4 <meta charset=
"utf-8" />
5 <title>BIP39 - Mnemonic Code
</title>
8 * Bootstrap v3.2
.0 (http://getbootstrap.com)
9 * Copyright
2011-
2014 Twitter, Inc.
10 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
13 /*! normalize.css v3.0
.1 | MIT License | git.io/normalize */
15 font-family: sans-serif;
16 -webkit-text-size-adjust:
100%;
17 -ms-text-size-adjust:
100%;
40 display: inline-block;
41 vertical-align: baseline;
43 audio:not([controls]) {
52 background: transparent;
59 border-bottom:
1px dotted;
84 vertical-align: baseline;
103 -webkit-box-sizing: content-box;
104 -moz-box-sizing: content-box;
105 box-sizing: content-box;
114 font-family: monospace, monospace;
131 text-transform: none;
134 html input[
type="button"],
136 input[
type="submit"] {
137 -webkit-appearance: button;
141 html input[disabled] {
144 button::-moz-focus-inner,
145 input::-moz-focus-inner {
152 input[
type="checkbox"],
153 input[
type="radio"] {
154 -webkit-box-sizing: border-box;
155 -moz-box-sizing: border-box;
156 box-sizing: border-box;
159 input[
type="number"]::-webkit-inner-spin-button,
160 input[
type="number"]::-webkit-outer-spin-button {
163 input[
type="search"] {
164 -webkit-box-sizing: content-box;
165 -moz-box-sizing: content-box;
166 box-sizing: content-box;
167 -webkit-appearance: textfield;
169 input[
type="search"]::-webkit-search-cancel-button,
170 input[
type="search"]::-webkit-search-decoration {
171 -webkit-appearance: none;
174 padding:
.35em
.625em
.75em;
176 border:
1px solid #c0c0c0;
190 border-collapse: collapse;
198 color: #
000 !important;
199 text-shadow: none !important;
200 background: transparent !important;
201 -webkit-box-shadow: none !important;
202 box-shadow: none !important;
206 text-decoration: underline;
209 content: " (" attr(href) ")";
212 content: " (" attr(title) ")";
214 a[href^="javascript:"]:after,
220 border:
1px solid #
999;
222 page-break-inside: avoid;
225 display: table-header-group;
229 page-break-inside: avoid;
232 max-width:
100% !important;
242 page-break-after: avoid;
245 background: #fff !important;
252 background-color: #fff !important;
255 .dropup
> .btn
> .caret {
256 border-top-color: #
000 !important;
259 border:
1px solid #
000;
262 border-collapse: collapse !important;
266 border:
1px solid #ddd !important;
270 font-family: 'Glyphicons Halflings';
272 src: url('../fonts/glyphicons-halflings-regular.eot');
273 src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
278 display: inline-block;
279 font-family: 'Glyphicons Halflings';
284 -webkit-font-smoothing: antialiased;
285 -moz-osx-font-smoothing: grayscale;
287 .glyphicon-asterisk:before {
290 .glyphicon-plus:before {
293 .glyphicon-euro:before {
296 .glyphicon-minus:before {
299 .glyphicon-cloud:before {
302 .glyphicon-envelope:before {
305 .glyphicon-pencil:before {
308 .glyphicon-glass:before {
311 .glyphicon-music:before {
314 .glyphicon-search:before {
317 .glyphicon-heart:before {
320 .glyphicon-star:before {
323 .glyphicon-star-empty:before {
326 .glyphicon-user:before {
329 .glyphicon-film:before {
332 .glyphicon-th-large:before {
335 .glyphicon-th:before {
338 .glyphicon-th-list:before {
341 .glyphicon-ok:before {
344 .glyphicon-remove:before {
347 .glyphicon-zoom-in:before {
350 .glyphicon-zoom-out:before {
353 .glyphicon-off:before {
356 .glyphicon-signal:before {
359 .glyphicon-cog:before {
362 .glyphicon-trash:before {
365 .glyphicon-home:before {
368 .glyphicon-file:before {
371 .glyphicon-time:before {
374 .glyphicon-road:before {
377 .glyphicon-download-alt:before {
380 .glyphicon-download:before {
383 .glyphicon-upload:before {
386 .glyphicon-inbox:before {
389 .glyphicon-play-circle:before {
392 .glyphicon-repeat:before {
395 .glyphicon-refresh:before {
398 .glyphicon-list-alt:before {
401 .glyphicon-lock:before {
404 .glyphicon-flag:before {
407 .glyphicon-headphones:before {
410 .glyphicon-volume-off:before {
413 .glyphicon-volume-down:before {
416 .glyphicon-volume-up:before {
419 .glyphicon-qrcode:before {
422 .glyphicon-barcode:before {
425 .glyphicon-tag:before {
428 .glyphicon-tags:before {
431 .glyphicon-book:before {
434 .glyphicon-bookmark:before {
437 .glyphicon-print:before {
440 .glyphicon-camera:before {
443 .glyphicon-font:before {
446 .glyphicon-bold:before {
449 .glyphicon-italic:before {
452 .glyphicon-text-height:before {
455 .glyphicon-text-width:before {
458 .glyphicon-align-left:before {
461 .glyphicon-align-center:before {
464 .glyphicon-align-right:before {
467 .glyphicon-align-justify:before {
470 .glyphicon-list:before {
473 .glyphicon-indent-left:before {
476 .glyphicon-indent-right:before {
479 .glyphicon-facetime-video:before {
482 .glyphicon-picture:before {
485 .glyphicon-map-marker:before {
488 .glyphicon-adjust:before {
491 .glyphicon-tint:before {
494 .glyphicon-edit:before {
497 .glyphicon-share:before {
500 .glyphicon-check:before {
503 .glyphicon-move:before {
506 .glyphicon-step-backward:before {
509 .glyphicon-fast-backward:before {
512 .glyphicon-backward:before {
515 .glyphicon-play:before {
518 .glyphicon-pause:before {
521 .glyphicon-stop:before {
524 .glyphicon-forward:before {
527 .glyphicon-fast-forward:before {
530 .glyphicon-step-forward:before {
533 .glyphicon-eject:before {
536 .glyphicon-chevron-left:before {
539 .glyphicon-chevron-right:before {
542 .glyphicon-plus-sign:before {
545 .glyphicon-minus-sign:before {
548 .glyphicon-remove-sign:before {
551 .glyphicon-ok-sign:before {
554 .glyphicon-question-sign:before {
557 .glyphicon-info-sign:before {
560 .glyphicon-screenshot:before {
563 .glyphicon-remove-circle:before {
566 .glyphicon-ok-circle:before {
569 .glyphicon-ban-circle:before {
572 .glyphicon-arrow-left:before {
575 .glyphicon-arrow-right:before {
578 .glyphicon-arrow-up:before {
581 .glyphicon-arrow-down:before {
584 .glyphicon-share-alt:before {
587 .glyphicon-resize-full:before {
590 .glyphicon-resize-small:before {
593 .glyphicon-exclamation-sign:before {
596 .glyphicon-gift:before {
599 .glyphicon-leaf:before {
602 .glyphicon-fire:before {
605 .glyphicon-eye-open:before {
608 .glyphicon-eye-close:before {
611 .glyphicon-warning-sign:before {
614 .glyphicon-plane:before {
617 .glyphicon-calendar:before {
620 .glyphicon-random:before {
623 .glyphicon-comment:before {
626 .glyphicon-magnet:before {
629 .glyphicon-chevron-up:before {
632 .glyphicon-chevron-down:before {
635 .glyphicon-retweet:before {
638 .glyphicon-shopping-cart:before {
641 .glyphicon-folder-close:before {
644 .glyphicon-folder-open:before {
647 .glyphicon-resize-vertical:before {
650 .glyphicon-resize-horizontal:before {
653 .glyphicon-hdd:before {
656 .glyphicon-bullhorn:before {
659 .glyphicon-bell:before {
662 .glyphicon-certificate:before {
665 .glyphicon-thumbs-up:before {
668 .glyphicon-thumbs-down:before {
671 .glyphicon-hand-right:before {
674 .glyphicon-hand-left:before {
677 .glyphicon-hand-up:before {
680 .glyphicon-hand-down:before {
683 .glyphicon-circle-arrow-right:before {
686 .glyphicon-circle-arrow-left:before {
689 .glyphicon-circle-arrow-up:before {
692 .glyphicon-circle-arrow-down:before {
695 .glyphicon-globe:before {
698 .glyphicon-wrench:before {
701 .glyphicon-tasks:before {
704 .glyphicon-filter:before {
707 .glyphicon-briefcase:before {
710 .glyphicon-fullscreen:before {
713 .glyphicon-dashboard:before {
716 .glyphicon-paperclip:before {
719 .glyphicon-heart-empty:before {
722 .glyphicon-link:before {
725 .glyphicon-phone:before {
728 .glyphicon-pushpin:before {
731 .glyphicon-usd:before {
734 .glyphicon-gbp:before {
737 .glyphicon-sort:before {
740 .glyphicon-sort-by-alphabet:before {
743 .glyphicon-sort-by-alphabet-alt:before {
746 .glyphicon-sort-by-order:before {
749 .glyphicon-sort-by-order-alt:before {
752 .glyphicon-sort-by-attributes:before {
755 .glyphicon-sort-by-attributes-alt:before {
758 .glyphicon-unchecked:before {
761 .glyphicon-expand:before {
764 .glyphicon-collapse-down:before {
767 .glyphicon-collapse-up:before {
770 .glyphicon-log-in:before {
773 .glyphicon-flash:before {
776 .glyphicon-log-out:before {
779 .glyphicon-new-window:before {
782 .glyphicon-record:before {
785 .glyphicon-save:before {
788 .glyphicon-open:before {
791 .glyphicon-saved:before {
794 .glyphicon-import:before {
797 .glyphicon-export:before {
800 .glyphicon-send:before {
803 .glyphicon-floppy-disk:before {
806 .glyphicon-floppy-saved:before {
809 .glyphicon-floppy-remove:before {
812 .glyphicon-floppy-save:before {
815 .glyphicon-floppy-open:before {
818 .glyphicon-credit-card:before {
821 .glyphicon-transfer:before {
824 .glyphicon-cutlery:before {
827 .glyphicon-header:before {
830 .glyphicon-compressed:before {
833 .glyphicon-earphone:before {
836 .glyphicon-phone-alt:before {
839 .glyphicon-tower:before {
842 .glyphicon-stats:before {
845 .glyphicon-sd-video:before {
848 .glyphicon-hd-video:before {
851 .glyphicon-subtitles:before {
854 .glyphicon-sound-stereo:before {
857 .glyphicon-sound-dolby:before {
860 .glyphicon-sound-
5-
1:before {
863 .glyphicon-sound-
6-
1:before {
866 .glyphicon-sound-
7-
1:before {
869 .glyphicon-copyright-mark:before {
872 .glyphicon-registration-mark:before {
875 .glyphicon-cloud-download:before {
878 .glyphicon-cloud-upload:before {
881 .glyphicon-tree-conifer:before {
884 .glyphicon-tree-deciduous:before {
888 -webkit-box-sizing: border-box;
889 -moz-box-sizing: border-box;
890 box-sizing: border-box;
894 -webkit-box-sizing: border-box;
895 -moz-box-sizing: border-box;
896 box-sizing: border-box;
901 -webkit-tap-highlight-color: rgba(
0,
0,
0,
0);
904 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
906 line-height:
1.42857143;
908 background-color: #fff;
914 font-family: inherit;
916 line-height: inherit;
920 text-decoration: none;
925 text-decoration: underline;
928 outline: thin dotted;
929 outline:
5px auto -webkit-focus-ring-color;
930 outline-offset: -
2px;
936 vertical-align: middle;
941 .carousel-inner
> .item
> img,
942 .carousel-inner
> .item
> a
> img {
952 display: inline-block;
957 line-height:
1.42857143;
958 background-color: #fff;
959 border:
1px solid #ddd;
961 -webkit-transition: all
.2s ease-in-out;
962 -o-transition: all
.2s ease-in-out;
963 transition: all
.2s ease-in-out;
972 border-top:
1px solid #eee;
981 clip: rect(
0,
0,
0,
0);
984 .sr-only-focusable:active,
985 .sr-only-focusable:focus {
1005 font-family: inherit;
1034 font-weight: normal;
1045 margin-bottom:
10px;
1068 margin-bottom:
10px;
1112 margin-bottom:
20px;
1117 @media (min-width:
768px) {
1132 background-color: #fcf8e3;
1144 text-align: justify;
1147 white-space: nowrap;
1150 text-transform: lowercase;
1153 text-transform: uppercase;
1156 text-transform: capitalize;
1164 a.text-primary:hover {
1170 a.text-success:hover {
1182 a.text-warning:hover {
1188 a.text-danger:hover {
1193 background-color: #
428bca;
1195 a.bg-primary:hover {
1196 background-color: #
3071a9;
1199 background-color: #dff0d8;
1201 a.bg-success:hover {
1202 background-color: #c1e2b3;
1205 background-color: #d9edf7;
1208 background-color: #afd9ee;
1211 background-color: #fcf8e3;
1213 a.bg-warning:hover {
1214 background-color: #f7ecb5;
1217 background-color: #f2dede;
1220 background-color: #e4b9b9;
1223 padding-bottom:
9px;
1224 margin:
40px
0 20px;
1225 border-bottom:
1px solid #eee;
1230 margin-bottom:
10px;
1248 display: inline-block;
1254 margin-bottom:
20px;
1258 line-height:
1.42857143;
1266 @media (min-width:
768px) {
1273 text-overflow: ellipsis;
1274 white-space: nowrap;
1281 abbr[data-original-title] {
1283 border-bottom:
1px dotted #
777;
1287 text-transform: uppercase;
1293 border-left:
5px solid #eee;
1295 blockquote p:last-child,
1296 blockquote ul:last-child,
1297 blockquote ol:last-child {
1305 line-height:
1.42857143;
1308 blockquote footer:before,
1309 blockquote small:before,
1310 blockquote .small:before {
1311 content: '\
2014 \
00A0';
1313 .blockquote-reverse,
1314 blockquote.pull-right {
1315 padding-right:
15px;
1318 border-right:
5px solid #eee;
1321 .blockquote-reverse footer:before,
1322 blockquote.pull-right footer:before,
1323 .blockquote-reverse small:before,
1324 blockquote.pull-right small:before,
1325 .blockquote-reverse .small:before,
1326 blockquote.pull-right .small:before {
1329 .blockquote-reverse footer:after,
1330 blockquote.pull-right footer:after,
1331 .blockquote-reverse small:after,
1332 blockquote.pull-right small:after,
1333 .blockquote-reverse .small:after,
1334 blockquote.pull-right .small:after {
1335 content: '\
00A0 \
2014';
1342 margin-bottom:
20px;
1344 line-height:
1.42857143;
1350 font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
1356 background-color: #f9f2f4;
1363 background-color: #
333;
1365 -webkit-box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.25);
1366 box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.25);
1371 -webkit-box-shadow: none;
1379 line-height:
1.42857143;
1381 word-break: break-all;
1382 word-wrap: break-word;
1383 background-color: #f5f5f5;
1384 border:
1px solid #ccc;
1391 white-space: pre-wrap;
1392 background-color: transparent;
1400 padding-right:
15px;
1405 @media (min-width:
768px) {
1410 @media (min-width:
992px) {
1415 @media (min-width:
1200px) {
1421 padding-right:
15px;
1427 margin-right: -
15px;
1430 .col-xs-
1, .col-sm-
1, .col-md-
1, .col-lg-
1, .col-xs-
2, .col-sm-
2, .col-md-
2, .col-lg-
2, .col-xs-
3, .col-sm-
3, .col-md-
3, .col-lg-
3, .col-xs-
4, .col-sm-
4, .col-md-
4, .col-lg-
4, .col-xs-
5, .col-sm-
5, .col-md-
5, .col-lg-
5, .col-xs-
6, .col-sm-
6, .col-md-
6, .col-lg-
6, .col-xs-
7, .col-sm-
7, .col-md-
7, .col-lg-
7, .col-xs-
8, .col-sm-
8, .col-md-
8, .col-lg-
8, .col-xs-
9, .col-sm-
9, .col-md-
9, .col-lg-
9, .col-xs-
10, .col-sm-
10, .col-md-
10, .col-lg-
10, .col-xs-
11, .col-sm-
11, .col-md-
11, .col-lg-
11, .col-xs-
12, .col-sm-
12, .col-md-
12, .col-lg-
12 {
1433 padding-right:
15px;
1436 .col-xs-
1, .col-xs-
2, .col-xs-
3, .col-xs-
4, .col-xs-
5, .col-xs-
6, .col-xs-
7, .col-xs-
8, .col-xs-
9, .col-xs-
10, .col-xs-
11, .col-xs-
12 {
1443 width:
91.66666667%;
1446 width:
83.33333333%;
1452 width:
66.66666667%;
1455 width:
58.33333333%;
1461 width:
41.66666667%;
1464 width:
33.33333333%;
1470 width:
16.66666667%;
1479 right:
91.66666667%;
1482 right:
83.33333333%;
1488 right:
66.66666667%;
1491 right:
58.33333333%;
1497 right:
41.66666667%;
1500 right:
33.33333333%;
1506 right:
16.66666667%;
1557 margin-left:
91.66666667%;
1560 margin-left:
83.33333333%;
1566 margin-left:
66.66666667%;
1569 margin-left:
58.33333333%;
1575 margin-left:
41.66666667%;
1578 margin-left:
33.33333333%;
1584 margin-left:
16.66666667%;
1587 margin-left:
8.33333333%;
1592 @media (min-width:
768px) {
1593 .col-sm-
1, .col-sm-
2, .col-sm-
3, .col-sm-
4, .col-sm-
5, .col-sm-
6, .col-sm-
7, .col-sm-
8, .col-sm-
9, .col-sm-
10, .col-sm-
11, .col-sm-
12 {
1600 width:
91.66666667%;
1603 width:
83.33333333%;
1609 width:
66.66666667%;
1612 width:
58.33333333%;
1618 width:
41.66666667%;
1621 width:
33.33333333%;
1627 width:
16.66666667%;
1636 right:
91.66666667%;
1639 right:
83.33333333%;
1645 right:
66.66666667%;
1648 right:
58.33333333%;
1654 right:
41.66666667%;
1657 right:
33.33333333%;
1663 right:
16.66666667%;
1714 margin-left:
91.66666667%;
1717 margin-left:
83.33333333%;
1723 margin-left:
66.66666667%;
1726 margin-left:
58.33333333%;
1732 margin-left:
41.66666667%;
1735 margin-left:
33.33333333%;
1741 margin-left:
16.66666667%;
1744 margin-left:
8.33333333%;
1750 @media (min-width:
992px) {
1751 .col-md-
1, .col-md-
2, .col-md-
3, .col-md-
4, .col-md-
5, .col-md-
6, .col-md-
7, .col-md-
8, .col-md-
9, .col-md-
10, .col-md-
11, .col-md-
12 {
1758 width:
91.66666667%;
1761 width:
83.33333333%;
1767 width:
66.66666667%;
1770 width:
58.33333333%;
1776 width:
41.66666667%;
1779 width:
33.33333333%;
1785 width:
16.66666667%;
1794 right:
91.66666667%;
1797 right:
83.33333333%;
1803 right:
66.66666667%;
1806 right:
58.33333333%;
1812 right:
41.66666667%;
1815 right:
33.33333333%;
1821 right:
16.66666667%;
1872 margin-left:
91.66666667%;
1875 margin-left:
83.33333333%;
1881 margin-left:
66.66666667%;
1884 margin-left:
58.33333333%;
1890 margin-left:
41.66666667%;
1893 margin-left:
33.33333333%;
1899 margin-left:
16.66666667%;
1902 margin-left:
8.33333333%;
1908 @media (min-width:
1200px) {
1909 .col-lg-
1, .col-lg-
2, .col-lg-
3, .col-lg-
4, .col-lg-
5, .col-lg-
6, .col-lg-
7, .col-lg-
8, .col-lg-
9, .col-lg-
10, .col-lg-
11, .col-lg-
12 {
1916 width:
91.66666667%;
1919 width:
83.33333333%;
1925 width:
66.66666667%;
1928 width:
58.33333333%;
1934 width:
41.66666667%;
1937 width:
33.33333333%;
1943 width:
16.66666667%;
1952 right:
91.66666667%;
1955 right:
83.33333333%;
1961 right:
66.66666667%;
1964 right:
58.33333333%;
1970 right:
41.66666667%;
1973 right:
33.33333333%;
1979 right:
16.66666667%;
2030 margin-left:
91.66666667%;
2033 margin-left:
83.33333333%;
2039 margin-left:
66.66666667%;
2042 margin-left:
58.33333333%;
2048 margin-left:
41.66666667%;
2051 margin-left:
33.33333333%;
2057 margin-left:
16.66666667%;
2060 margin-left:
8.33333333%;
2067 background-color: transparent;
2075 margin-bottom:
20px;
2077 .table
> thead
> tr
> th,
2078 .table
> tbody
> tr
> th,
2079 .table
> tfoot
> tr
> th,
2080 .table
> thead
> tr
> td,
2081 .table
> tbody
> tr
> td,
2082 .table
> tfoot
> tr
> td {
2084 line-height:
1.42857143;
2085 vertical-align: top;
2086 border-top:
1px solid #ddd;
2088 .table
> thead
> tr
> th {
2089 vertical-align: bottom;
2090 border-bottom:
2px solid #ddd;
2092 .table
> caption + thead
> tr:first-child
> th,
2093 .table
> colgroup + thead
> tr:first-child
> th,
2094 .table
> thead:first-child
> tr:first-child
> th,
2095 .table
> caption + thead
> tr:first-child
> td,
2096 .table
> colgroup + thead
> tr:first-child
> td,
2097 .table
> thead:first-child
> tr:first-child
> td {
2100 .table
> tbody + tbody {
2101 border-top:
2px solid #ddd;
2104 background-color: #fff;
2106 .table-condensed
> thead
> tr
> th,
2107 .table-condensed
> tbody
> tr
> th,
2108 .table-condensed
> tfoot
> tr
> th,
2109 .table-condensed
> thead
> tr
> td,
2110 .table-condensed
> tbody
> tr
> td,
2111 .table-condensed
> tfoot
> tr
> td {
2115 border:
1px solid #ddd;
2117 .table-bordered
> thead
> tr
> th,
2118 .table-bordered
> tbody
> tr
> th,
2119 .table-bordered
> tfoot
> tr
> th,
2120 .table-bordered
> thead
> tr
> td,
2121 .table-bordered
> tbody
> tr
> td,
2122 .table-bordered
> tfoot
> tr
> td {
2123 border:
1px solid #ddd;
2125 .table-bordered
> thead
> tr
> th,
2126 .table-bordered
> thead
> tr
> td {
2127 border-bottom-width:
2px;
2129 .table-striped
> tbody
> tr:nth-child(odd)
> td,
2130 .table-striped
> tbody
> tr:nth-child(odd)
> th {
2131 background-color: #f9f9f9;
2133 .table-hover
> tbody
> tr:hover
> td,
2134 .table-hover
> tbody
> tr:hover
> th {
2135 background-color: #f5f5f5;
2137 table col[class*="col-"] {
2139 display: table-column;
2142 table td[class*="col-"],
2143 table th[class*="col-"] {
2145 display: table-cell;
2148 .table
> thead
> tr
> td.active,
2149 .table
> tbody
> tr
> td.active,
2150 .table
> tfoot
> tr
> td.active,
2151 .table
> thead
> tr
> th.active,
2152 .table
> tbody
> tr
> th.active,
2153 .table
> tfoot
> tr
> th.active,
2154 .table
> thead
> tr.active
> td,
2155 .table
> tbody
> tr.active
> td,
2156 .table
> tfoot
> tr.active
> td,
2157 .table
> thead
> tr.active
> th,
2158 .table
> tbody
> tr.active
> th,
2159 .table
> tfoot
> tr.active
> th {
2160 background-color: #f5f5f5;
2162 .table-hover
> tbody
> tr
> td.active:hover,
2163 .table-hover
> tbody
> tr
> th.active:hover,
2164 .table-hover
> tbody
> tr.active:hover
> td,
2165 .table-hover
> tbody
> tr:hover
> .active,
2166 .table-hover
> tbody
> tr.active:hover
> th {
2167 background-color: #e8e8e8;
2169 .table
> thead
> tr
> td.success,
2170 .table
> tbody
> tr
> td.success,
2171 .table
> tfoot
> tr
> td.success,
2172 .table
> thead
> tr
> th.success,
2173 .table
> tbody
> tr
> th.success,
2174 .table
> tfoot
> tr
> th.success,
2175 .table
> thead
> tr.success
> td,
2176 .table
> tbody
> tr.success
> td,
2177 .table
> tfoot
> tr.success
> td,
2178 .table
> thead
> tr.success
> th,
2179 .table
> tbody
> tr.success
> th,
2180 .table
> tfoot
> tr.success
> th {
2181 background-color: #dff0d8;
2183 .table-hover
> tbody
> tr
> td.success:hover,
2184 .table-hover
> tbody
> tr
> th.success:hover,
2185 .table-hover
> tbody
> tr.success:hover
> td,
2186 .table-hover
> tbody
> tr:hover
> .success,
2187 .table-hover
> tbody
> tr.success:hover
> th {
2188 background-color: #d0e9c6;
2190 .table
> thead
> tr
> td.info,
2191 .table
> tbody
> tr
> td.info,
2192 .table
> tfoot
> tr
> td.info,
2193 .table
> thead
> tr
> th.info,
2194 .table
> tbody
> tr
> th.info,
2195 .table
> tfoot
> tr
> th.info,
2196 .table
> thead
> tr.info
> td,
2197 .table
> tbody
> tr.info
> td,
2198 .table
> tfoot
> tr.info
> td,
2199 .table
> thead
> tr.info
> th,
2200 .table
> tbody
> tr.info
> th,
2201 .table
> tfoot
> tr.info
> th {
2202 background-color: #d9edf7;
2204 .table-hover
> tbody
> tr
> td.info:hover,
2205 .table-hover
> tbody
> tr
> th.info:hover,
2206 .table-hover
> tbody
> tr.info:hover
> td,
2207 .table-hover
> tbody
> tr:hover
> .info,
2208 .table-hover
> tbody
> tr.info:hover
> th {
2209 background-color: #c4e3f3;
2211 .table
> thead
> tr
> td.warning,
2212 .table
> tbody
> tr
> td.warning,
2213 .table
> tfoot
> tr
> td.warning,
2214 .table
> thead
> tr
> th.warning,
2215 .table
> tbody
> tr
> th.warning,
2216 .table
> tfoot
> tr
> th.warning,
2217 .table
> thead
> tr.warning
> td,
2218 .table
> tbody
> tr.warning
> td,
2219 .table
> tfoot
> tr.warning
> td,
2220 .table
> thead
> tr.warning
> th,
2221 .table
> tbody
> tr.warning
> th,
2222 .table
> tfoot
> tr.warning
> th {
2223 background-color: #fcf8e3;
2225 .table-hover
> tbody
> tr
> td.warning:hover,
2226 .table-hover
> tbody
> tr
> th.warning:hover,
2227 .table-hover
> tbody
> tr.warning:hover
> td,
2228 .table-hover
> tbody
> tr:hover
> .warning,
2229 .table-hover
> tbody
> tr.warning:hover
> th {
2230 background-color: #faf2cc;
2232 .table
> thead
> tr
> td.danger,
2233 .table
> tbody
> tr
> td.danger,
2234 .table
> tfoot
> tr
> td.danger,
2235 .table
> thead
> tr
> th.danger,
2236 .table
> tbody
> tr
> th.danger,
2237 .table
> tfoot
> tr
> th.danger,
2238 .table
> thead
> tr.danger
> td,
2239 .table
> tbody
> tr.danger
> td,
2240 .table
> tfoot
> tr.danger
> td,
2241 .table
> thead
> tr.danger
> th,
2242 .table
> tbody
> tr.danger
> th,
2243 .table
> tfoot
> tr.danger
> th {
2244 background-color: #f2dede;
2246 .table-hover
> tbody
> tr
> td.danger:hover,
2247 .table-hover
> tbody
> tr
> th.danger:hover,
2248 .table-hover
> tbody
> tr.danger:hover
> td,
2249 .table-hover
> tbody
> tr:hover
> .danger,
2250 .table-hover
> tbody
> tr.danger:hover
> th {
2251 background-color: #ebcccc;
2253 @media screen and (max-width:
767px) {
2256 margin-bottom:
15px;
2259 -webkit-overflow-scrolling: touch;
2260 -ms-overflow-style: -ms-autohiding-scrollbar;
2261 border:
1px solid #ddd;
2263 .table-responsive
> .table {
2266 .table-responsive
> .table
> thead
> tr
> th,
2267 .table-responsive
> .table
> tbody
> tr
> th,
2268 .table-responsive
> .table
> tfoot
> tr
> th,
2269 .table-responsive
> .table
> thead
> tr
> td,
2270 .table-responsive
> .table
> tbody
> tr
> td,
2271 .table-responsive
> .table
> tfoot
> tr
> td {
2272 white-space: nowrap;
2274 .table-responsive
> .table-bordered {
2277 .table-responsive
> .table-bordered
> thead
> tr
> th:first-child,
2278 .table-responsive
> .table-bordered
> tbody
> tr
> th:first-child,
2279 .table-responsive
> .table-bordered
> tfoot
> tr
> th:first-child,
2280 .table-responsive
> .table-bordered
> thead
> tr
> td:first-child,
2281 .table-responsive
> .table-bordered
> tbody
> tr
> td:first-child,
2282 .table-responsive
> .table-bordered
> tfoot
> tr
> td:first-child {
2285 .table-responsive
> .table-bordered
> thead
> tr
> th:last-child,
2286 .table-responsive
> .table-bordered
> tbody
> tr
> th:last-child,
2287 .table-responsive
> .table-bordered
> tfoot
> tr
> th:last-child,
2288 .table-responsive
> .table-bordered
> thead
> tr
> td:last-child,
2289 .table-responsive
> .table-bordered
> tbody
> tr
> td:last-child,
2290 .table-responsive
> .table-bordered
> tfoot
> tr
> td:last-child {
2293 .table-responsive
> .table-bordered
> tbody
> tr:last-child
> th,
2294 .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> th,
2295 .table-responsive
> .table-bordered
> tbody
> tr:last-child
> td,
2296 .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> td {
2310 margin-bottom:
20px;
2312 line-height: inherit;
2315 border-bottom:
1px solid #e5e5e5;
2318 display: inline-block;
2323 input[
type="search"] {
2324 -webkit-box-sizing: border-box;
2325 -moz-box-sizing: border-box;
2326 box-sizing: border-box;
2328 input[
type="radio"],
2329 input[
type="checkbox"] {
2332 line-height: normal;
2334 input[
type="file"] {
2337 input[
type="range"] {
2345 input[
type="file"]:focus,
2346 input[
type="radio"]:focus,
2347 input[
type="checkbox"]:focus {
2348 outline: thin dotted;
2349 outline:
5px auto -webkit-focus-ring-color;
2350 outline-offset: -
2px;
2356 line-height:
1.42857143;
2365 line-height:
1.42857143;
2367 background-color: #fff;
2368 background-image: none;
2369 border:
1px solid #ccc;
2371 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2372 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2373 -webkit-transition: border-color ease-in-out
.15s, -webkit-box-shadow ease-in-out
.15s;
2374 -o-transition: border-color ease-in-out
.15s, box-shadow ease-in-out
.15s;
2375 transition: border-color ease-in-out
.15s, box-shadow ease-in-out
.15s;
2377 .form-control:focus {
2378 border-color: #
66afe9;
2380 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 8px rgba(
102,
175,
233,
.6);
2381 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 8px rgba(
102,
175,
233,
.6);
2383 .form-control::-moz-placeholder {
2387 .form-control:-ms-input-placeholder {
2390 .form-control::-webkit-input-placeholder {
2393 .form-control[disabled],
2394 .form-control[readonly],
2395 fieldset[disabled] .form-control {
2396 cursor: not-allowed;
2397 background-color: #eee;
2400 textarea.form-control {
2403 input[
type="search"] {
2404 -webkit-appearance: none;
2408 input[
type="datetime-local"],
2409 input[
type="month"] {
2411 line-height:
1.42857143 \
0;
2413 input[
type="date"].input-sm,
2414 input[
type="time"].input-sm,
2415 input[
type="datetime-local"].input-sm,
2416 input[
type="month"].input-sm {
2419 input[
type="date"].input-lg,
2420 input[
type="time"].input-lg,
2421 input[
type="datetime-local"].input-lg,
2422 input[
type="month"].input-lg {
2426 margin-bottom:
15px;
2434 margin-bottom:
10px;
2440 font-weight: normal;
2443 .radio input[
type="radio"],
2444 .radio-inline input[
type="radio"],
2445 .checkbox input[
type="checkbox"],
2446 .checkbox-inline input[
type="checkbox"] {
2452 .checkbox + .checkbox {
2457 display: inline-block;
2460 font-weight: normal;
2461 vertical-align: middle;
2464 .radio-inline + .radio-inline,
2465 .checkbox-inline + .checkbox-inline {
2469 input[
type="radio"][disabled],
2470 input[
type="checkbox"][disabled],
2471 input[
type="radio"].disabled,
2472 input[
type="checkbox"].disabled,
2473 fieldset[disabled] input[
type="radio"],
2474 fieldset[disabled] input[
type="checkbox"] {
2475 cursor: not-allowed;
2477 .radio-inline.disabled,
2478 .checkbox-inline.disabled,
2479 fieldset[disabled] .radio-inline,
2480 fieldset[disabled] .checkbox-inline {
2481 cursor: not-allowed;
2483 .radio.disabled label,
2484 .checkbox.disabled label,
2485 fieldset[disabled] .radio label,
2486 fieldset[disabled] .checkbox label {
2487 cursor: not-allowed;
2489 .form-control-static {
2491 padding-bottom:
7px;
2494 .form-control-static.input-lg,
2495 .form-control-static.input-sm {
2500 .form-horizontal .form-group-sm .form-control {
2512 select[multiple].input-sm {
2516 .form-horizontal .form-group-lg .form-control {
2528 select[multiple].input-lg {
2534 .has-feedback .form-control {
2535 padding-right:
42.5px;
2537 .form-control-feedback {
2548 .input-lg + .form-control-feedback {
2553 .input-sm + .form-control-feedback {
2558 .has-success .help-block,
2559 .has-success .control-label,
2560 .has-success .radio,
2561 .has-success .checkbox,
2562 .has-success .radio-inline,
2563 .has-success .checkbox-inline {
2566 .has-success .form-control {
2567 border-color: #
3c763d;
2568 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2569 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2571 .has-success .form-control:focus {
2572 border-color: #
2b542c;
2573 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #
67b168;
2574 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #
67b168;
2576 .has-success .input-group-addon {
2578 background-color: #dff0d8;
2579 border-color: #
3c763d;
2581 .has-success .form-control-feedback {
2584 .has-warning .help-block,
2585 .has-warning .control-label,
2586 .has-warning .radio,
2587 .has-warning .checkbox,
2588 .has-warning .radio-inline,
2589 .has-warning .checkbox-inline {
2592 .has-warning .form-control {
2593 border-color: #
8a6d3b;
2594 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2595 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2597 .has-warning .form-control:focus {
2598 border-color: #
66512c;
2599 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #c0a16b;
2600 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #c0a16b;
2602 .has-warning .input-group-addon {
2604 background-color: #fcf8e3;
2605 border-color: #
8a6d3b;
2607 .has-warning .form-control-feedback {
2610 .has-error .help-block,
2611 .has-error .control-label,
2613 .has-error .checkbox,
2614 .has-error .radio-inline,
2615 .has-error .checkbox-inline {
2618 .has-error .form-control {
2619 border-color: #a94442;
2620 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2621 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2623 .has-error .form-control:focus {
2624 border-color: #
843534;
2625 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #ce8483;
2626 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #ce8483;
2628 .has-error .input-group-addon {
2630 background-color: #f2dede;
2631 border-color: #a94442;
2633 .has-error .form-control-feedback {
2636 .has-feedback label.sr-only ~ .form-control-feedback {
2642 margin-bottom:
10px;
2645 @media (min-width:
768px) {
2646 .form-inline .form-group {
2647 display: inline-block;
2649 vertical-align: middle;
2651 .form-inline .form-control {
2652 display: inline-block;
2654 vertical-align: middle;
2656 .form-inline .input-group {
2657 display: inline-table;
2658 vertical-align: middle;
2660 .form-inline .input-group .input-group-addon,
2661 .form-inline .input-group .input-group-btn,
2662 .form-inline .input-group .form-control {
2665 .form-inline .input-group
> .form-control {
2668 .form-inline .control-label {
2670 vertical-align: middle;
2672 .form-inline .radio,
2673 .form-inline .checkbox {
2674 display: inline-block;
2677 vertical-align: middle;
2679 .form-inline .radio label,
2680 .form-inline .checkbox label {
2683 .form-inline .radio input[
type="radio"],
2684 .form-inline .checkbox input[
type="checkbox"] {
2688 .form-inline .has-feedback .form-control-feedback {
2692 .form-horizontal .radio,
2693 .form-horizontal .checkbox,
2694 .form-horizontal .radio-inline,
2695 .form-horizontal .checkbox-inline {
2700 .form-horizontal .radio,
2701 .form-horizontal .checkbox {
2704 .form-horizontal .form-group {
2705 margin-right: -
15px;
2708 @media (min-width:
768px) {
2709 .form-horizontal .control-label {
2715 .form-horizontal .has-feedback .form-control-feedback {
2719 @media (min-width:
768px) {
2720 .form-horizontal .form-group-lg .control-label {
2721 padding-top:
14.3px;
2724 @media (min-width:
768px) {
2725 .form-horizontal .form-group-sm .control-label {
2730 display: inline-block;
2734 font-weight: normal;
2735 line-height:
1.42857143;
2737 white-space: nowrap;
2738 vertical-align: middle;
2740 -webkit-user-select: none;
2741 -moz-user-select: none;
2742 -ms-user-select: none;
2744 background-image: none;
2745 border:
1px solid transparent;
2751 outline: thin dotted;
2752 outline:
5px auto -webkit-focus-ring-color;
2753 outline-offset: -
2px;
2758 text-decoration: none;
2762 background-image: none;
2764 -webkit-box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
2765 box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
2769 fieldset[disabled] .btn {
2770 pointer-events: none;
2771 cursor: not-allowed;
2772 filter: alpha(opacity=
65);
2773 -webkit-box-shadow: none;
2779 background-color: #fff;
2784 .btn-default:active,
2785 .btn-default.active,
2786 .open
> .dropdown-toggle.btn-default {
2788 background-color: #e6e6e6;
2789 border-color: #adadad;
2791 .btn-default:active,
2792 .btn-default.active,
2793 .open
> .dropdown-toggle.btn-default {
2794 background-image: none;
2796 .btn-default.disabled,
2797 .btn-default[disabled],
2798 fieldset[disabled] .btn-default,
2799 .btn-default.disabled:hover,
2800 .btn-default[disabled]:hover,
2801 fieldset[disabled] .btn-default:hover,
2802 .btn-default.disabled:focus,
2803 .btn-default[disabled]:focus,
2804 fieldset[disabled] .btn-default:focus,
2805 .btn-default.disabled:active,
2806 .btn-default[disabled]:active,
2807 fieldset[disabled] .btn-default:active,
2808 .btn-default.disabled.active,
2809 .btn-default[disabled].active,
2810 fieldset[disabled] .btn-default.active {
2811 background-color: #fff;
2814 .btn-default .badge {
2816 background-color: #
333;
2820 background-color: #
428bca;
2821 border-color: #
357ebd;
2825 .btn-primary:active,
2826 .btn-primary.active,
2827 .open
> .dropdown-toggle.btn-primary {
2829 background-color: #
3071a9;
2830 border-color: #
285e8e;
2832 .btn-primary:active,
2833 .btn-primary.active,
2834 .open
> .dropdown-toggle.btn-primary {
2835 background-image: none;
2837 .btn-primary.disabled,
2838 .btn-primary[disabled],
2839 fieldset[disabled] .btn-primary,
2840 .btn-primary.disabled:hover,
2841 .btn-primary[disabled]:hover,
2842 fieldset[disabled] .btn-primary:hover,
2843 .btn-primary.disabled:focus,
2844 .btn-primary[disabled]:focus,
2845 fieldset[disabled] .btn-primary:focus,
2846 .btn-primary.disabled:active,
2847 .btn-primary[disabled]:active,
2848 fieldset[disabled] .btn-primary:active,
2849 .btn-primary.disabled.active,
2850 .btn-primary[disabled].active,
2851 fieldset[disabled] .btn-primary.active {
2852 background-color: #
428bca;
2853 border-color: #
357ebd;
2855 .btn-primary .badge {
2857 background-color: #fff;
2861 background-color: #
5cb85c;
2862 border-color: #
4cae4c;
2866 .btn-success:active,
2867 .btn-success.active,
2868 .open
> .dropdown-toggle.btn-success {
2870 background-color: #
449d44;
2871 border-color: #
398439;
2873 .btn-success:active,
2874 .btn-success.active,
2875 .open
> .dropdown-toggle.btn-success {
2876 background-image: none;
2878 .btn-success.disabled,
2879 .btn-success[disabled],
2880 fieldset[disabled] .btn-success,
2881 .btn-success.disabled:hover,
2882 .btn-success[disabled]:hover,
2883 fieldset[disabled] .btn-success:hover,
2884 .btn-success.disabled:focus,
2885 .btn-success[disabled]:focus,
2886 fieldset[disabled] .btn-success:focus,
2887 .btn-success.disabled:active,
2888 .btn-success[disabled]:active,
2889 fieldset[disabled] .btn-success:active,
2890 .btn-success.disabled.active,
2891 .btn-success[disabled].active,
2892 fieldset[disabled] .btn-success.active {
2893 background-color: #
5cb85c;
2894 border-color: #
4cae4c;
2896 .btn-success .badge {
2898 background-color: #fff;
2902 background-color: #
5bc0de;
2903 border-color: #
46b8da;
2909 .open
> .dropdown-toggle.btn-info {
2911 background-color: #
31b0d5;
2912 border-color: #
269abc;
2916 .open
> .dropdown-toggle.btn-info {
2917 background-image: none;
2920 .btn-info[disabled],
2921 fieldset[disabled] .btn-info,
2922 .btn-info.disabled:hover,
2923 .btn-info[disabled]:hover,
2924 fieldset[disabled] .btn-info:hover,
2925 .btn-info.disabled:focus,
2926 .btn-info[disabled]:focus,
2927 fieldset[disabled] .btn-info:focus,
2928 .btn-info.disabled:active,
2929 .btn-info[disabled]:active,
2930 fieldset[disabled] .btn-info:active,
2931 .btn-info.disabled.active,
2932 .btn-info[disabled].active,
2933 fieldset[disabled] .btn-info.active {
2934 background-color: #
5bc0de;
2935 border-color: #
46b8da;
2939 background-color: #fff;
2943 background-color: #f0ad4e;
2944 border-color: #eea236;
2948 .btn-warning:active,
2949 .btn-warning.active,
2950 .open
> .dropdown-toggle.btn-warning {
2952 background-color: #ec971f;
2953 border-color: #d58512;
2955 .btn-warning:active,
2956 .btn-warning.active,
2957 .open
> .dropdown-toggle.btn-warning {
2958 background-image: none;
2960 .btn-warning.disabled,
2961 .btn-warning[disabled],
2962 fieldset[disabled] .btn-warning,
2963 .btn-warning.disabled:hover,
2964 .btn-warning[disabled]:hover,
2965 fieldset[disabled] .btn-warning:hover,
2966 .btn-warning.disabled:focus,
2967 .btn-warning[disabled]:focus,
2968 fieldset[disabled] .btn-warning:focus,
2969 .btn-warning.disabled:active,
2970 .btn-warning[disabled]:active,
2971 fieldset[disabled] .btn-warning:active,
2972 .btn-warning.disabled.active,
2973 .btn-warning[disabled].active,
2974 fieldset[disabled] .btn-warning.active {
2975 background-color: #f0ad4e;
2976 border-color: #eea236;
2978 .btn-warning .badge {
2980 background-color: #fff;
2984 background-color: #d9534f;
2985 border-color: #d43f3a;
2991 .open
> .dropdown-toggle.btn-danger {
2993 background-color: #c9302c;
2994 border-color: #ac2925;
2998 .open
> .dropdown-toggle.btn-danger {
2999 background-image: none;
3001 .btn-danger.disabled,
3002 .btn-danger[disabled],
3003 fieldset[disabled] .btn-danger,
3004 .btn-danger.disabled:hover,
3005 .btn-danger[disabled]:hover,
3006 fieldset[disabled] .btn-danger:hover,
3007 .btn-danger.disabled:focus,
3008 .btn-danger[disabled]:focus,
3009 fieldset[disabled] .btn-danger:focus,
3010 .btn-danger.disabled:active,
3011 .btn-danger[disabled]:active,
3012 fieldset[disabled] .btn-danger:active,
3013 .btn-danger.disabled.active,
3014 .btn-danger[disabled].active,
3015 fieldset[disabled] .btn-danger.active {
3016 background-color: #d9534f;
3017 border-color: #d43f3a;
3019 .btn-danger .badge {
3021 background-color: #fff;
3024 font-weight: normal;
3031 .btn-link[disabled],
3032 fieldset[disabled] .btn-link {
3033 background-color: transparent;
3034 -webkit-box-shadow: none;
3041 border-color: transparent;
3046 text-decoration: underline;
3047 background-color: transparent;
3049 .btn-link[disabled]:hover,
3050 fieldset[disabled] .btn-link:hover,
3051 .btn-link[disabled]:focus,
3052 fieldset[disabled] .btn-link:focus {
3054 text-decoration: none;
3057 .btn-group-lg
> .btn {
3064 .btn-group-sm
> .btn {
3071 .btn-group-xs
> .btn {
3081 .btn-block + .btn-block {
3084 input[
type="submit"].btn-block,
3085 input[
type="reset"].btn-block,
3086 input[
type="button"].btn-block {
3091 -webkit-transition: opacity
.15s linear;
3092 -o-transition: opacity
.15s linear;
3093 transition: opacity
.15s linear;
3108 display: table-row-group;
3114 -webkit-transition: height
.35s ease;
3115 -o-transition: height
.35s ease;
3116 transition: height
.35s ease;
3119 display: inline-block;
3123 vertical-align: middle;
3124 border-top:
4px solid;
3125 border-right:
4px solid transparent;
3126 border-left:
4px solid transparent;
3131 .dropdown-toggle:focus {
3147 background-color: #fff;
3148 -webkit-background-clip: padding-box;
3149 background-clip: padding-box;
3150 border:
1px solid #ccc;
3151 border:
1px solid rgba(
0,
0,
0,
.15);
3153 -webkit-box-shadow:
0 6px
12px rgba(
0,
0,
0,
.175);
3154 box-shadow:
0 6px
12px rgba(
0,
0,
0,
.175);
3156 .dropdown-menu.pull-right {
3160 .dropdown-menu .divider {
3164 background-color: #e5e5e5;
3166 .dropdown-menu
> li
> a {
3170 font-weight: normal;
3171 line-height:
1.42857143;
3173 white-space: nowrap;
3175 .dropdown-menu
> li
> a:hover,
3176 .dropdown-menu
> li
> a:focus {
3178 text-decoration: none;
3179 background-color: #f5f5f5;
3181 .dropdown-menu
> .active
> a,
3182 .dropdown-menu
> .active
> a:hover,
3183 .dropdown-menu
> .active
> a:focus {
3185 text-decoration: none;
3186 background-color: #
428bca;
3189 .dropdown-menu
> .disabled
> a,
3190 .dropdown-menu
> .disabled
> a:hover,
3191 .dropdown-menu
> .disabled
> a:focus {
3194 .dropdown-menu
> .disabled
> a:hover,
3195 .dropdown-menu
> .disabled
> a:focus {
3196 text-decoration: none;
3197 cursor: not-allowed;
3198 background-color: transparent;
3199 background-image: none;
3200 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3202 .open
> .dropdown-menu {
3208 .dropdown-menu-right {
3212 .dropdown-menu-left {
3220 line-height:
1.42857143;
3222 white-space: nowrap;
3224 .dropdown-backdrop {
3232 .pull-right
> .dropdown-menu {
3237 .navbar-fixed-bottom .dropdown .caret {
3240 border-bottom:
4px solid;
3242 .dropup .dropdown-menu,
3243 .navbar-fixed-bottom .dropdown .dropdown-menu {
3248 @media (min-width:
768px) {
3249 .navbar-right .dropdown-menu {
3253 .navbar-right .dropdown-menu-left {
3259 .btn-group-vertical {
3261 display: inline-block;
3262 vertical-align: middle;
3265 .btn-group-vertical
> .btn {
3269 .btn-group
> .btn:hover,
3270 .btn-group-vertical
> .btn:hover,
3271 .btn-group
> .btn:focus,
3272 .btn-group-vertical
> .btn:focus,
3273 .btn-group
> .btn:active,
3274 .btn-group-vertical
> .btn:active,
3275 .btn-group
> .btn.active,
3276 .btn-group-vertical
> .btn.active {
3279 .btn-group
> .btn:focus,
3280 .btn-group-vertical
> .btn:focus {
3283 .btn-group .btn + .btn,
3284 .btn-group .btn + .btn-group,
3285 .btn-group .btn-group + .btn,
3286 .btn-group .btn-group + .btn-group {
3292 .btn-toolbar .btn-group,
3293 .btn-toolbar .input-group {
3296 .btn-toolbar
> .btn,
3297 .btn-toolbar
> .btn-group,
3298 .btn-toolbar
> .input-group {
3301 .btn-group
> .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
3304 .btn-group
> .btn:first-child {
3307 .btn-group
> .btn:first-child:not(:last-child):not(.dropdown-toggle) {
3308 border-top-right-radius:
0;
3309 border-bottom-right-radius:
0;
3311 .btn-group
> .btn:last-child:not(:first-child),
3312 .btn-group
> .dropdown-toggle:not(:first-child) {
3313 border-top-left-radius:
0;
3314 border-bottom-left-radius:
0;
3316 .btn-group
> .btn-group {
3319 .btn-group
> .btn-group:not(:first-child):not(:last-child)
> .btn {
3322 .btn-group
> .btn-group:first-child
> .btn:last-child,
3323 .btn-group
> .btn-group:first-child
> .dropdown-toggle {
3324 border-top-right-radius:
0;
3325 border-bottom-right-radius:
0;
3327 .btn-group
> .btn-group:last-child
> .btn:first-child {
3328 border-top-left-radius:
0;
3329 border-bottom-left-radius:
0;
3331 .btn-group .dropdown-toggle:active,
3332 .btn-group.open .dropdown-toggle {
3335 .btn-group
> .btn + .dropdown-toggle {
3339 .btn-group
> .btn-lg + .dropdown-toggle {
3340 padding-right:
12px;
3343 .btn-group.open .dropdown-toggle {
3344 -webkit-box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
3345 box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
3347 .btn-group.open .dropdown-toggle.btn-link {
3348 -webkit-box-shadow: none;
3355 border-width:
5px
5px
0;
3356 border-bottom-width:
0;
3358 .dropup .btn-lg .caret {
3359 border-width:
0 5px
5px;
3361 .btn-group-vertical
> .btn,
3362 .btn-group-vertical
> .btn-group,
3363 .btn-group-vertical
> .btn-group
> .btn {
3369 .btn-group-vertical
> .btn-group
> .btn {
3372 .btn-group-vertical
> .btn + .btn,
3373 .btn-group-vertical
> .btn + .btn-group,
3374 .btn-group-vertical
> .btn-group + .btn,
3375 .btn-group-vertical
> .btn-group + .btn-group {
3379 .btn-group-vertical
> .btn:not(:first-child):not(:last-child) {
3382 .btn-group-vertical
> .btn:first-child:not(:last-child) {
3383 border-top-right-radius:
4px;
3384 border-bottom-right-radius:
0;
3385 border-bottom-left-radius:
0;
3387 .btn-group-vertical
> .btn:last-child:not(:first-child) {
3388 border-top-left-radius:
0;
3389 border-top-right-radius:
0;
3390 border-bottom-left-radius:
4px;
3392 .btn-group-vertical
> .btn-group:not(:first-child):not(:last-child)
> .btn {
3395 .btn-group-vertical
> .btn-group:first-child:not(:last-child)
> .btn:last-child,
3396 .btn-group-vertical
> .btn-group:first-child:not(:last-child)
> .dropdown-toggle {
3397 border-bottom-right-radius:
0;
3398 border-bottom-left-radius:
0;
3400 .btn-group-vertical
> .btn-group:last-child:not(:first-child)
> .btn:first-child {
3401 border-top-left-radius:
0;
3402 border-top-right-radius:
0;
3404 .btn-group-justified {
3407 table-layout: fixed;
3408 border-collapse: separate;
3410 .btn-group-justified
> .btn,
3411 .btn-group-justified
> .btn-group {
3412 display: table-cell;
3416 .btn-group-justified
> .btn-group .btn {
3419 .btn-group-justified
> .btn-group .dropdown-menu {
3422 [
data-toggle="buttons"]
> .btn
> input[
type="radio"],
3423 [
data-toggle="buttons"]
> .btn
> input[
type="checkbox"] {
3426 filter: alpha(opacity=
0);
3432 border-collapse: separate;
3434 .input-group[class*="col-"] {
3439 .input-group .form-control {
3446 .input-group-lg
> .form-control,
3447 .input-group-lg
> .input-group-addon,
3448 .input-group-lg
> .input-group-btn
> .btn {
3455 select.input-group-lg
> .form-control,
3456 select.input-group-lg
> .input-group-addon,
3457 select.input-group-lg
> .input-group-btn
> .btn {
3461 textarea.input-group-lg
> .form-control,
3462 textarea.input-group-lg
> .input-group-addon,
3463 textarea.input-group-lg
> .input-group-btn
> .btn,
3464 select[multiple].input-group-lg
> .form-control,
3465 select[multiple].input-group-lg
> .input-group-addon,
3466 select[multiple].input-group-lg
> .input-group-btn
> .btn {
3469 .input-group-sm
> .form-control,
3470 .input-group-sm
> .input-group-addon,
3471 .input-group-sm
> .input-group-btn
> .btn {
3478 select.input-group-sm
> .form-control,
3479 select.input-group-sm
> .input-group-addon,
3480 select.input-group-sm
> .input-group-btn
> .btn {
3484 textarea.input-group-sm
> .form-control,
3485 textarea.input-group-sm
> .input-group-addon,
3486 textarea.input-group-sm
> .input-group-btn
> .btn,
3487 select[multiple].input-group-sm
> .form-control,
3488 select[multiple].input-group-sm
> .input-group-addon,
3489 select[multiple].input-group-sm
> .input-group-btn
> .btn {
3494 .input-group .form-control {
3495 display: table-cell;
3497 .input-group-addon:not(:first-child):not(:last-child),
3498 .input-group-btn:not(:first-child):not(:last-child),
3499 .input-group .form-control:not(:first-child):not(:last-child) {
3505 white-space: nowrap;
3506 vertical-align: middle;
3508 .input-group-addon {
3511 font-weight: normal;
3515 background-color: #eee;
3516 border:
1px solid #ccc;
3519 .input-group-addon.input-sm {
3524 .input-group-addon.input-lg {
3529 .input-group-addon input[
type="radio"],
3530 .input-group-addon input[
type="checkbox"] {
3533 .input-group .form-control:first-child,
3534 .input-group-addon:first-child,
3535 .input-group-btn:first-child
> .btn,
3536 .input-group-btn:first-child
> .btn-group
> .btn,
3537 .input-group-btn:first-child
> .dropdown-toggle,
3538 .input-group-btn:last-child
> .btn:not(:last-child):not(.dropdown-toggle),
3539 .input-group-btn:last-child
> .btn-group:not(:last-child)
> .btn {
3540 border-top-right-radius:
0;
3541 border-bottom-right-radius:
0;
3543 .input-group-addon:first-child {
3546 .input-group .form-control:last-child,
3547 .input-group-addon:last-child,
3548 .input-group-btn:last-child
> .btn,
3549 .input-group-btn:last-child
> .btn-group
> .btn,
3550 .input-group-btn:last-child
> .dropdown-toggle,
3551 .input-group-btn:first-child
> .btn:not(:first-child),
3552 .input-group-btn:first-child
> .btn-group:not(:first-child)
> .btn {
3553 border-top-left-radius:
0;
3554 border-bottom-left-radius:
0;
3556 .input-group-addon:last-child {
3562 white-space: nowrap;
3564 .input-group-btn
> .btn {
3567 .input-group-btn
> .btn + .btn {
3570 .input-group-btn
> .btn:hover,
3571 .input-group-btn
> .btn:focus,
3572 .input-group-btn
> .btn:active {
3575 .input-group-btn:first-child
> .btn,
3576 .input-group-btn:first-child
> .btn-group {
3579 .input-group-btn:last-child
> .btn,
3580 .input-group-btn:last-child
> .btn-group {
3597 .nav
> li
> a:hover,
3598 .nav
> li
> a:focus {
3599 text-decoration: none;
3600 background-color: #eee;
3602 .nav
> li.disabled
> a {
3605 .nav
> li.disabled
> a:hover,
3606 .nav
> li.disabled
> a:focus {
3608 text-decoration: none;
3609 cursor: not-allowed;
3610 background-color: transparent;
3613 .nav .open
> a:hover,
3614 .nav .open
> a:focus {
3615 background-color: #eee;
3616 border-color: #
428bca;
3622 background-color: #e5e5e5;
3624 .nav
> li
> a
> img {
3628 border-bottom:
1px solid #ddd;
3632 margin-bottom: -
1px;
3634 .nav-tabs
> li
> a {
3636 line-height:
1.42857143;
3637 border:
1px solid transparent;
3638 border-radius:
4px
4px
0 0;
3640 .nav-tabs
> li
> a:hover {
3641 border-color: #eee #eee #ddd;
3643 .nav-tabs
> li.active
> a,
3644 .nav-tabs
> li.active
> a:hover,
3645 .nav-tabs
> li.active
> a:focus {
3648 background-color: #fff;
3649 border:
1px solid #ddd;
3650 border-bottom-color: transparent;
3652 .nav-tabs.nav-justified {
3656 .nav-tabs.nav-justified
> li {
3659 .nav-tabs.nav-justified
> li
> a {
3663 .nav-tabs.nav-justified
> .dropdown .dropdown-menu {
3667 @media (min-width:
768px) {
3668 .nav-tabs.nav-justified
> li {
3669 display: table-cell;
3672 .nav-tabs.nav-justified
> li
> a {
3676 .nav-tabs.nav-justified
> li
> a {
3680 .nav-tabs.nav-justified
> .active
> a,
3681 .nav-tabs.nav-justified
> .active
> a:hover,
3682 .nav-tabs.nav-justified
> .active
> a:focus {
3683 border:
1px solid #ddd;
3685 @media (min-width:
768px) {
3686 .nav-tabs.nav-justified
> li
> a {
3687 border-bottom:
1px solid #ddd;
3688 border-radius:
4px
4px
0 0;
3690 .nav-tabs.nav-justified
> .active
> a,
3691 .nav-tabs.nav-justified
> .active
> a:hover,
3692 .nav-tabs.nav-justified
> .active
> a:focus {
3693 border-bottom-color: #fff;
3699 .nav-pills
> li
> a {
3702 .nav-pills
> li + li {
3705 .nav-pills
> li.active
> a,
3706 .nav-pills
> li.active
> a:hover,
3707 .nav-pills
> li.active
> a:focus {
3709 background-color: #
428bca;
3714 .nav-stacked
> li + li {
3721 .nav-justified
> li {
3724 .nav-justified
> li
> a {
3728 .nav-justified
> .dropdown .dropdown-menu {
3732 @media (min-width:
768px) {
3733 .nav-justified
> li {
3734 display: table-cell;
3737 .nav-justified
> li
> a {
3741 .nav-tabs-justified {
3744 .nav-tabs-justified
> li
> a {
3748 .nav-tabs-justified
> .active
> a,
3749 .nav-tabs-justified
> .active
> a:hover,
3750 .nav-tabs-justified
> .active
> a:focus {
3751 border:
1px solid #ddd;
3753 @media (min-width:
768px) {
3754 .nav-tabs-justified
> li
> a {
3755 border-bottom:
1px solid #ddd;
3756 border-radius:
4px
4px
0 0;
3758 .nav-tabs-justified
> .active
> a,
3759 .nav-tabs-justified
> .active
> a:hover,
3760 .nav-tabs-justified
> .active
> a:focus {
3761 border-bottom-color: #fff;
3764 .tab-content
> .tab-pane {
3767 .tab-content
> .active {
3770 .nav-tabs .dropdown-menu {
3772 border-top-left-radius:
0;
3773 border-top-right-radius:
0;
3778 margin-bottom:
20px;
3779 border:
1px solid transparent;
3781 @media (min-width:
768px) {
3786 @media (min-width:
768px) {
3792 padding-right:
15px;
3794 overflow-x: visible;
3795 -webkit-overflow-scrolling: touch;
3796 border-top:
1px solid transparent;
3797 -webkit-box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1);
3798 box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1);
3800 .navbar-collapse.in {
3803 @media (min-width:
768px) {
3807 -webkit-box-shadow: none;
3810 .navbar-collapse.collapse {
3811 display: block !important;
3812 height: auto !important;
3814 overflow: visible !important;
3816 .navbar-collapse.in {
3817 overflow-y: visible;
3819 .navbar-fixed-top .navbar-collapse,
3820 .navbar-static-top .navbar-collapse,
3821 .navbar-fixed-bottom .navbar-collapse {
3826 .navbar-fixed-top .navbar-collapse,
3827 .navbar-fixed-bottom .navbar-collapse {
3830 @media (max-width:
480px) and (orientation: landscape) {
3831 .navbar-fixed-top .navbar-collapse,
3832 .navbar-fixed-bottom .navbar-collapse {
3836 .container
> .navbar-header,
3837 .container-fluid
> .navbar-header,
3838 .container
> .navbar-collapse,
3839 .container-fluid
> .navbar-collapse {
3840 margin-right: -
15px;
3843 @media (min-width:
768px) {
3844 .container
> .navbar-header,
3845 .container-fluid
> .navbar-header,
3846 .container
> .navbar-collapse,
3847 .container-fluid
> .navbar-collapse {
3852 .navbar-static-top {
3854 border-width:
0 0 1px;
3856 @media (min-width:
768px) {
3857 .navbar-static-top {
3862 .navbar-fixed-bottom {
3867 -webkit-transform: translate3d(
0,
0,
0);
3868 -o-transform: translate3d(
0,
0,
0);
3869 transform: translate3d(
0,
0,
0);
3871 @media (min-width:
768px) {
3873 .navbar-fixed-bottom {
3879 border-width:
0 0 1px;
3881 .navbar-fixed-bottom {
3884 border-width:
1px
0 0;
3893 .navbar-brand:hover,
3894 .navbar-brand:focus {
3895 text-decoration: none;
3897 @media (min-width:
768px) {
3898 .navbar
> .container .navbar-brand,
3899 .navbar
> .container-fluid .navbar-brand {
3910 background-color: transparent;
3911 background-image: none;
3912 border:
1px solid transparent;
3915 .navbar-toggle:focus {
3918 .navbar-toggle .icon-bar {
3924 .navbar-toggle .icon-bar + .icon-bar {
3927 @media (min-width:
768px) {
3933 margin:
7.5px -
15px;
3935 .navbar-nav
> li
> a {
3937 padding-bottom:
10px;
3940 @media (max-width:
767px) {
3941 .navbar-nav .open .dropdown-menu {
3946 background-color: transparent;
3948 -webkit-box-shadow: none;
3951 .navbar-nav .open .dropdown-menu
> li
> a,
3952 .navbar-nav .open .dropdown-menu .dropdown-header {
3953 padding:
5px
15px
5px
25px;
3955 .navbar-nav .open .dropdown-menu
> li
> a {
3958 .navbar-nav .open .dropdown-menu
> li
> a:hover,
3959 .navbar-nav .open .dropdown-menu
> li
> a:focus {
3960 background-image: none;
3963 @media (min-width:
768px) {
3971 .navbar-nav
> li
> a {
3973 padding-bottom:
15px;
3975 .navbar-nav.navbar-right:last-child {
3976 margin-right: -
15px;
3979 @media (min-width:
768px) {
3981 float: left !important;
3984 float: right !important;
3990 margin-right: -
15px;
3993 border-top:
1px solid transparent;
3994 border-bottom:
1px solid transparent;
3995 -webkit-box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1),
0 1px
0 rgba(
255,
255,
255,
.1);
3996 box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1),
0 1px
0 rgba(
255,
255,
255,
.1);
3998 @media (min-width:
768px) {
3999 .navbar-form .form-group {
4000 display: inline-block;
4002 vertical-align: middle;
4004 .navbar-form .form-control {
4005 display: inline-block;
4007 vertical-align: middle;
4009 .navbar-form .input-group {
4010 display: inline-table;
4011 vertical-align: middle;
4013 .navbar-form .input-group .input-group-addon,
4014 .navbar-form .input-group .input-group-btn,
4015 .navbar-form .input-group .form-control {
4018 .navbar-form .input-group
> .form-control {
4021 .navbar-form .control-label {
4023 vertical-align: middle;
4025 .navbar-form .radio,
4026 .navbar-form .checkbox {
4027 display: inline-block;
4030 vertical-align: middle;
4032 .navbar-form .radio label,
4033 .navbar-form .checkbox label {
4036 .navbar-form .radio input[
type="radio"],
4037 .navbar-form .checkbox input[
type="checkbox"] {
4041 .navbar-form .has-feedback .form-control-feedback {
4045 @media (max-width:
767px) {
4046 .navbar-form .form-group {
4050 @media (min-width:
768px) {
4058 -webkit-box-shadow: none;
4061 .navbar-form.navbar-right:last-child {
4062 margin-right: -
15px;
4065 .navbar-nav
> li
> .dropdown-menu {
4067 border-top-left-radius:
0;
4068 border-top-right-radius:
0;
4070 .navbar-fixed-bottom .navbar-nav
> li
> .dropdown-menu {
4071 border-bottom-right-radius:
0;
4072 border-bottom-left-radius:
0;
4078 .navbar-btn.btn-sm {
4080 margin-bottom:
10px;
4082 .navbar-btn.btn-xs {
4084 margin-bottom:
14px;
4088 margin-bottom:
15px;
4090 @media (min-width:
768px) {
4096 .navbar-text.navbar-right:last-child {
4101 background-color: #f8f8f8;
4102 border-color: #e7e7e7;
4104 .navbar-default .navbar-brand {
4107 .navbar-default .navbar-brand:hover,
4108 .navbar-default .navbar-brand:focus {
4110 background-color: transparent;
4112 .navbar-default .navbar-text {
4115 .navbar-default .navbar-nav
> li
> a {
4118 .navbar-default .navbar-nav
> li
> a:hover,
4119 .navbar-default .navbar-nav
> li
> a:focus {
4121 background-color: transparent;
4123 .navbar-default .navbar-nav
> .active
> a,
4124 .navbar-default .navbar-nav
> .active
> a:hover,
4125 .navbar-default .navbar-nav
> .active
> a:focus {
4127 background-color: #e7e7e7;
4129 .navbar-default .navbar-nav
> .disabled
> a,
4130 .navbar-default .navbar-nav
> .disabled
> a:hover,
4131 .navbar-default .navbar-nav
> .disabled
> a:focus {
4133 background-color: transparent;
4135 .navbar-default .navbar-toggle {
4138 .navbar-default .navbar-toggle:hover,
4139 .navbar-default .navbar-toggle:focus {
4140 background-color: #ddd;
4142 .navbar-default .navbar-toggle .icon-bar {
4143 background-color: #
888;
4145 .navbar-default .navbar-collapse,
4146 .navbar-default .navbar-form {
4147 border-color: #e7e7e7;
4149 .navbar-default .navbar-nav
> .open
> a,
4150 .navbar-default .navbar-nav
> .open
> a:hover,
4151 .navbar-default .navbar-nav
> .open
> a:focus {
4153 background-color: #e7e7e7;
4155 @media (max-width:
767px) {
4156 .navbar-default .navbar-nav .open .dropdown-menu
> li
> a {
4159 .navbar-default .navbar-nav .open .dropdown-menu
> li
> a:hover,
4160 .navbar-default .navbar-nav .open .dropdown-menu
> li
> a:focus {
4162 background-color: transparent;
4164 .navbar-default .navbar-nav .open .dropdown-menu
> .active
> a,
4165 .navbar-default .navbar-nav .open .dropdown-menu
> .active
> a:hover,
4166 .navbar-default .navbar-nav .open .dropdown-menu
> .active
> a:focus {
4168 background-color: #e7e7e7;
4170 .navbar-default .navbar-nav .open .dropdown-menu
> .disabled
> a,
4171 .navbar-default .navbar-nav .open .dropdown-menu
> .disabled
> a:hover,
4172 .navbar-default .navbar-nav .open .dropdown-menu
> .disabled
> a:focus {
4174 background-color: transparent;
4177 .navbar-default .navbar-link {
4180 .navbar-default .navbar-link:hover {
4183 .navbar-default .btn-link {
4186 .navbar-default .btn-link:hover,
4187 .navbar-default .btn-link:focus {
4190 .navbar-default .btn-link[disabled]:hover,
4191 fieldset[disabled] .navbar-default .btn-link:hover,
4192 .navbar-default .btn-link[disabled]:focus,
4193 fieldset[disabled] .navbar-default .btn-link:focus {
4197 background-color: #
222;
4198 border-color: #
080808;
4200 .navbar-inverse .navbar-brand {
4203 .navbar-inverse .navbar-brand:hover,
4204 .navbar-inverse .navbar-brand:focus {
4206 background-color: transparent;
4208 .navbar-inverse .navbar-text {
4211 .navbar-inverse .navbar-nav
> li
> a {
4214 .navbar-inverse .navbar-nav
> li
> a:hover,
4215 .navbar-inverse .navbar-nav
> li
> a:focus {
4217 background-color: transparent;
4219 .navbar-inverse .navbar-nav
> .active
> a,
4220 .navbar-inverse .navbar-nav
> .active
> a:hover,
4221 .navbar-inverse .navbar-nav
> .active
> a:focus {
4223 background-color: #
080808;
4225 .navbar-inverse .navbar-nav
> .disabled
> a,
4226 .navbar-inverse .navbar-nav
> .disabled
> a:hover,
4227 .navbar-inverse .navbar-nav
> .disabled
> a:focus {
4229 background-color: transparent;
4231 .navbar-inverse .navbar-toggle {
4234 .navbar-inverse .navbar-toggle:hover,
4235 .navbar-inverse .navbar-toggle:focus {
4236 background-color: #
333;
4238 .navbar-inverse .navbar-toggle .icon-bar {
4239 background-color: #fff;
4241 .navbar-inverse .navbar-collapse,
4242 .navbar-inverse .navbar-form {
4243 border-color: #
101010;
4245 .navbar-inverse .navbar-nav
> .open
> a,
4246 .navbar-inverse .navbar-nav
> .open
> a:hover,
4247 .navbar-inverse .navbar-nav
> .open
> a:focus {
4249 background-color: #
080808;
4251 @media (max-width:
767px) {
4252 .navbar-inverse .navbar-nav .open .dropdown-menu
> .dropdown-header {
4253 border-color: #
080808;
4255 .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
4256 background-color: #
080808;
4258 .navbar-inverse .navbar-nav .open .dropdown-menu
> li
> a {
4261 .navbar-inverse .navbar-nav .open .dropdown-menu
> li
> a:hover,
4262 .navbar-inverse .navbar-nav .open .dropdown-menu
> li
> a:focus {
4264 background-color: transparent;
4266 .navbar-inverse .navbar-nav .open .dropdown-menu
> .active
> a,
4267 .navbar-inverse .navbar-nav .open .dropdown-menu
> .active
> a:hover,
4268 .navbar-inverse .navbar-nav .open .dropdown-menu
> .active
> a:focus {
4270 background-color: #
080808;
4272 .navbar-inverse .navbar-nav .open .dropdown-menu
> .disabled
> a,
4273 .navbar-inverse .navbar-nav .open .dropdown-menu
> .disabled
> a:hover,
4274 .navbar-inverse .navbar-nav .open .dropdown-menu
> .disabled
> a:focus {
4276 background-color: transparent;
4279 .navbar-inverse .navbar-link {
4282 .navbar-inverse .navbar-link:hover {
4285 .navbar-inverse .btn-link {
4288 .navbar-inverse .btn-link:hover,
4289 .navbar-inverse .btn-link:focus {
4292 .navbar-inverse .btn-link[disabled]:hover,
4293 fieldset[disabled] .navbar-inverse .btn-link:hover,
4294 .navbar-inverse .btn-link[disabled]:focus,
4295 fieldset[disabled] .navbar-inverse .btn-link:focus {
4300 margin-bottom:
20px;
4302 background-color: #f5f5f5;
4306 display: inline-block;
4308 .breadcrumb
> li + li:before {
4313 .breadcrumb
> .active {
4317 display: inline-block;
4325 .pagination
> li
> a,
4326 .pagination
> li
> span {
4331 line-height:
1.42857143;
4333 text-decoration: none;
4334 background-color: #fff;
4335 border:
1px solid #ddd;
4337 .pagination
> li:first-child
> a,
4338 .pagination
> li:first-child
> span {
4340 border-top-left-radius:
4px;
4341 border-bottom-left-radius:
4px;
4343 .pagination
> li:last-child
> a,
4344 .pagination
> li:last-child
> span {
4345 border-top-right-radius:
4px;
4346 border-bottom-right-radius:
4px;
4348 .pagination
> li
> a:hover,
4349 .pagination
> li
> span:hover,
4350 .pagination
> li
> a:focus,
4351 .pagination
> li
> span:focus {
4353 background-color: #eee;
4356 .pagination
> .active
> a,
4357 .pagination
> .active
> span,
4358 .pagination
> .active
> a:hover,
4359 .pagination
> .active
> span:hover,
4360 .pagination
> .active
> a:focus,
4361 .pagination
> .active
> span:focus {
4365 background-color: #
428bca;
4366 border-color: #
428bca;
4368 .pagination
> .disabled
> span,
4369 .pagination
> .disabled
> span:hover,
4370 .pagination
> .disabled
> span:focus,
4371 .pagination
> .disabled
> a,
4372 .pagination
> .disabled
> a:hover,
4373 .pagination
> .disabled
> a:focus {
4375 cursor: not-allowed;
4376 background-color: #fff;
4379 .pagination-lg
> li
> a,
4380 .pagination-lg
> li
> span {
4384 .pagination-lg
> li:first-child
> a,
4385 .pagination-lg
> li:first-child
> span {
4386 border-top-left-radius:
6px;
4387 border-bottom-left-radius:
6px;
4389 .pagination-lg
> li:last-child
> a,
4390 .pagination-lg
> li:last-child
> span {
4391 border-top-right-radius:
6px;
4392 border-bottom-right-radius:
6px;
4394 .pagination-sm
> li
> a,
4395 .pagination-sm
> li
> span {
4399 .pagination-sm
> li:first-child
> a,
4400 .pagination-sm
> li:first-child
> span {
4401 border-top-left-radius:
3px;
4402 border-bottom-left-radius:
3px;
4404 .pagination-sm
> li:last-child
> a,
4405 .pagination-sm
> li:last-child
> span {
4406 border-top-right-radius:
3px;
4407 border-bottom-right-radius:
3px;
4420 display: inline-block;
4422 background-color: #fff;
4423 border:
1px solid #ddd;
4424 border-radius:
15px;
4426 .pager li
> a:hover,
4427 .pager li
> a:focus {
4428 text-decoration: none;
4429 background-color: #eee;
4432 .pager .next
> span {
4435 .pager .previous
> a,
4436 .pager .previous
> span {
4439 .pager .disabled
> a,
4440 .pager .disabled
> a:hover,
4441 .pager .disabled
> a:focus,
4442 .pager .disabled
> span {
4444 cursor: not-allowed;
4445 background-color: #fff;
4449 padding:
.2em
.6em
.3em;
4455 white-space: nowrap;
4456 vertical-align: baseline;
4457 border-radius:
.25em;
4462 text-decoration: none;
4473 background-color: #
777;
4475 .label-default[href]:hover,
4476 .label-default[href]:focus {
4477 background-color: #
5e5e5e;
4480 background-color: #
428bca;
4482 .label-primary[href]:hover,
4483 .label-primary[href]:focus {
4484 background-color: #
3071a9;
4487 background-color: #
5cb85c;
4489 .label-success[href]:hover,
4490 .label-success[href]:focus {
4491 background-color: #
449d44;
4494 background-color: #
5bc0de;
4496 .label-info[href]:hover,
4497 .label-info[href]:focus {
4498 background-color: #
31b0d5;
4501 background-color: #f0ad4e;
4503 .label-warning[href]:hover,
4504 .label-warning[href]:focus {
4505 background-color: #ec971f;
4508 background-color: #d9534f;
4510 .label-danger[href]:hover,
4511 .label-danger[href]:focus {
4512 background-color: #c9302c;
4515 display: inline-block;
4523 white-space: nowrap;
4524 vertical-align: baseline;
4525 background-color: #
777;
4526 border-radius:
10px;
4542 text-decoration: none;
4545 a.list-group-item.active
> .badge,
4546 .nav-pills
> .active
> a
> .badge {
4548 background-color: #fff;
4550 .nav-pills
> li
> a
> .badge {
4555 margin-bottom:
30px;
4557 background-color: #eee;
4564 margin-bottom:
15px;
4569 border-top-color: #d5d5d5;
4571 .container .jumbotron {
4574 .jumbotron .container {
4577 @media screen and (min-width:
768px) {
4580 padding-bottom:
48px;
4582 .container .jumbotron {
4583 padding-right:
60px;
4594 margin-bottom:
20px;
4595 line-height:
1.42857143;
4596 background-color: #fff;
4597 border:
1px solid #ddd;
4599 -webkit-transition: all
.2s ease-in-out;
4600 -o-transition: all
.2s ease-in-out;
4601 transition: all
.2s ease-in-out;
4604 .thumbnail a
> img {
4610 a.thumbnail.active {
4611 border-color: #
428bca;
4613 .thumbnail .caption {
4619 margin-bottom:
20px;
4620 border:
1px solid transparent;
4627 .alert .alert-link {
4638 .alert-dismissible {
4639 padding-right:
35px;
4641 .alert-dismissable .close,
4642 .alert-dismissible .close {
4650 background-color: #dff0d8;
4651 border-color: #d6e9c6;
4654 border-top-color: #c9e2b3;
4656 .alert-success .alert-link {
4661 background-color: #d9edf7;
4662 border-color: #bce8f1;
4665 border-top-color: #a6e1ec;
4667 .alert-info .alert-link {
4672 background-color: #fcf8e3;
4673 border-color: #faebcc;
4676 border-top-color: #f7e1b5;
4678 .alert-warning .alert-link {
4683 background-color: #f2dede;
4684 border-color: #ebccd1;
4687 border-top-color: #e4b9c0;
4689 .alert-danger .alert-link {
4692 @-webkit-keyframes progress-bar-stripes {
4694 background-position:
40px
0;
4697 background-position:
0 0;
4700 @-o-keyframes progress-bar-stripes {
4702 background-position:
40px
0;
4705 background-position:
0 0;
4708 @keyframes progress-bar-stripes {
4710 background-position:
40px
0;
4713 background-position:
0 0;
4718 margin-bottom:
20px;
4720 background-color: #f5f5f5;
4722 -webkit-box-shadow: inset
0 1px
2px rgba(
0,
0,
0,
.1);
4723 box-shadow: inset
0 1px
2px rgba(
0,
0,
0,
.1);
4733 background-color: #
428bca;
4734 -webkit-box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.15);
4735 box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.15);
4736 -webkit-transition: width
.6s ease;
4737 -o-transition: width
.6s ease;
4738 transition: width
.6s ease;
4740 .progress-striped .progress-bar,
4741 .progress-bar-striped {
4742 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4743 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4744 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4745 -webkit-background-size:
40px
40px;
4746 background-size:
40px
40px;
4748 .progress.active .progress-bar,
4749 .progress-bar.active {
4750 -webkit-animation: progress-bar-stripes
2s linear infinite;
4751 -o-animation: progress-bar-stripes
2s linear infinite;
4752 animation: progress-bar-stripes
2s linear infinite;
4754 .progress-bar[
aria-valuenow="
1"],
4755 .progress-bar[
aria-valuenow="
2"] {
4758 .progress-bar[
aria-valuenow="
0"] {
4761 background-color: transparent;
4762 background-image: none;
4763 -webkit-box-shadow: none;
4766 .progress-bar-success {
4767 background-color: #
5cb85c;
4769 .progress-striped .progress-bar-success {
4770 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4771 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4772 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4774 .progress-bar-info {
4775 background-color: #
5bc0de;
4777 .progress-striped .progress-bar-info {
4778 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4779 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4780 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4782 .progress-bar-warning {
4783 background-color: #f0ad4e;
4785 .progress-striped .progress-bar-warning {
4786 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4787 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4788 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4790 .progress-bar-danger {
4791 background-color: #d9534f;
4793 .progress-striped .progress-bar-danger {
4794 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4795 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4796 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4807 .media:first-child {
4816 .media
> .pull-left {
4819 .media
> .pull-right {
4828 margin-bottom:
20px;
4834 margin-bottom: -
1px;
4835 background-color: #fff;
4836 border:
1px solid #ddd;
4838 .list-group-item:first-child {
4839 border-top-left-radius:
4px;
4840 border-top-right-radius:
4px;
4842 .list-group-item:last-child {
4844 border-bottom-right-radius:
4px;
4845 border-bottom-left-radius:
4px;
4847 .list-group-item
> .badge {
4850 .list-group-item
> .badge + .badge {
4856 a.list-group-item .list-group-item-heading {
4859 a.list-group-item:hover,
4860 a.list-group-item:focus {
4862 text-decoration: none;
4863 background-color: #f5f5f5;
4865 .list-group-item.disabled,
4866 .list-group-item.disabled:hover,
4867 .list-group-item.disabled:focus {
4869 background-color: #eee;
4871 .list-group-item.disabled .list-group-item-heading,
4872 .list-group-item.disabled:hover .list-group-item-heading,
4873 .list-group-item.disabled:focus .list-group-item-heading {
4876 .list-group-item.disabled .list-group-item-text,
4877 .list-group-item.disabled:hover .list-group-item-text,
4878 .list-group-item.disabled:focus .list-group-item-text {
4881 .list-group-item.active,
4882 .list-group-item.active:hover,
4883 .list-group-item.active:focus {
4886 background-color: #
428bca;
4887 border-color: #
428bca;
4889 .list-group-item.active .list-group-item-heading,
4890 .list-group-item.active:hover .list-group-item-heading,
4891 .list-group-item.active:focus .list-group-item-heading,
4892 .list-group-item.active .list-group-item-heading
> small,
4893 .list-group-item.active:hover .list-group-item-heading
> small,
4894 .list-group-item.active:focus .list-group-item-heading
> small,
4895 .list-group-item.active .list-group-item-heading
> .small,
4896 .list-group-item.active:hover .list-group-item-heading
> .small,
4897 .list-group-item.active:focus .list-group-item-heading
> .small {
4900 .list-group-item.active .list-group-item-text,
4901 .list-group-item.active:hover .list-group-item-text,
4902 .list-group-item.active:focus .list-group-item-text {
4905 .list-group-item-success {
4907 background-color: #dff0d8;
4909 a.list-group-item-success {
4912 a.list-group-item-success .list-group-item-heading {
4915 a.list-group-item-success:hover,
4916 a.list-group-item-success:focus {
4918 background-color: #d0e9c6;
4920 a.list-group-item-success.active,
4921 a.list-group-item-success.active:hover,
4922 a.list-group-item-success.active:focus {
4924 background-color: #
3c763d;
4925 border-color: #
3c763d;
4927 .list-group-item-info {
4929 background-color: #d9edf7;
4931 a.list-group-item-info {
4934 a.list-group-item-info .list-group-item-heading {
4937 a.list-group-item-info:hover,
4938 a.list-group-item-info:focus {
4940 background-color: #c4e3f3;
4942 a.list-group-item-info.active,
4943 a.list-group-item-info.active:hover,
4944 a.list-group-item-info.active:focus {
4946 background-color: #
31708f;
4947 border-color: #
31708f;
4949 .list-group-item-warning {
4951 background-color: #fcf8e3;
4953 a.list-group-item-warning {
4956 a.list-group-item-warning .list-group-item-heading {
4959 a.list-group-item-warning:hover,
4960 a.list-group-item-warning:focus {
4962 background-color: #faf2cc;
4964 a.list-group-item-warning.active,
4965 a.list-group-item-warning.active:hover,
4966 a.list-group-item-warning.active:focus {
4968 background-color: #
8a6d3b;
4969 border-color: #
8a6d3b;
4971 .list-group-item-danger {
4973 background-color: #f2dede;
4975 a.list-group-item-danger {
4978 a.list-group-item-danger .list-group-item-heading {
4981 a.list-group-item-danger:hover,
4982 a.list-group-item-danger:focus {
4984 background-color: #ebcccc;
4986 a.list-group-item-danger.active,
4987 a.list-group-item-danger.active:hover,
4988 a.list-group-item-danger.active:focus {
4990 background-color: #a94442;
4991 border-color: #a94442;
4993 .list-group-item-heading {
4997 .list-group-item-text {
5002 margin-bottom:
20px;
5003 background-color: #fff;
5004 border:
1px solid transparent;
5006 -webkit-box-shadow:
0 1px
1px rgba(
0,
0,
0,
.05);
5007 box-shadow:
0 1px
1px rgba(
0,
0,
0,
.05);
5014 border-bottom:
1px solid transparent;
5015 border-top-left-radius:
3px;
5016 border-top-right-radius:
3px;
5018 .panel-heading
> .dropdown .dropdown-toggle {
5032 background-color: #f5f5f5;
5033 border-top:
1px solid #ddd;
5034 border-bottom-right-radius:
3px;
5035 border-bottom-left-radius:
3px;
5037 .panel
> .list-group {
5040 .panel
> .list-group .list-group-item {
5041 border-width:
1px
0;
5044 .panel
> .list-group:first-child .list-group-item:first-child {
5046 border-top-left-radius:
3px;
5047 border-top-right-radius:
3px;
5049 .panel
> .list-group:last-child .list-group-item:last-child {
5051 border-bottom-right-radius:
3px;
5052 border-bottom-left-radius:
3px;
5054 .panel-heading + .list-group .list-group-item:first-child {
5055 border-top-width:
0;
5057 .list-group + .panel-footer {
5058 border-top-width:
0;
5061 .panel
> .table-responsive
> .table,
5062 .panel
> .panel-collapse
> .table {
5065 .panel
> .table:first-child,
5066 .panel
> .table-responsive:first-child
> .table:first-child {
5067 border-top-left-radius:
3px;
5068 border-top-right-radius:
3px;
5070 .panel
> .table:first-child
> thead:first-child
> tr:first-child td:first-child,
5071 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child td:first-child,
5072 .panel
> .table:first-child
> tbody:first-child
> tr:first-child td:first-child,
5073 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child td:first-child,
5074 .panel
> .table:first-child
> thead:first-child
> tr:first-child th:first-child,
5075 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child th:first-child,
5076 .panel
> .table:first-child
> tbody:first-child
> tr:first-child th:first-child,
5077 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child th:first-child {
5078 border-top-left-radius:
3px;
5080 .panel
> .table:first-child
> thead:first-child
> tr:first-child td:last-child,
5081 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child td:last-child,
5082 .panel
> .table:first-child
> tbody:first-child
> tr:first-child td:last-child,
5083 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child td:last-child,
5084 .panel
> .table:first-child
> thead:first-child
> tr:first-child th:last-child,
5085 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child th:last-child,
5086 .panel
> .table:first-child
> tbody:first-child
> tr:first-child th:last-child,
5087 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child th:last-child {
5088 border-top-right-radius:
3px;
5090 .panel
> .table:last-child,
5091 .panel
> .table-responsive:last-child
> .table:last-child {
5092 border-bottom-right-radius:
3px;
5093 border-bottom-left-radius:
3px;
5095 .panel
> .table:last-child
> tbody:last-child
> tr:last-child td:first-child,
5096 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child td:first-child,
5097 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child td:first-child,
5098 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child td:first-child,
5099 .panel
> .table:last-child
> tbody:last-child
> tr:last-child th:first-child,
5100 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child th:first-child,
5101 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child th:first-child,
5102 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child th:first-child {
5103 border-bottom-left-radius:
3px;
5105 .panel
> .table:last-child
> tbody:last-child
> tr:last-child td:last-child,
5106 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child td:last-child,
5107 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child td:last-child,
5108 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child td:last-child,
5109 .panel
> .table:last-child
> tbody:last-child
> tr:last-child th:last-child,
5110 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child th:last-child,
5111 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child th:last-child,
5112 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child th:last-child {
5113 border-bottom-right-radius:
3px;
5115 .panel
> .panel-body + .table,
5116 .panel
> .panel-body + .table-responsive {
5117 border-top:
1px solid #ddd;
5119 .panel
> .table
> tbody:first-child
> tr:first-child th,
5120 .panel
> .table
> tbody:first-child
> tr:first-child td {
5123 .panel
> .table-bordered,
5124 .panel
> .table-responsive
> .table-bordered {
5127 .panel
> .table-bordered
> thead
> tr
> th:first-child,
5128 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> th:first-child,
5129 .panel
> .table-bordered
> tbody
> tr
> th:first-child,
5130 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> th:first-child,
5131 .panel
> .table-bordered
> tfoot
> tr
> th:first-child,
5132 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> th:first-child,
5133 .panel
> .table-bordered
> thead
> tr
> td:first-child,
5134 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> td:first-child,
5135 .panel
> .table-bordered
> tbody
> tr
> td:first-child,
5136 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> td:first-child,
5137 .panel
> .table-bordered
> tfoot
> tr
> td:first-child,
5138 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> td:first-child {
5141 .panel
> .table-bordered
> thead
> tr
> th:last-child,
5142 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> th:last-child,
5143 .panel
> .table-bordered
> tbody
> tr
> th:last-child,
5144 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> th:last-child,
5145 .panel
> .table-bordered
> tfoot
> tr
> th:last-child,
5146 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> th:last-child,
5147 .panel
> .table-bordered
> thead
> tr
> td:last-child,
5148 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> td:last-child,
5149 .panel
> .table-bordered
> tbody
> tr
> td:last-child,
5150 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> td:last-child,
5151 .panel
> .table-bordered
> tfoot
> tr
> td:last-child,
5152 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> td:last-child {
5155 .panel
> .table-bordered
> thead
> tr:first-child
> td,
5156 .panel
> .table-responsive
> .table-bordered
> thead
> tr:first-child
> td,
5157 .panel
> .table-bordered
> tbody
> tr:first-child
> td,
5158 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:first-child
> td,
5159 .panel
> .table-bordered
> thead
> tr:first-child
> th,
5160 .panel
> .table-responsive
> .table-bordered
> thead
> tr:first-child
> th,
5161 .panel
> .table-bordered
> tbody
> tr:first-child
> th,
5162 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:first-child
> th {
5165 .panel
> .table-bordered
> tbody
> tr:last-child
> td,
5166 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:last-child
> td,
5167 .panel
> .table-bordered
> tfoot
> tr:last-child
> td,
5168 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> td,
5169 .panel
> .table-bordered
> tbody
> tr:last-child
> th,
5170 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:last-child
> th,
5171 .panel
> .table-bordered
> tfoot
> tr:last-child
> th,
5172 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> th {
5175 .panel
> .table-responsive {
5180 margin-bottom:
20px;
5182 .panel-group .panel {
5186 .panel-group .panel + .panel {
5189 .panel-group .panel-heading {
5192 .panel-group .panel-heading + .panel-collapse
> .panel-body {
5193 border-top:
1px solid #ddd;
5195 .panel-group .panel-footer {
5198 .panel-group .panel-footer + .panel-collapse .panel-body {
5199 border-bottom:
1px solid #ddd;
5204 .panel-default
> .panel-heading {
5206 background-color: #f5f5f5;
5209 .panel-default
> .panel-heading + .panel-collapse
> .panel-body {
5210 border-top-color: #ddd;
5212 .panel-default
> .panel-heading .badge {
5214 background-color: #
333;
5216 .panel-default
> .panel-footer + .panel-collapse
> .panel-body {
5217 border-bottom-color: #ddd;
5220 border-color: #
428bca;
5222 .panel-primary
> .panel-heading {
5224 background-color: #
428bca;
5225 border-color: #
428bca;
5227 .panel-primary
> .panel-heading + .panel-collapse
> .panel-body {
5228 border-top-color: #
428bca;
5230 .panel-primary
> .panel-heading .badge {
5232 background-color: #fff;
5234 .panel-primary
> .panel-footer + .panel-collapse
> .panel-body {
5235 border-bottom-color: #
428bca;
5238 border-color: #d6e9c6;
5240 .panel-success
> .panel-heading {
5242 background-color: #dff0d8;
5243 border-color: #d6e9c6;
5245 .panel-success
> .panel-heading + .panel-collapse
> .panel-body {
5246 border-top-color: #d6e9c6;
5248 .panel-success
> .panel-heading .badge {
5250 background-color: #
3c763d;
5252 .panel-success
> .panel-footer + .panel-collapse
> .panel-body {
5253 border-bottom-color: #d6e9c6;
5256 border-color: #bce8f1;
5258 .panel-info
> .panel-heading {
5260 background-color: #d9edf7;
5261 border-color: #bce8f1;
5263 .panel-info
> .panel-heading + .panel-collapse
> .panel-body {
5264 border-top-color: #bce8f1;
5266 .panel-info
> .panel-heading .badge {
5268 background-color: #
31708f;
5270 .panel-info
> .panel-footer + .panel-collapse
> .panel-body {
5271 border-bottom-color: #bce8f1;
5274 border-color: #faebcc;
5276 .panel-warning
> .panel-heading {
5278 background-color: #fcf8e3;
5279 border-color: #faebcc;
5281 .panel-warning
> .panel-heading + .panel-collapse
> .panel-body {
5282 border-top-color: #faebcc;
5284 .panel-warning
> .panel-heading .badge {
5286 background-color: #
8a6d3b;
5288 .panel-warning
> .panel-footer + .panel-collapse
> .panel-body {
5289 border-bottom-color: #faebcc;
5292 border-color: #ebccd1;
5294 .panel-danger
> .panel-heading {
5296 background-color: #f2dede;
5297 border-color: #ebccd1;
5299 .panel-danger
> .panel-heading + .panel-collapse
> .panel-body {
5300 border-top-color: #ebccd1;
5302 .panel-danger
> .panel-heading .badge {
5304 background-color: #a94442;
5306 .panel-danger
> .panel-footer + .panel-collapse
> .panel-body {
5307 border-bottom-color: #ebccd1;
5316 .embed-responsive .embed-responsive-item,
5317 .embed-responsive iframe,
5318 .embed-responsive embed,
5319 .embed-responsive object {
5328 .embed-responsive.embed-responsive-
16by9 {
5329 padding-bottom:
56.25%;
5331 .embed-responsive.embed-responsive-
4by3 {
5332 padding-bottom:
75%;
5337 margin-bottom:
20px;
5338 background-color: #f5f5f5;
5339 border:
1px solid #e3e3e3;
5341 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.05);
5342 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.05);
5346 border-color: rgba(
0,
0,
0,
.15);
5362 text-shadow:
0 1px
0 #fff;
5363 filter: alpha(opacity=
20);
5369 text-decoration: none;
5371 filter: alpha(opacity=
50);
5375 -webkit-appearance: none;
5378 background: transparent;
5393 -webkit-overflow-scrolling: touch;
5396 .modal.fade .modal-dialog {
5397 -webkit-transition: -webkit-transform
.3s ease-out;
5398 -o-transition: -o-transform
.3s ease-out;
5399 transition: transform
.3s ease-out;
5400 -webkit-transform: translate3d(
0, -
25%,
0);
5401 -o-transform: translate3d(
0, -
25%,
0);
5402 transform: translate3d(
0, -
25%,
0);
5404 .modal.in .modal-dialog {
5405 -webkit-transform: translate3d(
0,
0,
0);
5406 -o-transform: translate3d(
0,
0,
0);
5407 transform: translate3d(
0,
0,
0);
5409 .modal-open .modal {
5420 background-color: #fff;
5421 -webkit-background-clip: padding-box;
5422 background-clip: padding-box;
5423 border:
1px solid #
999;
5424 border:
1px solid rgba(
0,
0,
0,
.2);
5427 -webkit-box-shadow:
0 3px
9px rgba(
0,
0,
0,
.5);
5428 box-shadow:
0 3px
9px rgba(
0,
0,
0,
.5);
5437 background-color: #
000;
5439 .modal-backdrop.fade {
5440 filter: alpha(opacity=
0);
5443 .modal-backdrop.in {
5444 filter: alpha(opacity=
50);
5448 min-height:
16.42857143px;
5450 border-bottom:
1px solid #e5e5e5;
5452 .modal-header .close {
5457 line-height:
1.42857143;
5466 border-top:
1px solid #e5e5e5;
5468 .modal-footer .btn + .btn {
5472 .modal-footer .btn-group .btn + .btn {
5475 .modal-footer .btn-block + .btn-block {
5478 .modal-scrollbar-measure {
5485 @media (min-width:
768px) {
5491 -webkit-box-shadow:
0 5px
15px rgba(
0,
0,
0,
.5);
5492 box-shadow:
0 5px
15px rgba(
0,
0,
0,
.5);
5498 @media (min-width:
992px) {
5509 visibility: visible;
5510 filter: alpha(opacity=
0);
5514 filter: alpha(opacity=
90);
5538 text-decoration: none;
5539 background-color: #
000;
5546 border-color: transparent;
5547 border-style: solid;
5549 .tooltip.top .tooltip-arrow {
5553 border-width:
5px
5px
0;
5554 border-top-color: #
000;
5556 .tooltip.top-left .tooltip-arrow {
5559 border-width:
5px
5px
0;
5560 border-top-color: #
000;
5562 .tooltip.top-right .tooltip-arrow {
5565 border-width:
5px
5px
0;
5566 border-top-color: #
000;
5568 .tooltip.right .tooltip-arrow {
5572 border-width:
5px
5px
5px
0;
5573 border-right-color: #
000;
5575 .tooltip.left .tooltip-arrow {
5579 border-width:
5px
0 5px
5px;
5580 border-left-color: #
000;
5582 .tooltip.bottom .tooltip-arrow {
5586 border-width:
0 5px
5px;
5587 border-bottom-color: #
000;
5589 .tooltip.bottom-left .tooltip-arrow {
5592 border-width:
0 5px
5px;
5593 border-bottom-color: #
000;
5595 .tooltip.bottom-right .tooltip-arrow {
5598 border-width:
0 5px
5px;
5599 border-bottom-color: #
000;
5610 white-space: normal;
5611 background-color: #fff;
5612 -webkit-background-clip: padding-box;
5613 background-clip: padding-box;
5614 border:
1px solid #ccc;
5615 border:
1px solid rgba(
0,
0,
0,
.2);
5617 -webkit-box-shadow:
0 5px
10px rgba(
0,
0,
0,
.2);
5618 box-shadow:
0 5px
10px rgba(
0,
0,
0,
.2);
5636 font-weight: normal;
5638 background-color: #f7f7f7;
5639 border-bottom:
1px solid #ebebeb;
5640 border-radius:
5px
5px
0 0;
5646 .popover
> .arrow:after {
5651 border-color: transparent;
5652 border-style: solid;
5657 .popover
> .arrow:after {
5661 .popover.top
> .arrow {
5665 border-top-color: #
999;
5666 border-top-color: rgba(
0,
0,
0,
.25);
5667 border-bottom-width:
0;
5669 .popover.top
> .arrow:after {
5673 border-top-color: #fff;
5674 border-bottom-width:
0;
5676 .popover.right
> .arrow {
5680 border-right-color: #
999;
5681 border-right-color: rgba(
0,
0,
0,
.25);
5682 border-left-width:
0;
5684 .popover.right
> .arrow:after {
5688 border-right-color: #fff;
5689 border-left-width:
0;
5691 .popover.bottom
> .arrow {
5695 border-top-width:
0;
5696 border-bottom-color: #
999;
5697 border-bottom-color: rgba(
0,
0,
0,
.25);
5699 .popover.bottom
> .arrow:after {
5703 border-top-width:
0;
5704 border-bottom-color: #fff;
5706 .popover.left
> .arrow {
5710 border-right-width:
0;
5711 border-left-color: #
999;
5712 border-left-color: rgba(
0,
0,
0,
.25);
5714 .popover.left
> .arrow:after {
5718 border-right-width:
0;
5719 border-left-color: #fff;
5729 .carousel-inner
> .item {
5732 -webkit-transition:
.6s ease-in-out left;
5733 -o-transition:
.6s ease-in-out left;
5734 transition:
.6s ease-in-out left;
5736 .carousel-inner
> .item
> img,
5737 .carousel-inner
> .item
> a
> img {
5740 .carousel-inner
> .active,
5741 .carousel-inner
> .next,
5742 .carousel-inner
> .prev {
5745 .carousel-inner
> .active {
5748 .carousel-inner
> .next,
5749 .carousel-inner
> .prev {
5754 .carousel-inner
> .next {
5757 .carousel-inner
> .prev {
5760 .carousel-inner
> .next.left,
5761 .carousel-inner
> .prev.right {
5764 .carousel-inner
> .active.left {
5767 .carousel-inner
> .active.right {
5779 text-shadow:
0 1px
2px rgba(
0,
0,
0,
.6);
5780 filter: alpha(opacity=
50);
5783 .carousel-control.left {
5784 background-image: -webkit-linear-gradient(left, rgba(
0,
0,
0,
.5)
0%, rgba(
0,
0,
0,
.0001)
100%);
5785 background-image: -o-linear-gradient(left, rgba(
0,
0,
0,
.5)
0%, rgba(
0,
0,
0,
.0001)
100%);
5786 background-image: -webkit-gradient(linear, left top, right top, from(rgba(
0,
0,
0,
.5)), to(rgba(
0,
0,
0,
.0001)));
5787 background-image: linear-gradient(to right, rgba(
0,
0,
0,
.5)
0%, rgba(
0,
0,
0,
.0001)
100%);
5788 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#
80000000', endColorstr='#
00000000', GradientType=
1);
5789 background-repeat: repeat-x;
5791 .carousel-control.right {
5794 background-image: -webkit-linear-gradient(left, rgba(
0,
0,
0,
.0001)
0%, rgba(
0,
0,
0,
.5)
100%);
5795 background-image: -o-linear-gradient(left, rgba(
0,
0,
0,
.0001)
0%, rgba(
0,
0,
0,
.5)
100%);
5796 background-image: -webkit-gradient(linear, left top, right top, from(rgba(
0,
0,
0,
.0001)), to(rgba(
0,
0,
0,
.5)));
5797 background-image: linear-gradient(to right, rgba(
0,
0,
0,
.0001)
0%, rgba(
0,
0,
0,
.5)
100%);
5798 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#
00000000', endColorstr='#
80000000', GradientType=
1);
5799 background-repeat: repeat-x;
5801 .carousel-control:hover,
5802 .carousel-control:focus {
5804 text-decoration: none;
5805 filter: alpha(opacity=
90);
5809 .carousel-control .icon-prev,
5810 .carousel-control .icon-next,
5811 .carousel-control .glyphicon-chevron-left,
5812 .carousel-control .glyphicon-chevron-right {
5816 display: inline-block;
5818 .carousel-control .icon-prev,
5819 .carousel-control .glyphicon-chevron-left {
5823 .carousel-control .icon-next,
5824 .carousel-control .glyphicon-chevron-right {
5826 margin-right: -
10px;
5828 .carousel-control .icon-prev,
5829 .carousel-control .icon-next {
5835 .carousel-control .icon-prev:before {
5838 .carousel-control .icon-next:before {
5841 .carousel-indicators {
5852 .carousel-indicators li {
5853 display: inline-block;
5857 text-indent: -
999px;
5859 background-color: #
000 \
9;
5860 background-color: rgba(
0,
0,
0,
0);
5861 border:
1px solid #fff;
5862 border-radius:
10px;
5864 .carousel-indicators .active {
5868 background-color: #fff;
5877 padding-bottom:
20px;
5880 text-shadow:
0 1px
2px rgba(
0,
0,
0,
.6);
5882 .carousel-caption .btn {
5885 @media screen and (min-width:
768px) {
5886 .carousel-control .glyphicon-chevron-left,
5887 .carousel-control .glyphicon-chevron-right,
5888 .carousel-control .icon-prev,
5889 .carousel-control .icon-next {
5895 .carousel-control .glyphicon-chevron-left,
5896 .carousel-control .icon-prev {
5899 .carousel-control .glyphicon-chevron-right,
5900 .carousel-control .icon-next {
5901 margin-right: -
15px;
5906 padding-bottom:
30px;
5908 .carousel-indicators {
5914 .dl-horizontal dd:before,
5915 .dl-horizontal dd:after,
5918 .container-fluid:before,
5919 .container-fluid:after,
5922 .form-horizontal .form-group:before,
5923 .form-horizontal .form-group:after,
5924 .btn-toolbar:before,
5926 .btn-group-vertical
> .btn-group:before,
5927 .btn-group-vertical
> .btn-group:after,
5932 .navbar-header:before,
5933 .navbar-header:after,
5934 .navbar-collapse:before,
5935 .navbar-collapse:after,
5940 .modal-footer:before,
5941 .modal-footer:after {
5946 .dl-horizontal dd:after,
5948 .container-fluid:after,
5950 .form-horizontal .form-group:after,
5952 .btn-group-vertical
> .btn-group:after,
5955 .navbar-header:after,
5956 .navbar-collapse:after,
5959 .modal-footer:after {
5968 float: right !important;
5971 float: left !important;
5974 display: none !important;
5977 display: block !important;
5986 background-color: transparent;
5990 display: none !important;
5991 visibility: hidden !important;
5995 -webkit-transform: translate3d(
0,
0,
0);
5996 -o-transform: translate3d(
0,
0,
0);
5997 transform: translate3d(
0,
0,
0);
6000 width: device-width;
6006 display: none !important;
6010 .visible-xs-inline-block,
6013 .visible-sm-inline-block,
6016 .visible-md-inline-block,
6019 .visible-lg-inline-block {
6020 display: none !important;
6022 @media (max-width:
767px) {
6024 display: block !important;
6030 display: table-row !important;
6034 display: table-cell !important;
6037 @media (max-width:
767px) {
6039 display: block !important;
6042 @media (max-width:
767px) {
6043 .visible-xs-inline {
6044 display: inline !important;
6047 @media (max-width:
767px) {
6048 .visible-xs-inline-block {
6049 display: inline-block !important;
6052 @media (min-width:
768px) and (max-width:
991px) {
6054 display: block !important;
6060 display: table-row !important;
6064 display: table-cell !important;
6067 @media (min-width:
768px) and (max-width:
991px) {
6069 display: block !important;
6072 @media (min-width:
768px) and (max-width:
991px) {
6073 .visible-sm-inline {
6074 display: inline !important;
6077 @media (min-width:
768px) and (max-width:
991px) {
6078 .visible-sm-inline-block {
6079 display: inline-block !important;
6082 @media (min-width:
992px) and (max-width:
1199px) {
6084 display: block !important;
6090 display: table-row !important;
6094 display: table-cell !important;
6097 @media (min-width:
992px) and (max-width:
1199px) {
6099 display: block !important;
6102 @media (min-width:
992px) and (max-width:
1199px) {
6103 .visible-md-inline {
6104 display: inline !important;
6107 @media (min-width:
992px) and (max-width:
1199px) {
6108 .visible-md-inline-block {
6109 display: inline-block !important;
6112 @media (min-width:
1200px) {
6114 display: block !important;
6120 display: table-row !important;
6124 display: table-cell !important;
6127 @media (min-width:
1200px) {
6129 display: block !important;
6132 @media (min-width:
1200px) {
6133 .visible-lg-inline {
6134 display: inline !important;
6137 @media (min-width:
1200px) {
6138 .visible-lg-inline-block {
6139 display: inline-block !important;
6142 @media (max-width:
767px) {
6144 display: none !important;
6147 @media (min-width:
768px) and (max-width:
991px) {
6149 display: none !important;
6152 @media (min-width:
992px) and (max-width:
1199px) {
6154 display: none !important;
6157 @media (min-width:
1200px) {
6159 display: none !important;
6163 display: none !important;
6167 display: block !important;
6169 table.visible-print {
6173 display: table-row !important;
6177 display: table-cell !important;
6180 .visible-print-block {
6181 display: none !important;
6184 .visible-print-block {
6185 display: block !important;
6188 .visible-print-inline {
6189 display: none !important;
6192 .visible-print-inline {
6193 display: inline !important;
6196 .visible-print-inline-block {
6197 display: none !important;
6200 .visible-print-inline-block {
6201 display: inline-block !important;
6206 display: none !important;
6209 /*# sourceMappingURL=bootstrap.css.map */
6211 <meta content=
"Mnemonic code for generating deterministic keys" name=
"description"/>
6212 <meta content=
"width=device-width, initial-scale=1.0" name=
"viewport" />
6213 <meta content=
"bitcoin mnemonic converter" name=
"description" />
6214 <meta content=
"DC POS" name=
"author" />
6218 padding-bottom:
32px;
6220 .form-control[readonly] {
6223 .feedback-container {
6233 background-color: orange;
6237 border:
2px solid #
555;
6239 border-bottom-left-radius:
20px
20px;
6240 border-bottom-right-radius:
20px
20px;
6245 <div class=
"container">
6247 <h1 class=
"text-center">Mnemonic Code Converter
</h1>
6250 <div class=
"col-md-12">
6252 <form class=
"form-horizontal" role=
"form">
6253 <div class=
"col-sm-2"></div>
6254 <div class=
"col-sm-10">
6255 <p>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum)
</p>
6256 <p>For more info see the
<a href=
"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target=
"_blank">BIP39 spec
</a></p>
6258 <div class=
"form-group">
6259 <label for=
"network-phrase" class=
"col-sm-2 control-label">Coin
</label>
6260 <div class=
"col-sm-10">
6261 <select id=
"network-phrase" class=
"network form-control">
6262 <option value=
"bitcoin">Bitcoin
</option>
6263 <option value=
"bitcoin-testnet">Bitcoin Testnet
</option>
6264 <option value=
"litecoin">Litecoin
</option>
6265 <option value=
"dogecoin">Dogecoin
</option>
6269 <div class=
"form-group">
6270 <label for=
"phrase" class=
"col-sm-2 control-label">BIP39 Mnemonic
</label>
6271 <div class=
"col-sm-10">
6272 <textarea id=
"phrase" class=
"phrase form-control"></textarea>
6275 <div class=
"form-group">
6276 <label for=
"strength" class=
"col-sm-2 control-label">Number of words
</label>
6277 <div class=
"col-sm-10">
6278 <div class=
"input-group">
6279 <input type=
"number" class=
"strength form-control" id=
"strength" value=
"12">
6280 <span class=
"input-group-btn">
6281 <button class=
"btn generate">Generate Random Mnemonic
</button>
6286 <div class=
"form-group">
6287 <label for=
"passphrase" class=
"col-sm-2 control-label">BIP39 Passphrase (optional)
</label>
6288 <div class=
"col-sm-10">
6289 <textarea id=
"passphrase" class=
"passphrase form-control"></textarea>
6292 <div class=
"form-group">
6293 <label for=
"root-key" class=
"col-sm-2 control-label">BIP32 Root Key
</label>
6294 <div class=
"col-sm-10">
6295 <textarea id=
"root-key" class=
"root-key form-control" readonly=
"readonly"></textarea>
6305 <div class=
"col-md-12">
6306 <h2>Derivation Path
</h2>
6307 <ul class=
"derivation-type nav nav-tabs" role=
"tablist">
6308 <li id=
"bip44-tab" class=
"active">
6309 <a href=
"#bip44" role=
"tab" data-toggle=
"tab">BIP44
</a>
6312 <a href=
"#bip32" role=
"tab" data-toggle=
"tab">BIP32
</a>
6315 <div class=
"derivation-type tab-content">
6316 <div id=
"bip44" class=
"tab-pane active">
6317 <form class=
"form-horizontal" role=
"form">
6319 <div class=
"col-sm-2"></div>
6320 <div class=
"col-sm-10">
6321 <p>For more info see the
<a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target=
"_blank">BIP44 spec
</a></p>
6323 <div class=
"form-group">
6324 <label for=
"network-bip44" class=
"col-sm-2 control-label">Coin
</label>
6325 <div class=
"col-sm-10">
6326 <select id=
"network-bip44" class=
"network form-control">
6327 <option value=
"bitcoin">Bitcoin
</option>
6328 <option value=
"bitcoin-testnet">Bitcoin Testnet
</option>
6329 <option value=
"litecoin">Litecoin
</option>
6333 <div class=
"form-group">
6334 <label for=
"purpose" class=
"col-sm-2 control-label">
6335 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target=
"_blank">Purpose
</a>
6337 <div class=
"col-sm-10">
6338 <input id=
"purpose" type=
"text" class=
"purpose form-control" value=
"44">
6341 <div class=
"form-group">
6342 <label for=
"coin" class=
"col-sm-2 control-label">
6343 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target=
"_blank">Coin
</a>
6345 <div class=
"col-sm-10">
6346 <input id=
"coin" type=
"text" class=
"coin form-control" value=
"0">
6349 <div class=
"form-group">
6350 <label for=
"account" class=
"col-sm-2 control-label">
6351 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target=
"_blank">Account
</a>
6353 <div class=
"col-sm-10">
6354 <input id=
"account" type=
"text" class=
"account form-control" value=
"0">
6357 <div class=
"form-group">
6358 <label for=
"change" class=
"col-sm-2 control-label">
6359 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target=
"_blank">External / Internal
</a>
6361 <div class=
"col-sm-10">
6362 <input id=
"change" type=
"text" class=
"change form-control" value=
"0">
6365 <div class=
"form-group">
6366 <label for=
"bip44-path" class=
"col-sm-2 control-label">BIP32 Derivation Path
</label>
6367 <div class=
"col-sm-10">
6368 <input id=
"bip44-path" type=
"text" class=
"path form-control" value=
"m/44'/0'/0'/0" readonly=
"readonly">
6373 <div id=
"bip32" class=
"tab-pane">
6374 <form class=
"form-horizontal" role=
"form">
6376 <div class=
"col-sm-2"></div>
6377 <div class=
"col-sm-10">
6378 <p>For more info see the
<a href=
"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target=
"_blank">BIP32 spec
</a></p>
6380 <div class=
"form-group">
6381 <label for=
"bip32-path" class=
"col-sm-2 control-label">BIP32 Derivation Path
</label>
6382 <div class=
"col-sm-10">
6383 <input id=
"bip32-path" type=
"text" class=
"path form-control" value=
"m/0">
6389 <form class=
"form-horizontal" role=
"form">
6390 <div class=
"form-group">
6391 <label for=
"extended-priv-key" class=
"col-sm-2 control-label">BIP32 Extended Key
</label>
6392 <div class=
"col-sm-10">
6393 <textarea id=
"extended-priv-key" class=
"extended-priv-key form-control" readonly=
"readonly"></textarea>
6396 <div class=
"form-group">
6397 <label for=
"extended-pub-key" class=
"col-sm-2 control-label">BIP32 Extended Key (addresses only)
</label>
6398 <div class=
"col-sm-10">
6399 <textarea id=
"extended-pub-key" class=
"extended-pub-key form-control" readonly=
"readonly"></textarea>
6409 <div class=
"col-md-12">
6410 <h2>Derived Addresses
</h2>
6411 <p>Note these addreses are derived from the
<strong>BIP32 Extended Key
</strong></p>
6412 <div class=
"form-group">
6413 <label for=
"network-address-type" class=
"col-sm-2 control-label">Coin
</label>
6414 <div class=
"col-sm-10">
6415 <select id=
"network-address-type" class=
"network form-control">
6416 <option value=
"bitcoin">Bitcoin
</option>
6417 <option value=
"bitcoin-testnet">Bitcoin Testnet
</option>
6418 <option value=
"litecoin">Litecoin
</option>
6419 <option value=
"dogecoin">Dogecoin
</option>
6422 <table class=
"table table-striped">
6425 <div class=
"input-group">
6427 <button class=
"index-toggle">Toggle
</button>
6431 <div class=
"input-group">
6433 <button class=
"address-toggle">Toggle
</button>
6437 <div class=
"input-group">
6438 Private Key
6439 <button class=
"private-key-toggle">Toggle
</button>
6443 <tbody class=
"addresses">
6444 <tr><td> </td><td> </td><td> </td></tr>
6445 <tr><td> </td><td> </td><td> </td></tr>
6446 <tr><td> </td><td> </td><td> </td></tr>
6447 <tr><td> </td><td> </td><td> </td></tr>
6448 <tr><td> </td><td> </td><td> </td></tr>
6453 <span>Show next
</button>
6454 <input type=
"number" class=
"rows-to-add" value=
"20">
6455 <button class=
"more">Show
</button>
6460 <div class=
"col-md-12">
6462 <h3>BIP39
<span class=
"small">Mnemonic code for generating deterministic keys
</span></h3>
6465 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec
</a>
6467 <h3>BIP32
<span class=
"small">Hierarchical Deterministic Wallets
</span></h3>
6470 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target=
"_blank">official BIP32 spec
</a>
6472 <a href=
"http://bip32.org/" target=
"_blank">bip32.org
</a>
6474 <h3>BIP44
<span class=
"small">Multi-Account Hierarchy for Deterministic Wallets
</span></h3>
6477 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target=
"_blank">official BIP44 spec
</a>
6479 <h3>Private Keys
</h3>
6482 <a href=
"https://brainwallet.github.io/" target=
"_blank">brainwallet.org
</a>,
6483 but be careful - it can be easy to make mistakes if you
6484 don't know what you're doing
6492 <div class=
"col-md-12">
6494 <h2>Offline Usage
</h2>
6497 You can use this tool without having to be online.
6500 In your browser, select file save-as, and save this page
6504 Double-click that file to open it in a browser
6505 on any offline computer.
6508 Alternatively, download it from
6509 <a href=
"https://github.com/dcpos/bip39">
6510 https://github.com/dcpos/bip39
6519 <div class=
"col-md-12">
6521 <h2>This project is
100% open-source code
</h2>
6524 <span>Get the source code at -
</span>
6525 <a href=
"https://github.com/dcpos/bip39" target=
"_blank">
6526 https://github.com/dcpos/bip39
6533 <span>BitcoinJS -
</span>
6534 <a href=
"https://github.com/bitcoinjs/bitcoinjs-lib" target=
"_blank">
6535 https://github.com/bitcoinjs/bitcoinjs-lib
6540 <span>jsBIP39 -
</span>
6541 <a href=
"https://github.com/iancoleman/jsbip39" target=
"_blank">
6542 https://github.com/iancoleman/jsbip39
6547 <span>sjcl -
</span>
6548 <a href=
"https://github.com/bitwiseshiftleft/sjcl" target=
"_blank">
6549 https://github.com/bitwiseshiftleft/sjcl
6554 <span>jQuery -
</span>
6555 <a href=
"https://jquery.com/" target=
"_blank">
6561 <span>Twitter Bootstrap -
</span>
6562 <a href=
"http://getbootstrap.com/" target=
"_blank">
6563 http://getbootstrap.com/
6572 <div class=
"feedback-container">
6573 <div class=
"feedback">Loading...
</div>
6576 <script type=
"text/template" id=
"address-row-template">
6578 <td class=
"index"><span></span></td>
6579 <td class=
"address"><span></span></td>
6580 <td class=
"privkey"><span></span></td>
6585 * jQuery JavaScript Library v2.1
.1
6586 * http://jquery.com/
6588 * Includes Sizzle.js
6589 * http://sizzlejs.com/
6591 * Copyright
2005,
2014 jQuery Foundation, Inc. and other contributors
6592 * Released under the MIT license
6593 * http://jquery.org/license
6595 * Date:
2014-
05-
01T17:
11Z
6598 (function( global, factory ) {
6600 if ( typeof module === "object" && typeof module.exports === "object" ) {
6601 // For CommonJS and CommonJS-like environments where a proper window is present,
6602 // execute the factory and get jQuery
6603 // For environments that do not inherently posses a window with a document
6604 // (such as Node.js), expose a jQuery-making factory as module.exports
6605 // This accentuates the need for the creation of a real window
6606 // e.g. var jQuery = require("jquery")(window);
6607 // See ticket #
14549 for more info
6608 module.exports = global.document ?
6609 factory( global, true ) :
6611 if ( !w.document ) {
6612 throw new Error( "jQuery requires a window with a document" );
6614 return factory( w );
6620 // Pass this if window is not defined yet
6621 }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
6623 // Can't do this because several apps including ASP.NET trace
6624 // the stack via arguments.caller.callee and Firefox dies if
6625 // you try to trace through "use strict" call chains. (#
13335)
6626 // Support: Firefox
18+
6631 var slice = arr.slice;
6633 var concat = arr.concat;
6635 var push = arr.push;
6637 var indexOf = arr.indexOf;
6639 var class2type = {};
6641 var toString = class2type.toString;
6643 var hasOwn = class2type.hasOwnProperty;
6650 // Use the correct document accordingly with window argument (sandbox)
6651 document = window.document,
6655 // Define a local copy of jQuery
6656 jQuery = function( selector, context ) {
6657 // The jQuery object is actually just the init constructor 'enhanced'
6658 // Need init if jQuery is called (just allow error to be thrown if not included)
6659 return new jQuery.fn.init( selector, context );
6662 // Support: Android
<4.1
6663 // Make sure we trim BOM and NBSP
6664 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
6666 // Matches dashed string for camelizing
6667 rmsPrefix = /^-ms-/,
6668 rdashAlpha = /-([\da-z])/gi,
6670 // Used by jQuery.camelCase as callback to replace()
6671 fcamelCase = function( all, letter ) {
6672 return letter.toUpperCase();
6675 jQuery.fn = jQuery.prototype = {
6676 // The current version of jQuery being used
6679 constructor: jQuery,
6681 // Start with an empty selector
6684 // The default length of a jQuery object is
0
6687 toArray: function() {
6688 return slice.call( this );
6691 // Get the Nth element in the matched element set OR
6692 // Get the whole matched element set as a clean array
6693 get: function( num ) {
6694 return num != null ?
6696 // Return just the one element from the set
6697 ( num <
0 ? this[ num + this.length ] : this[ num ] ) :
6699 // Return all the elements in a clean array
6703 // Take an array of elements and push it onto the stack
6704 // (returning the new matched element set)
6705 pushStack: function( elems ) {
6707 // Build a new jQuery matched element set
6708 var ret = jQuery.merge( this.constructor(), elems );
6710 // Add the old object onto the stack (as a reference)
6711 ret.prevObject = this;
6712 ret.context = this.context;
6714 // Return the newly-formed element set
6718 // Execute a callback for every element in the matched set.
6719 // (You can seed the arguments with an array of args, but this is
6720 // only used internally.)
6721 each: function( callback, args ) {
6722 return jQuery.each( this, callback, args );
6725 map: function( callback ) {
6726 return this.pushStack( jQuery.map(this, function( elem, i ) {
6727 return callback.call( elem, i, elem );
6732 return this.pushStack( slice.apply( this, arguments ) );
6736 return this.eq(
0 );
6740 return this.eq( -
1 );
6744 var len = this.length,
6745 j = +i + ( i <
0 ? len :
0 );
6746 return this.pushStack( j
>=
0 && j < len ? [ this[j] ] : [] );
6750 return this.prevObject || this.constructor(null);
6753 // For internal use only.
6754 // Behaves like an Array's method, not like a jQuery method.
6760 jQuery.extend = jQuery.fn.extend = function() {
6761 var options, name, src, copy, copyIsArray, clone,
6762 target = arguments[
0] || {},
6764 length = arguments.length,
6767 // Handle a deep copy situation
6768 if ( typeof target === "boolean" ) {
6771 // skip the boolean and the target
6772 target = arguments[ i ] || {};
6776 // Handle case when target is a string or something (possible in deep copy)
6777 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
6781 // extend jQuery itself if only one argument is passed
6782 if ( i === length ) {
6787 for ( ; i < length; i++ ) {
6788 // Only deal with non-null/undefined values
6789 if ( (options = arguments[ i ]) != null ) {
6790 // Extend the base object
6791 for ( name in options ) {
6792 src = target[ name ];
6793 copy = options[ name ];
6795 // Prevent never-ending loop
6796 if ( target === copy ) {
6800 // Recurse if we're merging plain objects or arrays
6801 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
6802 if ( copyIsArray ) {
6803 copyIsArray = false;
6804 clone = src && jQuery.isArray(src) ? src : [];
6807 clone = src && jQuery.isPlainObject(src) ? src : {};
6810 // Never move original objects, clone them
6811 target[ name ] = jQuery.extend( deep, clone, copy );
6813 // Don't bring in undefined values
6814 } else if ( copy !== undefined ) {
6815 target[ name ] = copy;
6821 // Return the modified object
6826 // Unique for each copy of jQuery on the page
6827 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
6829 // Assume jQuery is ready without the ready module
6832 error: function( msg ) {
6833 throw new Error( msg );
6836 noop: function() {},
6838 // See test/unit/core.js for details concerning isFunction.
6839 // Since version
1.3, DOM methods and functions like alert
6840 // aren't supported. They return false on IE (#
2968).
6841 isFunction: function( obj ) {
6842 return jQuery.type(obj) === "function";
6845 isArray: Array.isArray,
6847 isWindow: function( obj ) {
6848 return obj != null && obj === obj.window;
6851 isNumeric: function( obj ) {
6852 // parseFloat NaNs numeric-cast false positives (null|true|false|"")
6853 // ...but misinterprets leading-number strings, particularly hex literals ("
0x...")
6854 // subtraction forces infinities to NaN
6855 return !jQuery.isArray( obj ) && obj - parseFloat( obj )
>=
0;
6858 isPlainObject: function( obj ) {
6859 // Not plain objects:
6860 // - Any object or value whose internal [[Class]] property is not "[object Object]"
6863 if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
6867 if ( obj.constructor &&
6868 !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
6872 // If the function hasn't returned already, we're confident that
6873 // |obj| is a plain object, created by {} or constructed with new Object
6877 isEmptyObject: function( obj ) {
6879 for ( name in obj ) {
6885 type: function( obj ) {
6886 if ( obj == null ) {
6889 // Support: Android <
4.0, iOS <
6 (functionish RegExp)
6890 return typeof obj === "object" || typeof obj === "function" ?
6891 class2type[ toString.call(obj) ] || "object" :
6895 // Evaluates a script in a global context
6896 globalEval: function( code ) {
6900 code = jQuery.trim( code );
6903 // If the code includes a valid, prologue position
6904 // strict mode pragma, execute code by injecting a
6905 // script tag into the document.
6906 if ( code.indexOf("use strict") ===
1 ) {
6907 script = document.createElement("script");
6909 document.head.appendChild( script ).parentNode.removeChild( script );
6911 // Otherwise, avoid the DOM node creation, insertion
6912 // and removal by using an indirect global eval
6918 // Convert dashed to camelCase; used by the css and data modules
6919 // Microsoft forgot to hump their vendor prefix (#
9572)
6920 camelCase: function( string ) {
6921 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
6924 nodeName: function( elem, name ) {
6925 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
6928 // args is for internal usage only
6929 each: function( obj, callback, args ) {
6932 length = obj.length,
6933 isArray = isArraylike( obj );
6937 for ( ; i < length; i++ ) {
6938 value = callback.apply( obj[ i ], args );
6940 if ( value === false ) {
6946 value = callback.apply( obj[ i ], args );
6948 if ( value === false ) {
6954 // A special, fast, case for the most common use of each
6957 for ( ; i < length; i++ ) {
6958 value = callback.call( obj[ i ], i, obj[ i ] );
6960 if ( value === false ) {
6966 value = callback.call( obj[ i ], i, obj[ i ] );
6968 if ( value === false ) {
6978 // Support: Android
<4.1
6979 trim: function( text ) {
6980 return text == null ?
6982 ( text +
"" ).replace( rtrim,
"" );
6985 // results is for internal usage only
6986 makeArray: function( arr, results ) {
6987 var ret = results || [];
6989 if ( arr != null ) {
6990 if ( isArraylike( Object(arr) ) ) {
6992 typeof arr ===
"string" ?
6996 push.call( ret, arr );
7003 inArray: function( elem, arr, i ) {
7004 return arr == null ? -
1 : indexOf.call( arr, elem, i );
7007 merge: function( first, second ) {
7008 var len = +second.length,
7012 for ( ; j < len; j++ ) {
7013 first[ i++ ] = second[ j ];
7021 grep: function( elems, callback, invert ) {
7022 var callbackInverse,
7025 length = elems.length,
7026 callbackExpect = !invert;
7028 // Go through the array, only saving the items
7029 // that pass the validator function
7030 for ( ; i < length; i++ ) {
7031 callbackInverse = !callback( elems[ i ], i );
7032 if ( callbackInverse !== callbackExpect ) {
7033 matches.push( elems[ i ] );
7040 // arg is for internal usage only
7041 map: function( elems, callback, arg ) {
7044 length = elems.length,
7045 isArray = isArraylike( elems ),
7048 // Go through the array, translating each of the items to their new values
7050 for ( ; i < length; i++ ) {
7051 value = callback( elems[ i ], i, arg );
7053 if ( value != null ) {
7058 // Go through every key on the object,
7060 for ( i in elems ) {
7061 value = callback( elems[ i ], i, arg );
7063 if ( value != null ) {
7069 // Flatten any nested arrays
7070 return concat.apply( [], ret );
7073 // A global GUID counter for objects
7076 // Bind a function to a context, optionally partially applying any
7078 proxy: function( fn, context ) {
7079 var tmp, args, proxy;
7081 if ( typeof context ===
"string" ) {
7082 tmp = fn[ context ];
7087 // Quick check to determine if target is callable, in the spec
7088 // this throws a TypeError, but we will just return undefined.
7089 if ( !jQuery.isFunction( fn ) ) {
7094 args = slice.call( arguments,
2 );
7095 proxy = function() {
7096 return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
7099 // Set the guid of unique handler to the same of original handler, so it can be removed
7100 proxy.guid = fn.guid = fn.guid || jQuery.guid++;
7107 // jQuery.support is not used in Core but other projects attach their
7108 // properties to it so it needs to exist.
7112 // Populate the class2type map
7113 jQuery.each(
"Boolean Number String Function Array Date RegExp Object Error".split(
" "), function(i, name) {
7114 class2type[
"[object " + name +
"]" ] = name.toLowerCase();
7117 function isArraylike( obj ) {
7118 var length = obj.length,
7119 type = jQuery.type( obj );
7121 if ( type ===
"function" || jQuery.isWindow( obj ) ) {
7125 if ( obj.nodeType ===
1 && length ) {
7129 return type ===
"array" || length ===
0 ||
7130 typeof length ===
"number" && length
> 0 && ( length -
1 ) in obj;
7134 * Sizzle CSS Selector Engine v1.10
.19
7135 * http://sizzlejs.com/
7137 * Copyright
2013 jQuery Foundation, Inc. and other contributors
7138 * Released under the MIT license
7139 * http://jquery.org/license
7143 (function( window ) {
7157 // Local document vars
7167 // Instance-specific data
7168 expando =
"sizzle" + -(new Date()),
7169 preferredDoc = window.document,
7172 classCache = createCache(),
7173 tokenCache = createCache(),
7174 compilerCache = createCache(),
7175 sortOrder = function( a, b ) {
7177 hasDuplicate = true;
7182 // General-purpose constants
7183 strundefined = typeof undefined,
7184 MAX_NEGATIVE =
1 <<
31,
7187 hasOwn = ({}).hasOwnProperty,
7190 push_native = arr.push,
7193 // Use a stripped-down indexOf if we can't use a native one
7194 indexOf = arr.indexOf || function( elem ) {
7197 for ( ; i < len; i++ ) {
7198 if ( this[i] === elem ) {
7205 booleans =
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
7207 // Regular expressions
7209 // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
7210 whitespace =
"[\\x20\\t\\r\\n\\f]",
7211 // http://www.w3.org/TR/css3-syntax/#characters
7212 characterEncoding =
"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
7214 // Loosely modeled on CSS identifier characters
7215 // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
7216 // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
7217 identifier = characterEncoding.replace(
"w",
"w#" ),
7219 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
7220 attributes =
"\\[" + whitespace +
"*(" + characterEncoding +
")(?:" + whitespace +
7221 // Operator (capture
2)
7222 "*([*^$|!~]?=)" + whitespace +
7223 //
"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
7224 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\
"])*)\"|(
" + identifier + "))|)
" + whitespace +
7227 pseudos = ":(
" + characterEncoding + ")(?:\\((
" +
7228 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
7229 // 1. quoted (capture 3; capture 4 or capture 5)
7230 "('((?:\\\\.|[^\\\\'])*)'|\
"((?:\\\\.|[^\\\\\"])*)\
")|" +
7231 //
2. simple (capture
6)
7232 "((?:\\\\.|[^\\\\()[\\]]|" + attributes +
")*)|" +
7233 //
3. anything else (capture
2)
7237 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
7238 rtrim = new RegExp(
"^" + whitespace +
"+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace +
"+$",
"g" ),
7240 rcomma = new RegExp(
"^" + whitespace +
"*," + whitespace +
"*" ),
7241 rcombinators = new RegExp(
"^" + whitespace +
"*([>+~]|" + whitespace +
")" + whitespace +
"*" ),
7243 rattributeQuotes = new RegExp(
"=" + whitespace +
"*([^\\]'\"]*?)
" + whitespace + "*\\]
", "g
" ),
7245 rpseudo = new RegExp( pseudos ),
7246 ridentifier = new RegExp( "^
" + identifier + "$
" ),
7249 "ID
": new RegExp( "^#(
" + characterEncoding + ")
" ),
7250 "CLASS
": new RegExp( "^\\.(
" + characterEncoding + ")
" ),
7251 "TAG
": new RegExp( "^(
" + characterEncoding.replace( "w
", "w*
" ) + ")
" ),
7252 "ATTR
": new RegExp( "^
" + attributes ),
7253 "PSEUDO
": new RegExp( "^
" + pseudos ),
7254 "CHILD
": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(
" + whitespace +
7255 "*(even|odd|(([+-]|)(\\d*)n|)
" + whitespace + "*(?:([+-]|)
" + whitespace +
7256 "*(\\d+)|))
" + whitespace + "*\\)|)
", "i
" ),
7257 "bool
": new RegExp( "^(?:
" + booleans + ")$
", "i
" ),
7258 // For use in libraries implementing .is()
7259 // We use this for POS matching in `select`
7260 "needsContext
": new RegExp( "^
" + whitespace + "*[
>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
7261 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
7264 rinputs = /^(?:input|select|textarea|button)$/i,
7267 rnative = /^[^{]+\{\s*\[native \w/,
7269 // Easily-parseable/retrievable ID or TAG or CLASS selectors
7270 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
7275 // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
7276 runescape = new RegExp( "\\\\([\\da-f]{
1,
6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
7277 funescape = function( _, escaped, escapedWhitespace ) {
7278 var high = "
0x" + escaped -
0x10000;
7279 // NaN means non-codepoint
7280 // Support: Firefox
<24
7281 // Workaround erroneous numeric interpretation of +
"0x"
7282 return high !== high || escapedWhitespace ?
7286 String.fromCharCode( high +
0x10000 ) :
7287 // Supplemental Plane codepoint (surrogate pair)
7288 String.fromCharCode( high
>> 10 |
0xD800, high &
0x3FF |
0xDC00 );
7291 // Optimize for push.apply( _, NodeList )
7294 (arr = slice.call( preferredDoc.childNodes )),
7295 preferredDoc.childNodes
7297 // Support: Android
<4.0
7298 // Detect silently failing push.apply
7299 arr[ preferredDoc.childNodes.length ].nodeType;
7301 push = { apply: arr.length ?
7303 // Leverage slice if possible
7304 function( target, els ) {
7305 push_native.apply( target, slice.call(els) );
7309 // Otherwise append directly
7310 function( target, els ) {
7311 var j = target.length,
7313 // Can't trust NodeList.length
7314 while ( (target[j++] = els[i++]) ) {}
7315 target.length = j -
1;
7320 function Sizzle( selector, context, results, seed ) {
7321 var match, elem, m, nodeType,
7323 i, groups, old, nid, newContext, newSelector;
7325 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
7326 setDocument( context );
7329 context = context || document;
7330 results = results || [];
7332 if ( !selector || typeof selector !==
"string" ) {
7336 if ( (nodeType = context.nodeType) !==
1 && nodeType !==
9 ) {
7340 if ( documentIsHTML && !seed ) {
7343 if ( (match = rquickExpr.exec( selector )) ) {
7344 // Speed-up: Sizzle(
"#ID")
7345 if ( (m = match[
1]) ) {
7346 if ( nodeType ===
9 ) {
7347 elem = context.getElementById( m );
7348 // Check parentNode to catch when Blackberry
4.6 returns
7349 // nodes that are no longer in the document (jQuery #
6963)
7350 if ( elem && elem.parentNode ) {
7351 // Handle the case where IE, Opera, and Webkit return items
7352 // by name instead of ID
7353 if ( elem.id === m ) {
7354 results.push( elem );
7361 // Context is not a document
7362 if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
7363 contains( context, elem ) && elem.id === m ) {
7364 results.push( elem );
7369 // Speed-up: Sizzle(
"TAG")
7370 } else if ( match[
2] ) {
7371 push.apply( results, context.getElementsByTagName( selector ) );
7374 // Speed-up: Sizzle(
".CLASS")
7375 } else if ( (m = match[
3]) && support.getElementsByClassName && context.getElementsByClassName ) {
7376 push.apply( results, context.getElementsByClassName( m ) );
7382 if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
7383 nid = old = expando;
7384 newContext = context;
7385 newSelector = nodeType ===
9 && selector;
7387 // qSA works strangely on Element-rooted queries
7388 // We can work around this by specifying an extra ID on the root
7389 // and working up from there (Thanks to Andrew Dupont for the technique)
7390 // IE
8 doesn't work on object elements
7391 if ( nodeType ===
1 && context.nodeName.toLowerCase() !==
"object" ) {
7392 groups = tokenize( selector );
7394 if ( (old = context.getAttribute(
"id")) ) {
7395 nid = old.replace( rescape,
"\\$&" );
7397 context.setAttribute(
"id", nid );
7399 nid =
"[id='" + nid +
"'] ";
7403 groups[i] = nid + toSelector( groups[i] );
7405 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
7406 newSelector = groups.join(
",");
7409 if ( newSelector ) {
7411 push.apply( results,
7412 newContext.querySelectorAll( newSelector )
7418 context.removeAttribute(
"id");
7426 return select( selector.replace( rtrim,
"$1" ), context, results, seed );
7430 * Create key-value caches of limited size
7431 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
7432 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
7433 * deleting the oldest entry
7435 function createCache() {
7438 function cache( key, value ) {
7439 // Use (key +
" ") to avoid collision with native prototype properties (see Issue #
157)
7440 if ( keys.push( key +
" " )
> Expr.cacheLength ) {
7441 // Only keep the most recent entries
7442 delete cache[ keys.shift() ];
7444 return (cache[ key + " " ] = value);
7450 * Mark a function for special use by Sizzle
7451 * @param {Function} fn The function to mark
7453 function markFunction( fn ) {
7454 fn[ expando ] = true;
7459 * Support testing using an element
7460 * @param {Function} fn Passed the created div and expects a boolean result
7462 function assert( fn ) {
7463 var div = document.createElement("div");
7470 // Remove from its parent by default
7471 if ( div.parentNode ) {
7472 div.parentNode.removeChild( div );
7474 // release memory in IE
7480 * Adds the same handler for all of the specified attrs
7481 * @param {String} attrs Pipe-separated list of attributes
7482 * @param {Function} handler The method that will be applied
7484 function addHandle( attrs, handler ) {
7485 var arr = attrs.split("|"),
7489 Expr.attrHandle[ arr[i] ] = handler;
7494 * Checks document order of two siblings
7495 * @param {Element} a
7496 * @param {Element} b
7497 * @returns {Number} Returns less than
0 if a precedes b, greater than
0 if a follows b
7499 function siblingCheck( a, b ) {
7501 diff = cur && a.nodeType ===
1 && b.nodeType ===
1 &&
7502 ( ~b.sourceIndex || MAX_NEGATIVE ) -
7503 ( ~a.sourceIndex || MAX_NEGATIVE );
7505 // Use IE sourceIndex if available on both nodes
7510 // Check if b follows a
7512 while ( (cur = cur.nextSibling) ) {
7523 * Returns a function to use in pseudos for input types
7524 * @param {String} type
7526 function createInputPseudo( type ) {
7527 return function( elem ) {
7528 var name = elem.nodeName.toLowerCase();
7529 return name === "input" && elem.type === type;
7534 * Returns a function to use in pseudos for buttons
7535 * @param {String} type
7537 function createButtonPseudo( type ) {
7538 return function( elem ) {
7539 var name = elem.nodeName.toLowerCase();
7540 return (name === "input" || name === "button") && elem.type === type;
7545 * Returns a function to use in pseudos for positionals
7546 * @param {Function} fn
7548 function createPositionalPseudo( fn ) {
7549 return markFunction(function( argument ) {
7550 argument = +argument;
7551 return markFunction(function( seed, matches ) {
7553 matchIndexes = fn( [], seed.length, argument ),
7554 i = matchIndexes.length;
7556 // Match elements found at the specified indexes
7558 if ( seed[ (j = matchIndexes[i]) ] ) {
7559 seed[j] = !(matches[j] = seed[j]);
7567 * Checks a node for validity as a Sizzle context
7568 * @param {Element|Object=} context
7569 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
7571 function testContext( context ) {
7572 return context && typeof context.getElementsByTagName !== strundefined && context;
7575 // Expose support vars for convenience
7576 support = Sizzle.support = {};
7580 * @param {Element|Object} elem An element or a document
7581 * @returns {Boolean} True iff elem is a non-HTML XML node
7583 isXML = Sizzle.isXML = function( elem ) {
7584 // documentElement is verified for cases where it doesn't yet exist
7585 // (such as loading iframes in IE - #
4833)
7586 var documentElement = elem && (elem.ownerDocument || elem).documentElement;
7587 return documentElement ? documentElement.nodeName !== "HTML" : false;
7591 * Sets document-related variables once based on the current document
7592 * @param {Element|Object} [doc] An element or document object to use to set the document
7593 * @returns {Object} Returns the current document
7595 setDocument = Sizzle.setDocument = function( node ) {
7597 doc = node ? node.ownerDocument || node : preferredDoc,
7598 parent = doc.defaultView;
7600 // If no document and documentElement is available, return
7601 if ( doc === document || doc.nodeType !==
9 || !doc.documentElement ) {
7607 docElem = doc.documentElement;
7610 documentIsHTML = !isXML( doc );
7613 // If iframe document is assigned to
"document" variable and if iframe has been reloaded,
7614 // IE will throw
"permission denied" error when accessing
"document" variable, see jQuery #
13936
7615 // IE6-
8 do not support the defaultView property so parent will be undefined
7616 if ( parent && parent !== parent.top ) {
7617 // IE11 does not have attachEvent, so all must suffer
7618 if ( parent.addEventListener ) {
7619 parent.addEventListener(
"unload", function() {
7622 } else if ( parent.attachEvent ) {
7623 parent.attachEvent(
"onunload", function() {
7630 ---------------------------------------------------------------------- */
7633 // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
7634 support.attributes = assert(function( div ) {
7635 div.className =
"i";
7636 return !div.getAttribute(
"className");
7640 ---------------------------------------------------------------------- */
7642 // Check if getElementsByTagName(
"*") returns only elements
7643 support.getElementsByTagName = assert(function( div ) {
7644 div.appendChild( doc.createComment(
"") );
7645 return !div.getElementsByTagName(
"*").length;
7648 // Check if getElementsByClassName can be trusted
7649 support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
7650 div.innerHTML =
"<div class='a'></div><div class='a i'></div>";
7652 // Support: Safari
<4
7653 // Catch class over-caching
7654 div.firstChild.className =
"i";
7655 // Support: Opera
<10
7656 // Catch gEBCN failure to find non-leading classes
7657 return div.getElementsByClassName(
"i").length ===
2;
7661 // Check if getElementById returns elements by name
7662 // The broken getElementById methods don't pick up programatically-set names,
7663 // so use a roundabout getElementsByName test
7664 support.getById = assert(function( div ) {
7665 docElem.appendChild( div ).id = expando;
7666 return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
7669 // ID find and filter
7670 if ( support.getById ) {
7671 Expr.find[
"ID"] = function( id, context ) {
7672 if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
7673 var m = context.getElementById( id );
7674 // Check parentNode to catch when Blackberry
4.6 returns
7675 // nodes that are no longer in the document #
6963
7676 return m && m.parentNode ? [ m ] : [];
7679 Expr.filter[
"ID"] = function( id ) {
7680 var attrId = id.replace( runescape, funescape );
7681 return function( elem ) {
7682 return elem.getAttribute(
"id") === attrId;
7687 // getElementById is not reliable as a find shortcut
7688 delete Expr.find[
"ID"];
7690 Expr.filter[
"ID"] = function( id ) {
7691 var attrId = id.replace( runescape, funescape );
7692 return function( elem ) {
7693 var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(
"id");
7694 return node && node.value === attrId;
7700 Expr.find[
"TAG"] = support.getElementsByTagName ?
7701 function( tag, context ) {
7702 if ( typeof context.getElementsByTagName !== strundefined ) {
7703 return context.getElementsByTagName( tag );
7706 function( tag, context ) {
7710 results = context.getElementsByTagName( tag );
7712 // Filter out possible comments
7713 if ( tag ===
"*" ) {
7714 while ( (elem = results[i++]) ) {
7715 if ( elem.nodeType ===
1 ) {
7726 Expr.find[
"CLASS"] = support.getElementsByClassName && function( className, context ) {
7727 if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
7728 return context.getElementsByClassName( className );
7732 /* QSA/matchesSelector
7733 ---------------------------------------------------------------------- */
7735 // QSA and matchesSelector support
7737 // matchesSelector(:active) reports false when true (IE9/Opera
11.5)
7740 // qSa(:focus) reports false when true (Chrome
21)
7741 // We allow this because of a bug in IE8/
9 that throws an error
7742 // whenever `document.activeElement` is accessed on an iframe
7743 // So, we allow :focus to pass through QSA all the time to avoid the IE error
7744 // See http://bugs.jquery.com/ticket/
13378
7747 if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
7749 // Regex strategy adopted from Diego Perini
7750 assert(function( div ) {
7751 // Select is set to empty string on purpose
7752 // This is to test IE's treatment of not explicitly
7753 // setting a boolean content attribute,
7754 // since its presence should be enough
7755 // http://bugs.jquery.com/ticket/
12359
7756 div.innerHTML =
"<select msallowclip=''><option selected=''></option></select>";
7758 // Support: IE8, Opera
11-
12.16
7759 // Nothing should be selected when empty strings follow ^= or $= or *=
7760 // The test attribute must be unknown in Opera but
"safe" for WinRT
7761 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
7762 if ( div.querySelectorAll(
"[msallowclip^='']").length ) {
7763 rbuggyQSA.push(
"[*^$]=" + whitespace +
"*(?:''|\"\
")" );
7767 // Boolean attributes and
"value" are not treated correctly
7768 if ( !div.querySelectorAll(
"[selected]").length ) {
7769 rbuggyQSA.push(
"\\[" + whitespace +
"*(?:value|" + booleans +
")" );
7772 // Webkit/Opera - :checked should return selected option elements
7773 // http://www.w3.org/TR/
2011/REC-css3-selectors-
20110929/#checked
7774 // IE8 throws error here and will not see later tests
7775 if ( !div.querySelectorAll(
":checked").length ) {
7776 rbuggyQSA.push(
":checked");
7780 assert(function( div ) {
7781 // Support: Windows
8 Native Apps
7782 // The type and name attributes are restricted during .innerHTML assignment
7783 var input = doc.createElement(
"input");
7784 input.setAttribute(
"type",
"hidden" );
7785 div.appendChild( input ).setAttribute(
"name",
"D" );
7788 // Enforce case-sensitivity of name attribute
7789 if ( div.querySelectorAll(
"[name=d]").length ) {
7790 rbuggyQSA.push(
"name" + whitespace +
"*[*^$|!~]?=" );
7793 // FF
3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
7794 // IE8 throws error here and will not see later tests
7795 if ( !div.querySelectorAll(
":enabled").length ) {
7796 rbuggyQSA.push(
":enabled",
":disabled" );
7799 // Opera
10-
11 does not throw on post-comma invalid pseudos
7800 div.querySelectorAll(
"*,:x");
7801 rbuggyQSA.push(
",.*:");
7805 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
7806 docElem.webkitMatchesSelector ||
7807 docElem.mozMatchesSelector ||
7808 docElem.oMatchesSelector ||
7809 docElem.msMatchesSelector) )) ) {
7811 assert(function( div ) {
7812 // Check to see if it's possible to do matchesSelector
7813 // on a disconnected node (IE
9)
7814 support.disconnectedMatch = matches.call( div,
"div" );
7816 // This should fail with an exception
7817 // Gecko does not error, returns false instead
7818 matches.call( div,
"[s!='']:x" );
7819 rbuggyMatches.push(
"!=", pseudos );
7823 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(
"|") );
7824 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(
"|") );
7827 ---------------------------------------------------------------------- */
7828 hasCompare = rnative.test( docElem.compareDocumentPosition );
7830 // Element contains another
7831 // Purposefully does not implement inclusive descendent
7832 // As in, an element does not contain itself
7833 contains = hasCompare || rnative.test( docElem.contains ) ?
7835 var adown = a.nodeType ===
9 ? a.documentElement : a,
7836 bup = b && b.parentNode;
7837 return a === bup || !!( bup && bup.nodeType ===
1 && (
7839 adown.contains( bup ) :
7840 a.compareDocumentPosition && a.compareDocumentPosition( bup ) &
16
7845 while ( (b = b.parentNode) ) {
7855 ---------------------------------------------------------------------- */
7857 // Document order sorting
7858 sortOrder = hasCompare ?
7861 // Flag for duplicate removal
7863 hasDuplicate = true;
7867 // Sort on method existence if only one input has compareDocumentPosition
7868 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
7873 // Calculate position if both inputs belong to the same document
7874 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
7875 a.compareDocumentPosition( b ) :
7877 // Otherwise we know they are disconnected
7880 // Disconnected nodes
7882 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
7884 // Choose the first element that is related to our preferred document
7885 if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
7888 if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
7892 // Maintain original order
7894 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
7898 return compare &
4 ? -
1 :
1;
7901 // Exit early if the nodes are identical
7903 hasDuplicate = true;
7914 // Parentless nodes are either documents or disconnected
7915 if ( !aup || !bup ) {
7916 return a === doc ? -
1 :
7921 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
7924 // If the nodes are siblings, we can do a quick check
7925 } else if ( aup === bup ) {
7926 return siblingCheck( a, b );
7929 // Otherwise we need full lists of their ancestors for comparison
7931 while ( (cur = cur.parentNode) ) {
7935 while ( (cur = cur.parentNode) ) {
7939 // Walk down the tree looking for a discrepancy
7940 while ( ap[i] === bp[i] ) {
7945 // Do a sibling check if the nodes have a common ancestor
7946 siblingCheck( ap[i], bp[i] ) :
7948 // Otherwise nodes in our document sort first
7949 ap[i] === preferredDoc ? -
1 :
7950 bp[i] === preferredDoc ?
1 :
7957 Sizzle.matches = function( expr, elements ) {
7958 return Sizzle( expr, null, null, elements );
7961 Sizzle.matchesSelector = function( elem, expr ) {
7962 // Set document vars if needed
7963 if ( ( elem.ownerDocument || elem ) !== document ) {
7964 setDocument( elem );
7967 // Make sure that attribute selectors are quoted
7968 expr = expr.replace( rattributeQuotes,
"='$1']" );
7970 if ( support.matchesSelector && documentIsHTML &&
7971 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
7972 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
7975 var ret = matches.call( elem, expr );
7977 // IE
9's matchesSelector returns false on disconnected nodes
7978 if ( ret || support.disconnectedMatch ||
7979 // As well, disconnected nodes are said to be in a document
7981 elem.document && elem.document.nodeType !==
11 ) {
7987 return Sizzle( expr, document, null, [ elem ] ).length
> 0;
7990 Sizzle.contains = function( context, elem ) {
7991 // Set document vars if needed
7992 if ( ( context.ownerDocument || context ) !== document ) {
7993 setDocument( context );
7995 return contains( context, elem );
7998 Sizzle.attr = function( elem, name ) {
7999 // Set document vars if needed
8000 if ( ( elem.ownerDocument || elem ) !== document ) {
8001 setDocument( elem );
8004 var fn = Expr.attrHandle[ name.toLowerCase() ],
8005 // Don't get fooled by Object.prototype properties (jQuery #
13807)
8006 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
8007 fn( elem, name, !documentIsHTML ) :
8010 return val !== undefined ?
8012 support.attributes || !documentIsHTML ?
8013 elem.getAttribute( name ) :
8014 (val = elem.getAttributeNode(name)) && val.specified ?
8019 Sizzle.error = function( msg ) {
8020 throw new Error(
"Syntax error, unrecognized expression: " + msg );
8024 * Document sorting and removing duplicates
8025 * @param {ArrayLike} results
8027 Sizzle.uniqueSort = function( results ) {
8033 // Unless we *know* we can detect duplicates, assume their presence
8034 hasDuplicate = !support.detectDuplicates;
8035 sortInput = !support.sortStable && results.slice(
0 );
8036 results.sort( sortOrder );
8038 if ( hasDuplicate ) {
8039 while ( (elem = results[i++]) ) {
8040 if ( elem === results[ i ] ) {
8041 j = duplicates.push( i );
8045 results.splice( duplicates[ j ],
1 );
8049 // Clear input after sorting to release objects
8050 // See https://github.com/jquery/sizzle/pull/
225
8057 * Utility function for retrieving the text value of an array of DOM nodes
8058 * @param {Array|Element} elem
8060 getText = Sizzle.getText = function( elem ) {
8064 nodeType = elem.nodeType;
8067 // If no nodeType, this is expected to be an array
8068 while ( (node = elem[i++]) ) {
8069 // Do not traverse comment nodes
8070 ret += getText( node );
8072 } else if ( nodeType ===
1 || nodeType ===
9 || nodeType ===
11 ) {
8073 // Use textContent for elements
8074 // innerText usage removed for consistency of new lines (jQuery #
11153)
8075 if ( typeof elem.textContent ===
"string" ) {
8076 return elem.textContent;
8078 // Traverse its children
8079 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
8080 ret += getText( elem );
8083 } else if ( nodeType ===
3 || nodeType ===
4 ) {
8084 return elem.nodeValue;
8086 // Do not include comment or processing instruction nodes
8091 Expr = Sizzle.selectors = {
8093 // Can be adjusted by the user
8096 createPseudo: markFunction,
8105 ">": { dir:
"parentNode", first: true },
8106 " ": { dir:
"parentNode" },
8107 "+": { dir:
"previousSibling", first: true },
8108 "~": { dir:
"previousSibling" }
8112 "ATTR": function( match ) {
8113 match[
1] = match[
1].replace( runescape, funescape );
8115 // Move the given value to match[
3] whether quoted or unquoted
8116 match[
3] = ( match[
3] || match[
4] || match[
5] ||
"" ).replace( runescape, funescape );
8118 if ( match[
2] ===
"~=" ) {
8119 match[
3] =
" " + match[
3] +
" ";
8122 return match.slice(
0,
4 );
8125 "CHILD": function( match ) {
8126 /* matches from matchExpr[
"CHILD"]
8127 1 type (only|nth|...)
8128 2 what (child|of-type)
8129 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
8130 4 xn-component of xn+y argument ([+-]?\d*n|)
8131 5 sign of xn-component
8133 7 sign of y-component
8136 match[
1] = match[
1].toLowerCase();
8138 if ( match[
1].slice(
0,
3 ) ===
"nth" ) {
8139 // nth-* requires argument
8141 Sizzle.error( match[
0] );
8144 // numeric x and y parameters for Expr.filter.CHILD
8145 // remember that false/true cast respectively to
0/
1
8146 match[
4] = +( match[
4] ? match[
5] + (match[
6] ||
1) :
2 * ( match[
3] ===
"even" || match[
3] ===
"odd" ) );
8147 match[
5] = +( ( match[
7] + match[
8] ) || match[
3] ===
"odd" );
8149 // other types prohibit arguments
8150 } else if ( match[
3] ) {
8151 Sizzle.error( match[
0] );
8157 "PSEUDO": function( match ) {
8159 unquoted = !match[
6] && match[
2];
8161 if ( matchExpr[
"CHILD"].test( match[
0] ) ) {
8165 // Accept quoted arguments as-is
8167 match[
2] = match[
4] || match[
5] ||
"";
8169 // Strip excess characters from unquoted arguments
8170 } else if ( unquoted && rpseudo.test( unquoted ) &&
8171 // Get excess from tokenize (recursively)
8172 (excess = tokenize( unquoted, true )) &&
8173 // advance to the next closing parenthesis
8174 (excess = unquoted.indexOf(
")", unquoted.length - excess ) - unquoted.length) ) {
8176 // excess is a negative index
8177 match[
0] = match[
0].slice(
0, excess );
8178 match[
2] = unquoted.slice(
0, excess );
8181 // Return only captures needed by the pseudo filter method (type and argument)
8182 return match.slice(
0,
3 );
8188 "TAG": function( nodeNameSelector ) {
8189 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
8190 return nodeNameSelector ===
"*" ?
8191 function() { return true; } :
8193 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
8197 "CLASS": function( className ) {
8198 var pattern = classCache[ className +
" " ];
8201 (pattern = new RegExp(
"(^|" + whitespace +
")" + className +
"(" + whitespace +
"|$)" )) &&
8202 classCache( className, function( elem ) {
8203 return pattern.test( typeof elem.className ===
"string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(
"class") ||
"" );
8207 "ATTR": function( name, operator, check ) {
8208 return function( elem ) {
8209 var result = Sizzle.attr( elem, name );
8211 if ( result == null ) {
8212 return operator ===
"!=";
8220 return operator ===
"=" ? result === check :
8221 operator ===
"!=" ? result !== check :
8222 operator ===
"^=" ? check && result.indexOf( check ) ===
0 :
8223 operator ===
"*=" ? check && result.indexOf( check )
> -
1 :
8224 operator === "$=" ? check && result.slice( -check.length ) === check :
8225 operator === "~=" ? ( " " + result + " " ).indexOf( check )
> -
1 :
8226 operator === "|=" ? result === check || result.slice(
0, check.length +
1 ) === check + "-" :
8231 "CHILD": function( type, what, argument, first, last ) {
8232 var simple = type.slice(
0,
3 ) !== "nth",
8233 forward = type.slice( -
4 ) !== "last",
8234 ofType = what === "of-type";
8236 return first ===
1 && last ===
0 ?
8238 // Shortcut for :nth-*(n)
8240 return !!elem.parentNode;
8243 function( elem, context, xml ) {
8244 var cache, outerCache, node, diff, nodeIndex, start,
8245 dir = simple !== forward ? "nextSibling" : "previousSibling",
8246 parent = elem.parentNode,
8247 name = ofType && elem.nodeName.toLowerCase(),
8248 useCache = !xml && !ofType;
8252 // :(first|last|only)-(child|of-type)
8256 while ( (node = node[ dir ]) ) {
8257 if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType ===
1 ) {
8261 // Reverse direction for :only-* (if we haven't yet done so)
8262 start = dir = type === "only" && !start && "nextSibling";
8267 start = [ forward ? parent.firstChild : parent.lastChild ];
8269 // non-xml :nth-child(...) stores cache data on `parent`
8270 if ( forward && useCache ) {
8271 // Seek `elem` from a previously-cached index
8272 outerCache = parent[ expando ] || (parent[ expando ] = {});
8273 cache = outerCache[ type ] || [];
8274 nodeIndex = cache[
0] === dirruns && cache[
1];
8275 diff = cache[
0] === dirruns && cache[
2];
8276 node = nodeIndex && parent.childNodes[ nodeIndex ];
8278 while ( (node = ++nodeIndex && node && node[ dir ] ||
8280 // Fallback to seeking `elem` from the start
8281 (diff = nodeIndex =
0) || start.pop()) ) {
8283 // When found, cache indexes on `parent` and break
8284 if ( node.nodeType ===
1 && ++diff && node === elem ) {
8285 outerCache[ type ] = [ dirruns, nodeIndex, diff ];
8290 // Use previously-cached element index if available
8291 } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[
0] === dirruns ) {
8294 // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
8296 // Use the same loop as above to seek `elem` from the start
8297 while ( (node = ++nodeIndex && node && node[ dir ] ||
8298 (diff = nodeIndex =
0) || start.pop()) ) {
8300 if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType ===
1 ) && ++diff ) {
8301 // Cache the index of each encountered element
8303 (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
8306 if ( node === elem ) {
8313 // Incorporate the offset, then check against cycle size
8315 return diff === first || ( diff % first ===
0 && diff / first
>=
0 );
8320 "PSEUDO": function( pseudo, argument ) {
8321 // pseudo-class names are case-insensitive
8322 // http://www.w3.org/TR/selectors/#pseudo-classes
8323 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
8324 // Remember that setFilters inherits from pseudos
8326 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
8327 Sizzle.error( "unsupported pseudo: " + pseudo );
8329 // The user may use createPseudo to indicate that
8330 // arguments are needed to create the filter function
8331 // just as Sizzle does
8332 if ( fn[ expando ] ) {
8333 return fn( argument );
8336 // But maintain support for old signatures
8337 if ( fn.length
> 1 ) {
8338 args = [ pseudo, pseudo,
"", argument ];
8339 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
8340 markFunction(function( seed, matches ) {
8342 matched = fn( seed, argument ),
8345 idx = indexOf.call( seed, matched[i] );
8346 seed[ idx ] = !( matches[ idx ] = matched[i] );
8350 return fn( elem,
0, args );
8359 // Potentially complex pseudos
8360 "not": markFunction(function( selector ) {
8361 // Trim the selector passed to compile
8362 // to avoid treating leading and trailing
8363 // spaces as combinators
8366 matcher = compile( selector.replace( rtrim,
"$1" ) );
8368 return matcher[ expando ] ?
8369 markFunction(function( seed, matches, context, xml ) {
8371 unmatched = matcher( seed, null, xml, [] ),
8374 // Match elements unmatched by `matcher`
8376 if ( (elem = unmatched[i]) ) {
8377 seed[i] = !(matches[i] = elem);
8381 function( elem, context, xml ) {
8383 matcher( input, null, xml, results );
8384 return !results.pop();
8388 "has": markFunction(function( selector ) {
8389 return function( elem ) {
8390 return Sizzle( selector, elem ).length
> 0;
8394 "contains": markFunction(function( text ) {
8395 return function( elem ) {
8396 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text )
> -
1;
8400 // "Whether an element is represented by a :lang() selector
8401 // is based solely on the element's language value
8402 // being equal to the identifier C,
8403 // or beginning with the identifier C immediately followed by "-".
8404 // The matching of C against the element's language value is performed case-insensitively.
8405 // The identifier C does not have to be a valid language name."
8406 // http://www.w3.org/TR/selectors/#lang-pseudo
8407 "lang": markFunction( function( lang ) {
8408 // lang value must be a valid identifier
8409 if ( !ridentifier.test(lang || "") ) {
8410 Sizzle.error( "unsupported lang: " + lang );
8412 lang = lang.replace( runescape, funescape ).toLowerCase();
8413 return function( elem ) {
8416 if ( (elemLang = documentIsHTML ?
8418 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
8420 elemLang = elemLang.toLowerCase();
8421 return elemLang === lang || elemLang.indexOf( lang + "-" ) ===
0;
8423 } while ( (elem = elem.parentNode) && elem.nodeType ===
1 );
8429 "target": function( elem ) {
8430 var hash = window.location && window.location.hash;
8431 return hash && hash.slice(
1 ) === elem.id;
8434 "root": function( elem ) {
8435 return elem === docElem;
8438 "focus": function( elem ) {
8439 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
8442 // Boolean properties
8443 "enabled": function( elem ) {
8444 return elem.disabled === false;
8447 "disabled": function( elem ) {
8448 return elem.disabled === true;
8451 "checked": function( elem ) {
8452 // In CSS3, :checked should return both checked and selected elements
8453 // http://www.w3.org/TR/
2011/REC-css3-selectors-
20110929/#checked
8454 var nodeName = elem.nodeName.toLowerCase();
8455 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
8458 "selected": function( elem ) {
8459 // Accessing this property makes selected-by-default
8460 // options in Safari work properly
8461 if ( elem.parentNode ) {
8462 elem.parentNode.selectedIndex;
8465 return elem.selected === true;
8469 "empty": function( elem ) {
8470 // http://www.w3.org/TR/selectors/#empty-pseudo
8471 // :empty is negated by element (
1) or content nodes (text:
3; cdata:
4; entity ref:
5),
8472 // but not by others (comment:
8; processing instruction:
7; etc.)
8473 // nodeType <
6 works because attributes (
2) do not appear as children
8474 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
8475 if ( elem.nodeType <
6 ) {
8482 "parent": function( elem ) {
8483 return !Expr.pseudos["empty"]( elem );
8486 // Element/input types
8487 "header": function( elem ) {
8488 return rheader.test( elem.nodeName );
8491 "input": function( elem ) {
8492 return rinputs.test( elem.nodeName );
8495 "button": function( elem ) {
8496 var name = elem.nodeName.toLowerCase();
8497 return name === "input" && elem.type === "button" || name === "button";
8500 "text": function( elem ) {
8502 return elem.nodeName.toLowerCase() === "input" &&
8503 elem.type === "text" &&
8506 // New HTML5 attribute values (e.g.,
"search") appear with elem.type ===
"text"
8507 ( (attr = elem.getAttribute(
"type")) == null || attr.toLowerCase() ===
"text" );
8510 // Position-in-collection
8511 "first": createPositionalPseudo(function() {
8515 "last": createPositionalPseudo(function( matchIndexes, length ) {
8516 return [ length -
1 ];
8519 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
8520 return [ argument <
0 ? argument + length : argument ];
8523 "even": createPositionalPseudo(function( matchIndexes, length ) {
8525 for ( ; i < length; i +=
2 ) {
8526 matchIndexes.push( i );
8528 return matchIndexes;
8531 "odd": createPositionalPseudo(function( matchIndexes, length ) {
8533 for ( ; i < length; i +=
2 ) {
8534 matchIndexes.push( i );
8536 return matchIndexes;
8539 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
8540 var i = argument <
0 ? argument + length : argument;
8541 for ( ; --i
>=
0; ) {
8542 matchIndexes.push( i );
8544 return matchIndexes;
8547 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
8548 var i = argument <
0 ? argument + length : argument;
8549 for ( ; ++i < length; ) {
8550 matchIndexes.push( i );
8552 return matchIndexes;
8557 Expr.pseudos["nth"] = Expr.pseudos["eq"];
8559 // Add button/input type pseudos
8560 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
8561 Expr.pseudos[ i ] = createInputPseudo( i );
8563 for ( i in { submit: true, reset: true } ) {
8564 Expr.pseudos[ i ] = createButtonPseudo( i );
8567 // Easy API for creating new setFilters
8568 function setFilters() {}
8569 setFilters.prototype = Expr.filters = Expr.pseudos;
8570 Expr.setFilters = new setFilters();
8572 tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
8573 var matched, match, tokens, type,
8574 soFar, groups, preFilters,
8575 cached = tokenCache[ selector + " " ];
8578 return parseOnly ?
0 : cached.slice(
0 );
8583 preFilters = Expr.preFilter;
8587 // Comma and first run
8588 if ( !matched || (match = rcomma.exec( soFar )) ) {
8590 // Don't consume trailing commas as valid
8591 soFar = soFar.slice( match[
0].length ) || soFar;
8593 groups.push( (tokens = []) );
8599 if ( (match = rcombinators.exec( soFar )) ) {
8600 matched = match.shift();
8603 // Cast descendant combinators to space
8604 type: match[
0].replace( rtrim, " " )
8606 soFar = soFar.slice( matched.length );
8610 for ( type in Expr.filter ) {
8611 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
8612 (match = preFilters[ type ]( match ))) ) {
8613 matched = match.shift();
8619 soFar = soFar.slice( matched.length );
8628 // Return the length of the invalid excess
8629 // if we're just parsing
8630 // Otherwise, throw an error or return tokens
8634 Sizzle.error( selector ) :
8636 tokenCache( selector, groups ).slice(
0 );
8639 function toSelector( tokens ) {
8641 len = tokens.length,
8643 for ( ; i < len; i++ ) {
8644 selector += tokens[i].value;
8649 function addCombinator( matcher, combinator, base ) {
8650 var dir = combinator.dir,
8651 checkNonElements = base && dir === "parentNode",
8654 return combinator.first ?
8655 // Check against closest ancestor/preceding element
8656 function( elem, context, xml ) {
8657 while ( (elem = elem[ dir ]) ) {
8658 if ( elem.nodeType ===
1 || checkNonElements ) {
8659 return matcher( elem, context, xml );
8664 // Check against all ancestor/preceding elements
8665 function( elem, context, xml ) {
8666 var oldCache, outerCache,
8667 newCache = [ dirruns, doneName ];
8669 // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
8671 while ( (elem = elem[ dir ]) ) {
8672 if ( elem.nodeType ===
1 || checkNonElements ) {
8673 if ( matcher( elem, context, xml ) ) {
8679 while ( (elem = elem[ dir ]) ) {
8680 if ( elem.nodeType ===
1 || checkNonElements ) {
8681 outerCache = elem[ expando ] || (elem[ expando ] = {});
8682 if ( (oldCache = outerCache[ dir ]) &&
8683 oldCache[
0 ] === dirruns && oldCache[
1 ] === doneName ) {
8685 // Assign to newCache so results back-propagate to previous elements
8686 return (newCache[
2 ] = oldCache[
2 ]);
8688 // Reuse newcache so results back-propagate to previous elements
8689 outerCache[ dir ] = newCache;
8691 // A match means we're done; a fail means we have to keep checking
8692 if ( (newCache[
2 ] = matcher( elem, context, xml )) ) {
8702 function elementMatcher( matchers ) {
8703 return matchers.length
> 1 ?
8704 function( elem, context, xml ) {
8705 var i = matchers.length;
8707 if ( !matchers[i]( elem, context, xml ) ) {
8716 function multipleContexts( selector, contexts, results ) {
8718 len = contexts.length;
8719 for ( ; i < len; i++ ) {
8720 Sizzle( selector, contexts[i], results );
8725 function condense( unmatched, map, filter, context, xml ) {
8729 len = unmatched.length,
8730 mapped = map != null;
8732 for ( ; i < len; i++ ) {
8733 if ( (elem = unmatched[i]) ) {
8734 if ( !filter || filter( elem, context, xml ) ) {
8735 newUnmatched.push( elem );
8743 return newUnmatched;
8746 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
8747 if ( postFilter && !postFilter[ expando ] ) {
8748 postFilter = setMatcher( postFilter );
8750 if ( postFinder && !postFinder[ expando ] ) {
8751 postFinder = setMatcher( postFinder, postSelector );
8753 return markFunction(function( seed, results, context, xml ) {
8757 preexisting = results.length,
8759 // Get initial elements from seed or context
8760 elems = seed || multipleContexts( selector ||
"*", context.nodeType ? [ context ] : context, [] ),
8762 // Prefilter to get matcher input, preserving a map for seed-results synchronization
8763 matcherIn = preFilter && ( seed || !selector ) ?
8764 condense( elems, preMap, preFilter, context, xml ) :
8767 matcherOut = matcher ?
8768 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
8769 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
8771 // ...intermediate processing is necessary
8774 // ...otherwise use results directly
8778 // Find primary matches
8780 matcher( matcherIn, matcherOut, context, xml );
8785 temp = condense( matcherOut, postMap );
8786 postFilter( temp, [], context, xml );
8788 // Un-match failing elements by moving them back to matcherIn
8791 if ( (elem = temp[i]) ) {
8792 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
8798 if ( postFinder || preFilter ) {
8800 // Get the final matcherOut by condensing this intermediate into postFinder contexts
8802 i = matcherOut.length;
8804 if ( (elem = matcherOut[i]) ) {
8805 // Restore matcherIn since elem is not yet a final match
8806 temp.push( (matcherIn[i] = elem) );
8809 postFinder( null, (matcherOut = []), temp, xml );
8812 // Move matched elements from seed to results to keep them synchronized
8813 i = matcherOut.length;
8815 if ( (elem = matcherOut[i]) &&
8816 (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i])
> -
1 ) {
8818 seed[temp] = !(results[temp] = elem);
8823 // Add elements to results, through postFinder if defined
8825 matcherOut = condense(
8826 matcherOut === results ?
8827 matcherOut.splice( preexisting, matcherOut.length ) :
8831 postFinder( null, results, matcherOut, xml );
8833 push.apply( results, matcherOut );
8839 function matcherFromTokens( tokens ) {
8840 var checkContext, matcher, j,
8841 len = tokens.length,
8842 leadingRelative = Expr.relative[ tokens[
0].type ],
8843 implicitRelative = leadingRelative || Expr.relative[" "],
8844 i = leadingRelative ?
1 :
0,
8846 // The foundational matcher ensures that elements are reachable from top-level context(s)
8847 matchContext = addCombinator( function( elem ) {
8848 return elem === checkContext;
8849 }, implicitRelative, true ),
8850 matchAnyContext = addCombinator( function( elem ) {
8851 return indexOf.call( checkContext, elem )
> -
1;
8852 }, implicitRelative, true ),
8853 matchers = [ function( elem, context, xml ) {
8854 return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
8855 (checkContext = context).nodeType ?
8856 matchContext( elem, context, xml ) :
8857 matchAnyContext( elem, context, xml ) );
8860 for ( ; i < len; i++ ) {
8861 if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
8862 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
8864 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
8866 // Return special upon seeing a positional matcher
8867 if ( matcher[ expando ] ) {
8868 // Find the next relative operator (if any) for proper handling
8870 for ( ; j < len; j++ ) {
8871 if ( Expr.relative[ tokens[j].type ] ) {
8876 i
> 1 && elementMatcher( matchers ),
8877 i
> 1 && toSelector(
8878 // If the preceding token was a descendant combinator, insert an implicit any-element `*`
8879 tokens.slice(
0, i -
1 ).concat({ value: tokens[ i -
2 ].type ===
" " ?
"*" :
"" })
8880 ).replace( rtrim,
"$1" ),
8882 i < j && matcherFromTokens( tokens.slice( i, j ) ),
8883 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
8884 j < len && toSelector( tokens )
8887 matchers.push( matcher );
8891 return elementMatcher( matchers );
8894 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
8895 var bySet = setMatchers.length
> 0,
8896 byElement = elementMatchers.length
> 0,
8897 superMatcher = function( seed, context, xml, results, outermost ) {
8898 var elem, j, matcher,
8901 unmatched = seed && [],
8903 contextBackup = outermostContext,
8904 // We must always have either seed elements or outermost context
8905 elems = seed || byElement && Expr.find[
"TAG"](
"*", outermost ),
8906 // Use integer dirruns iff this is the outermost matcher
8907 dirrunsUnique = (dirruns += contextBackup == null ?
1 : Math.random() ||
0.1),
8911 outermostContext = context !== document && context;
8914 // Add elements passing elementMatchers directly to results
8915 // Keep `i` a string if there are no elements so `matchedCount` will be
"00" below
8916 // Support: IE
<9, Safari
8917 // Tolerate NodeList properties (IE:
"length"; Safari:
<number>) matching elements by id
8918 for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
8919 if ( byElement && elem ) {
8921 while ( (matcher = elementMatchers[j++]) ) {
8922 if ( matcher( elem, context, xml ) ) {
8923 results.push( elem );
8928 dirruns = dirrunsUnique;
8932 // Track unmatched elements for set filters
8934 // They will have gone through all possible matchers
8935 if ( (elem = !matcher && elem) ) {
8939 // Lengthen the array for every element, matched or not
8941 unmatched.push( elem );
8946 // Apply set filters to unmatched elements
8948 if ( bySet && i !== matchedCount ) {
8950 while ( (matcher = setMatchers[j++]) ) {
8951 matcher( unmatched, setMatched, context, xml );
8955 // Reintegrate element matches to eliminate the need for sorting
8956 if ( matchedCount
> 0 ) {
8958 if ( !(unmatched[i] || setMatched[i]) ) {
8959 setMatched[i] = pop.call( results );
8964 // Discard index placeholder values to get only actual matches
8965 setMatched = condense( setMatched );
8968 // Add matches to results
8969 push.apply( results, setMatched );
8971 // Seedless set matches succeeding multiple successful matchers stipulate sorting
8972 if ( outermost && !seed && setMatched.length
> 0 &&
8973 ( matchedCount + setMatchers.length )
> 1 ) {
8975 Sizzle.uniqueSort( results );
8979 // Override manipulation of globals by nested matchers
8981 dirruns = dirrunsUnique;
8982 outermostContext = contextBackup;
8989 markFunction( superMatcher ) :
8993 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
8996 elementMatchers = [],
8997 cached = compilerCache[ selector +
" " ];
9000 // Generate a function of recursive functions that can be used to check each element
9002 match = tokenize( selector );
9006 cached = matcherFromTokens( match[i] );
9007 if ( cached[ expando ] ) {
9008 setMatchers.push( cached );
9010 elementMatchers.push( cached );
9014 // Cache the compiled function
9015 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
9017 // Save selector and tokenization
9018 cached.selector = selector;
9024 * A low-level selection function that works with Sizzle's compiled
9025 * selector functions
9026 * @param {String|Function} selector A selector or a pre-compiled
9027 * selector function built with Sizzle.compile
9028 * @param {Element} context
9029 * @param {Array} [results]
9030 * @param {Array} [seed] A set of elements to match against
9032 select = Sizzle.select = function( selector, context, results, seed ) {
9033 var i, tokens, token, type, find,
9034 compiled = typeof selector ===
"function" && selector,
9035 match = !seed && tokenize( (selector = compiled.selector || selector) );
9037 results = results || [];
9039 // Try to minimize operations if there is no seed and only one group
9040 if ( match.length ===
1 ) {
9042 // Take a shortcut and set the context if the root selector is an ID
9043 tokens = match[
0] = match[
0].slice(
0 );
9044 if ( tokens.length
> 2 && (token = tokens[
0]).type ===
"ID" &&
9045 support.getById && context.nodeType ===
9 && documentIsHTML &&
9046 Expr.relative[ tokens[
1].type ] ) {
9048 context = ( Expr.find[
"ID"]( token.matches[
0].replace(runescape, funescape), context ) || [] )[
0];
9052 // Precompiled matchers will still verify ancestry, so step up a level
9053 } else if ( compiled ) {
9054 context = context.parentNode;
9057 selector = selector.slice( tokens.shift().value.length );
9060 // Fetch a seed set for right-to-left matching
9061 i = matchExpr[
"needsContext"].test( selector ) ?
0 : tokens.length;
9065 // Abort if we hit a combinator
9066 if ( Expr.relative[ (type = token.type) ] ) {
9069 if ( (find = Expr.find[ type ]) ) {
9070 // Search, expanding context for leading sibling combinators
9072 token.matches[
0].replace( runescape, funescape ),
9073 rsibling.test( tokens[
0].type ) && testContext( context.parentNode ) || context
9076 // If seed is empty or no tokens remain, we can return early
9077 tokens.splice( i,
1 );
9078 selector = seed.length && toSelector( tokens );
9080 push.apply( results, seed );
9090 // Compile and execute a filtering function if one is not provided
9091 // Provide `match` to avoid retokenization if we modified the selector above
9092 ( compiled || compile( selector, match ) )(
9097 rsibling.test( selector ) && testContext( context.parentNode ) || context
9102 // One-time assignments
9105 support.sortStable = expando.split(
"").sort( sortOrder ).join(
"") === expando;
9107 // Support: Chrome
<14
9108 // Always assume duplicates if they aren't passed to the comparison function
9109 support.detectDuplicates = !!hasDuplicate;
9111 // Initialize against the default document
9114 // Support: Webkit
<537.32 - Safari
6.0.3/Chrome
25 (fixed in Chrome
27)
9115 // Detached nodes confoundingly follow *each other*
9116 support.sortDetached = assert(function( div1 ) {
9117 // Should return
1, but returns
4 (following)
9118 return div1.compareDocumentPosition( document.createElement(
"div") ) &
1;
9122 // Prevent attribute/property
"interpolation"
9123 // http://msdn.microsoft.com/en-us/library/ms536429%
28VS
.85%
29.aspx
9124 if ( !assert(function( div ) {
9125 div.innerHTML =
"<a href='#'></a>";
9126 return div.firstChild.getAttribute(
"href") ===
"#" ;
9128 addHandle(
"type|href|height|width", function( elem, name, isXML ) {
9130 return elem.getAttribute( name, name.toLowerCase() ===
"type" ?
1 :
2 );
9136 // Use defaultValue in place of getAttribute(
"value")
9137 if ( !support.attributes || !assert(function( div ) {
9138 div.innerHTML =
"<input/>";
9139 div.firstChild.setAttribute(
"value",
"" );
9140 return div.firstChild.getAttribute(
"value" ) ===
"";
9142 addHandle(
"value", function( elem, name, isXML ) {
9143 if ( !isXML && elem.nodeName.toLowerCase() ===
"input" ) {
9144 return elem.defaultValue;
9150 // Use getAttributeNode to fetch booleans when getAttribute lies
9151 if ( !assert(function( div ) {
9152 return div.getAttribute(
"disabled") == null;
9154 addHandle( booleans, function( elem, name, isXML ) {
9157 return elem[ name ] === true ? name.toLowerCase() :
9158 (val = elem.getAttributeNode( name )) && val.specified ?
9171 jQuery.find = Sizzle;
9172 jQuery.expr = Sizzle.selectors;
9173 jQuery.expr[
":"] = jQuery.expr.pseudos;
9174 jQuery.unique = Sizzle.uniqueSort;
9175 jQuery.text = Sizzle.getText;
9176 jQuery.isXMLDoc = Sizzle.isXML;
9177 jQuery.contains = Sizzle.contains;
9181 var rneedsContext = jQuery.expr.match.needsContext;
9183 var rsingleTag = (/^<(\w+)\s*\/
?>(?:<\/\
1>|)$/);
9187 var risSimple = /^.[^:#\[\.,]*$/;
9189 // Implement the identical functionality for filter and not
9190 function winnow( elements, qualifier, not ) {
9191 if ( jQuery.isFunction( qualifier ) ) {
9192 return jQuery.grep( elements, function( elem, i ) {
9194 return !!qualifier.call( elem, i, elem ) !== not;
9199 if ( qualifier.nodeType ) {
9200 return jQuery.grep( elements, function( elem ) {
9201 return ( elem === qualifier ) !== not;
9206 if ( typeof qualifier === "string" ) {
9207 if ( risSimple.test( qualifier ) ) {
9208 return jQuery.filter( qualifier, elements, not );
9211 qualifier = jQuery.filter( qualifier, elements );
9214 return jQuery.grep( elements, function( elem ) {
9215 return ( indexOf.call( qualifier, elem )
>=
0 ) !== not;
9219 jQuery.filter = function( expr, elems, not ) {
9220 var elem = elems[
0 ];
9223 expr = ":not(" + expr + ")";
9226 return elems.length ===
1 && elem.nodeType ===
1 ?
9227 jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
9228 jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
9229 return elem.nodeType ===
1;
9234 find: function( selector ) {
9240 if ( typeof selector !== "string" ) {
9241 return this.pushStack( jQuery( selector ).filter(function() {
9242 for ( i =
0; i < len; i++ ) {
9243 if ( jQuery.contains( self[ i ], this ) ) {
9250 for ( i =
0; i < len; i++ ) {
9251 jQuery.find( selector, self[ i ], ret );
9254 // Needed because $( selector, context ) becomes $( context ).find( selector )
9255 ret = this.pushStack( len
> 1 ? jQuery.unique( ret ) : ret );
9256 ret.selector = this.selector ? this.selector +
" " + selector : selector;
9259 filter: function( selector ) {
9260 return this.pushStack( winnow(this, selector || [], false) );
9262 not: function( selector ) {
9263 return this.pushStack( winnow(this, selector || [], true) );
9265 is: function( selector ) {
9269 // If this is a positional/relative selector, check membership in the returned set
9270 // so $(
"p:first").is(
"p:last") won't return true for a doc with two
"p".
9271 typeof selector ===
"string" && rneedsContext.test( selector ) ?
9272 jQuery( selector ) :
9280 // Initialize a jQuery object
9283 // A central reference to the root jQuery(document)
9286 // A simple way to check for HTML strings
9287 // Prioritize #id over
<tag> to avoid XSS via location.hash (#
9521)
9288 // Strict HTML recognition (#
11290: must start with <)
9289 rquickExpr = /^(?:\s*(<[\w\W]+
>)[^
>]*|#([\w-]*))$/,
9291 init = jQuery.fn.init = function( selector, context ) {
9294 // HANDLE: $(""), $(null), $(undefined), $(false)
9299 // Handle HTML strings
9300 if ( typeof selector === "string" ) {
9301 if ( selector[
0] === "<" && selector[ selector.length -
1 ] === "
>" && selector.length >= 3 ) {
9302 // Assume that strings that start and end with <> are HTML and skip the regex check
9303 match = [ null, selector, null ];
9306 match = rquickExpr.exec( selector );
9309 // Match html or make sure no context is specified for #id
9310 if ( match && (match[1] || !context) ) {
9312 // HANDLE: $(html) -> $(array)
9314 context = context instanceof jQuery ? context[0] : context;
9316 // scripts is true for back-compat
9317 // Intentionally let the error be thrown if parseHTML is not present
9318 jQuery.merge( this, jQuery.parseHTML(
9320 context && context.nodeType ? context.ownerDocument || context : document,
9324 // HANDLE: $(html, props)
9325 if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
9326 for ( match in context ) {
9327 // Properties of context are called as methods if possible
9328 if ( jQuery.isFunction( this[ match ] ) ) {
9329 this[ match ]( context[ match ] );
9331 // ...and otherwise set as attributes
9333 this.attr( match, context[ match ] );
9342 elem = document.getElementById( match[2] );
9344 // Check parentNode to catch when Blackberry 4.6 returns
9345 // nodes that are no longer in the document #6963
9346 if ( elem && elem.parentNode ) {
9347 // Inject the element directly into the jQuery object
9352 this.context = document;
9353 this.selector = selector;
9357 // HANDLE: $(expr, $(...))
9358 } else if ( !context || context.jquery ) {
9359 return ( context || rootjQuery ).find( selector );
9361 // HANDLE: $(expr, context)
9362 // (which is just equivalent to: $(context).find(expr)
9364 return this.constructor( context ).find( selector );
9367 // HANDLE: $(DOMElement)
9368 } else if ( selector.nodeType ) {
9369 this.context = this[0] = selector;
9373 // HANDLE: $(function)
9374 // Shortcut for document ready
9375 } else if ( jQuery.isFunction( selector ) ) {
9376 return typeof rootjQuery.ready !== "undefined" ?
9377 rootjQuery.ready( selector ) :
9378 // Execute immediately if ready is not present
9382 if ( selector.selector !== undefined ) {
9383 this.selector = selector.selector;
9384 this.context = selector.context;
9387 return jQuery.makeArray( selector, this );
9390 // Give the init function the jQuery prototype for later instantiation
9391 init.prototype = jQuery.fn;
9393 // Initialize central reference
9394 rootjQuery = jQuery( document );
9397 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
9398 // methods guaranteed to produce a unique set when starting from a unique set
9399 guaranteedUnique = {
9407 dir: function( elem, dir, until ) {
9409 truncate = until !== undefined;
9411 while ( (elem = elem[ dir ]) && elem.nodeType !==
9 ) {
9412 if ( elem.nodeType ===
1 ) {
9413 if ( truncate && jQuery( elem ).is( until ) ) {
9416 matched.push( elem );
9422 sibling: function( n, elem ) {
9425 for ( ; n; n = n.nextSibling ) {
9426 if ( n.nodeType ===
1 && n !== elem ) {
9436 has: function( target ) {
9437 var targets = jQuery( target, this ),
9440 return this.filter(function() {
9442 for ( ; i < l; i++ ) {
9443 if ( jQuery.contains( this, targets[i] ) ) {
9450 closest: function( selectors, context ) {
9455 pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
9456 jQuery( selectors, context || this.context ) :
9459 for ( ; i < l; i++ ) {
9460 for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
9461 // Always skip document fragments
9462 if ( cur.nodeType <
11 && (pos ?
9463 pos.index(cur)
> -
1 :
9465 // Don't pass non-elements to Sizzle
9466 cur.nodeType ===
1 &&
9467 jQuery.find.matchesSelector(cur, selectors)) ) {
9469 matched.push( cur );
9475 return this.pushStack( matched.length
> 1 ? jQuery.unique( matched ) : matched );
9478 // Determine the position of an element within
9479 // the matched set of elements
9480 index: function( elem ) {
9482 // No argument, return index in parent
9484 return ( this[
0 ] && this[
0 ].parentNode ) ? this.first().prevAll().length : -
1;
9487 // index in selector
9488 if ( typeof elem ===
"string" ) {
9489 return indexOf.call( jQuery( elem ), this[
0 ] );
9492 // Locate the position of the desired element
9493 return indexOf.call( this,
9495 // If it receives a jQuery object, the first element is used
9496 elem.jquery ? elem[
0 ] : elem
9500 add: function( selector, context ) {
9501 return this.pushStack(
9503 jQuery.merge( this.get(), jQuery( selector, context ) )
9508 addBack: function( selector ) {
9509 return this.add( selector == null ?
9510 this.prevObject : this.prevObject.filter(selector)
9515 function sibling( cur, dir ) {
9516 while ( (cur = cur[dir]) && cur.nodeType !==
1 ) {}
9521 parent: function( elem ) {
9522 var parent = elem.parentNode;
9523 return parent && parent.nodeType !==
11 ? parent : null;
9525 parents: function( elem ) {
9526 return jQuery.dir( elem,
"parentNode" );
9528 parentsUntil: function( elem, i, until ) {
9529 return jQuery.dir( elem,
"parentNode", until );
9531 next: function( elem ) {
9532 return sibling( elem,
"nextSibling" );
9534 prev: function( elem ) {
9535 return sibling( elem,
"previousSibling" );
9537 nextAll: function( elem ) {
9538 return jQuery.dir( elem,
"nextSibling" );
9540 prevAll: function( elem ) {
9541 return jQuery.dir( elem,
"previousSibling" );
9543 nextUntil: function( elem, i, until ) {
9544 return jQuery.dir( elem,
"nextSibling", until );
9546 prevUntil: function( elem, i, until ) {
9547 return jQuery.dir( elem,
"previousSibling", until );
9549 siblings: function( elem ) {
9550 return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
9552 children: function( elem ) {
9553 return jQuery.sibling( elem.firstChild );
9555 contents: function( elem ) {
9556 return elem.contentDocument || jQuery.merge( [], elem.childNodes );
9558 }, function( name, fn ) {
9559 jQuery.fn[ name ] = function( until, selector ) {
9560 var matched = jQuery.map( this, fn, until );
9562 if ( name.slice( -
5 ) !==
"Until" ) {
9566 if ( selector && typeof selector ===
"string" ) {
9567 matched = jQuery.filter( selector, matched );
9570 if ( this.length
> 1 ) {
9571 // Remove duplicates
9572 if ( !guaranteedUnique[ name ] ) {
9573 jQuery.unique( matched );
9576 // Reverse order for parents* and prev-derivatives
9577 if ( rparentsprev.test( name ) ) {
9582 return this.pushStack( matched );
9585 var rnotwhite = (/\S+/g);
9589 // String to Object options format cache
9590 var optionsCache = {};
9592 // Convert String-formatted options into Object-formatted ones and store in cache
9593 function createOptions( options ) {
9594 var object = optionsCache[ options ] = {};
9595 jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
9596 object[ flag ] = true;
9602 * Create a callback list using the following parameters:
9604 * options: an optional list of space-separated options that will change how
9605 * the callback list behaves or a more traditional option object
9607 * By default a callback list will act like an event callback list and can be
9608 *
"fired" multiple times.
9612 * once: will ensure the callback list can only be fired once (like a Deferred)
9614 * memory: will keep track of previous values and will call any callback added
9615 * after the list has been fired right away with the latest
"memorized"
9616 * values (like a Deferred)
9618 * unique: will ensure a callback can only be added once (no duplicate in the list)
9620 * stopOnFalse: interrupt callings when a callback returns false
9623 jQuery.Callbacks = function( options ) {
9625 // Convert options from String-formatted to Object-formatted if needed
9626 // (we check in cache first)
9627 options = typeof options ===
"string" ?
9628 ( optionsCache[ options ] || createOptions( options ) ) :
9629 jQuery.extend( {}, options );
9631 var // Last fire value (for non-forgettable lists)
9633 // Flag to know if list was already fired
9635 // Flag to know if list is currently firing
9637 // First callback to fire (used internally by add and fireWith)
9639 // End of the loop when firing
9641 // Index of currently firing callback (modified by remove if needed)
9643 // Actual callback list
9645 // Stack of fire calls for repeatable lists
9646 stack = !options.once && [],
9648 fire = function( data ) {
9649 memory = options.memory && data;
9651 firingIndex = firingStart ||
0;
9653 firingLength = list.length;
9655 for ( ; list && firingIndex < firingLength; firingIndex++ ) {
9656 if ( list[ firingIndex ].apply( data[
0 ], data[
1 ] ) === false && options.stopOnFalse ) {
9657 memory = false; // To prevent further calls using add
9664 if ( stack.length ) {
9665 fire( stack.shift() );
9667 } else if ( memory ) {
9674 // Actual Callbacks object
9676 // Add a callback or a collection of callbacks to the list
9679 // First, we save the current length
9680 var start = list.length;
9681 (function add( args ) {
9682 jQuery.each( args, function( _, arg ) {
9683 var type = jQuery.type( arg );
9684 if ( type ===
"function" ) {
9685 if ( !options.unique || !self.has( arg ) ) {
9688 } else if ( arg && arg.length && type !==
"string" ) {
9689 // Inspect recursively
9694 // Do we need to add the callbacks to the
9695 // current firing batch?
9697 firingLength = list.length;
9698 // With memory, if we're not firing then
9699 // we should call right away
9700 } else if ( memory ) {
9701 firingStart = start;
9707 // Remove a callback from the list
9708 remove: function() {
9710 jQuery.each( arguments, function( _, arg ) {
9712 while ( ( index = jQuery.inArray( arg, list, index ) )
> -
1 ) {
9713 list.splice( index,
1 );
9714 // Handle firing indexes
9716 if ( index <= firingLength ) {
9719 if ( index <= firingIndex ) {
9728 // Check if a given callback is in the list.
9729 // If no argument is given, return whether or not list has callbacks attached.
9730 has: function( fn ) {
9731 return fn ? jQuery.inArray( fn, list )
> -
1 : !!( list && list.length );
9733 // Remove all callbacks from the list
9739 // Have the list do nothing anymore
9740 disable: function() {
9741 list = stack = memory = undefined;
9745 disabled: function() {
9748 // Lock the list in its current state
9757 locked: function() {
9760 // Call all callbacks with the given context and arguments
9761 fireWith: function( context, args ) {
9762 if ( list && ( !fired || stack ) ) {
9764 args = [ context, args.slice ? args.slice() : args ];
9773 // Call all the callbacks with the given arguments
9775 self.fireWith( this, arguments );
9778 // To know if the callbacks have already been called at least once
9790 Deferred: function( func ) {
9792 // action, add listener, listener list, final state
9793 [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
9794 [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
9795 [ "notify", "progress", jQuery.Callbacks("memory") ]
9802 always: function() {
9803 deferred.done( arguments ).fail( arguments );
9806 then: function( /* fnDone, fnFail, fnProgress */ ) {
9807 var fns = arguments;
9808 return jQuery.Deferred(function( newDefer ) {
9809 jQuery.each( tuples, function( i, tuple ) {
9810 var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
9811 // deferred[ done | fail | progress ] for forwarding actions to newDefer
9812 deferred[ tuple[
1] ](function() {
9813 var returned = fn && fn.apply( this, arguments );
9814 if ( returned && jQuery.isFunction( returned.promise ) ) {
9816 .done( newDefer.resolve )
9817 .fail( newDefer.reject )
9818 .progress( newDefer.notify );
9820 newDefer[ tuple[
0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
9827 // Get a promise for this deferred
9828 // If obj is provided, the promise aspect is added to the object
9829 promise: function( obj ) {
9830 return obj != null ? jQuery.extend( obj, promise ) : promise;
9835 // Keep pipe for back-compat
9836 promise.pipe = promise.then;
9838 // Add list-specific methods
9839 jQuery.each( tuples, function( i, tuple ) {
9840 var list = tuple[
2 ],
9841 stateString = tuple[
3 ];
9843 // promise[ done | fail | progress ] = list.add
9844 promise[ tuple[
1] ] = list.add;
9847 if ( stateString ) {
9848 list.add(function() {
9849 // state = [ resolved | rejected ]
9850 state = stateString;
9852 // [ reject_list | resolve_list ].disable; progress_list.lock
9853 }, tuples[ i ^
1 ][
2 ].disable, tuples[
2 ][
2 ].lock );
9856 // deferred[ resolve | reject | notify ]
9857 deferred[ tuple[
0] ] = function() {
9858 deferred[ tuple[
0] + "With" ]( this === deferred ? promise : this, arguments );
9861 deferred[ tuple[
0] + "With" ] = list.fireWith;
9864 // Make the deferred a promise
9865 promise.promise( deferred );
9867 // Call given func if any
9869 func.call( deferred, deferred );
9877 when: function( subordinate /* , ..., subordinateN */ ) {
9879 resolveValues = slice.call( arguments ),
9880 length = resolveValues.length,
9882 // the count of uncompleted subordinates
9883 remaining = length !==
1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length :
0,
9885 // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
9886 deferred = remaining ===
1 ? subordinate : jQuery.Deferred(),
9888 // Update function for both resolve and progress values
9889 updateFunc = function( i, contexts, values ) {
9890 return function( value ) {
9891 contexts[ i ] = this;
9892 values[ i ] = arguments.length
> 1 ? slice.call( arguments ) : value;
9893 if ( values === progressValues ) {
9894 deferred.notifyWith( contexts, values );
9895 } else if ( !( --remaining ) ) {
9896 deferred.resolveWith( contexts, values );
9901 progressValues, progressContexts, resolveContexts;
9903 // add listeners to Deferred subordinates; treat others as resolved
9905 progressValues = new Array( length );
9906 progressContexts = new Array( length );
9907 resolveContexts = new Array( length );
9908 for ( ; i < length; i++ ) {
9909 if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
9910 resolveValues[ i ].promise()
9911 .done( updateFunc( i, resolveContexts, resolveValues ) )
9912 .fail( deferred.reject )
9913 .progress( updateFunc( i, progressContexts, progressValues ) );
9920 // if we're not waiting on anything, resolve the master
9922 deferred.resolveWith( resolveContexts, resolveValues );
9925 return deferred.promise();
9930 // The deferred used on DOM ready
9933 jQuery.fn.ready = function( fn ) {
9935 jQuery.ready.promise().done( fn );
9941 // Is the DOM ready to be used? Set to true once it occurs.
9944 // A counter to track how many items to wait for before
9945 // the ready event fires. See #
6781
9948 // Hold (or release) the ready event
9949 holdReady: function( hold ) {
9953 jQuery.ready( true );
9957 // Handle when the DOM is ready
9958 ready: function( wait ) {
9960 // Abort if there are pending holds or we're already ready
9961 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
9965 // Remember that the DOM is ready
9966 jQuery.isReady = true;
9968 // If a normal DOM Ready event fired, decrement, and wait if need be
9969 if ( wait !== true && --jQuery.readyWait
> 0 ) {
9973 // If there are functions bound, to execute
9974 readyList.resolveWith( document, [ jQuery ] );
9976 // Trigger any bound ready events
9977 if ( jQuery.fn.triggerHandler ) {
9978 jQuery( document ).triggerHandler(
"ready" );
9979 jQuery( document ).off(
"ready" );
9985 * The ready event handler and self cleanup method
9987 function completed() {
9988 document.removeEventListener(
"DOMContentLoaded", completed, false );
9989 window.removeEventListener(
"load", completed, false );
9993 jQuery.ready.promise = function( obj ) {
9996 readyList = jQuery.Deferred();
9998 // Catch cases where $(document).ready() is called after the browser event has already occurred.
9999 // we once tried to use readyState
"interactive" here, but it caused issues like the one
10000 // discovered by ChrisS here: http://bugs.jquery.com/ticket/
12282#comment:
15
10001 if ( document.readyState ===
"complete" ) {
10002 // Handle it asynchronously to allow scripts the opportunity to delay ready
10003 setTimeout( jQuery.ready );
10007 // Use the handy event callback
10008 document.addEventListener(
"DOMContentLoaded", completed, false );
10010 // A fallback to window.onload, that will always work
10011 window.addEventListener(
"load", completed, false );
10014 return readyList.promise( obj );
10017 // Kick off the DOM ready check even if the user does not
10018 jQuery.ready.promise();
10023 // Multifunctional method to get and set values of a collection
10024 // The value/s can optionally be executed if it's a function
10025 var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
10027 len = elems.length,
10028 bulk = key == null;
10030 // Sets many values
10031 if ( jQuery.type( key ) ===
"object" ) {
10034 jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
10038 } else if ( value !== undefined ) {
10041 if ( !jQuery.isFunction( value ) ) {
10046 // Bulk operations run against the entire set
10048 fn.call( elems, value );
10051 // ...except when executing function values
10054 fn = function( elem, key, value ) {
10055 return bulk.call( jQuery( elem ), value );
10061 for ( ; i < len; i++ ) {
10062 fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
10073 len ? fn( elems[
0], key ) : emptyGet;
10078 * Determines whether an object can have data
10080 jQuery.acceptData = function( owner ) {
10083 // - Node.ELEMENT_NODE
10084 // - Node.DOCUMENT_NODE
10088 return owner.nodeType ===
1 || owner.nodeType ===
9 || !( +owner.nodeType );
10093 // Support: Android <
4,
10094 // Old WebKit does not have Object.preventExtensions/freeze method,
10095 // return new empty object instead with no [[set]] accessor
10096 Object.defineProperty( this.cache = {},
0, {
10102 this.expando = jQuery.expando + Math.random();
10106 Data.accepts = jQuery.acceptData;
10109 key: function( owner ) {
10110 // We can accept data for non-element nodes in modern browsers,
10111 // but we should not, see #
8335.
10112 // Always return the key for a frozen object.
10113 if ( !Data.accepts( owner ) ) {
10117 var descriptor = {},
10118 // Check if the owner object already has a cache key
10119 unlock = owner[ this.expando ];
10121 // If not, create one
10123 unlock = Data.uid++;
10125 // Secure it in a non-enumerable, non-writable property
10127 descriptor[ this.expando ] = { value: unlock };
10128 Object.defineProperties( owner, descriptor );
10130 // Support: Android <
4
10131 // Fallback to a less secure definition
10133 descriptor[ this.expando ] = unlock;
10134 jQuery.extend( owner, descriptor );
10138 // Ensure the cache object
10139 if ( !this.cache[ unlock ] ) {
10140 this.cache[ unlock ] = {};
10145 set: function( owner, data, value ) {
10147 // There may be an unlock assigned to this node,
10148 // if there is no entry for this
"owner", create one inline
10149 // and set the unlock as though an owner entry had always existed
10150 unlock = this.key( owner ),
10151 cache = this.cache[ unlock ];
10153 // Handle: [ owner, key, value ] args
10154 if ( typeof data ===
"string" ) {
10155 cache[ data ] = value;
10157 // Handle: [ owner, { properties } ] args
10159 // Fresh assignments by object are shallow copied
10160 if ( jQuery.isEmptyObject( cache ) ) {
10161 jQuery.extend( this.cache[ unlock ], data );
10162 // Otherwise, copy the properties one-by-one to the cache object
10164 for ( prop in data ) {
10165 cache[ prop ] = data[ prop ];
10171 get: function( owner, key ) {
10172 // Either a valid cache is found, or will be created.
10173 // New caches will be created and the unlock returned,
10174 // allowing direct access to the newly created
10175 // empty data object. A valid owner object must be provided.
10176 var cache = this.cache[ this.key( owner ) ];
10178 return key === undefined ?
10179 cache : cache[ key ];
10181 access: function( owner, key, value ) {
10183 // In cases where either:
10185 //
1. No key was specified
10186 //
2. A string key was specified, but no value provided
10188 // Take the
"read" path and allow the get method to determine
10189 // which value to return, respectively either:
10191 //
1. The entire cache object
10192 //
2. The data stored at the key
10194 if ( key === undefined ||
10195 ((key && typeof key ===
"string") && value === undefined) ) {
10197 stored = this.get( owner, key );
10199 return stored !== undefined ?
10200 stored : this.get( owner, jQuery.camelCase(key) );
10203 // [*]When the key is not a string, or both a key and value
10204 // are specified, set or extend (existing objects) with either:
10206 //
1. An object of properties
10207 //
2. A key and value
10209 this.set( owner, key, value );
10211 // Since the
"set" path can have two possible entry points
10212 // return the expected data based on which path was taken[*]
10213 return value !== undefined ? value : key;
10215 remove: function( owner, key ) {
10216 var i, name, camel,
10217 unlock = this.key( owner ),
10218 cache = this.cache[ unlock ];
10220 if ( key === undefined ) {
10221 this.cache[ unlock ] = {};
10224 // Support array or space separated string of keys
10225 if ( jQuery.isArray( key ) ) {
10226 // If
"name" is an array of keys...
10227 // When data is initially created, via (
"key",
"val") signature,
10228 // keys will be converted to camelCase.
10229 // Since there is no way to tell _how_ a key was added, remove
10230 // both plain key and camelCase key. #
12786
10231 // This will only penalize the array argument path.
10232 name = key.concat( key.map( jQuery.camelCase ) );
10234 camel = jQuery.camelCase( key );
10235 // Try the string as a key before any manipulation
10236 if ( key in cache ) {
10237 name = [ key, camel ];
10239 // If a key with the spaces exists, use it.
10240 // Otherwise, create an array by matching non-whitespace
10242 name = name in cache ?
10243 [ name ] : ( name.match( rnotwhite ) || [] );
10249 delete cache[ name[ i ] ];
10253 hasData: function( owner ) {
10254 return !jQuery.isEmptyObject(
10255 this.cache[ owner[ this.expando ] ] || {}
10258 discard: function( owner ) {
10259 if ( owner[ this.expando ] ) {
10260 delete this.cache[ owner[ this.expando ] ];
10264 var data_priv = new Data();
10266 var data_user = new Data();
10271 Implementation Summary
10273 1. Enforce API surface and semantic compatibility with
1.9.x branch
10274 2. Improve the module's maintainability by reducing the storage
10275 paths to a single mechanism.
10276 3. Use the same single mechanism to support
"private" and
"user" data.
10277 4. _Never_ expose
"private" data to user code (TODO: Drop _data, _removeData)
10278 5. Avoid exposing implementation details on user objects (eg. expando properties)
10279 6. Provide a clear path for implementation upgrade to WeakMap in
2014
10281 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
10282 rmultiDash = /([A-Z])/g;
10284 function dataAttr( elem, key, data ) {
10287 // If nothing was found internally, try to fetch any
10288 // data from the HTML5 data-* attribute
10289 if ( data === undefined && elem.nodeType ===
1 ) {
10290 name =
"data-" + key.replace( rmultiDash,
"-$1" ).toLowerCase();
10291 data = elem.getAttribute( name );
10293 if ( typeof data ===
"string" ) {
10295 data = data ===
"true" ? true :
10296 data ===
"false" ? false :
10297 data ===
"null" ? null :
10298 // Only convert to a number if it doesn't change the string
10299 +data +
"" === data ? +data :
10300 rbrace.test( data ) ? jQuery.parseJSON( data ) :
10304 // Make sure we set the data so it isn't changed later
10305 data_user.set( elem, key, data );
10314 hasData: function( elem ) {
10315 return data_user.hasData( elem ) || data_priv.hasData( elem );
10318 data: function( elem, name, data ) {
10319 return data_user.access( elem, name, data );
10322 removeData: function( elem, name ) {
10323 data_user.remove( elem, name );
10326 // TODO: Now that all calls to _data and _removeData have been replaced
10327 // with direct calls to data_priv methods, these can be deprecated.
10328 _data: function( elem, name, data ) {
10329 return data_priv.access( elem, name, data );
10332 _removeData: function( elem, name ) {
10333 data_priv.remove( elem, name );
10338 data: function( key, value ) {
10341 attrs = elem && elem.attributes;
10344 if ( key === undefined ) {
10345 if ( this.length ) {
10346 data = data_user.get( elem );
10348 if ( elem.nodeType ===
1 && !data_priv.get( elem,
"hasDataAttrs" ) ) {
10353 // The attrs elements can be null (#
14894)
10354 if ( attrs[ i ] ) {
10355 name = attrs[ i ].name;
10356 if ( name.indexOf(
"data-" ) ===
0 ) {
10357 name = jQuery.camelCase( name.slice(
5) );
10358 dataAttr( elem, name, data[ name ] );
10362 data_priv.set( elem,
"hasDataAttrs", true );
10369 // Sets multiple values
10370 if ( typeof key ===
"object" ) {
10371 return this.each(function() {
10372 data_user.set( this, key );
10376 return access( this, function( value ) {
10378 camelKey = jQuery.camelCase( key );
10380 // The calling jQuery object (element matches) is not empty
10381 // (and therefore has an element appears at this[
0 ]) and the
10382 // `value` parameter was not undefined. An empty jQuery object
10383 // will result in `undefined` for elem = this[
0 ] which will
10384 // throw an exception if an attempt to read a data cache is made.
10385 if ( elem && value === undefined ) {
10386 // Attempt to get data from the cache
10387 // with the key as-is
10388 data = data_user.get( elem, key );
10389 if ( data !== undefined ) {
10393 // Attempt to get data from the cache
10394 // with the key camelized
10395 data = data_user.get( elem, camelKey );
10396 if ( data !== undefined ) {
10400 // Attempt to
"discover" the data in
10401 // HTML5 custom data-* attrs
10402 data = dataAttr( elem, camelKey, undefined );
10403 if ( data !== undefined ) {
10407 // We tried really hard, but the data doesn't exist.
10412 this.each(function() {
10413 // First, attempt to store a copy or reference of any
10414 // data that might've been store with a camelCased key.
10415 var data = data_user.get( this, camelKey );
10417 // For HTML5 data-* attribute interop, we have to
10418 // store property names with dashes in a camelCase form.
10419 // This might not apply to all properties...*
10420 data_user.set( this, camelKey, value );
10422 // *... In the case of properties that might _actually_
10423 // have dashes, we need to also store a copy of that
10424 // unchanged property.
10425 if ( key.indexOf(
"-") !== -
1 && data !== undefined ) {
10426 data_user.set( this, key, value );
10429 }, null, value, arguments.length
> 1, null, true );
10432 removeData: function( key ) {
10433 return this.each(function() {
10434 data_user.remove( this, key );
10441 queue: function( elem, type, data ) {
10445 type = ( type ||
"fx" ) +
"queue";
10446 queue = data_priv.get( elem, type );
10448 // Speed up dequeue by getting out quickly if this is just a lookup
10450 if ( !queue || jQuery.isArray( data ) ) {
10451 queue = data_priv.access( elem, type, jQuery.makeArray(data) );
10453 queue.push( data );
10456 return queue || [];
10460 dequeue: function( elem, type ) {
10461 type = type ||
"fx";
10463 var queue = jQuery.queue( elem, type ),
10464 startLength = queue.length,
10465 fn = queue.shift(),
10466 hooks = jQuery._queueHooks( elem, type ),
10467 next = function() {
10468 jQuery.dequeue( elem, type );
10471 // If the fx queue is dequeued, always remove the progress sentinel
10472 if ( fn ===
"inprogress" ) {
10473 fn = queue.shift();
10479 // Add a progress sentinel to prevent the fx queue from being
10480 // automatically dequeued
10481 if ( type ===
"fx" ) {
10482 queue.unshift(
"inprogress" );
10485 // clear up the last queue stop function
10487 fn.call( elem, next, hooks );
10490 if ( !startLength && hooks ) {
10491 hooks.empty.fire();
10495 // not intended for public consumption - generates a queueHooks object, or returns the current one
10496 _queueHooks: function( elem, type ) {
10497 var key = type +
"queueHooks";
10498 return data_priv.get( elem, key ) || data_priv.access( elem, key, {
10499 empty: jQuery.Callbacks(
"once memory").add(function() {
10500 data_priv.remove( elem, [ type +
"queue", key ] );
10507 queue: function( type, data ) {
10510 if ( typeof type !==
"string" ) {
10516 if ( arguments.length < setter ) {
10517 return jQuery.queue( this[
0], type );
10520 return data === undefined ?
10522 this.each(function() {
10523 var queue = jQuery.queue( this, type, data );
10525 // ensure a hooks for this queue
10526 jQuery._queueHooks( this, type );
10528 if ( type ===
"fx" && queue[
0] !==
"inprogress" ) {
10529 jQuery.dequeue( this, type );
10533 dequeue: function( type ) {
10534 return this.each(function() {
10535 jQuery.dequeue( this, type );
10538 clearQueue: function( type ) {
10539 return this.queue( type ||
"fx", [] );
10541 // Get a promise resolved when queues of a certain type
10542 // are emptied (fx is the type by default)
10543 promise: function( type, obj ) {
10546 defer = jQuery.Deferred(),
10549 resolve = function() {
10550 if ( !( --count ) ) {
10551 defer.resolveWith( elements, [ elements ] );
10555 if ( typeof type !==
"string" ) {
10559 type = type ||
"fx";
10562 tmp = data_priv.get( elements[ i ], type +
"queueHooks" );
10563 if ( tmp && tmp.empty ) {
10565 tmp.empty.add( resolve );
10569 return defer.promise( obj );
10572 var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
10574 var cssExpand = [
"Top",
"Right",
"Bottom",
"Left" ];
10576 var isHidden = function( elem, el ) {
10577 // isHidden might be called from jQuery#filter function;
10578 // in that case, element will be second argument
10580 return jQuery.css( elem,
"display" ) ===
"none" || !jQuery.contains( elem.ownerDocument, elem );
10583 var rcheckableType = (/^(?:checkbox|radio)$/i);
10588 var fragment = document.createDocumentFragment(),
10589 div = fragment.appendChild( document.createElement(
"div" ) ),
10590 input = document.createElement(
"input" );
10592 // #
11217 - WebKit loses check when the name is after the checked attribute
10593 // Support: Windows Web Apps (WWA)
10594 // `name` and `type` need .setAttribute for WWA
10595 input.setAttribute(
"type",
"radio" );
10596 input.setAttribute(
"checked",
"checked" );
10597 input.setAttribute(
"name",
"t" );
10599 div.appendChild( input );
10601 // Support: Safari
5.1, iOS
5.1, Android
4.x, Android
2.3
10602 // old WebKit doesn't clone checked state correctly in fragments
10603 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
10605 // Make sure textarea (and checkbox) defaultValue is properly cloned
10606 // Support: IE9-IE11+
10607 div.innerHTML =
"<textarea>x</textarea>";
10608 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
10610 var strundefined = typeof undefined;
10614 support.focusinBubbles =
"onfocusin" in window;
10618 rkeyEvent = /^key/,
10619 rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
10620 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
10621 rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
10623 function returnTrue() {
10627 function returnFalse() {
10631 function safeActiveElement() {
10633 return document.activeElement;
10634 } catch ( err ) { }
10638 * Helper functions for managing events -- not part of the public interface.
10639 * Props to Dean Edwards' addEvent library for many of the ideas.
10645 add: function( elem, types, handler, data, selector ) {
10647 var handleObjIn, eventHandle, tmp,
10648 events, t, handleObj,
10649 special, handlers, type, namespaces, origType,
10650 elemData = data_priv.get( elem );
10652 // Don't attach events to noData or text/comment nodes (but allow plain objects)
10657 // Caller can pass in an object of custom data in lieu of the handler
10658 if ( handler.handler ) {
10659 handleObjIn = handler;
10660 handler = handleObjIn.handler;
10661 selector = handleObjIn.selector;
10664 // Make sure that the handler has a unique ID, used to find/remove it later
10665 if ( !handler.guid ) {
10666 handler.guid = jQuery.guid++;
10669 // Init the element's event structure and main handler, if this is the first
10670 if ( !(events = elemData.events) ) {
10671 events = elemData.events = {};
10673 if ( !(eventHandle = elemData.handle) ) {
10674 eventHandle = elemData.handle = function( e ) {
10675 // Discard the second event of a jQuery.event.trigger() and
10676 // when an event is called after a page has unloaded
10677 return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
10678 jQuery.event.dispatch.apply( elem, arguments ) : undefined;
10682 // Handle multiple events separated by a space
10683 types = ( types ||
"" ).match( rnotwhite ) || [
"" ];
10686 tmp = rtypenamespace.exec( types[t] ) || [];
10687 type = origType = tmp[
1];
10688 namespaces = ( tmp[
2] ||
"" ).split(
"." ).sort();
10690 // There *must* be a type, no attaching namespace-only handlers
10695 // If event changes its type, use the special event handlers for the changed type
10696 special = jQuery.event.special[ type ] || {};
10698 // If selector defined, determine special event api type, otherwise given type
10699 type = ( selector ? special.delegateType : special.bindType ) || type;
10701 // Update special based on newly reset type
10702 special = jQuery.event.special[ type ] || {};
10704 // handleObj is passed to all event handlers
10705 handleObj = jQuery.extend({
10707 origType: origType,
10710 guid: handler.guid,
10711 selector: selector,
10712 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
10713 namespace: namespaces.join(
".")
10716 // Init the event handler queue if we're the first
10717 if ( !(handlers = events[ type ]) ) {
10718 handlers = events[ type ] = [];
10719 handlers.delegateCount =
0;
10721 // Only use addEventListener if the special events handler returns false
10722 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
10723 if ( elem.addEventListener ) {
10724 elem.addEventListener( type, eventHandle, false );
10729 if ( special.add ) {
10730 special.add.call( elem, handleObj );
10732 if ( !handleObj.handler.guid ) {
10733 handleObj.handler.guid = handler.guid;
10737 // Add to the element's handler list, delegates in front
10739 handlers.splice( handlers.delegateCount++,
0, handleObj );
10741 handlers.push( handleObj );
10744 // Keep track of which events have ever been used, for event optimization
10745 jQuery.event.global[ type ] = true;
10750 // Detach an event or set of events from an element
10751 remove: function( elem, types, handler, selector, mappedTypes ) {
10753 var j, origCount, tmp,
10754 events, t, handleObj,
10755 special, handlers, type, namespaces, origType,
10756 elemData = data_priv.hasData( elem ) && data_priv.get( elem );
10758 if ( !elemData || !(events = elemData.events) ) {
10762 // Once for each type.namespace in types; type may be omitted
10763 types = ( types ||
"" ).match( rnotwhite ) || [
"" ];
10766 tmp = rtypenamespace.exec( types[t] ) || [];
10767 type = origType = tmp[
1];
10768 namespaces = ( tmp[
2] ||
"" ).split(
"." ).sort();
10770 // Unbind all events (on this namespace, if provided) for the element
10772 for ( type in events ) {
10773 jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
10778 special = jQuery.event.special[ type ] || {};
10779 type = ( selector ? special.delegateType : special.bindType ) || type;
10780 handlers = events[ type ] || [];
10781 tmp = tmp[
2] && new RegExp(
"(^|\\.)" + namespaces.join(
"\\.(?:.*\\.|)") +
"(\\.|$)" );
10783 // Remove matching events
10784 origCount = j = handlers.length;
10786 handleObj = handlers[ j ];
10788 if ( ( mappedTypes || origType === handleObj.origType ) &&
10789 ( !handler || handler.guid === handleObj.guid ) &&
10790 ( !tmp || tmp.test( handleObj.namespace ) ) &&
10791 ( !selector || selector === handleObj.selector || selector ===
"**" && handleObj.selector ) ) {
10792 handlers.splice( j,
1 );
10794 if ( handleObj.selector ) {
10795 handlers.delegateCount--;
10797 if ( special.remove ) {
10798 special.remove.call( elem, handleObj );
10803 // Remove generic event handler if we removed something and no more handlers exist
10804 // (avoids potential for endless recursion during removal of special event handlers)
10805 if ( origCount && !handlers.length ) {
10806 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
10807 jQuery.removeEvent( elem, type, elemData.handle );
10810 delete events[ type ];
10814 // Remove the expando if it's no longer used
10815 if ( jQuery.isEmptyObject( events ) ) {
10816 delete elemData.handle;
10817 data_priv.remove( elem,
"events" );
10821 trigger: function( event, data, elem, onlyHandlers ) {
10823 var i, cur, tmp, bubbleType, ontype, handle, special,
10824 eventPath = [ elem || document ],
10825 type = hasOwn.call( event,
"type" ) ? event.type : event,
10826 namespaces = hasOwn.call( event,
"namespace" ) ? event.namespace.split(
".") : [];
10828 cur = tmp = elem = elem || document;
10830 // Don't do events on text and comment nodes
10831 if ( elem.nodeType ===
3 || elem.nodeType ===
8 ) {
10835 // focus/blur morphs to focusin/out; ensure we're not firing them right now
10836 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
10840 if ( type.indexOf(
".")
>=
0 ) {
10841 // Namespaced trigger; create a regexp to match event type in handle()
10842 namespaces = type.split(".");
10843 type = namespaces.shift();
10846 ontype = type.indexOf(":") <
0 && "on" + type;
10848 // Caller can pass in a jQuery.Event object, Object, or just an event type string
10849 event = event[ jQuery.expando ] ?
10851 new jQuery.Event( type, typeof event === "object" && event );
10853 // Trigger bitmask: &
1 for native handlers; &
2 for jQuery (always true)
10854 event.isTrigger = onlyHandlers ?
2 :
3;
10855 event.namespace = namespaces.join(".");
10856 event.namespace_re = event.namespace ?
10857 new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
10860 // Clean up the event in case it is being reused
10861 event.result = undefined;
10862 if ( !event.target ) {
10863 event.target = elem;
10866 // Clone any incoming data and prepend the event, creating the handler arg list
10867 data = data == null ?
10869 jQuery.makeArray( data, [ event ] );
10871 // Allow special events to draw outside the lines
10872 special = jQuery.event.special[ type ] || {};
10873 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
10877 // Determine event propagation path in advance, per W3C events spec (#
9951)
10878 // Bubble up to document, then to window; watch for a global ownerDocument var (#
9724)
10879 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
10881 bubbleType = special.delegateType || type;
10882 if ( !rfocusMorph.test( bubbleType + type ) ) {
10883 cur = cur.parentNode;
10885 for ( ; cur; cur = cur.parentNode ) {
10886 eventPath.push( cur );
10890 // Only add window if we got to document (e.g., not plain obj or detached DOM)
10891 if ( tmp === (elem.ownerDocument || document) ) {
10892 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
10896 // Fire handlers on the event path
10898 while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
10900 event.type = i
> 1 ?
10902 special.bindType || type;
10905 handle = ( data_priv.get( cur,
"events" ) || {} )[ event.type ] && data_priv.get( cur,
"handle" );
10907 handle.apply( cur, data );
10911 handle = ontype && cur[ ontype ];
10912 if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
10913 event.result = handle.apply( cur, data );
10914 if ( event.result === false ) {
10915 event.preventDefault();
10921 // If nobody prevented the default action, do it now
10922 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
10924 if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
10925 jQuery.acceptData( elem ) ) {
10927 // Call a native DOM method on the target with the same name name as the event.
10928 // Don't do default actions on window, that's where global variables be (#
6170)
10929 if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
10931 // Don't re-trigger an onFOO event when we call its FOO() method
10932 tmp = elem[ ontype ];
10935 elem[ ontype ] = null;
10938 // Prevent re-triggering of the same event, since we already bubbled it above
10939 jQuery.event.triggered = type;
10941 jQuery.event.triggered = undefined;
10944 elem[ ontype ] = tmp;
10950 return event.result;
10953 dispatch: function( event ) {
10955 // Make a writable jQuery.Event from the native event object
10956 event = jQuery.event.fix( event );
10958 var i, j, ret, matched, handleObj,
10960 args = slice.call( arguments ),
10961 handlers = ( data_priv.get( this,
"events" ) || {} )[ event.type ] || [],
10962 special = jQuery.event.special[ event.type ] || {};
10964 // Use the fix-ed jQuery.Event rather than the (read-only) native event
10966 event.delegateTarget = this;
10968 // Call the preDispatch hook for the mapped type, and let it bail if desired
10969 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
10973 // Determine handlers
10974 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
10976 // Run delegates first; they may want to stop propagation beneath us
10978 while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
10979 event.currentTarget = matched.elem;
10982 while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
10984 // Triggered event must either
1) have no namespace, or
10985 //
2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
10986 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
10988 event.handleObj = handleObj;
10989 event.data = handleObj.data;
10991 ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
10992 .apply( matched.elem, args );
10994 if ( ret !== undefined ) {
10995 if ( (event.result = ret) === false ) {
10996 event.preventDefault();
10997 event.stopPropagation();
11004 // Call the postDispatch hook for the mapped type
11005 if ( special.postDispatch ) {
11006 special.postDispatch.call( this, event );
11009 return event.result;
11012 handlers: function( event, handlers ) {
11013 var i, matches, sel, handleObj,
11015 delegateCount = handlers.delegateCount,
11016 cur = event.target;
11018 // Find delegate handlers
11019 // Black-hole SVG
<use> instance trees (#
13180)
11020 // Avoid non-left-click bubbling in Firefox (#
3861)
11021 if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
11023 for ( ; cur !== this; cur = cur.parentNode || this ) {
11025 // Don't process clicks on disabled elements (#
6911, #
8165, #
11382, #
11764)
11026 if ( cur.disabled !== true || event.type !== "click" ) {
11028 for ( i =
0; i < delegateCount; i++ ) {
11029 handleObj = handlers[ i ];
11031 // Don't conflict with Object.prototype properties (#
13203)
11032 sel = handleObj.selector + " ";
11034 if ( matches[ sel ] === undefined ) {
11035 matches[ sel ] = handleObj.needsContext ?
11036 jQuery( sel, this ).index( cur )
>=
0 :
11037 jQuery.find( sel, this, null, [ cur ] ).length;
11039 if ( matches[ sel ] ) {
11040 matches.push( handleObj );
11043 if ( matches.length ) {
11044 handlerQueue.push({ elem: cur, handlers: matches });
11050 // Add the remaining (directly-bound) handlers
11051 if ( delegateCount < handlers.length ) {
11052 handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
11055 return handlerQueue;
11058 // Includes some event props shared by KeyEvent and MouseEvent
11059 props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
11064 props: "char charCode key keyCode".split(" "),
11065 filter: function( event, original ) {
11067 // Add which for key events
11068 if ( event.which == null ) {
11069 event.which = original.charCode != null ? original.charCode : original.keyCode;
11077 props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
11078 filter: function( event, original ) {
11079 var eventDoc, doc, body,
11080 button = original.button;
11082 // Calculate pageX/Y if missing and clientX/Y available
11083 if ( event.pageX == null && original.clientX != null ) {
11084 eventDoc = event.target.ownerDocument || document;
11085 doc = eventDoc.documentElement;
11086 body = eventDoc.body;
11088 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft ||
0 ) - ( doc && doc.clientLeft || body && body.clientLeft ||
0 );
11089 event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop ||
0 ) - ( doc && doc.clientTop || body && body.clientTop ||
0 );
11092 // Add which for click:
1 === left;
2 === middle;
3 === right
11093 // Note: button is not normalized, so don't use it
11094 if ( !event.which && button !== undefined ) {
11095 event.which = ( button &
1 ?
1 : ( button &
2 ?
3 : ( button &
4 ?
2 :
0 ) ) );
11102 fix: function( event ) {
11103 if ( event[ jQuery.expando ] ) {
11107 // Create a writable copy of the event object and normalize some properties
11110 originalEvent = event,
11111 fixHook = this.fixHooks[ type ];
11114 this.fixHooks[ type ] = fixHook =
11115 rmouseEvent.test( type ) ? this.mouseHooks :
11116 rkeyEvent.test( type ) ? this.keyHooks :
11119 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
11121 event = new jQuery.Event( originalEvent );
11126 event[ prop ] = originalEvent[ prop ];
11129 // Support: Cordova
2.5 (WebKit) (#
13255)
11130 // All events should have a target; Cordova deviceready doesn't
11131 if ( !event.target ) {
11132 event.target = document;
11135 // Support: Safari
6.0+, Chrome <
28
11136 // Target should not be a text node (#
504, #
13143)
11137 if ( event.target.nodeType ===
3 ) {
11138 event.target = event.target.parentNode;
11141 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
11146 // Prevent triggered image.load events from bubbling to window.load
11150 // Fire native event if possible so blur/focus sequence is correct
11151 trigger: function() {
11152 if ( this !== safeActiveElement() && this.focus ) {
11157 delegateType: "focusin"
11160 trigger: function() {
11161 if ( this === safeActiveElement() && this.blur ) {
11166 delegateType: "focusout"
11169 // For checkbox, fire native event so checked state will be right
11170 trigger: function() {
11171 if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
11177 // For cross-browser consistency, don't fire native .click() on links
11178 _default: function( event ) {
11179 return jQuery.nodeName( event.target, "a" );
11184 postDispatch: function( event ) {
11186 // Support: Firefox
20+
11187 // Firefox doesn't alert if the returnValue field is not set.
11188 if ( event.result !== undefined && event.originalEvent ) {
11189 event.originalEvent.returnValue = event.result;
11195 simulate: function( type, elem, event, bubble ) {
11196 // Piggyback on a donor event to simulate a different one.
11197 // Fake originalEvent to avoid donor's stopPropagation, but if the
11198 // simulated event prevents default then we do the same on the donor.
11199 var e = jQuery.extend(
11200 new jQuery.Event(),
11209 jQuery.event.trigger( e, null, elem );
11211 jQuery.event.dispatch.call( elem, e );
11213 if ( e.isDefaultPrevented() ) {
11214 event.preventDefault();
11219 jQuery.removeEvent = function( elem, type, handle ) {
11220 if ( elem.removeEventListener ) {
11221 elem.removeEventListener( type, handle, false );
11225 jQuery.Event = function( src, props ) {
11226 // Allow instantiation without the 'new' keyword
11227 if ( !(this instanceof jQuery.Event) ) {
11228 return new jQuery.Event( src, props );
11232 if ( src && src.type ) {
11233 this.originalEvent = src;
11234 this.type = src.type;
11236 // Events bubbling up the document may have been marked as prevented
11237 // by a handler lower down the tree; reflect the correct value.
11238 this.isDefaultPrevented = src.defaultPrevented ||
11239 src.defaultPrevented === undefined &&
11240 // Support: Android <
4.0
11241 src.returnValue === false ?
11250 // Put explicitly provided properties onto the event object
11252 jQuery.extend( this, props );
11255 // Create a timestamp if incoming event doesn't have one
11256 this.timeStamp = src && src.timeStamp || jQuery.now();
11258 // Mark it as fixed
11259 this[ jQuery.expando ] = true;
11262 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
11263 // http://www.w3.org/TR/
2003/WD-DOM-Level-
3-Events-
20030331/ecma-script-binding.html
11264 jQuery.Event.prototype = {
11265 isDefaultPrevented: returnFalse,
11266 isPropagationStopped: returnFalse,
11267 isImmediatePropagationStopped: returnFalse,
11269 preventDefault: function() {
11270 var e = this.originalEvent;
11272 this.isDefaultPrevented = returnTrue;
11274 if ( e && e.preventDefault ) {
11275 e.preventDefault();
11278 stopPropagation: function() {
11279 var e = this.originalEvent;
11281 this.isPropagationStopped = returnTrue;
11283 if ( e && e.stopPropagation ) {
11284 e.stopPropagation();
11287 stopImmediatePropagation: function() {
11288 var e = this.originalEvent;
11290 this.isImmediatePropagationStopped = returnTrue;
11292 if ( e && e.stopImmediatePropagation ) {
11293 e.stopImmediatePropagation();
11296 this.stopPropagation();
11300 // Create mouseenter/leave events using mouseover/out and event-time checks
11301 // Support: Chrome
15+
11303 mouseenter: "mouseover",
11304 mouseleave: "mouseout",
11305 pointerenter: "pointerover",
11306 pointerleave: "pointerout"
11307 }, function( orig, fix ) {
11308 jQuery.event.special[ orig ] = {
11312 handle: function( event ) {
11315 related = event.relatedTarget,
11316 handleObj = event.handleObj;
11318 // For mousenter/leave call the handler if related is outside the target.
11319 // NB: No relatedTarget if the mouse left/entered the browser window
11320 if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
11321 event.type = handleObj.origType;
11322 ret = handleObj.handler.apply( this, arguments );
11330 // Create "bubbling" focus and blur events
11331 // Support: Firefox, Chrome, Safari
11332 if ( !support.focusinBubbles ) {
11333 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
11335 // Attach a single capturing handler on the document while someone wants focusin/focusout
11336 var handler = function( event ) {
11337 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
11340 jQuery.event.special[ fix ] = {
11341 setup: function() {
11342 var doc = this.ownerDocument || this,
11343 attaches = data_priv.access( doc, fix );
11346 doc.addEventListener( orig, handler, true );
11348 data_priv.access( doc, fix, ( attaches ||
0 ) +
1 );
11350 teardown: function() {
11351 var doc = this.ownerDocument || this,
11352 attaches = data_priv.access( doc, fix ) -
1;
11355 doc.removeEventListener( orig, handler, true );
11356 data_priv.remove( doc, fix );
11359 data_priv.access( doc, fix, attaches );
11368 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
11371 // Types can be a map of types/handlers
11372 if ( typeof types === "object" ) {
11373 // ( types-Object, selector, data )
11374 if ( typeof selector !== "string" ) {
11375 // ( types-Object, data )
11376 data = data || selector;
11377 selector = undefined;
11379 for ( type in types ) {
11380 this.on( type, selector, data, types[ type ], one );
11385 if ( data == null && fn == null ) {
11388 data = selector = undefined;
11389 } else if ( fn == null ) {
11390 if ( typeof selector === "string" ) {
11391 // ( types, selector, fn )
11395 // ( types, data, fn )
11398 selector = undefined;
11401 if ( fn === false ) {
11403 } else if ( !fn ) {
11409 fn = function( event ) {
11410 // Can use an empty set, since event contains the info
11411 jQuery().off( event );
11412 return origFn.apply( this, arguments );
11414 // Use same guid so caller can remove using origFn
11415 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
11417 return this.each( function() {
11418 jQuery.event.add( this, types, fn, data, selector );
11421 one: function( types, selector, data, fn ) {
11422 return this.on( types, selector, data, fn,
1 );
11424 off: function( types, selector, fn ) {
11425 var handleObj, type;
11426 if ( types && types.preventDefault && types.handleObj ) {
11427 // ( event ) dispatched jQuery.Event
11428 handleObj = types.handleObj;
11429 jQuery( types.delegateTarget ).off(
11430 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
11431 handleObj.selector,
11436 if ( typeof types === "object" ) {
11437 // ( types-object [, selector] )
11438 for ( type in types ) {
11439 this.off( type, selector, types[ type ] );
11443 if ( selector === false || typeof selector === "function" ) {
11444 // ( types [, fn] )
11446 selector = undefined;
11448 if ( fn === false ) {
11451 return this.each(function() {
11452 jQuery.event.remove( this, types, fn, selector );
11456 trigger: function( type, data ) {
11457 return this.each(function() {
11458 jQuery.event.trigger( type, data, this );
11461 triggerHandler: function( type, data ) {
11462 var elem = this[
0];
11464 return jQuery.event.trigger( type, data, elem, true );
11471 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^
>]*)\
/>/gi,
11472 rtagName = /<([\w:]+)/,
11473 rhtml = /<|&#?\w+;/,
11474 rnoInnerhtml = /<(?:script|style|link)/i,
11475 //
checked="checked" or checked
11476 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
11477 rscriptType = /^$|\/(?:java|ecma)script/i,
11478 rscriptTypeMasked = /^true\/(.*)/,
11479 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)
>\s*$/g,
11481 // We have to close these tags to support XHTML (#
13200)
11485 option: [
1, "
<select multiple='multiple'
>", "</select>" ],
11487 thead: [ 1, "<table>", "</table>" ],
11488 col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
11489 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
11490 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
11492 _default: [ 0, "", "" ]
11496 wrapMap.optgroup = wrapMap.option;
11498 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
11499 wrapMap.th = wrapMap.td;
11501 // Support: 1.x compatibility
11502 // Manipulating tables requires a tbody
11503 function manipulationTarget( elem, content ) {
11504 return jQuery.nodeName( elem, "table
" ) &&
11505 jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr
" ) ?
11507 elem.getElementsByTagName("tbody
")[0] ||
11508 elem.appendChild( elem.ownerDocument.createElement("tbody
") ) :
11512 // Replace/restore the type attribute of script elements for safe DOM manipulation
11513 function disableScript( elem ) {
11514 elem.type = (elem.getAttribute("type
") !== null) + "/
" + elem.type;
11517 function restoreScript( elem ) {
11518 var match = rscriptTypeMasked.exec( elem.type );
11521 elem.type = match[ 1 ];
11523 elem.removeAttribute("type
");
11529 // Mark scripts as having already been evaluated
11530 function setGlobalEval( elems, refElements ) {
11534 for ( ; i < l; i++ ) {
11536 elems[ i ], "globalEval
", !refElements || data_priv.get( refElements[ i ], "globalEval
" )
11541 function cloneCopyEvent( src, dest ) {
11542 var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
11544 if ( dest.nodeType !== 1 ) {
11548 // 1. Copy private data: events, handlers, etc.
11549 if ( data_priv.hasData( src ) ) {
11550 pdataOld = data_priv.access( src );
11551 pdataCur = data_priv.set( dest, pdataOld );
11552 events = pdataOld.events;
11555 delete pdataCur.handle;
11556 pdataCur.events = {};
11558 for ( type in events ) {
11559 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
11560 jQuery.event.add( dest, type, events[ type ][ i ] );
11566 // 2. Copy user data
11567 if ( data_user.hasData( src ) ) {
11568 udataOld = data_user.access( src );
11569 udataCur = jQuery.extend( {}, udataOld );
11571 data_user.set( dest, udataCur );
11575 function getAll( context, tag ) {
11576 var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*
" ) :
11577 context.querySelectorAll ? context.querySelectorAll( tag || "*
" ) :
11580 return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
11581 jQuery.merge( [ context ], ret ) :
11585 // Support: IE >= 9
11586 function fixInput( src, dest ) {
11587 var nodeName = dest.nodeName.toLowerCase();
11589 // Fails to persist the checked state of a cloned checkbox or radio button.
11590 if ( nodeName === "input
" && rcheckableType.test( src.type ) ) {
11591 dest.checked = src.checked;
11593 // Fails to return the selected option to the default selected state when cloning options
11594 } else if ( nodeName === "input
" || nodeName === "textarea
" ) {
11595 dest.defaultValue = src.defaultValue;
11600 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
11601 var i, l, srcElements, destElements,
11602 clone = elem.cloneNode( true ),
11603 inPage = jQuery.contains( elem.ownerDocument, elem );
11605 // Support: IE >= 9
11606 // Fix Cloning issues
11607 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
11608 !jQuery.isXMLDoc( elem ) ) {
11610 // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
11611 destElements = getAll( clone );
11612 srcElements = getAll( elem );
11614 for ( i = 0, l = srcElements.length; i < l; i++ ) {
11615 fixInput( srcElements[ i ], destElements[ i ] );
11619 // Copy the events from the original to the clone
11620 if ( dataAndEvents ) {
11621 if ( deepDataAndEvents ) {
11622 srcElements = srcElements || getAll( elem );
11623 destElements = destElements || getAll( clone );
11625 for ( i = 0, l = srcElements.length; i < l; i++ ) {
11626 cloneCopyEvent( srcElements[ i ], destElements[ i ] );
11629 cloneCopyEvent( elem, clone );
11633 // Preserve script evaluation history
11634 destElements = getAll( clone, "script
" );
11635 if ( destElements.length > 0 ) {
11636 setGlobalEval( destElements, !inPage && getAll( elem, "script
" ) );
11639 // Return the cloned set
11643 buildFragment: function( elems, context, scripts, selection ) {
11644 var elem, tmp, tag, wrap, contains, j,
11645 fragment = context.createDocumentFragment(),
11650 for ( ; i < l; i++ ) {
11653 if ( elem || elem === 0 ) {
11655 // Add nodes directly
11656 if ( jQuery.type( elem ) === "object
" ) {
11657 // Support: QtWebKit
11658 // jQuery.merge because push.apply(_, arraylike) throws
11659 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
11661 // Convert non-html into a text node
11662 } else if ( !rhtml.test( elem ) ) {
11663 nodes.push( context.createTextNode( elem ) );
11665 // Convert html into DOM nodes
11667 tmp = tmp || fragment.appendChild( context.createElement("div
") );
11669 // Deserialize a standard representation
11670 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
11671 wrap = wrapMap[ tag ] || wrapMap._default;
11672 tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$
1></$
2>" ) + wrap[ 2 ];
11674 // Descend through wrappers to the right content
11677 tmp = tmp.lastChild;
11680 // Support: QtWebKit
11681 // jQuery.merge because push.apply(_, arraylike) throws
11682 jQuery.merge( nodes, tmp.childNodes );
11684 // Remember the top-level container
11685 tmp = fragment.firstChild;
11688 // Support: Webkit, IE
11689 tmp.textContent = "";
11694 // Remove wrapper from fragment
11695 fragment.textContent = "";
11698 while ( (elem = nodes[ i++ ]) ) {
11700 // #4087 - If origin and destination elements are the same, and this is
11701 // that element, do not do anything
11702 if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
11706 contains = jQuery.contains( elem.ownerDocument, elem );
11708 // Append to fragment
11709 tmp = getAll( fragment.appendChild( elem ), "script
" );
11711 // Preserve script evaluation history
11713 setGlobalEval( tmp );
11716 // Capture executables
11719 while ( (elem = tmp[ j++ ]) ) {
11720 if ( rscriptType.test( elem.type || "" ) ) {
11721 scripts.push( elem );
11730 cleanData: function( elems ) {
11731 var data, elem, type, key,
11732 special = jQuery.event.special,
11735 for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
11736 if ( jQuery.acceptData( elem ) ) {
11737 key = elem[ data_priv.expando ];
11739 if ( key && (data = data_priv.cache[ key ]) ) {
11740 if ( data.events ) {
11741 for ( type in data.events ) {
11742 if ( special[ type ] ) {
11743 jQuery.event.remove( elem, type );
11745 // This is a shortcut to avoid jQuery.event.remove's overhead
11747 jQuery.removeEvent( elem, type, data.handle );
11751 if ( data_priv.cache[ key ] ) {
11752 // Discard any remaining `private` data
11753 delete data_priv.cache[ key ];
11757 // Discard any remaining `user` data
11758 delete data_user.cache[ elem[ data_user.expando ] ];
11764 text: function( value ) {
11765 return access( this, function( value ) {
11766 return value === undefined ?
11767 jQuery.text( this ) :
11768 this.empty().each(function() {
11769 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
11770 this.textContent = value;
11773 }, null, value, arguments.length );
11776 append: function() {
11777 return this.domManip( arguments, function( elem ) {
11778 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
11779 var target = manipulationTarget( this, elem );
11780 target.appendChild( elem );
11785 prepend: function() {
11786 return this.domManip( arguments, function( elem ) {
11787 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
11788 var target = manipulationTarget( this, elem );
11789 target.insertBefore( elem, target.firstChild );
11794 before: function() {
11795 return this.domManip( arguments, function( elem ) {
11796 if ( this.parentNode ) {
11797 this.parentNode.insertBefore( elem, this );
11802 after: function() {
11803 return this.domManip( arguments, function( elem ) {
11804 if ( this.parentNode ) {
11805 this.parentNode.insertBefore( elem, this.nextSibling );
11810 remove: function( selector, keepData /* Internal Use Only */ ) {
11812 elems = selector ? jQuery.filter( selector, this ) : this,
11815 for ( ; (elem = elems[i]) != null; i++ ) {
11816 if ( !keepData && elem.nodeType === 1 ) {
11817 jQuery.cleanData( getAll( elem ) );
11820 if ( elem.parentNode ) {
11821 if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
11822 setGlobalEval( getAll( elem, "script
" ) );
11824 elem.parentNode.removeChild( elem );
11831 empty: function() {
11835 for ( ; (elem = this[i]) != null; i++ ) {
11836 if ( elem.nodeType === 1 ) {
11838 // Prevent memory leaks
11839 jQuery.cleanData( getAll( elem, false ) );
11841 // Remove any remaining nodes
11842 elem.textContent = "";
11849 clone: function( dataAndEvents, deepDataAndEvents ) {
11850 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
11851 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
11853 return this.map(function() {
11854 return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
11858 html: function( value ) {
11859 return access( this, function( value ) {
11860 var elem = this[ 0 ] || {},
11864 if ( value === undefined && elem.nodeType === 1 ) {
11865 return elem.innerHTML;
11868 // See if we can take a shortcut and just use innerHTML
11869 if ( typeof value === "string
" && !rnoInnerhtml.test( value ) &&
11870 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
11872 value = value.replace( rxhtmlTag, "<$
1></$
2>" );
11875 for ( ; i < l; i++ ) {
11876 elem = this[ i ] || {};
11878 // Remove element nodes and prevent memory leaks
11879 if ( elem.nodeType === 1 ) {
11880 jQuery.cleanData( getAll( elem, false ) );
11881 elem.innerHTML = value;
11887 // If using innerHTML throws an exception, use the fallback method
11892 this.empty().append( value );
11894 }, null, value, arguments.length );
11897 replaceWith: function() {
11898 var arg = arguments[ 0 ];
11900 // Make the changes, replacing each context element with the new content
11901 this.domManip( arguments, function( elem ) {
11902 arg = this.parentNode;
11904 jQuery.cleanData( getAll( this ) );
11907 arg.replaceChild( elem, this );
11911 // Force removal if there was no new content (e.g., from empty arguments)
11912 return arg && (arg.length || arg.nodeType) ? this : this.remove();
11915 detach: function( selector ) {
11916 return this.remove( selector, true );
11919 domManip: function( args, callback ) {
11921 // Flatten any nested arrays
11922 args = concat.apply( [], args );
11924 var fragment, first, scripts, hasScripts, node, doc,
11930 isFunction = jQuery.isFunction( value );
11932 // We can't cloneNode fragments that contain checked, in WebKit
11934 ( l > 1 && typeof value === "string
" &&
11935 !support.checkClone && rchecked.test( value ) ) ) {
11936 return this.each(function( index ) {
11937 var self = set.eq( index );
11938 if ( isFunction ) {
11939 args[ 0 ] = value.call( this, index, self.html() );
11941 self.domManip( args, callback );
11946 fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
11947 first = fragment.firstChild;
11949 if ( fragment.childNodes.length === 1 ) {
11954 scripts = jQuery.map( getAll( fragment, "script
" ), disableScript );
11955 hasScripts = scripts.length;
11957 // Use the original fragment for the last item instead of the first because it can end up
11958 // being emptied incorrectly in certain situations (#8070).
11959 for ( ; i < l; i++ ) {
11962 if ( i !== iNoClone ) {
11963 node = jQuery.clone( node, true, true );
11965 // Keep references to cloned scripts for later restoration
11966 if ( hasScripts ) {
11967 // Support: QtWebKit
11968 // jQuery.merge because push.apply(_, arraylike) throws
11969 jQuery.merge( scripts, getAll( node, "script
" ) );
11973 callback.call( this[ i ], node, i );
11976 if ( hasScripts ) {
11977 doc = scripts[ scripts.length - 1 ].ownerDocument;
11979 // Reenable scripts
11980 jQuery.map( scripts, restoreScript );
11982 // Evaluate executable scripts on first document insertion
11983 for ( i = 0; i < hasScripts; i++ ) {
11984 node = scripts[ i ];
11985 if ( rscriptType.test( node.type || "" ) &&
11986 !data_priv.access( node, "globalEval
" ) && jQuery.contains( doc, node ) ) {
11989 // Optional AJAX dependency, but won't run scripts if not present
11990 if ( jQuery._evalUrl ) {
11991 jQuery._evalUrl( node.src );
11994 jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
12007 appendTo: "append
",
12008 prependTo: "prepend
",
12009 insertBefore: "before
",
12010 insertAfter: "after
",
12011 replaceAll: "replaceWith
"
12012 }, function( name, original ) {
12013 jQuery.fn[ name ] = function( selector ) {
12016 insert = jQuery( selector ),
12017 last = insert.length - 1,
12020 for ( ; i <= last; i++ ) {
12021 elems = i === last ? this : this.clone( true );
12022 jQuery( insert[ i ] )[ original ]( elems );
12024 // Support: QtWebKit
12025 // .get() because push.apply(_, arraylike) throws
12026 push.apply( ret, elems.get() );
12029 return this.pushStack( ret );
12038 * Retrieve the actual display of a element
12039 * @param {String} name nodeName of the element
12040 * @param {Object} doc Document object
12042 // Called only from within defaultDisplay
12043 function actualDisplay( name, doc ) {
12045 elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
12047 // getDefaultComputedStyle might be reliably used only on attached element
12048 display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
12050 // Use of this method is a temporary fix (more like optmization) until something better comes along,
12051 // since it was removed from specification and supported only in FF
12052 style.display : jQuery.css( elem[ 0 ], "display
" );
12054 // We don't have any data stored on the element,
12055 // so use "detach
" method as fast way to get rid of the element
12062 * Try to determine the default display value of an element
12063 * @param {String} nodeName
12065 function defaultDisplay( nodeName ) {
12066 var doc = document,
12067 display = elemdisplay[ nodeName ];
12070 display = actualDisplay( nodeName, doc );
12072 // If the simple way fails, read from inside an iframe
12073 if ( display === "none
" || !display ) {
12075 // Use the already-created iframe if possible
12076 iframe = (iframe || jQuery( "<iframe frameborder='
0' width='
0' height='
0'
/>" )).appendTo( doc.documentElement );
12078 // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
12079 doc = iframe[ 0 ].contentDocument;
12085 display = actualDisplay( nodeName, doc );
12089 // Store the correct default display
12090 elemdisplay[ nodeName ] = display;
12095 var rmargin = (/^margin/);
12097 var rnumnonpx = new RegExp( "^(
" + pnum + ")(?!px)[a-z%]+$
", "i
" );
12099 var getStyles = function( elem ) {
12100 return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
12105 function curCSS( elem, name, computed ) {
12106 var width, minWidth, maxWidth, ret,
12107 style = elem.style;
12109 computed = computed || getStyles( elem );
12112 // getPropertyValue is only needed for .css('filter') in IE9, see #12537
12114 ret = computed.getPropertyValue( name ) || computed[ name ];
12119 if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
12120 ret = jQuery.style( elem, name );
12123 // Support: iOS < 6
12124 // A tribute to the "awesome hack by Dean Edwards
"
12125 // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
12126 // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
12127 if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
12129 // Remember the original values
12130 width = style.width;
12131 minWidth = style.minWidth;
12132 maxWidth = style.maxWidth;
12134 // Put in the new values to get a computed value out
12135 style.minWidth = style.maxWidth = style.width = ret;
12136 ret = computed.width;
12138 // Revert the changed values
12139 style.width = width;
12140 style.minWidth = minWidth;
12141 style.maxWidth = maxWidth;
12145 return ret !== undefined ?
12147 // IE returns zIndex value as an integer.
12153 function addGetHookIf( conditionFn, hookFn ) {
12154 // Define the hook, we'll check on the first run if it's really needed.
12157 if ( conditionFn() ) {
12158 // Hook not needed (or it's not possible to use it due to missing dependency),
12160 // Since there are no other hooks for marginRight, remove the whole object.
12165 // Hook needed; redefine it so that the support test is not executed again.
12167 return (this.get = hookFn).apply( this, arguments );
12174 var pixelPositionVal, boxSizingReliableVal,
12175 docElem = document.documentElement,
12176 container = document.createElement( "div
" ),
12177 div = document.createElement( "div
" );
12179 if ( !div.style ) {
12183 div.style.backgroundClip = "content-box
";
12184 div.cloneNode( true ).style.backgroundClip = "";
12185 support.clearCloneStyle = div.style.backgroundClip === "content-box
";
12187 container.style.cssText = "border:
0;width:
0;height:
0;top:
0;left:-
9999px;margin-top:
1px;
" +
12188 "position:absolute
";
12189 container.appendChild( div );
12191 // Executing both pixelPosition & boxSizingReliable tests require only one layout
12192 // so they're executed at the same time to save the second computation.
12193 function computePixelPositionAndBoxSizingReliable() {
12194 div.style.cssText =
12195 // Support: Firefox<29, Android 2.3
12196 // Vendor-prefix box-sizing
12197 "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;
" +
12198 "box-sizing:border-box;display:block;margin-top:
1%;top:
1%;
" +
12199 "border:
1px;padding:
1px;width:
4px;position:absolute
";
12200 div.innerHTML = "";
12201 docElem.appendChild( container );
12203 var divStyle = window.getComputedStyle( div, null );
12204 pixelPositionVal = divStyle.top !== "1%
";
12205 boxSizingReliableVal = divStyle.width === "4px
";
12207 docElem.removeChild( container );
12210 // Support: node.js jsdom
12211 // Don't assume that getComputedStyle is a property of the global object
12212 if ( window.getComputedStyle ) {
12213 jQuery.extend( support, {
12214 pixelPosition: function() {
12215 // This test is executed only once but we still do memoizing
12216 // since we can use the boxSizingReliable pre-computing.
12217 // No need to check if the test was already performed, though.
12218 computePixelPositionAndBoxSizingReliable();
12219 return pixelPositionVal;
12221 boxSizingReliable: function() {
12222 if ( boxSizingReliableVal == null ) {
12223 computePixelPositionAndBoxSizingReliable();
12225 return boxSizingReliableVal;
12227 reliableMarginRight: function() {
12228 // Support: Android 2.3
12229 // Check if div with explicit width and no margin-right incorrectly
12230 // gets computed margin-right based on width of container. (#3333)
12231 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
12232 // This support function is only executed once so no memoizing is needed.
12234 marginDiv = div.appendChild( document.createElement( "div
" ) );
12236 // Reset CSS: box-sizing; display; margin; border; padding
12237 marginDiv.style.cssText = div.style.cssText =
12238 // Support: Firefox<29, Android 2.3
12239 // Vendor-prefix box-sizing
12240 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;
" +
12241 "box-sizing:content-box;display:block;margin:
0;border:
0;padding:
0";
12242 marginDiv.style.marginRight = marginDiv.style.width = "0";
12243 div.style.width = "1px
";
12244 docElem.appendChild( container );
12246 ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
12248 docElem.removeChild( container );
12257 // A method for quickly swapping in/out CSS properties to get correct calculations.
12258 jQuery.swap = function( elem, options, callback, args ) {
12262 // Remember the old values, and insert the new ones
12263 for ( name in options ) {
12264 old[ name ] = elem.style[ name ];
12265 elem.style[ name ] = options[ name ];
12268 ret = callback.apply( elem, args || [] );
12270 // Revert the old values
12271 for ( name in options ) {
12272 elem.style[ name ] = old[ name ];
12280 // swappable if display is none or starts with table except "table
", "table-cell
", or "table-caption
"
12281 // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
12282 rdisplayswap = /^(none|table(?!-c[ea]).+)/,
12283 rnumsplit = new RegExp( "^(
" + pnum + ")(.*)$
", "i
" ),
12284 rrelNum = new RegExp( "^([+-])=(
" + pnum + ")
", "i
" ),
12286 cssShow = { position: "absolute
", visibility: "hidden
", display: "block
" },
12287 cssNormalTransform = {
12288 letterSpacing: "0",
12292 cssPrefixes = [ "Webkit
", "O
", "Moz
", "ms
" ];
12294 // return a css property mapped to a potentially vendor prefixed property
12295 function vendorPropName( style, name ) {
12297 // shortcut for names that are not vendor prefixed
12298 if ( name in style ) {
12302 // check for vendor prefixed names
12303 var capName = name[0].toUpperCase() + name.slice(1),
12305 i = cssPrefixes.length;
12308 name = cssPrefixes[ i ] + capName;
12309 if ( name in style ) {
12317 function setPositiveNumber( elem, value, subtract ) {
12318 var matches = rnumsplit.exec( value );
12320 // Guard against undefined "subtract
", e.g., when used as in cssHooks
12321 Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px
" ) :
12325 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
12326 var i = extra === ( isBorderBox ? "border
" : "content
" ) ?
12327 // If we already have the right measurement, avoid augmentation
12329 // Otherwise initialize for horizontal or vertical properties
12330 name === "width
" ? 1 : 0,
12334 for ( ; i < 4; i += 2 ) {
12335 // both box models exclude margin, so add it if we want it
12336 if ( extra === "margin
" ) {
12337 val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
12340 if ( isBorderBox ) {
12341 // border-box includes padding, so remove it if we want content
12342 if ( extra === "content
" ) {
12343 val -= jQuery.css( elem, "padding
" + cssExpand[ i ], true, styles );
12346 // at this point, extra isn't border nor margin, so remove border
12347 if ( extra !== "margin
" ) {
12348 val -= jQuery.css( elem, "border
" + cssExpand[ i ] + "Width
", true, styles );
12351 // at this point, extra isn't content, so add padding
12352 val += jQuery.css( elem, "padding
" + cssExpand[ i ], true, styles );
12354 // at this point, extra isn't content nor padding, so add border
12355 if ( extra !== "padding
" ) {
12356 val += jQuery.css( elem, "border
" + cssExpand[ i ] + "Width
", true, styles );
12364 function getWidthOrHeight( elem, name, extra ) {
12366 // Start with offset property, which is equivalent to the border-box value
12367 var valueIsBorderBox = true,
12368 val = name === "width
" ? elem.offsetWidth : elem.offsetHeight,
12369 styles = getStyles( elem ),
12370 isBorderBox = jQuery.css( elem, "boxSizing
", false, styles ) === "border-box
";
12372 // some non-html elements return undefined for offsetWidth, so check for null/undefined
12373 // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
12374 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
12375 if ( val <= 0 || val == null ) {
12376 // Fall back to computed then uncomputed css if necessary
12377 val = curCSS( elem, name, styles );
12378 if ( val < 0 || val == null ) {
12379 val = elem.style[ name ];
12382 // Computed unit is not pixels. Stop here and return.
12383 if ( rnumnonpx.test(val) ) {
12387 // we need the check for style in case a browser which returns unreliable values
12388 // for getComputedStyle silently falls back to the reliable elem.style
12389 valueIsBorderBox = isBorderBox &&
12390 ( support.boxSizingReliable() || val === elem.style[ name ] );
12392 // Normalize "", auto, and prepare for extra
12393 val = parseFloat( val ) || 0;
12396 // use the active box-sizing model to add/subtract irrelevant styles
12398 augmentWidthOrHeight(
12401 extra || ( isBorderBox ? "border
" : "content
" ),
12408 function showHide( elements, show ) {
12409 var display, elem, hidden,
12412 length = elements.length;
12414 for ( ; index < length; index++ ) {
12415 elem = elements[ index ];
12416 if ( !elem.style ) {
12420 values[ index ] = data_priv.get( elem, "olddisplay
" );
12421 display = elem.style.display;
12423 // Reset the inline display of this element to learn if it is
12424 // being hidden by cascaded rules or not
12425 if ( !values[ index ] && display === "none
" ) {
12426 elem.style.display = "";
12429 // Set elements which have been overridden with display: none
12430 // in a stylesheet to whatever the default browser style is
12431 // for such an element
12432 if ( elem.style.display === "" && isHidden( elem ) ) {
12433 values[ index ] = data_priv.access( elem, "olddisplay
", defaultDisplay(elem.nodeName) );
12436 hidden = isHidden( elem );
12438 if ( display !== "none
" || !hidden ) {
12439 data_priv.set( elem, "olddisplay
", hidden ? display : jQuery.css( elem, "display
" ) );
12444 // Set the display of most of the elements in a second loop
12445 // to avoid the constant reflow
12446 for ( index = 0; index < length; index++ ) {
12447 elem = elements[ index ];
12448 if ( !elem.style ) {
12451 if ( !show || elem.style.display === "none
" || elem.style.display === "" ) {
12452 elem.style.display = show ? values[ index ] || "" : "none
";
12460 // Add in style property hooks for overriding the default
12461 // behavior of getting and setting a style property
12464 get: function( elem, computed ) {
12466 // We should always get a number back from opacity
12467 var ret = curCSS( elem, "opacity
" );
12468 return ret === "" ? "1" : ret;
12474 // Don't automatically add "px
" to these possibly-unitless properties
12476 "columnCount
": true,
12477 "fillOpacity
": true,
12479 "flexShrink
": true,
12480 "fontWeight
": true,
12481 "lineHeight
": true,
12490 // Add in properties whose names you wish to fix before
12491 // setting or getting the value
12493 // normalize float css property
12494 "float
": "cssFloat
"
12497 // Get and set the style property on a DOM Node
12498 style: function( elem, name, value, extra ) {
12499 // Don't set styles on text and comment nodes
12500 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
12504 // Make sure that we're working with the right name
12505 var ret, type, hooks,
12506 origName = jQuery.camelCase( name ),
12507 style = elem.style;
12509 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
12511 // gets hook for the prefixed version
12512 // followed by the unprefixed version
12513 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
12515 // Check if we're setting a value
12516 if ( value !== undefined ) {
12517 type = typeof value;
12519 // convert relative number strings (+= or -=) to relative numbers. #7345
12520 if ( type === "string
" && (ret = rrelNum.exec( value )) ) {
12521 value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
12526 // Make sure that null and NaN values aren't set. See: #7116
12527 if ( value == null || value !== value ) {
12531 // If a number was passed in, add 'px' to the (except for certain CSS properties)
12532 if ( type === "number
" && !jQuery.cssNumber[ origName ] ) {
12536 // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
12537 // but it would mean to define eight (for every problematic property) identical functions
12538 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background
" ) === 0 ) {
12539 style[ name ] = "inherit
";
12542 // If a hook was provided, use that value, otherwise just set the specified value
12543 if ( !hooks || !("set
" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
12544 style[ name ] = value;
12548 // If a hook was provided get the non-computed value from there
12549 if ( hooks && "get
" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
12553 // Otherwise just get the value from the style object
12554 return style[ name ];
12558 css: function( elem, name, extra, styles ) {
12559 var val, num, hooks,
12560 origName = jQuery.camelCase( name );
12562 // Make sure that we're working with the right name
12563 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
12565 // gets hook for the prefixed version
12566 // followed by the unprefixed version
12567 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
12569 // If a hook was provided get the computed value from there
12570 if ( hooks && "get
" in hooks ) {
12571 val = hooks.get( elem, true, extra );
12574 // Otherwise, if a way to get the computed value exists, use that
12575 if ( val === undefined ) {
12576 val = curCSS( elem, name, styles );
12579 //convert "normal
" to computed value
12580 if ( val === "normal
" && name in cssNormalTransform ) {
12581 val = cssNormalTransform[ name ];
12584 // Return, converting to number if forced or a qualifier was provided and val looks numeric
12585 if ( extra === "" || extra ) {
12586 num = parseFloat( val );
12587 return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
12593 jQuery.each([ "height
", "width
" ], function( i, name ) {
12594 jQuery.cssHooks[ name ] = {
12595 get: function( elem, computed, extra ) {
12597 // certain elements can have dimension info if we invisibly show them
12598 // however, it must have a current display style that would benefit from this
12599 return rdisplayswap.test( jQuery.css( elem, "display
" ) ) && elem.offsetWidth === 0 ?
12600 jQuery.swap( elem, cssShow, function() {
12601 return getWidthOrHeight( elem, name, extra );
12603 getWidthOrHeight( elem, name, extra );
12607 set: function( elem, value, extra ) {
12608 var styles = extra && getStyles( elem );
12609 return setPositiveNumber( elem, value, extra ?
12610 augmentWidthOrHeight(
12614 jQuery.css( elem, "boxSizing
", false, styles ) === "border-box
",
12622 // Support: Android 2.3
12623 jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
12624 function( elem, computed ) {
12626 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
12627 // Work around by temporarily setting element display to inline-block
12628 return jQuery.swap( elem, { "display
": "inline-block
" },
12629 curCSS, [ elem, "marginRight
" ] );
12634 // These hooks are used by animate to expand properties
12639 }, function( prefix, suffix ) {
12640 jQuery.cssHooks[ prefix + suffix ] = {
12641 expand: function( value ) {
12645 // assumes a single number if not a string
12646 parts = typeof value === "string
" ? value.split(" ") : [ value ];
12648 for ( ; i < 4; i++ ) {
12649 expanded[ prefix + cssExpand[ i ] + suffix ] =
12650 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
12657 if ( !rmargin.test( prefix ) ) {
12658 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
12663 css: function( name, value ) {
12664 return access( this, function( elem, name, value ) {
12669 if ( jQuery.isArray( name ) ) {
12670 styles = getStyles( elem );
12673 for ( ; i < len; i++ ) {
12674 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
12680 return value !== undefined ?
12681 jQuery.style( elem, name, value ) :
12682 jQuery.css( elem, name );
12683 }, name, value, arguments.length > 1 );
12686 return showHide( this, true );
12689 return showHide( this );
12691 toggle: function( state ) {
12692 if ( typeof state === "boolean
" ) {
12693 return state ? this.show() : this.hide();
12696 return this.each(function() {
12697 if ( isHidden( this ) ) {
12698 jQuery( this ).show();
12700 jQuery( this ).hide();
12707 function Tween( elem, options, prop, end, easing ) {
12708 return new Tween.prototype.init( elem, options, prop, end, easing );
12710 jQuery.Tween = Tween;
12712 Tween.prototype = {
12713 constructor: Tween,
12714 init: function( elem, options, prop, end, easing, unit ) {
12717 this.easing = easing || "swing
";
12718 this.options = options;
12719 this.start = this.now = this.cur();
12721 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px
" );
12724 var hooks = Tween.propHooks[ this.prop ];
12726 return hooks && hooks.get ?
12727 hooks.get( this ) :
12728 Tween.propHooks._default.get( this );
12730 run: function( percent ) {
12732 hooks = Tween.propHooks[ this.prop ];
12734 if ( this.options.duration ) {
12735 this.pos = eased = jQuery.easing[ this.easing ](
12736 percent, this.options.duration * percent, 0, 1, this.options.duration
12739 this.pos = eased = percent;
12741 this.now = ( this.end - this.start ) * eased + this.start;
12743 if ( this.options.step ) {
12744 this.options.step.call( this.elem, this.now, this );
12747 if ( hooks && hooks.set ) {
12750 Tween.propHooks._default.set( this );
12756 Tween.prototype.init.prototype = Tween.prototype;
12758 Tween.propHooks = {
12760 get: function( tween ) {
12763 if ( tween.elem[ tween.prop ] != null &&
12764 (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
12765 return tween.elem[ tween.prop ];
12768 // passing an empty string as a 3rd parameter to .css will automatically
12769 // attempt a parseFloat and fallback to a string if the parse fails
12770 // so, simple values such as "10px
" are parsed to Float.
12771 // complex values such as "rotate(
1rad)
" are returned as is.
12772 result = jQuery.css( tween.elem, tween.prop, "" );
12773 // Empty strings, null, undefined and "auto
" are converted to 0.
12774 return !result || result === "auto
" ? 0 : result;
12776 set: function( tween ) {
12777 // use step hook for back compat - use cssHook if its there - use .style if its
12778 // available and use plain properties where available
12779 if ( jQuery.fx.step[ tween.prop ] ) {
12780 jQuery.fx.step[ tween.prop ]( tween );
12781 } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
12782 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
12784 tween.elem[ tween.prop ] = tween.now;
12791 // Panic based approach to setting things on disconnected nodes
12793 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
12794 set: function( tween ) {
12795 if ( tween.elem.nodeType && tween.elem.parentNode ) {
12796 tween.elem[ tween.prop ] = tween.now;
12802 linear: function( p ) {
12805 swing: function( p ) {
12806 return 0.5 - Math.cos( p * Math.PI ) / 2;
12810 jQuery.fx = Tween.prototype.init;
12812 // Back Compat <1.8 extension point
12813 jQuery.fx.step = {};
12820 rfxtypes = /^(?:toggle|show|hide)$/,
12821 rfxnum = new RegExp( "^(?:([+-])=|)(
" + pnum + ")([a-z%]*)$
", "i
" ),
12822 rrun = /queueHooks$/,
12823 animationPrefilters = [ defaultPrefilter ],
12825 "*
": [ function( prop, value ) {
12826 var tween = this.createTween( prop, value ),
12827 target = tween.cur(),
12828 parts = rfxnum.exec( value ),
12829 unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px
" ),
12831 // Starting value computation is required for potential unit mismatches
12832 start = ( jQuery.cssNumber[ prop ] || unit !== "px
" && +target ) &&
12833 rfxnum.exec( jQuery.css( tween.elem, prop ) ),
12835 maxIterations = 20;
12837 if ( start && start[ 3 ] !== unit ) {
12838 // Trust units reported by jQuery.css
12839 unit = unit || start[ 3 ];
12841 // Make sure we update the tween properties later on
12842 parts = parts || [];
12844 // Iteratively approximate from a nonzero starting point
12845 start = +target || 1;
12848 // If previous iteration zeroed out, double until we get *something*
12849 // Use a string for doubling factor so we don't accidentally see scale as unchanged below
12850 scale = scale || ".5";
12852 // Adjust and apply
12853 start = start / scale;
12854 jQuery.style( tween.elem, prop, start + unit );
12856 // Update scale, tolerating zero or NaN from tween.cur()
12857 // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
12858 } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
12861 // Update tween properties
12863 start = tween.start = +start || +target || 0;
12865 // If a +=/-= token was provided, we're doing a relative animation
12866 tween.end = parts[ 1 ] ?
12867 start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
12875 // Animations created synchronously will run synchronously
12876 function createFxNow() {
12877 setTimeout(function() {
12880 return ( fxNow = jQuery.now() );
12883 // Generate parameters to create a standard animation
12884 function genFx( type, includeWidth ) {
12887 attrs = { height: type };
12889 // if we include width, step value is 1 to do all cssExpand values,
12890 // if we don't include width, step value is 2 to skip over Left and Right
12891 includeWidth = includeWidth ? 1 : 0;
12892 for ( ; i < 4 ; i += 2 - includeWidth ) {
12893 which = cssExpand[ i ];
12894 attrs[ "margin
" + which ] = attrs[ "padding
" + which ] = type;
12897 if ( includeWidth ) {
12898 attrs.opacity = attrs.width = type;
12904 function createTween( value, prop, animation ) {
12906 collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*
" ] ),
12908 length = collection.length;
12909 for ( ; index < length; index++ ) {
12910 if ( (tween = collection[ index ].call( animation, prop, value )) ) {
12912 // we're done with this property
12918 function defaultPrefilter( elem, props, opts ) {
12919 /* jshint validthis: true */
12920 var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
12923 style = elem.style,
12924 hidden = elem.nodeType && isHidden( elem ),
12925 dataShow = data_priv.get( elem, "fxshow
" );
12927 // handle queue: false promises
12928 if ( !opts.queue ) {
12929 hooks = jQuery._queueHooks( elem, "fx
" );
12930 if ( hooks.unqueued == null ) {
12931 hooks.unqueued = 0;
12932 oldfire = hooks.empty.fire;
12933 hooks.empty.fire = function() {
12934 if ( !hooks.unqueued ) {
12941 anim.always(function() {
12942 // doing this makes sure that the complete handler will be called
12943 // before this completes
12944 anim.always(function() {
12946 if ( !jQuery.queue( elem, "fx
" ).length ) {
12947 hooks.empty.fire();
12953 // height/width overflow pass
12954 if ( elem.nodeType === 1 && ( "height
" in props || "width
" in props ) ) {
12955 // Make sure that nothing sneaks out
12956 // Record all 3 overflow attributes because IE9-10 do not
12957 // change the overflow attribute when overflowX and
12958 // overflowY are set to the same value
12959 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
12961 // Set display property to inline-block for height/width
12962 // animations on inline elements that are having width/height animated
12963 display = jQuery.css( elem, "display
" );
12965 // Test default display if display is currently "none
"
12966 checkDisplay = display === "none
" ?
12967 data_priv.get( elem, "olddisplay
" ) || defaultDisplay( elem.nodeName ) : display;
12969 if ( checkDisplay === "inline
" && jQuery.css( elem, "float
" ) === "none
" ) {
12970 style.display = "inline-block
";
12974 if ( opts.overflow ) {
12975 style.overflow = "hidden
";
12976 anim.always(function() {
12977 style.overflow = opts.overflow[ 0 ];
12978 style.overflowX = opts.overflow[ 1 ];
12979 style.overflowY = opts.overflow[ 2 ];
12984 for ( prop in props ) {
12985 value = props[ prop ];
12986 if ( rfxtypes.exec( value ) ) {
12987 delete props[ prop ];
12988 toggle = toggle || value === "toggle
";
12989 if ( value === ( hidden ? "hide
" : "show
" ) ) {
12991 // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
12992 if ( value === "show
" && dataShow && dataShow[ prop ] !== undefined ) {
12998 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
13000 // Any non-fx value stops us from restoring the original display value
13002 display = undefined;
13006 if ( !jQuery.isEmptyObject( orig ) ) {
13008 if ( "hidden
" in dataShow ) {
13009 hidden = dataShow.hidden;
13012 dataShow = data_priv.access( elem, "fxshow
", {} );
13015 // store state if its toggle - enables .stop().toggle() to "reverse
"
13017 dataShow.hidden = !hidden;
13020 jQuery( elem ).show();
13022 anim.done(function() {
13023 jQuery( elem ).hide();
13026 anim.done(function() {
13029 data_priv.remove( elem, "fxshow
" );
13030 for ( prop in orig ) {
13031 jQuery.style( elem, prop, orig[ prop ] );
13034 for ( prop in orig ) {
13035 tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
13037 if ( !( prop in dataShow ) ) {
13038 dataShow[ prop ] = tween.start;
13040 tween.end = tween.start;
13041 tween.start = prop === "width
" || prop === "height
" ? 1 : 0;
13046 // If this is a noop like .hide().hide(), restore an overwritten display value
13047 } else if ( (display === "none
" ? defaultDisplay( elem.nodeName ) : display) === "inline
" ) {
13048 style.display = display;
13052 function propFilter( props, specialEasing ) {
13053 var index, name, easing, value, hooks;
13055 // camelCase, specialEasing and expand cssHook pass
13056 for ( index in props ) {
13057 name = jQuery.camelCase( index );
13058 easing = specialEasing[ name ];
13059 value = props[ index ];
13060 if ( jQuery.isArray( value ) ) {
13061 easing = value[ 1 ];
13062 value = props[ index ] = value[ 0 ];
13065 if ( index !== name ) {
13066 props[ name ] = value;
13067 delete props[ index ];
13070 hooks = jQuery.cssHooks[ name ];
13071 if ( hooks && "expand
" in hooks ) {
13072 value = hooks.expand( value );
13073 delete props[ name ];
13075 // not quite $.extend, this wont overwrite keys already present.
13076 // also - reusing 'index' from above because we have the correct "name
"
13077 for ( index in value ) {
13078 if ( !( index in props ) ) {
13079 props[ index ] = value[ index ];
13080 specialEasing[ index ] = easing;
13084 specialEasing[ name ] = easing;
13089 function Animation( elem, properties, options ) {
13093 length = animationPrefilters.length,
13094 deferred = jQuery.Deferred().always( function() {
13095 // don't match elem in the :animated selector
13098 tick = function() {
13102 var currentTime = fxNow || createFxNow(),
13103 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
13104 // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
13105 temp = remaining / animation.duration || 0,
13106 percent = 1 - temp,
13108 length = animation.tweens.length;
13110 for ( ; index < length ; index++ ) {
13111 animation.tweens[ index ].run( percent );
13114 deferred.notifyWith( elem, [ animation, percent, remaining ]);
13116 if ( percent < 1 && length ) {
13119 deferred.resolveWith( elem, [ animation ] );
13123 animation = deferred.promise({
13125 props: jQuery.extend( {}, properties ),
13126 opts: jQuery.extend( true, { specialEasing: {} }, options ),
13127 originalProperties: properties,
13128 originalOptions: options,
13129 startTime: fxNow || createFxNow(),
13130 duration: options.duration,
13132 createTween: function( prop, end ) {
13133 var tween = jQuery.Tween( elem, animation.opts, prop, end,
13134 animation.opts.specialEasing[ prop ] || animation.opts.easing );
13135 animation.tweens.push( tween );
13138 stop: function( gotoEnd ) {
13140 // if we are going to the end, we want to run all the tweens
13141 // otherwise we skip this part
13142 length = gotoEnd ? animation.tweens.length : 0;
13147 for ( ; index < length ; index++ ) {
13148 animation.tweens[ index ].run( 1 );
13151 // resolve when we played the last frame
13152 // otherwise, reject
13154 deferred.resolveWith( elem, [ animation, gotoEnd ] );
13156 deferred.rejectWith( elem, [ animation, gotoEnd ] );
13161 props = animation.props;
13163 propFilter( props, animation.opts.specialEasing );
13165 for ( ; index < length ; index++ ) {
13166 result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
13172 jQuery.map( props, createTween, animation );
13174 if ( jQuery.isFunction( animation.opts.start ) ) {
13175 animation.opts.start.call( elem, animation );
13179 jQuery.extend( tick, {
13182 queue: animation.opts.queue
13186 // attach callbacks from options
13187 return animation.progress( animation.opts.progress )
13188 .done( animation.opts.done, animation.opts.complete )
13189 .fail( animation.opts.fail )
13190 .always( animation.opts.always );
13193 jQuery.Animation = jQuery.extend( Animation, {
13195 tweener: function( props, callback ) {
13196 if ( jQuery.isFunction( props ) ) {
13200 props = props.split(" ");
13205 length = props.length;
13207 for ( ; index < length ; index++ ) {
13208 prop = props[ index ];
13209 tweeners[ prop ] = tweeners[ prop ] || [];
13210 tweeners[ prop ].unshift( callback );
13214 prefilter: function( callback, prepend ) {
13216 animationPrefilters.unshift( callback );
13218 animationPrefilters.push( callback );
13223 jQuery.speed = function( speed, easing, fn ) {
13224 var opt = speed && typeof speed === "object
" ? jQuery.extend( {}, speed ) : {
13225 complete: fn || !fn && easing ||
13226 jQuery.isFunction( speed ) && speed,
13228 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
13231 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number
" ? opt.duration :
13232 opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
13234 // normalize opt.queue - true/undefined/null -> "fx
"
13235 if ( opt.queue == null || opt.queue === true ) {
13240 opt.old = opt.complete;
13242 opt.complete = function() {
13243 if ( jQuery.isFunction( opt.old ) ) {
13244 opt.old.call( this );
13248 jQuery.dequeue( this, opt.queue );
13256 fadeTo: function( speed, to, easing, callback ) {
13258 // show any hidden elements after setting opacity to 0
13259 return this.filter( isHidden ).css( "opacity
", 0 ).show()
13261 // animate to the value specified
13262 .end().animate({ opacity: to }, speed, easing, callback );
13264 animate: function( prop, speed, easing, callback ) {
13265 var empty = jQuery.isEmptyObject( prop ),
13266 optall = jQuery.speed( speed, easing, callback ),
13267 doAnimation = function() {
13268 // Operate on a copy of prop so per-property easing won't be lost
13269 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
13271 // Empty animations, or finishing resolves immediately
13272 if ( empty || data_priv.get( this, "finish
" ) ) {
13276 doAnimation.finish = doAnimation;
13278 return empty || optall.queue === false ?
13279 this.each( doAnimation ) :
13280 this.queue( optall.queue, doAnimation );
13282 stop: function( type, clearQueue, gotoEnd ) {
13283 var stopQueue = function( hooks ) {
13284 var stop = hooks.stop;
13289 if ( typeof type !== "string
" ) {
13290 gotoEnd = clearQueue;
13294 if ( clearQueue && type !== false ) {
13295 this.queue( type || "fx
", [] );
13298 return this.each(function() {
13299 var dequeue = true,
13300 index = type != null && type + "queueHooks
",
13301 timers = jQuery.timers,
13302 data = data_priv.get( this );
13305 if ( data[ index ] && data[ index ].stop ) {
13306 stopQueue( data[ index ] );
13309 for ( index in data ) {
13310 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
13311 stopQueue( data[ index ] );
13316 for ( index = timers.length; index--; ) {
13317 if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
13318 timers[ index ].anim.stop( gotoEnd );
13320 timers.splice( index, 1 );
13324 // start the next in the queue if the last step wasn't forced
13325 // timers currently will call their complete callbacks, which will dequeue
13326 // but only if they were gotoEnd
13327 if ( dequeue || !gotoEnd ) {
13328 jQuery.dequeue( this, type );
13332 finish: function( type ) {
13333 if ( type !== false ) {
13334 type = type || "fx
";
13336 return this.each(function() {
13338 data = data_priv.get( this ),
13339 queue = data[ type + "queue
" ],
13340 hooks = data[ type + "queueHooks
" ],
13341 timers = jQuery.timers,
13342 length = queue ? queue.length : 0;
13344 // enable finishing flag on private data
13345 data.finish = true;
13347 // empty the queue first
13348 jQuery.queue( this, type, [] );
13350 if ( hooks && hooks.stop ) {
13351 hooks.stop.call( this, true );
13354 // look for any active animations, and finish them
13355 for ( index = timers.length; index--; ) {
13356 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
13357 timers[ index ].anim.stop( true );
13358 timers.splice( index, 1 );
13362 // look for any animations in the old queue and finish them
13363 for ( index = 0; index < length; index++ ) {
13364 if ( queue[ index ] && queue[ index ].finish ) {
13365 queue[ index ].finish.call( this );
13369 // turn off finishing flag
13370 delete data.finish;
13375 jQuery.each([ "toggle
", "show
", "hide
" ], function( i, name ) {
13376 var cssFn = jQuery.fn[ name ];
13377 jQuery.fn[ name ] = function( speed, easing, callback ) {
13378 return speed == null || typeof speed === "boolean
" ?
13379 cssFn.apply( this, arguments ) :
13380 this.animate( genFx( name, true ), speed, easing, callback );
13384 // Generate shortcuts for custom animations
13386 slideDown: genFx("show
"),
13387 slideUp: genFx("hide
"),
13388 slideToggle: genFx("toggle
"),
13389 fadeIn: { opacity: "show
" },
13390 fadeOut: { opacity: "hide
" },
13391 fadeToggle: { opacity: "toggle
" }
13392 }, function( name, props ) {
13393 jQuery.fn[ name ] = function( speed, easing, callback ) {
13394 return this.animate( props, speed, easing, callback );
13398 jQuery.timers = [];
13399 jQuery.fx.tick = function() {
13402 timers = jQuery.timers;
13404 fxNow = jQuery.now();
13406 for ( ; i < timers.length; i++ ) {
13407 timer = timers[ i ];
13408 // Checks the timer has not already been removed
13409 if ( !timer() && timers[ i ] === timer ) {
13410 timers.splice( i--, 1 );
13414 if ( !timers.length ) {
13420 jQuery.fx.timer = function( timer ) {
13421 jQuery.timers.push( timer );
13425 jQuery.timers.pop();
13429 jQuery.fx.interval = 13;
13431 jQuery.fx.start = function() {
13433 timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
13437 jQuery.fx.stop = function() {
13438 clearInterval( timerId );
13442 jQuery.fx.speeds = {
13450 // Based off of the plugin by Clint Helfers, with permission.
13451 // http://blindsignals.com/index.php/2009/07/jquery-delay/
13452 jQuery.fn.delay = function( time, type ) {
13453 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
13454 type = type || "fx
";
13456 return this.queue( type, function( next, hooks ) {
13457 var timeout = setTimeout( next, time );
13458 hooks.stop = function() {
13459 clearTimeout( timeout );
13466 var input = document.createElement( "input
" ),
13467 select = document.createElement( "select
" ),
13468 opt = select.appendChild( document.createElement( "option
" ) );
13470 input.type = "checkbox
";
13472 // Support: iOS 5.1, Android 4.x, Android 2.3
13473 // Check the default checkbox/radio value ("" on old WebKit; "on
" elsewhere)
13474 support.checkOn = input.value !== "";
13476 // Must access the parent to make an option select properly
13477 // Support: IE9, IE10
13478 support.optSelected = opt.selected;
13480 // Make sure that the options inside disabled selects aren't marked as disabled
13481 // (WebKit marks them as disabled)
13482 select.disabled = true;
13483 support.optDisabled = !opt.disabled;
13485 // Check if an input maintains its value after becoming a radio
13486 // Support: IE9, IE10
13487 input = document.createElement( "input
" );
13489 input.type = "radio
";
13490 support.radioValue = input.value === "t
";
13494 var nodeHook, boolHook,
13495 attrHandle = jQuery.expr.attrHandle;
13498 attr: function( name, value ) {
13499 return access( this, jQuery.attr, name, value, arguments.length > 1 );
13502 removeAttr: function( name ) {
13503 return this.each(function() {
13504 jQuery.removeAttr( this, name );
13510 attr: function( elem, name, value ) {
13512 nType = elem.nodeType;
13514 // don't get/set attributes on text, comment and attribute nodes
13515 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
13519 // Fallback to prop when attributes are not supported
13520 if ( typeof elem.getAttribute === strundefined ) {
13521 return jQuery.prop( elem, name, value );
13524 // All attributes are lowercase
13525 // Grab necessary hook if one is defined
13526 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
13527 name = name.toLowerCase();
13528 hooks = jQuery.attrHooks[ name ] ||
13529 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
13532 if ( value !== undefined ) {
13534 if ( value === null ) {
13535 jQuery.removeAttr( elem, name );
13537 } else if ( hooks && "set
" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
13541 elem.setAttribute( name, value + "" );
13545 } else if ( hooks && "get
" in hooks && (ret = hooks.get( elem, name )) !== null ) {
13549 ret = jQuery.find.attr( elem, name );
13551 // Non-existent attributes return null, we normalize to undefined
13552 return ret == null ?
13558 removeAttr: function( elem, value ) {
13559 var name, propName,
13561 attrNames = value && value.match( rnotwhite );
13563 if ( attrNames && elem.nodeType === 1 ) {
13564 while ( (name = attrNames[i++]) ) {
13565 propName = jQuery.propFix[ name ] || name;
13567 // Boolean attributes get special treatment (#10870)
13568 if ( jQuery.expr.match.bool.test( name ) ) {
13569 // Set corresponding property to false
13570 elem[ propName ] = false;
13573 elem.removeAttribute( name );
13580 set: function( elem, value ) {
13581 if ( !support.radioValue && value === "radio
" &&
13582 jQuery.nodeName( elem, "input
" ) ) {
13583 // Setting the type on a radio button after the value resets the value in IE6-9
13584 // Reset value to default in case type is set after value during creation
13585 var val = elem.value;
13586 elem.setAttribute( "type
", value );
13597 // Hooks for boolean attributes
13599 set: function( elem, value, name ) {
13600 if ( value === false ) {
13601 // Remove boolean attributes when set to false
13602 jQuery.removeAttr( elem, name );
13604 elem.setAttribute( name, name );
13609 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
13610 var getter = attrHandle[ name ] || jQuery.find.attr;
13612 attrHandle[ name ] = function( elem, name, isXML ) {
13615 // Avoid an infinite loop by temporarily removing this function from the getter
13616 handle = attrHandle[ name ];
13617 attrHandle[ name ] = ret;
13618 ret = getter( elem, name, isXML ) != null ?
13619 name.toLowerCase() :
13621 attrHandle[ name ] = handle;
13630 var rfocusable = /^(?:input|select|textarea|button)$/i;
13633 prop: function( name, value ) {
13634 return access( this, jQuery.prop, name, value, arguments.length > 1 );
13637 removeProp: function( name ) {
13638 return this.each(function() {
13639 delete this[ jQuery.propFix[ name ] || name ];
13647 "class
": "className
"
13650 prop: function( elem, name, value ) {
13651 var ret, hooks, notxml,
13652 nType = elem.nodeType;
13654 // don't get/set properties on text, comment and attribute nodes
13655 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
13659 notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
13662 // Fix name and attach hooks
13663 name = jQuery.propFix[ name ] || name;
13664 hooks = jQuery.propHooks[ name ];
13667 if ( value !== undefined ) {
13668 return hooks && "set
" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
13670 ( elem[ name ] = value );
13673 return hooks && "get
" in hooks && (ret = hooks.get( elem, name )) !== null ?
13681 get: function( elem ) {
13682 return elem.hasAttribute( "tabindex
" ) || rfocusable.test( elem.nodeName ) || elem.href ?
13691 // Selectedness for an option in an optgroup can be inaccurate
13692 if ( !support.optSelected ) {
13693 jQuery.propHooks.selected = {
13694 get: function( elem ) {
13695 var parent = elem.parentNode;
13696 if ( parent && parent.parentNode ) {
13697 parent.parentNode.selectedIndex;
13716 jQuery.propFix[ this.toLowerCase() ] = this;
13722 var rclass = /[\t\r\n\f]/g;
13725 addClass: function( value ) {
13726 var classes, elem, cur, clazz, j, finalValue,
13727 proceed = typeof value === "string
" && value,
13731 if ( jQuery.isFunction( value ) ) {
13732 return this.each(function( j ) {
13733 jQuery( this ).addClass( value.call( this, j, this.className ) );
13738 // The disjunction here is for better compressibility (see removeClass)
13739 classes = ( value || "" ).match( rnotwhite ) || [];
13741 for ( ; i < len; i++ ) {
13743 cur = elem.nodeType === 1 && ( elem.className ?
13744 ( " " + elem.className + " " ).replace( rclass, " " ) :
13750 while ( (clazz = classes[j++]) ) {
13751 if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
13752 cur += clazz + " ";
13756 // only assign if different to avoid unneeded rendering.
13757 finalValue = jQuery.trim( cur );
13758 if ( elem.className !== finalValue ) {
13759 elem.className = finalValue;
13768 removeClass: function( value ) {
13769 var classes, elem, cur, clazz, j, finalValue,
13770 proceed = arguments.length === 0 || typeof value === "string
" && value,
13774 if ( jQuery.isFunction( value ) ) {
13775 return this.each(function( j ) {
13776 jQuery( this ).removeClass( value.call( this, j, this.className ) );
13780 classes = ( value || "" ).match( rnotwhite ) || [];
13782 for ( ; i < len; i++ ) {
13784 // This expression is here for better compressibility (see addClass)
13785 cur = elem.nodeType === 1 && ( elem.className ?
13786 ( " " + elem.className + " " ).replace( rclass, " " ) :
13792 while ( (clazz = classes[j++]) ) {
13793 // Remove *all* instances
13794 while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
13795 cur = cur.replace( " " + clazz + " ", " " );
13799 // only assign if different to avoid unneeded rendering.
13800 finalValue = value ? jQuery.trim( cur ) : "";
13801 if ( elem.className !== finalValue ) {
13802 elem.className = finalValue;
13811 toggleClass: function( value, stateVal ) {
13812 var type = typeof value;
13814 if ( typeof stateVal === "boolean
" && type === "string
" ) {
13815 return stateVal ? this.addClass( value ) : this.removeClass( value );
13818 if ( jQuery.isFunction( value ) ) {
13819 return this.each(function( i ) {
13820 jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
13824 return this.each(function() {
13825 if ( type === "string
" ) {
13826 // toggle individual class names
13829 self = jQuery( this ),
13830 classNames = value.match( rnotwhite ) || [];
13832 while ( (className = classNames[ i++ ]) ) {
13833 // check each className given, space separated list
13834 if ( self.hasClass( className ) ) {
13835 self.removeClass( className );
13837 self.addClass( className );
13841 // Toggle whole class name
13842 } else if ( type === strundefined || type === "boolean
" ) {
13843 if ( this.className ) {
13844 // store className if set
13845 data_priv.set( this, "__className__
", this.className );
13848 // If the element has a class name or if we're passed "false
",
13849 // then remove the whole classname (if there was one, the above saved it).
13850 // Otherwise bring back whatever was previously saved (if anything),
13851 // falling back to the empty string if nothing was stored.
13852 this.className = this.className || value === false ? "" : data_priv.get( this, "__className__
" ) || "";
13857 hasClass: function( selector ) {
13858 var className = " " + selector + " ",
13861 for ( ; i < l; i++ ) {
13862 if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
13874 var rreturn = /\r/g;
13877 val: function( value ) {
13878 var hooks, ret, isFunction,
13881 if ( !arguments.length ) {
13883 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
13885 if ( hooks && "get
" in hooks && (ret = hooks.get( elem, "value
" )) !== undefined ) {
13891 return typeof ret === "string
" ?
13892 // handle most common string cases
13893 ret.replace(rreturn, "") :
13894 // handle cases where value is null/undef or number
13895 ret == null ? "" : ret;
13901 isFunction = jQuery.isFunction( value );
13903 return this.each(function( i ) {
13906 if ( this.nodeType !== 1 ) {
13910 if ( isFunction ) {
13911 val = value.call( this, i, jQuery( this ).val() );
13916 // Treat null/undefined as ""; convert numbers to string
13917 if ( val == null ) {
13920 } else if ( typeof val === "number
" ) {
13923 } else if ( jQuery.isArray( val ) ) {
13924 val = jQuery.map( val, function( value ) {
13925 return value == null ? "" : value + "";
13929 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
13931 // If set returns undefined, fall back to normal setting
13932 if ( !hooks || !("set
" in hooks) || hooks.set( this, val, "value
" ) === undefined ) {
13942 get: function( elem ) {
13943 var val = jQuery.find.attr( elem, "value
" );
13944 return val != null ?
13946 // Support: IE10-11+
13947 // option.text throws exceptions (#14686, #14858)
13948 jQuery.trim( jQuery.text( elem ) );
13952 get: function( elem ) {
13954 options = elem.options,
13955 index = elem.selectedIndex,
13956 one = elem.type === "select-one
" || index < 0,
13957 values = one ? null : [],
13958 max = one ? index + 1 : options.length,
13963 // Loop through all the selected options
13964 for ( ; i < max; i++ ) {
13965 option = options[ i ];
13967 // IE6-9 doesn't update selected after form reset (#2551)
13968 if ( ( option.selected || i === index ) &&
13969 // Don't return options that are disabled or in a disabled optgroup
13970 ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled
" ) === null ) &&
13971 ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup
" ) ) ) {
13973 // Get the specific value for the option
13974 value = jQuery( option ).val();
13976 // We don't need an array for one selects
13981 // Multi-Selects return an array
13982 values.push( value );
13989 set: function( elem, value ) {
13990 var optionSet, option,
13991 options = elem.options,
13992 values = jQuery.makeArray( value ),
13993 i = options.length;
13996 option = options[ i ];
13997 if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
14002 // force browsers to behave consistently when non-matching value is set
14003 if ( !optionSet ) {
14004 elem.selectedIndex = -1;
14012 // Radios and checkboxes getter/setter
14013 jQuery.each([ "radio
", "checkbox
" ], function() {
14014 jQuery.valHooks[ this ] = {
14015 set: function( elem, value ) {
14016 if ( jQuery.isArray( value ) ) {
14017 return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
14021 if ( !support.checkOn ) {
14022 jQuery.valHooks[ this ].get = function( elem ) {
14024 // "" is returned instead of "on
" if a value isn't specified
14025 return elem.getAttribute("value
") === null ? "on
" : elem.value;
14033 // Return jQuery for attributes-only inclusion
14036 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick
" +
14037 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave
" +
14038 "change select submit keydown keypress keyup error contextmenu
").split(" "), function( i, name ) {
14040 // Handle event binding
14041 jQuery.fn[ name ] = function( data, fn ) {
14042 return arguments.length > 0 ?
14043 this.on( name, null, data, fn ) :
14044 this.trigger( name );
14049 hover: function( fnOver, fnOut ) {
14050 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
14053 bind: function( types, data, fn ) {
14054 return this.on( types, null, data, fn );
14056 unbind: function( types, fn ) {
14057 return this.off( types, null, fn );
14060 delegate: function( selector, types, data, fn ) {
14061 return this.on( types, selector, data, fn );
14063 undelegate: function( selector, types, fn ) {
14064 // ( namespace ) or ( selector, types [, fn] )
14065 return arguments.length === 1 ? this.off( selector, "**
" ) : this.off( types, selector || "**
", fn );
14070 var nonce = jQuery.now();
14072 var rquery = (/\?/);
14076 // Support: Android 2.3
14077 // Workaround failure to string-cast null input
14078 jQuery.parseJSON = function( data ) {
14079 return JSON.parse( data + "" );
14083 // Cross-browser xml parsing
14084 jQuery.parseXML = function( data ) {
14086 if ( !data || typeof data !== "string
" ) {
14092 tmp = new DOMParser();
14093 xml = tmp.parseFromString( data, "text/xml
" );
14098 if ( !xml || xml.getElementsByTagName( "parsererror
" ).length ) {
14099 jQuery.error( "Invalid XML:
" + data );
14106 // Document location
14111 rts = /([?&])_=[^&]*/,
14112 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
14113 // #7653, #8125, #8152: local protocol detection
14114 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
14115 rnoContent = /^(?:GET|HEAD)$/,
14116 rprotocol = /^\/\//,
14117 rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
14120 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
14121 * 2) These are called:
14122 * - BEFORE asking for a transport
14123 * - AFTER param serialization (s.data is a string if s.processData is true)
14124 * 3) key is the dataType
14125 * 4) the catchall symbol "*
" can be used
14126 * 5) execution will start with transport dataType and THEN continue down to "*
" if needed
14130 /* Transports bindings
14131 * 1) key is the dataType
14132 * 2) the catchall symbol "*
" can be used
14133 * 3) selection will start with transport dataType and THEN go to "*
" if needed
14137 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
14138 allTypes = "*/
".concat("*
");
14140 // #8138, IE may throw an exception when accessing
14141 // a field from window.location if document.domain has been set
14143 ajaxLocation = location.href;
14145 // Use the href attribute of an A element
14146 // since IE will modify it given document.location
14147 ajaxLocation = document.createElement( "a
" );
14148 ajaxLocation.href = "";
14149 ajaxLocation = ajaxLocation.href;
14152 // Segment location into parts
14153 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
14155 // Base "constructor
" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
14156 function addToPrefiltersOrTransports( structure ) {
14158 // dataTypeExpression is optional and defaults to "*
"
14159 return function( dataTypeExpression, func ) {
14161 if ( typeof dataTypeExpression !== "string
" ) {
14162 func = dataTypeExpression;
14163 dataTypeExpression = "*
";
14168 dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
14170 if ( jQuery.isFunction( func ) ) {
14171 // For each dataType in the dataTypeExpression
14172 while ( (dataType = dataTypes[i++]) ) {
14173 // Prepend if requested
14174 if ( dataType[0] === "+
" ) {
14175 dataType = dataType.slice( 1 ) || "*
";
14176 (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
14178 // Otherwise append
14180 (structure[ dataType ] = structure[ dataType ] || []).push( func );
14187 // Base inspection function for prefilters and transports
14188 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
14190 var inspected = {},
14191 seekingTransport = ( structure === transports );
14193 function inspect( dataType ) {
14195 inspected[ dataType ] = true;
14196 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
14197 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
14198 if ( typeof dataTypeOrTransport === "string
" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
14199 options.dataTypes.unshift( dataTypeOrTransport );
14200 inspect( dataTypeOrTransport );
14202 } else if ( seekingTransport ) {
14203 return !( selected = dataTypeOrTransport );
14209 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*
" ] && inspect( "*
" );
14212 // A special extend for ajax options
14213 // that takes "flat
" options (not to be deep extended)
14215 function ajaxExtend( target, src ) {
14217 flatOptions = jQuery.ajaxSettings.flatOptions || {};
14219 for ( key in src ) {
14220 if ( src[ key ] !== undefined ) {
14221 ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
14225 jQuery.extend( true, target, deep );
14231 /* Handles responses to an ajax request:
14232 * - finds the right dataType (mediates between content-type and expected dataType)
14233 * - returns the corresponding response
14235 function ajaxHandleResponses( s, jqXHR, responses ) {
14237 var ct, type, finalDataType, firstDataType,
14238 contents = s.contents,
14239 dataTypes = s.dataTypes;
14241 // Remove auto dataType and get content-type in the process
14242 while ( dataTypes[ 0 ] === "*
" ) {
14244 if ( ct === undefined ) {
14245 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type
");
14249 // Check if we're dealing with a known content-type
14251 for ( type in contents ) {
14252 if ( contents[ type ] && contents[ type ].test( ct ) ) {
14253 dataTypes.unshift( type );
14259 // Check to see if we have a response for the expected dataType
14260 if ( dataTypes[ 0 ] in responses ) {
14261 finalDataType = dataTypes[ 0 ];
14263 // Try convertible dataTypes
14264 for ( type in responses ) {
14265 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
14266 finalDataType = type;
14269 if ( !firstDataType ) {
14270 firstDataType = type;
14273 // Or just use first one
14274 finalDataType = finalDataType || firstDataType;
14277 // If we found a dataType
14278 // We add the dataType to the list if needed
14279 // and return the corresponding response
14280 if ( finalDataType ) {
14281 if ( finalDataType !== dataTypes[ 0 ] ) {
14282 dataTypes.unshift( finalDataType );
14284 return responses[ finalDataType ];
14288 /* Chain conversions given the request and the original response
14289 * Also sets the responseXXX fields on the jqXHR instance
14291 function ajaxConvert( s, response, jqXHR, isSuccess ) {
14292 var conv2, current, conv, tmp, prev,
14294 // Work with a copy of dataTypes in case we need to modify it for conversion
14295 dataTypes = s.dataTypes.slice();
14297 // Create converters map with lowercased keys
14298 if ( dataTypes[ 1 ] ) {
14299 for ( conv in s.converters ) {
14300 converters[ conv.toLowerCase() ] = s.converters[ conv ];
14304 current = dataTypes.shift();
14306 // Convert to each sequential dataType
14307 while ( current ) {
14309 if ( s.responseFields[ current ] ) {
14310 jqXHR[ s.responseFields[ current ] ] = response;
14313 // Apply the dataFilter if provided
14314 if ( !prev && isSuccess && s.dataFilter ) {
14315 response = s.dataFilter( response, s.dataType );
14319 current = dataTypes.shift();
14323 // There's only work to do if current dataType is non-auto
14324 if ( current === "*
" ) {
14328 // Convert response if prev dataType is non-auto and differs from current
14329 } else if ( prev !== "*
" && prev !== current ) {
14331 // Seek a direct converter
14332 conv = converters[ prev + " " + current ] || converters[ "*
" + current ];
14334 // If none found, seek a pair
14336 for ( conv2 in converters ) {
14338 // If conv2 outputs current
14339 tmp = conv2.split( " " );
14340 if ( tmp[ 1 ] === current ) {
14342 // If prev can be converted to accepted input
14343 conv = converters[ prev + " " + tmp[ 0 ] ] ||
14344 converters[ "*
" + tmp[ 0 ] ];
14346 // Condense equivalence converters
14347 if ( conv === true ) {
14348 conv = converters[ conv2 ];
14350 // Otherwise, insert the intermediate dataType
14351 } else if ( converters[ conv2 ] !== true ) {
14352 current = tmp[ 0 ];
14353 dataTypes.unshift( tmp[ 1 ] );
14361 // Apply converter (if not an equivalence)
14362 if ( conv !== true ) {
14364 // Unless errors are allowed to bubble, catch and return them
14365 if ( conv && s[ "throws
" ] ) {
14366 response = conv( response );
14369 response = conv( response );
14371 return { state: "parsererror
", error: conv ? e : "No conversion from
" + prev + " to
" + current };
14379 return { state: "success
", data: response };
14384 // Counter for holding the number of active queries
14387 // Last-Modified header cache for next request
14394 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
14398 contentType: "application/x-www-form-urlencoded; charset=UTF-
8",
14407 traditional: false,
14413 text: "text/plain
",
14415 xml: "application/xml, text/xml
",
14416 json: "application/json, text/javascript
"
14426 xml: "responseXML
",
14427 text: "responseText
",
14428 json: "responseJSON
"
14432 // Keys separate source (or catchall "*
") and destination types with a single space
14435 // Convert anything to text
14438 // Text to html (true = no transformation)
14441 // Evaluate text as a json expression
14442 "text json
": jQuery.parseJSON,
14444 // Parse text as xml
14445 "text xml
": jQuery.parseXML
14448 // For options that shouldn't be deep extended:
14449 // you can add your own custom options here if
14450 // and when you create one that shouldn't be
14451 // deep extended (see ajaxExtend)
14458 // Creates a full fledged settings object into target
14459 // with both ajaxSettings and settings fields.
14460 // If target is omitted, writes into ajaxSettings.
14461 ajaxSetup: function( target, settings ) {
14464 // Building a settings object
14465 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
14467 // Extending ajaxSettings
14468 ajaxExtend( jQuery.ajaxSettings, target );
14471 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
14472 ajaxTransport: addToPrefiltersOrTransports( transports ),
14475 ajax: function( url, options ) {
14477 // If url is an object, simulate pre-1.5 signature
14478 if ( typeof url === "object
" ) {
14483 // Force options to be an object
14484 options = options || {};
14487 // URL without anti-cache param
14489 // Response headers
14490 responseHeadersString,
14494 // Cross-domain detection vars
14496 // To know if global events are to be dispatched
14500 // Create the final options object
14501 s = jQuery.ajaxSetup( {}, options ),
14502 // Callbacks context
14503 callbackContext = s.context || s,
14504 // Context for global events is callbackContext if it is a DOM node or jQuery collection
14505 globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
14506 jQuery( callbackContext ) :
14509 deferred = jQuery.Deferred(),
14510 completeDeferred = jQuery.Callbacks("once memory
"),
14511 // Status-dependent callbacks
14512 statusCode = s.statusCode || {},
14513 // Headers (they are sent all at once)
14514 requestHeaders = {},
14515 requestHeadersNames = {},
14518 // Default abort message
14519 strAbort = "canceled
",
14524 // Builds headers hashtable if needed
14525 getResponseHeader: function( key ) {
14527 if ( state === 2 ) {
14528 if ( !responseHeaders ) {
14529 responseHeaders = {};
14530 while ( (match = rheaders.exec( responseHeadersString )) ) {
14531 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
14534 match = responseHeaders[ key.toLowerCase() ];
14536 return match == null ? null : match;
14540 getAllResponseHeaders: function() {
14541 return state === 2 ? responseHeadersString : null;
14544 // Caches the header
14545 setRequestHeader: function( name, value ) {
14546 var lname = name.toLowerCase();
14548 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
14549 requestHeaders[ name ] = value;
14554 // Overrides response content-type header
14555 overrideMimeType: function( type ) {
14562 // Status-dependent callbacks
14563 statusCode: function( map ) {
14567 for ( code in map ) {
14568 // Lazy-add the new callback in a way that preserves old ones
14569 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
14572 // Execute the appropriate callbacks
14573 jqXHR.always( map[ jqXHR.status ] );
14579 // Cancel the request
14580 abort: function( statusText ) {
14581 var finalText = statusText || strAbort;
14583 transport.abort( finalText );
14585 done( 0, finalText );
14590 // Attach deferreds
14591 deferred.promise( jqXHR ).complete = completeDeferred.add;
14592 jqXHR.success = jqXHR.done;
14593 jqXHR.error = jqXHR.fail;
14595 // Remove hash character (#7531: and string promotion)
14596 // Add protocol if not provided (prefilters might expect it)
14597 // Handle falsy url in the settings object (#10093: consistency with old signature)
14598 // We also use the url parameter if available
14599 s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
14600 .replace( rprotocol, ajaxLocParts[ 1 ] + "//
" );
14602 // Alias method option to type as per ticket #12004
14603 s.type = options.method || options.type || s.method || s.type;
14605 // Extract dataTypes list
14606 s.dataTypes = jQuery.trim( s.dataType || "*
" ).toLowerCase().match( rnotwhite ) || [ "" ];
14608 // A cross-domain request is in order when we have a protocol:host:port mismatch
14609 if ( s.crossDomain == null ) {
14610 parts = rurl.exec( s.url.toLowerCase() );
14611 s.crossDomain = !!( parts &&
14612 ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
14613 ( parts[ 3 ] || ( parts[ 1 ] === "http:
" ? "80" : "443" ) ) !==
14614 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:
" ? "80" : "443" ) ) )
14618 // Convert data if not already a string
14619 if ( s.data && s.processData && typeof s.data !== "string
" ) {
14620 s.data = jQuery.param( s.data, s.traditional );
14623 // Apply prefilters
14624 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
14626 // If request was aborted inside a prefilter, stop there
14627 if ( state === 2 ) {
14631 // We can fire global events as of now if asked to
14632 fireGlobals = s.global;
14634 // Watch for a new set of requests
14635 if ( fireGlobals && jQuery.active++ === 0 ) {
14636 jQuery.event.trigger("ajaxStart
");
14639 // Uppercase the type
14640 s.type = s.type.toUpperCase();
14642 // Determine if request has content
14643 s.hasContent = !rnoContent.test( s.type );
14645 // Save the URL in case we're toying with the If-Modified-Since
14646 // and/or If-None-Match header later on
14649 // More options handling for requests with no content
14650 if ( !s.hasContent ) {
14652 // If data is available, append data to url
14654 cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&
" : "?
" ) + s.data );
14655 // #9682: remove data so that it's not used in an eventual retry
14659 // Add anti-cache in url if needed
14660 if ( s.cache === false ) {
14661 s.url = rts.test( cacheURL ) ?
14663 // If there is already a '_' parameter, set its value
14664 cacheURL.replace( rts, "$
1_=
" + nonce++ ) :
14666 // Otherwise add one to the end
14667 cacheURL + ( rquery.test( cacheURL ) ? "&
" : "?
" ) + "_=
" + nonce++;
14671 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
14672 if ( s.ifModified ) {
14673 if ( jQuery.lastModified[ cacheURL ] ) {
14674 jqXHR.setRequestHeader( "If-Modified-Since
", jQuery.lastModified[ cacheURL ] );
14676 if ( jQuery.etag[ cacheURL ] ) {
14677 jqXHR.setRequestHeader( "If-None-Match
", jQuery.etag[ cacheURL ] );
14681 // Set the correct header, if data is being sent
14682 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
14683 jqXHR.setRequestHeader( "Content-Type
", s.contentType );
14686 // Set the Accepts header for the server, depending on the dataType
14687 jqXHR.setRequestHeader(
14689 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
14690 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*
" ? ",
" + allTypes + "; q=
0.01" : "" ) :
14694 // Check for headers option
14695 for ( i in s.headers ) {
14696 jqXHR.setRequestHeader( i, s.headers[ i ] );
14699 // Allow custom headers/mimetypes and early abort
14700 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
14701 // Abort if not done already and return
14702 return jqXHR.abort();
14705 // aborting is no longer a cancellation
14706 strAbort = "abort
";
14708 // Install callbacks on deferreds
14709 for ( i in { success: 1, error: 1, complete: 1 } ) {
14710 jqXHR[ i ]( s[ i ] );
14714 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
14716 // If no transport, we auto-abort
14717 if ( !transport ) {
14718 done( -1, "No Transport
" );
14720 jqXHR.readyState = 1;
14722 // Send global event
14723 if ( fireGlobals ) {
14724 globalEventContext.trigger( "ajaxSend
", [ jqXHR, s ] );
14727 if ( s.async && s.timeout > 0 ) {
14728 timeoutTimer = setTimeout(function() {
14729 jqXHR.abort("timeout
");
14735 transport.send( requestHeaders, done );
14737 // Propagate exception as error if not done
14740 // Simply rethrow otherwise
14747 // Callback for when everything is done
14748 function done( status, nativeStatusText, responses, headers ) {
14749 var isSuccess, success, error, response, modified,
14750 statusText = nativeStatusText;
14753 if ( state === 2 ) {
14757 // State is "done
" now
14760 // Clear timeout if it exists
14761 if ( timeoutTimer ) {
14762 clearTimeout( timeoutTimer );
14765 // Dereference transport for early garbage collection
14766 // (no matter how long the jqXHR object will be used)
14767 transport = undefined;
14769 // Cache response headers
14770 responseHeadersString = headers || "";
14773 jqXHR.readyState = status > 0 ? 4 : 0;
14775 // Determine if successful
14776 isSuccess = status >= 200 && status < 300 || status === 304;
14778 // Get response data
14780 response = ajaxHandleResponses( s, jqXHR, responses );
14783 // Convert no matter what (that way responseXXX fields are always set)
14784 response = ajaxConvert( s, response, jqXHR, isSuccess );
14786 // If successful, handle type chaining
14789 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
14790 if ( s.ifModified ) {
14791 modified = jqXHR.getResponseHeader("Last-Modified
");
14793 jQuery.lastModified[ cacheURL ] = modified;
14795 modified = jqXHR.getResponseHeader("etag
");
14797 jQuery.etag[ cacheURL ] = modified;
14802 if ( status === 204 || s.type === "HEAD
" ) {
14803 statusText = "nocontent
";
14806 } else if ( status === 304 ) {
14807 statusText = "notmodified
";
14809 // If we have data, let's convert it
14811 statusText = response.state;
14812 success = response.data;
14813 error = response.error;
14814 isSuccess = !error;
14817 // We extract error from statusText
14818 // then normalize statusText and status for non-aborts
14819 error = statusText;
14820 if ( status || !statusText ) {
14821 statusText = "error
";
14822 if ( status < 0 ) {
14828 // Set data for the fake xhr object
14829 jqXHR.status = status;
14830 jqXHR.statusText = ( nativeStatusText || statusText ) + "";
14834 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
14836 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
14839 // Status-dependent callbacks
14840 jqXHR.statusCode( statusCode );
14841 statusCode = undefined;
14843 if ( fireGlobals ) {
14844 globalEventContext.trigger( isSuccess ? "ajaxSuccess
" : "ajaxError
",
14845 [ jqXHR, s, isSuccess ? success : error ] );
14849 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
14851 if ( fireGlobals ) {
14852 globalEventContext.trigger( "ajaxComplete
", [ jqXHR, s ] );
14853 // Handle the global AJAX counter
14854 if ( !( --jQuery.active ) ) {
14855 jQuery.event.trigger("ajaxStop
");
14863 getJSON: function( url, data, callback ) {
14864 return jQuery.get( url, data, callback, "json
" );
14867 getScript: function( url, callback ) {
14868 return jQuery.get( url, undefined, callback, "script
" );
14872 jQuery.each( [ "get
", "post
" ], function( i, method ) {
14873 jQuery[ method ] = function( url, data, callback, type ) {
14874 // shift arguments if data argument was omitted
14875 if ( jQuery.isFunction( data ) ) {
14876 type = type || callback;
14881 return jQuery.ajax({
14891 // Attach a bunch of functions for handling common AJAX events
14892 jQuery.each( [ "ajaxStart
", "ajaxStop
", "ajaxComplete
", "ajaxError
", "ajaxSuccess
", "ajaxSend
" ], function( i, type ) {
14893 jQuery.fn[ type ] = function( fn ) {
14894 return this.on( type, fn );
14899 jQuery._evalUrl = function( url ) {
14900 return jQuery.ajax({
14903 dataType: "script
",
14912 wrapAll: function( html ) {
14915 if ( jQuery.isFunction( html ) ) {
14916 return this.each(function( i ) {
14917 jQuery( this ).wrapAll( html.call(this, i) );
14923 // The elements to wrap the target around
14924 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
14926 if ( this[ 0 ].parentNode ) {
14927 wrap.insertBefore( this[ 0 ] );
14930 wrap.map(function() {
14933 while ( elem.firstElementChild ) {
14934 elem = elem.firstElementChild;
14944 wrapInner: function( html ) {
14945 if ( jQuery.isFunction( html ) ) {
14946 return this.each(function( i ) {
14947 jQuery( this ).wrapInner( html.call(this, i) );
14951 return this.each(function() {
14952 var self = jQuery( this ),
14953 contents = self.contents();
14955 if ( contents.length ) {
14956 contents.wrapAll( html );
14959 self.append( html );
14964 wrap: function( html ) {
14965 var isFunction = jQuery.isFunction( html );
14967 return this.each(function( i ) {
14968 jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
14972 unwrap: function() {
14973 return this.parent().each(function() {
14974 if ( !jQuery.nodeName( this, "body
" ) ) {
14975 jQuery( this ).replaceWith( this.childNodes );
14982 jQuery.expr.filters.hidden = function( elem ) {
14983 // Support: Opera <= 12.12
14984 // Opera reports offsetWidths and offsetHeights less than zero on some elements
14985 return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
14987 jQuery.expr.filters.visible = function( elem ) {
14988 return !jQuery.expr.filters.hidden( elem );
14995 rbracket = /\[\]$/,
14997 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
14998 rsubmittable = /^(?:input|select|textarea|keygen)/i;
15000 function buildParams( prefix, obj, traditional, add ) {
15003 if ( jQuery.isArray( obj ) ) {
15004 // Serialize array item.
15005 jQuery.each( obj, function( i, v ) {
15006 if ( traditional || rbracket.test( prefix ) ) {
15007 // Treat each array item as a scalar.
15011 // Item is non-scalar (array or object), encode its numeric index.
15012 buildParams( prefix + "[
" + ( typeof v === "object
" ? i : "" ) + "]
", v, traditional, add );
15016 } else if ( !traditional && jQuery.type( obj ) === "object
" ) {
15017 // Serialize object item.
15018 for ( name in obj ) {
15019 buildParams( prefix + "[
" + name + "]
", obj[ name ], traditional, add );
15023 // Serialize scalar item.
15024 add( prefix, obj );
15028 // Serialize an array of form elements or a set of
15029 // key/values into a query string
15030 jQuery.param = function( a, traditional ) {
15033 add = function( key, value ) {
15034 // If value is a function, invoke it and return its value
15035 value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
15036 s[ s.length ] = encodeURIComponent( key ) + "=
" + encodeURIComponent( value );
15039 // Set traditional to true for jQuery <= 1.3.2 behavior.
15040 if ( traditional === undefined ) {
15041 traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
15044 // If an array was passed in, assume that it is an array of form elements.
15045 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
15046 // Serialize the form elements
15047 jQuery.each( a, function() {
15048 add( this.name, this.value );
15052 // If traditional, encode the "old
" way (the way 1.3.2 or older
15053 // did it), otherwise encode params recursively.
15054 for ( prefix in a ) {
15055 buildParams( prefix, a[ prefix ], traditional, add );
15059 // Return the resulting serialization
15060 return s.join( "&
" ).replace( r20, "+
" );
15064 serialize: function() {
15065 return jQuery.param( this.serializeArray() );
15067 serializeArray: function() {
15068 return this.map(function() {
15069 // Can add propHook for "elements
" to filter or add form elements
15070 var elements = jQuery.prop( this, "elements
" );
15071 return elements ? jQuery.makeArray( elements ) : this;
15073 .filter(function() {
15074 var type = this.type;
15076 // Use .is( ":disabled
" ) so that fieldset[disabled] works
15077 return this.name && !jQuery( this ).is( ":disabled
" ) &&
15078 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
15079 ( this.checked || !rcheckableType.test( type ) );
15081 .map(function( i, elem ) {
15082 var val = jQuery( this ).val();
15084 return val == null ?
15086 jQuery.isArray( val ) ?
15087 jQuery.map( val, function( val ) {
15088 return { name: elem.name, value: val.replace( rCRLF, "\r\n
" ) };
15090 { name: elem.name, value: val.replace( rCRLF, "\r\n
" ) };
15096 jQuery.ajaxSettings.xhr = function() {
15098 return new XMLHttpRequest();
15104 xhrSuccessStatus = {
15105 // file protocol always yields status code 0, assume 200
15108 // #1450: sometimes IE returns 1223 when it should be 204
15111 xhrSupported = jQuery.ajaxSettings.xhr();
15114 // Open requests must be manually aborted on unload (#5280)
15115 if ( window.ActiveXObject ) {
15116 jQuery( window ).on( "unload
", function() {
15117 for ( var key in xhrCallbacks ) {
15118 xhrCallbacks[ key ]();
15123 support.cors = !!xhrSupported && ( "withCredentials
" in xhrSupported );
15124 support.ajax = xhrSupported = !!xhrSupported;
15126 jQuery.ajaxTransport(function( options ) {
15129 // Cross domain only allowed if supported through XMLHttpRequest
15130 if ( support.cors || xhrSupported && !options.crossDomain ) {
15132 send: function( headers, complete ) {
15134 xhr = options.xhr(),
15137 xhr.open( options.type, options.url, options.async, options.username, options.password );
15139 // Apply custom fields if provided
15140 if ( options.xhrFields ) {
15141 for ( i in options.xhrFields ) {
15142 xhr[ i ] = options.xhrFields[ i ];
15146 // Override mime type if needed
15147 if ( options.mimeType && xhr.overrideMimeType ) {
15148 xhr.overrideMimeType( options.mimeType );
15151 // X-Requested-With header
15152 // For cross-domain requests, seeing as conditions for a preflight are
15153 // akin to a jigsaw puzzle, we simply never set it to be sure.
15154 // (it can always be set on a per-request basis or even using ajaxSetup)
15155 // For same-domain requests, won't change header if already provided.
15156 if ( !options.crossDomain && !headers["X-Requested-With
"] ) {
15157 headers["X-Requested-With
"] = "XMLHttpRequest
";
15161 for ( i in headers ) {
15162 xhr.setRequestHeader( i, headers[ i ] );
15166 callback = function( type ) {
15167 return function() {
15169 delete xhrCallbacks[ id ];
15170 callback = xhr.onload = xhr.onerror = null;
15172 if ( type === "abort
" ) {
15174 } else if ( type === "error
" ) {
15176 // file: protocol always yields status 0; see #8605, #14207
15182 xhrSuccessStatus[ xhr.status ] || xhr.status,
15185 // Accessing binary-data responseText throws an exception
15187 typeof xhr.responseText === "string
" ? {
15188 text: xhr.responseText
15190 xhr.getAllResponseHeaders()
15197 // Listen to events
15198 xhr.onload = callback();
15199 xhr.onerror = callback("error
");
15201 // Create the abort callback
15202 callback = xhrCallbacks[ id ] = callback("abort
");
15205 // Do send the request (this may raise an exception)
15206 xhr.send( options.hasContent && options.data || null );
15208 // #14683: Only rethrow if this hasn't been notified as an error yet
15215 abort: function() {
15227 // Install script dataType
15230 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript
"
15233 script: /(?:java|ecma)script/
15236 "text script
": function( text ) {
15237 jQuery.globalEval( text );
15243 // Handle cache's special case and crossDomain
15244 jQuery.ajaxPrefilter( "script
", function( s ) {
15245 if ( s.cache === undefined ) {
15248 if ( s.crossDomain ) {
15253 // Bind script tag hack transport
15254 jQuery.ajaxTransport( "script
", function( s ) {
15255 // This transport only deals with cross domain requests
15256 if ( s.crossDomain ) {
15257 var script, callback;
15259 send: function( _, complete ) {
15260 script = jQuery("<script>").prop({
15262 charset: s.scriptCharset,
15266 callback = function( evt ) {
15270 complete( evt.type === "error
" ? 404 : 200, evt.type );
15274 document.head.appendChild( script[ 0 ] );
15276 abort: function() {
15288 var oldCallbacks = [],
15289 rjsonp = /(=)\?(?=&|$)|\?\?/;
15291 // Default jsonp settings
15294 jsonpCallback: function() {
15295 var callback = oldCallbacks.pop() || ( jQuery.expando + "_
" + ( nonce++ ) );
15296 this[ callback ] = true;
15301 // Detect, normalize options and install callbacks for jsonp requests
15302 jQuery.ajaxPrefilter( "json jsonp
", function( s, originalSettings, jqXHR ) {
15304 var callbackName, overwritten, responseContainer,
15305 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
15307 typeof s.data === "string
" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded
") && rjsonp.test( s.data ) && "data
"
15310 // Handle iff the expected data type is "jsonp
" or we have a parameter to set
15311 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp
" ) {
15313 // Get callback name, remembering preexisting value associated with it
15314 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
15315 s.jsonpCallback() :
15318 // Insert callback into url or form data
15320 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$
1" + callbackName );
15321 } else if ( s.jsonp !== false ) {
15322 s.url += ( rquery.test( s.url ) ? "&
" : "?
" ) + s.jsonp + "=
" + callbackName;
15325 // Use data converter to retrieve json after script execution
15326 s.converters["script json
"] = function() {
15327 if ( !responseContainer ) {
15328 jQuery.error( callbackName + " was not called
" );
15330 return responseContainer[ 0 ];
15333 // force json dataType
15334 s.dataTypes[ 0 ] = "json
";
15336 // Install callback
15337 overwritten = window[ callbackName ];
15338 window[ callbackName ] = function() {
15339 responseContainer = arguments;
15342 // Clean-up function (fires after converters)
15343 jqXHR.always(function() {
15344 // Restore preexisting value
15345 window[ callbackName ] = overwritten;
15347 // Save back as free
15348 if ( s[ callbackName ] ) {
15349 // make sure that re-using the options doesn't screw things around
15350 s.jsonpCallback = originalSettings.jsonpCallback;
15352 // save the callback name for future use
15353 oldCallbacks.push( callbackName );
15356 // Call if it was a function and we have a response
15357 if ( responseContainer && jQuery.isFunction( overwritten ) ) {
15358 overwritten( responseContainer[ 0 ] );
15361 responseContainer = overwritten = undefined;
15364 // Delegate to script
15372 // data: string of html
15373 // context (optional): If specified, the fragment will be created in this context, defaults to document
15374 // keepScripts (optional): If true, will include scripts passed in the html string
15375 jQuery.parseHTML = function( data, context, keepScripts ) {
15376 if ( !data || typeof data !== "string
" ) {
15379 if ( typeof context === "boolean
" ) {
15380 keepScripts = context;
15383 context = context || document;
15385 var parsed = rsingleTag.exec( data ),
15386 scripts = !keepScripts && [];
15390 return [ context.createElement( parsed[1] ) ];
15393 parsed = jQuery.buildFragment( [ data ], context, scripts );
15395 if ( scripts && scripts.length ) {
15396 jQuery( scripts ).remove();
15399 return jQuery.merge( [], parsed.childNodes );
15403 // Keep a copy of the old load method
15404 var _load = jQuery.fn.load;
15407 * Load a url into a page
15409 jQuery.fn.load = function( url, params, callback ) {
15410 if ( typeof url !== "string
" && _load ) {
15411 return _load.apply( this, arguments );
15414 var selector, type, response,
15416 off = url.indexOf(" ");
15419 selector = jQuery.trim( url.slice( off ) );
15420 url = url.slice( 0, off );
15423 // If it's a function
15424 if ( jQuery.isFunction( params ) ) {
15426 // We assume that it's the callback
15428 params = undefined;
15430 // Otherwise, build a param string
15431 } else if ( params && typeof params === "object
" ) {
15435 // If we have elements to modify, make the request
15436 if ( self.length > 0 ) {
15440 // if "type
" variable is undefined, then "GET
" method will be used
15444 }).done(function( responseText ) {
15446 // Save response for use in complete callback
15447 response = arguments;
15449 self.html( selector ?
15451 // If a selector was specified, locate the right elements in a dummy div
15452 // Exclude scripts to avoid IE 'Permission Denied' errors
15453 jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
15455 // Otherwise use the full result
15458 }).complete( callback && function( jqXHR, status ) {
15459 self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
15469 jQuery.expr.filters.animated = function( elem ) {
15470 return jQuery.grep(jQuery.timers, function( fn ) {
15471 return elem === fn.elem;
15478 var docElem = window.document.documentElement;
15481 * Gets a window from an element
15483 function getWindow( elem ) {
15484 return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
15488 setOffset: function( elem, options, i ) {
15489 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
15490 position = jQuery.css( elem, "position
" ),
15491 curElem = jQuery( elem ),
15494 // Set position first, in-case top/left are set even on static elem
15495 if ( position === "static
" ) {
15496 elem.style.position = "relative
";
15499 curOffset = curElem.offset();
15500 curCSSTop = jQuery.css( elem, "top
" );
15501 curCSSLeft = jQuery.css( elem, "left
" );
15502 calculatePosition = ( position === "absolute
" || position === "fixed
" ) &&
15503 ( curCSSTop + curCSSLeft ).indexOf("auto
") > -1;
15505 // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
15506 if ( calculatePosition ) {
15507 curPosition = curElem.position();
15508 curTop = curPosition.top;
15509 curLeft = curPosition.left;
15512 curTop = parseFloat( curCSSTop ) || 0;
15513 curLeft = parseFloat( curCSSLeft ) || 0;
15516 if ( jQuery.isFunction( options ) ) {
15517 options = options.call( elem, i, curOffset );
15520 if ( options.top != null ) {
15521 props.top = ( options.top - curOffset.top ) + curTop;
15523 if ( options.left != null ) {
15524 props.left = ( options.left - curOffset.left ) + curLeft;
15527 if ( "using
" in options ) {
15528 options.using.call( elem, props );
15531 curElem.css( props );
15537 offset: function( options ) {
15538 if ( arguments.length ) {
15539 return options === undefined ?
15541 this.each(function( i ) {
15542 jQuery.offset.setOffset( this, options, i );
15548 box = { top: 0, left: 0 },
15549 doc = elem && elem.ownerDocument;
15555 docElem = doc.documentElement;
15557 // Make sure it's not a disconnected DOM node
15558 if ( !jQuery.contains( docElem, elem ) ) {
15562 // If we don't have gBCR, just use 0,0 rather than error
15563 // BlackBerry 5, iOS 3 (original iPhone)
15564 if ( typeof elem.getBoundingClientRect !== strundefined ) {
15565 box = elem.getBoundingClientRect();
15567 win = getWindow( doc );
15569 top: box.top + win.pageYOffset - docElem.clientTop,
15570 left: box.left + win.pageXOffset - docElem.clientLeft
15574 position: function() {
15575 if ( !this[ 0 ] ) {
15579 var offsetParent, offset,
15581 parentOffset = { top: 0, left: 0 };
15583 // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
15584 if ( jQuery.css( elem, "position
" ) === "fixed
" ) {
15585 // We assume that getBoundingClientRect is available when computed position is fixed
15586 offset = elem.getBoundingClientRect();
15589 // Get *real* offsetParent
15590 offsetParent = this.offsetParent();
15592 // Get correct offsets
15593 offset = this.offset();
15594 if ( !jQuery.nodeName( offsetParent[ 0 ], "html
" ) ) {
15595 parentOffset = offsetParent.offset();
15598 // Add offsetParent borders
15599 parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth
", true );
15600 parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth
", true );
15603 // Subtract parent offsets and element margins
15605 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop
", true ),
15606 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft
", true )
15610 offsetParent: function() {
15611 return this.map(function() {
15612 var offsetParent = this.offsetParent || docElem;
15614 while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html
" ) && jQuery.css( offsetParent, "position
" ) === "static
" ) ) {
15615 offsetParent = offsetParent.offsetParent;
15618 return offsetParent || docElem;
15623 // Create scrollLeft and scrollTop methods
15624 jQuery.each( { scrollLeft: "pageXOffset
", scrollTop: "pageYOffset
" }, function( method, prop ) {
15625 var top = "pageYOffset
" === prop;
15627 jQuery.fn[ method ] = function( val ) {
15628 return access( this, function( elem, method, val ) {
15629 var win = getWindow( elem );
15631 if ( val === undefined ) {
15632 return win ? win[ prop ] : elem[ method ];
15637 !top ? val : window.pageXOffset,
15638 top ? val : window.pageYOffset
15642 elem[ method ] = val;
15644 }, method, val, arguments.length, null );
15648 // Add the top/left cssHooks using jQuery.fn.position
15649 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
15650 // getComputedStyle returns percent when specified for top/left/bottom/right
15651 // rather than make the css module depend on the offset module, we just check for it here
15652 jQuery.each( [ "top
", "left
" ], function( i, prop ) {
15653 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
15654 function( elem, computed ) {
15656 computed = curCSS( elem, prop );
15657 // if curCSS returns percentage, fallback to offset
15658 return rnumnonpx.test( computed ) ?
15659 jQuery( elem ).position()[ prop ] + "px
" :
15667 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
15668 jQuery.each( { Height: "height
", Width: "width
" }, function( name, type ) {
15669 jQuery.each( { padding: "inner
" + name, content: type, "": "outer
" + name }, function( defaultExtra, funcName ) {
15670 // margin is only for outerHeight, outerWidth
15671 jQuery.fn[ funcName ] = function( margin, value ) {
15672 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean
" ),
15673 extra = defaultExtra || ( margin === true || value === true ? "margin
" : "border
" );
15675 return access( this, function( elem, type, value ) {
15678 if ( jQuery.isWindow( elem ) ) {
15679 // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
15680 // isn't a whole lot we can do. See pull request at this URL for discussion:
15681 // https://github.com/jquery/jquery/pull/764
15682 return elem.document.documentElement[ "client
" + name ];
15685 // Get document width or height
15686 if ( elem.nodeType === 9 ) {
15687 doc = elem.documentElement;
15689 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
15690 // whichever is greatest
15692 elem.body[ "scroll
" + name ], doc[ "scroll
" + name ],
15693 elem.body[ "offset
" + name ], doc[ "offset
" + name ],
15694 doc[ "client
" + name ]
15698 return value === undefined ?
15699 // Get width or height on the element, requesting but not forcing parseFloat
15700 jQuery.css( elem, type, extra ) :
15702 // Set width or height on the element
15703 jQuery.style( elem, type, value, extra );
15704 }, type, chainable ? margin : undefined, chainable, null );
15710 // The number of elements contained in the matched element set
15711 jQuery.fn.size = function() {
15712 return this.length;
15715 jQuery.fn.andSelf = jQuery.fn.addBack;
15720 // Register as a named AMD module, since jQuery can be concatenated with other
15721 // files that may use define, but not via a proper concatenation script that
15722 // understands anonymous AMD modules. A named AMD is safest and most robust
15723 // way to register. Lowercase jquery is used because AMD module names are
15724 // derived from file names, and jQuery is normally delivered in a lowercase
15725 // file name. Do this after creating the global so that if an AMD module wants
15726 // to call noConflict to hide this version of jQuery, it will work.
15728 // Note that for maximum portability, libraries that are not jQuery should
15729 // declare themselves as anonymous modules, and avoid setting a global if an
15730 // AMD loader is present. jQuery is a special case. For more information, see
15731 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
15733 if ( typeof define === "function
" && define.amd ) {
15734 define( "jquery
", [], function() {
15743 // Map over jQuery in case of overwrite
15744 _jQuery = window.jQuery,
15746 // Map over the $ in case of overwrite
15749 jQuery.noConflict = function( deep ) {
15750 if ( window.$ === jQuery ) {
15754 if ( deep && window.jQuery === jQuery ) {
15755 window.jQuery = _jQuery;
15761 // Expose jQuery and $ identifiers, even in
15762 // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
15763 // and CommonJS for browser emulators (#13566)
15764 if ( typeof noGlobal === strundefined ) {
15765 window.jQuery = window.$ = jQuery;
15777 * Bootstrap v3.2.0 (http://getbootstrap.com)
15778 * Copyright 2011-2014 Twitter, Inc.
15779 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15782 if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
15784 /* ========================================================================
15785 * Bootstrap: transition.js v3.2.0
15786 * http://getbootstrap.com/javascript/#transitions
15787 * ========================================================================
15788 * Copyright 2011-2014 Twitter, Inc.
15789 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15790 * ======================================================================== */
15796 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
15797 // ============================================================
15799 function transitionEnd() {
15800 var el = document.createElement('bootstrap')
15802 var transEndEventNames = {
15803 WebkitTransition : 'webkitTransitionEnd',
15804 MozTransition : 'transitionend',
15805 OTransition : 'oTransitionEnd otransitionend',
15806 transition : 'transitionend'
15809 for (var name in transEndEventNames) {
15810 if (el.style[name] !== undefined) {
15811 return { end: transEndEventNames[name] }
15815 return false // explicit for ie8 ( ._.)
15818 // http://blog.alexmaccaw.com/css-transitions
15819 $.fn.emulateTransitionEnd = function (duration) {
15822 $(this).one('bsTransitionEnd', function () { called = true })
15823 var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
15824 setTimeout(callback, duration)
15829 $.support.transition = transitionEnd()
15831 if (!$.support.transition) return
15833 $.event.special.bsTransitionEnd = {
15834 bindType: $.support.transition.end,
15835 delegateType: $.support.transition.end,
15836 handle: function (e) {
15837 if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
15844 /* ========================================================================
15845 * Bootstrap: alert.js v3.2.0
15846 * http://getbootstrap.com/javascript/#alerts
15847 * ========================================================================
15848 * Copyright 2011-2014 Twitter, Inc.
15849 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15850 * ======================================================================== */
15856 // ALERT CLASS DEFINITION
15857 // ======================
15859 var dismiss = '[data-dismiss="alert"]'
15860 var Alert = function (el) {
15861 $(el).on('click', dismiss, this.close)
15864 Alert.VERSION = '
3.2.0'
15866 Alert.prototype.close = function (e) {
15867 var $this = $(this)
15868 var selector = $this.attr('data-target')
15871 selector = $this.attr('href')
15872 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
15875 var $parent = $(selector)
15877 if (e) e.preventDefault()
15879 if (!$parent.length) {
15880 $parent = $this.hasClass('alert') ? $this : $this.parent()
15883 $parent.trigger(e = $.Event('close.bs.alert'))
15885 if (e.isDefaultPrevented()) return
15887 $parent.removeClass('in')
15889 function removeElement() {
15890 // detach from parent, fire event then clean up data
15891 $parent.detach().trigger('closed.bs.alert').remove()
15894 $.support.transition && $parent.hasClass('fade') ?
15896 .one('bsTransitionEnd', removeElement)
15897 .emulateTransitionEnd(
150) :
15902 // ALERT PLUGIN DEFINITION
15903 // =======================
15905 function Plugin(option) {
15906 return this.each(function () {
15907 var $this = $(this)
15908 var data = $this.data('bs.alert')
15910 if (!data) $this.data('bs.alert', (data = new Alert(this)))
15911 if (typeof option == 'string') data[option].call($this)
15915 var old = $.fn.alert
15917 $.fn.alert = Plugin
15918 $.fn.alert.Constructor = Alert
15921 // ALERT NO CONFLICT
15922 // =================
15924 $.fn.alert.noConflict = function () {
15933 $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
15937 /* ========================================================================
15938 * Bootstrap: button.js v3.2
.0
15939 * http://getbootstrap.com/javascript/#buttons
15940 * ========================================================================
15941 * Copyright
2011-
2014 Twitter, Inc.
15942 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15943 * ======================================================================== */
15949 // BUTTON PUBLIC CLASS DEFINITION
15950 // ==============================
15952 var Button = function (element, options) {
15953 this.$element = $(element)
15954 this.options = $.extend({}, Button.DEFAULTS, options)
15955 this.isLoading = false
15958 Button.VERSION = '
3.2.0'
15960 Button.DEFAULTS = {
15961 loadingText: 'loading...'
15964 Button.prototype.setState = function (state) {
15966 var $el = this.$element
15967 var val = $el.is('input') ? 'val' : 'html'
15968 var data = $el.data()
15970 state = state + 'Text'
15972 if (data.resetText == null) $el.data('resetText', $el[val]())
15974 $el[val](data[state] == null ? this.options[state] : data[state])
15976 // push to event loop to allow forms to submit
15977 setTimeout($.proxy(function () {
15978 if (state == 'loadingText') {
15979 this.isLoading = true
15980 $el.addClass(d).attr(d, d)
15981 } else if (this.isLoading) {
15982 this.isLoading = false
15983 $el.removeClass(d).removeAttr(d)
15988 Button.prototype.toggle = function () {
15990 var $parent = this.$element.closest('[
data-toggle="buttons"]')
15992 if ($parent.length) {
15993 var $input = this.$element.find('input')
15994 if ($input.prop('type') == 'radio') {
15995 if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
15996 else $parent.find('.active').removeClass('active')
15998 if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
16001 if (changed) this.$element.toggleClass('active')
16005 // BUTTON PLUGIN DEFINITION
16006 // ========================
16008 function Plugin(option) {
16009 return this.each(function () {
16010 var $this = $(this)
16011 var data = $this.data('bs.button')
16012 var options = typeof option == 'object' && option
16014 if (!data) $this.data('bs.button', (data = new Button(this, options)))
16016 if (option == 'toggle') data.toggle()
16017 else if (option) data.setState(option)
16021 var old = $.fn.button
16023 $.fn.button = Plugin
16024 $.fn.button.Constructor = Button
16027 // BUTTON NO CONFLICT
16028 // ==================
16030 $.fn.button.noConflict = function () {
16039 $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
16040 var $btn = $(e.target)
16041 if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
16042 Plugin.call($btn, 'toggle')
16048 /* ========================================================================
16049 * Bootstrap: carousel.js v3.2
.0
16050 * http://getbootstrap.com/javascript/#carousel
16051 * ========================================================================
16052 * Copyright
2011-
2014 Twitter, Inc.
16053 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16054 * ======================================================================== */
16060 // CAROUSEL CLASS DEFINITION
16061 // =========================
16063 var Carousel = function (element, options) {
16064 this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
16065 this.$indicators = this.$element.find('.carousel-indicators')
16066 this.options = options
16073 this.options.pause == 'hover' && this.$element
16074 .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
16075 .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
16078 Carousel.VERSION = '
3.2.0'
16080 Carousel.DEFAULTS = {
16086 Carousel.prototype.keydown = function (e) {
16088 case
37: this.prev(); break
16089 case
39: this.next(); break
16096 Carousel.prototype.cycle = function (e) {
16097 e || (this.paused = false)
16099 this.interval && clearInterval(this.interval)
16101 this.options.interval
16103 && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
16108 Carousel.prototype.getItemIndex = function (item) {
16109 this.$items = item.parent().children('.item')
16110 return this.$items.index(item || this.$active)
16113 Carousel.prototype.to = function (pos) {
16115 var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
16117 if (pos
> (this.$items.length -
1) || pos <
0) return
16119 if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
16120 if (activeIndex == pos) return this.pause().cycle()
16122 return this.slide(pos
> activeIndex ? 'next' : 'prev', $(this.$items[pos]))
16125 Carousel.prototype.pause = function (e) {
16126 e || (this.paused = true)
16128 if (this.$element.find('.next, .prev').length && $.support.transition) {
16129 this.$element.trigger($.support.transition.end)
16133 this.interval = clearInterval(this.interval)
16138 Carousel.prototype.next = function () {
16139 if (this.sliding) return
16140 return this.slide('next')
16143 Carousel.prototype.prev = function () {
16144 if (this.sliding) return
16145 return this.slide('prev')
16148 Carousel.prototype.slide = function (type, next) {
16149 var $active = this.$element.find('.item.active')
16150 var $next = next || $active[type]()
16151 var isCycling = this.interval
16152 var direction = type == 'next' ? 'left' : 'right'
16153 var fallback = type == 'next' ? 'first' : 'last'
16156 if (!$next.length) {
16157 if (!this.options.wrap) return
16158 $next = this.$element.find('.item')[fallback]()
16161 if ($next.hasClass('active')) return (this.sliding = false)
16163 var relatedTarget = $next[
0]
16164 var slideEvent = $.Event('slide.bs.carousel', {
16165 relatedTarget: relatedTarget,
16166 direction: direction
16168 this.$element.trigger(slideEvent)
16169 if (slideEvent.isDefaultPrevented()) return
16171 this.sliding = true
16173 isCycling && this.pause()
16175 if (this.$indicators.length) {
16176 this.$indicators.find('.active').removeClass('active')
16177 var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
16178 $nextIndicator && $nextIndicator.addClass('active')
16181 var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
16182 if ($.support.transition && this.$element.hasClass('slide')) {
16183 $next.addClass(type)
16184 $next[
0].offsetWidth // force reflow
16185 $active.addClass(direction)
16186 $next.addClass(direction)
16188 .one('bsTransitionEnd', function () {
16189 $next.removeClass([type, direction].join(' ')).addClass('active')
16190 $active.removeClass(['active', direction].join(' '))
16191 that.sliding = false
16192 setTimeout(function () {
16193 that.$element.trigger(slidEvent)
16196 .emulateTransitionEnd($active.css('transition-duration').slice(
0, -
1) *
1000)
16198 $active.removeClass('active')
16199 $next.addClass('active')
16200 this.sliding = false
16201 this.$element.trigger(slidEvent)
16204 isCycling && this.cycle()
16210 // CAROUSEL PLUGIN DEFINITION
16211 // ==========================
16213 function Plugin(option) {
16214 return this.each(function () {
16215 var $this = $(this)
16216 var data = $this.data('bs.carousel')
16217 var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
16218 var action = typeof option == 'string' ? option : options.slide
16220 if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
16221 if (typeof option == 'number') data.to(option)
16222 else if (action) data[action]()
16223 else if (options.interval) data.pause().cycle()
16227 var old = $.fn.carousel
16229 $.fn.carousel = Plugin
16230 $.fn.carousel.Constructor = Carousel
16233 // CAROUSEL NO CONFLICT
16234 // ====================
16236 $.fn.carousel.noConflict = function () {
16237 $.fn.carousel = old
16242 // CAROUSEL DATA-API
16243 // =================
16245 $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
16247 var $this = $(this)
16248 var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
16249 if (!$target.hasClass('carousel')) return
16250 var options = $.extend({}, $target.data(), $this.data())
16251 var slideIndex = $this.attr('data-slide-to')
16252 if (slideIndex) options.interval = false
16254 Plugin.call($target, options)
16257 $target.data('bs.carousel').to(slideIndex)
16263 $(window).on('load', function () {
16264 $('[
data-ride="carousel"]').each(function () {
16265 var $carousel = $(this)
16266 Plugin.call($carousel, $carousel.data())
16272 /* ========================================================================
16273 * Bootstrap: collapse.js v3.2
.0
16274 * http://getbootstrap.com/javascript/#collapse
16275 * ========================================================================
16276 * Copyright
2011-
2014 Twitter, Inc.
16277 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16278 * ======================================================================== */
16284 // COLLAPSE PUBLIC CLASS DEFINITION
16285 // ================================
16287 var Collapse = function (element, options) {
16288 this.$element = $(element)
16289 this.options = $.extend({}, Collapse.DEFAULTS, options)
16290 this.transitioning = null
16292 if (this.options.parent) this.$parent = $(this.options.parent)
16293 if (this.options.toggle) this.toggle()
16296 Collapse.VERSION = '
3.2.0'
16298 Collapse.DEFAULTS = {
16302 Collapse.prototype.dimension = function () {
16303 var hasWidth = this.$element.hasClass('width')
16304 return hasWidth ? 'width' : 'height'
16307 Collapse.prototype.show = function () {
16308 if (this.transitioning || this.$element.hasClass('in')) return
16310 var startEvent = $.Event('show.bs.collapse')
16311 this.$element.trigger(startEvent)
16312 if (startEvent.isDefaultPrevented()) return
16314 var actives = this.$parent && this.$parent.find('
> .panel
> .in')
16316 if (actives && actives.length) {
16317 var hasData = actives.data('bs.collapse')
16318 if (hasData && hasData.transitioning) return
16319 Plugin.call(actives, 'hide')
16320 hasData || actives.data('bs.collapse', null)
16323 var dimension = this.dimension()
16326 .removeClass('collapse')
16327 .addClass('collapsing')[dimension](
0)
16329 this.transitioning =
1
16331 var complete = function () {
16333 .removeClass('collapsing')
16334 .addClass('collapse in')[dimension]('')
16335 this.transitioning =
0
16337 .trigger('shown.bs.collapse')
16340 if (!$.support.transition) return complete.call(this)
16342 var scrollSize = $.camelCase(['scroll', dimension].join('-'))
16345 .one('bsTransitionEnd', $.proxy(complete, this))
16346 .emulateTransitionEnd(
350)[dimension](this.$element[
0][scrollSize])
16349 Collapse.prototype.hide = function () {
16350 if (this.transitioning || !this.$element.hasClass('in')) return
16352 var startEvent = $.Event('hide.bs.collapse')
16353 this.$element.trigger(startEvent)
16354 if (startEvent.isDefaultPrevented()) return
16356 var dimension = this.dimension()
16358 this.$element[dimension](this.$element[dimension]())[
0].offsetHeight
16361 .addClass('collapsing')
16362 .removeClass('collapse')
16365 this.transitioning =
1
16367 var complete = function () {
16368 this.transitioning =
0
16370 .trigger('hidden.bs.collapse')
16371 .removeClass('collapsing')
16372 .addClass('collapse')
16375 if (!$.support.transition) return complete.call(this)
16379 .one('bsTransitionEnd', $.proxy(complete, this))
16380 .emulateTransitionEnd(
350)
16383 Collapse.prototype.toggle = function () {
16384 this[this.$element.hasClass('in') ? 'hide' : 'show']()
16388 // COLLAPSE PLUGIN DEFINITION
16389 // ==========================
16391 function Plugin(option) {
16392 return this.each(function () {
16393 var $this = $(this)
16394 var data = $this.data('bs.collapse')
16395 var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
16397 if (!data && options.toggle && option == 'show') option = !option
16398 if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
16399 if (typeof option == 'string') data[option]()
16403 var old = $.fn.collapse
16405 $.fn.collapse = Plugin
16406 $.fn.collapse.Constructor = Collapse
16409 // COLLAPSE NO CONFLICT
16410 // ====================
16412 $.fn.collapse.noConflict = function () {
16413 $.fn.collapse = old
16418 // COLLAPSE DATA-API
16419 // =================
16421 $(document).on('click.bs.collapse.data-api', '[
data-toggle="collapse"]', function (e) {
16423 var $this = $(this)
16424 var target = $this.attr('data-target')
16425 || e.preventDefault()
16426 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
16427 var $target = $(target)
16428 var data = $target.data('bs.collapse')
16429 var option = data ? 'toggle' : $this.data()
16430 var parent = $this.attr('data-parent')
16431 var $parent = parent && $(parent)
16433 if (!data || !data.transitioning) {
16434 if ($parent) $parent.find('[
data-toggle="collapse"][
data-parent="' + parent + '"]').not($this).addClass('collapsed')
16435 $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
16438 Plugin.call($target, option)
16443 /* ========================================================================
16444 * Bootstrap: dropdown.js v3.2
.0
16445 * http://getbootstrap.com/javascript/#dropdowns
16446 * ========================================================================
16447 * Copyright
2011-
2014 Twitter, Inc.
16448 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16449 * ======================================================================== */
16455 // DROPDOWN CLASS DEFINITION
16456 // =========================
16458 var backdrop = '.dropdown-backdrop'
16459 var toggle = '[
data-toggle="dropdown"]'
16460 var Dropdown = function (element) {
16461 $(element).on('click.bs.dropdown', this.toggle)
16464 Dropdown.VERSION = '
3.2.0'
16466 Dropdown.prototype.toggle = function (e) {
16467 var $this = $(this)
16469 if ($this.is('.disabled, :disabled')) return
16471 var $parent = getParent($this)
16472 var isActive = $parent.hasClass('open')
16477 if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
16478 // if mobile we use a backdrop because click events don't delegate
16479 $('
<div class=
"dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
16482 var relatedTarget = { relatedTarget: this }
16483 $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
16485 if (e.isDefaultPrevented()) return
16487 $this.trigger('focus')
16490 .toggleClass('open')
16491 .trigger('shown.bs.dropdown', relatedTarget)
16497 Dropdown.prototype.keydown = function (e) {
16498 if (!/(
38|
40|
27)/.test(e.keyCode)) return
16500 var $this = $(this)
16503 e.stopPropagation()
16505 if ($this.is('.disabled, :disabled')) return
16507 var $parent = getParent($this)
16508 var isActive = $parent.hasClass('open')
16510 if (!isActive || (isActive && e.keyCode ==
27)) {
16511 if (e.which ==
27) $parent.find(toggle).trigger('focus')
16512 return $this.trigger('click')
16515 var desc = ' li:not(.divider):visible a'
16516 var $items = $parent.find('[
role="menu"]' + desc + ', [
role="listbox"]' + desc)
16518 if (!$items.length) return
16520 var index = $items.index($items.filter(':focus'))
16522 if (e.keyCode ==
38 && index
> 0) index-- // up
16523 if (e.keyCode ==
40 && index < $items.length -
1) index++ // down
16524 if (!~index) index =
0
16526 $items.eq(index).trigger('focus')
16529 function clearMenus(e) {
16530 if (e && e.which ===
3) return
16531 $(backdrop).remove()
16532 $(toggle).each(function () {
16533 var $parent = getParent($(this))
16534 var relatedTarget = { relatedTarget: this }
16535 if (!$parent.hasClass('open')) return
16536 $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
16537 if (e.isDefaultPrevented()) return
16538 $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
16542 function getParent($this) {
16543 var selector = $this.attr('data-target')
16546 selector = $this.attr('href')
16547 selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
16550 var $parent = selector && $(selector)
16552 return $parent && $parent.length ? $parent : $this.parent()
16556 // DROPDOWN PLUGIN DEFINITION
16557 // ==========================
16559 function Plugin(option) {
16560 return this.each(function () {
16561 var $this = $(this)
16562 var data = $this.data('bs.dropdown')
16564 if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
16565 if (typeof option == 'string') data[option].call($this)
16569 var old = $.fn.dropdown
16571 $.fn.dropdown = Plugin
16572 $.fn.dropdown.Constructor = Dropdown
16575 // DROPDOWN NO CONFLICT
16576 // ====================
16578 $.fn.dropdown.noConflict = function () {
16579 $.fn.dropdown = old
16584 // APPLY TO STANDARD DROPDOWN ELEMENTS
16585 // ===================================
16588 .on('click.bs.dropdown.data-api', clearMenus)
16589 .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
16590 .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
16591 .on('keydown.bs.dropdown.data-api', toggle + ', [
role=
"menu"], [
role=
"listbox"]', Dropdown.prototype.keydown)
16595 /* ========================================================================
16596 * Bootstrap: modal.js v3.2
.0
16597 * http://getbootstrap.com/javascript/#modals
16598 * ========================================================================
16599 * Copyright
2011-
2014 Twitter, Inc.
16600 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16601 * ======================================================================== */
16607 // MODAL CLASS DEFINITION
16608 // ======================
16610 var Modal = function (element, options) {
16611 this.options = options
16612 this.$body = $(document.body)
16613 this.$element = $(element)
16615 this.isShown = null
16616 this.scrollbarWidth =
0
16618 if (this.options.remote) {
16620 .find('.modal-content')
16621 .load(this.options.remote, $.proxy(function () {
16622 this.$element.trigger('loaded.bs.modal')
16627 Modal.VERSION = '
3.2.0'
16635 Modal.prototype.toggle = function (_relatedTarget) {
16636 return this.isShown ? this.hide() : this.show(_relatedTarget)
16639 Modal.prototype.show = function (_relatedTarget) {
16641 var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
16643 this.$element.trigger(e)
16645 if (this.isShown || e.isDefaultPrevented()) return
16647 this.isShown = true
16649 this.checkScrollbar()
16650 this.$body.addClass('modal-open')
16652 this.setScrollbar()
16655 this.$element.on('click.dismiss.bs.modal', '[
data-dismiss=
"modal"]', $.proxy(this.hide, this))
16657 this.backdrop(function () {
16658 var transition = $.support.transition && that.$element.hasClass('fade')
16660 if (!that.$element.parent().length) {
16661 that.$element.appendTo(that.$body) // don't move modals dom position
16669 that.$element[
0].offsetWidth // force reflow
16674 .attr('aria-hidden', false)
16676 that.enforceFocus()
16678 var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
16681 that.$element.find('.modal-dialog') // wait for modal to slide in
16682 .one('bsTransitionEnd', function () {
16683 that.$element.trigger('focus').trigger(e)
16685 .emulateTransitionEnd(
300) :
16686 that.$element.trigger('focus').trigger(e)
16690 Modal.prototype.hide = function (e) {
16691 if (e) e.preventDefault()
16693 e = $.Event('hide.bs.modal')
16695 this.$element.trigger(e)
16697 if (!this.isShown || e.isDefaultPrevented()) return
16699 this.isShown = false
16701 this.$body.removeClass('modal-open')
16703 this.resetScrollbar()
16706 $(document).off('focusin.bs.modal')
16710 .attr('aria-hidden', true)
16711 .off('click.dismiss.bs.modal')
16713 $.support.transition && this.$element.hasClass('fade') ?
16715 .one('bsTransitionEnd', $.proxy(this.hideModal, this))
16716 .emulateTransitionEnd(
300) :
16720 Modal.prototype.enforceFocus = function () {
16722 .off('focusin.bs.modal') // guard against infinite focus loop
16723 .on('focusin.bs.modal', $.proxy(function (e) {
16724 if (this.$element[
0] !== e.target && !this.$element.has(e.target).length) {
16725 this.$element.trigger('focus')
16730 Modal.prototype.escape = function () {
16731 if (this.isShown && this.options.keyboard) {
16732 this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
16733 e.which ==
27 && this.hide()
16735 } else if (!this.isShown) {
16736 this.$element.off('keyup.dismiss.bs.modal')
16740 Modal.prototype.hideModal = function () {
16742 this.$element.hide()
16743 this.backdrop(function () {
16744 that.$element.trigger('hidden.bs.modal')
16748 Modal.prototype.removeBackdrop = function () {
16749 this.$backdrop && this.$backdrop.remove()
16750 this.$backdrop = null
16753 Modal.prototype.backdrop = function (callback) {
16755 var animate = this.$element.hasClass('fade') ? 'fade' : ''
16757 if (this.isShown && this.options.backdrop) {
16758 var doAnimate = $.support.transition && animate
16760 this.$backdrop = $('
<div class=
"modal-backdrop ' + animate + '" />')
16761 .appendTo(this.$body)
16763 this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
16764 if (e.target !== e.currentTarget) return
16765 this.options.backdrop == 'static'
16766 ? this.$element[
0].focus.call(this.$element[
0])
16767 : this.hide.call(this)
16770 if (doAnimate) this.$backdrop[
0].offsetWidth // force reflow
16772 this.$backdrop.addClass('in')
16774 if (!callback) return
16778 .one('bsTransitionEnd', callback)
16779 .emulateTransitionEnd(
150) :
16782 } else if (!this.isShown && this.$backdrop) {
16783 this.$backdrop.removeClass('in')
16785 var callbackRemove = function () {
16786 that.removeBackdrop()
16787 callback && callback()
16789 $.support.transition && this.$element.hasClass('fade') ?
16791 .one('bsTransitionEnd', callbackRemove)
16792 .emulateTransitionEnd(
150) :
16795 } else if (callback) {
16800 Modal.prototype.checkScrollbar = function () {
16801 if (document.body.clientWidth
>= window.innerWidth) return
16802 this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
16805 Modal.prototype.setScrollbar = function () {
16806 var bodyPad = parseInt((this.$body.css('padding-right') ||
0),
10)
16807 if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
16810 Modal.prototype.resetScrollbar = function () {
16811 this.$body.css('padding-right', '')
16814 Modal.prototype.measureScrollbar = function () { // thx walsh
16815 var scrollDiv = document.createElement('div')
16816 scrollDiv.className = 'modal-scrollbar-measure'
16817 this.$body.append(scrollDiv)
16818 var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
16819 this.$body[
0].removeChild(scrollDiv)
16820 return scrollbarWidth
16824 // MODAL PLUGIN DEFINITION
16825 // =======================
16827 function Plugin(option, _relatedTarget) {
16828 return this.each(function () {
16829 var $this = $(this)
16830 var data = $this.data('bs.modal')
16831 var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
16833 if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
16834 if (typeof option == 'string') data[option](_relatedTarget)
16835 else if (options.show) data.show(_relatedTarget)
16839 var old = $.fn.modal
16841 $.fn.modal = Plugin
16842 $.fn.modal.Constructor = Modal
16845 // MODAL NO CONFLICT
16846 // =================
16848 $.fn.modal.noConflict = function () {
16857 $(document).on('click.bs.modal.data-api', '[
data-toggle="modal"]', function (e) {
16858 var $this = $(this)
16859 var href = $this.attr('href')
16860 var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
16861 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
16863 if ($this.is('a')) e.preventDefault()
16865 $target.one('show.bs.modal', function (showEvent) {
16866 if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
16867 $target.one('hidden.bs.modal', function () {
16868 $this.is(':visible') && $this.trigger('focus')
16871 Plugin.call($target, option, this)
16876 /* ========================================================================
16877 * Bootstrap: tooltip.js v3.2
.0
16878 * http://getbootstrap.com/javascript/#tooltip
16879 * Inspired by the original jQuery.tipsy by Jason Frame
16880 * ========================================================================
16881 * Copyright
2011-
2014 Twitter, Inc.
16882 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16883 * ======================================================================== */
16889 // TOOLTIP PUBLIC CLASS DEFINITION
16890 // ===============================
16892 var Tooltip = function (element, options) {
16898 this.$element = null
16900 this.init('tooltip', element, options)
16903 Tooltip.VERSION = '
3.2.0'
16905 Tooltip.DEFAULTS = {
16909 template: '
<div class=
"tooltip" role=
"tooltip"><div class=
"tooltip-arrow"></div><div class=
"tooltip-inner"></div></div>',
16910 trigger: 'hover focus',
16921 Tooltip.prototype.init = function (type, element, options) {
16922 this.enabled = true
16924 this.$element = $(element)
16925 this.options = this.getOptions(options)
16926 this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
16928 var triggers = this.options.trigger.split(' ')
16930 for (var i = triggers.length; i--;) {
16931 var trigger = triggers[i]
16933 if (trigger == 'click') {
16934 this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
16935 } else if (trigger != 'manual') {
16936 var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
16937 var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
16939 this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
16940 this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
16944 this.options.selector ?
16945 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
16949 Tooltip.prototype.getDefaults = function () {
16950 return Tooltip.DEFAULTS
16953 Tooltip.prototype.getOptions = function (options) {
16954 options = $.extend({}, this.getDefaults(), this.$element.data(), options)
16956 if (options.delay && typeof options.delay == 'number') {
16958 show: options.delay,
16959 hide: options.delay
16966 Tooltip.prototype.getDelegateOptions = function () {
16968 var defaults = this.getDefaults()
16970 this._options && $.each(this._options, function (key, value) {
16971 if (defaults[key] != value) options[key] = value
16977 Tooltip.prototype.enter = function (obj) {
16978 var self = obj instanceof this.constructor ?
16979 obj : $(obj.currentTarget).data('bs.' + this.type)
16982 self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
16983 $(obj.currentTarget).data('bs.' + this.type, self)
16986 clearTimeout(self.timeout)
16988 self.hoverState = 'in'
16990 if (!self.options.delay || !self.options.delay.show) return self.show()
16992 self.timeout = setTimeout(function () {
16993 if (self.hoverState == 'in') self.show()
16994 }, self.options.delay.show)
16997 Tooltip.prototype.leave = function (obj) {
16998 var self = obj instanceof this.constructor ?
16999 obj : $(obj.currentTarget).data('bs.' + this.type)
17002 self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
17003 $(obj.currentTarget).data('bs.' + this.type, self)
17006 clearTimeout(self.timeout)
17008 self.hoverState = 'out'
17010 if (!self.options.delay || !self.options.delay.hide) return self.hide()
17012 self.timeout = setTimeout(function () {
17013 if (self.hoverState == 'out') self.hide()
17014 }, self.options.delay.hide)
17017 Tooltip.prototype.show = function () {
17018 var e = $.Event('show.bs.' + this.type)
17020 if (this.hasContent() && this.enabled) {
17021 this.$element.trigger(e)
17023 var inDom = $.contains(document.documentElement, this.$element[
0])
17024 if (e.isDefaultPrevented() || !inDom) return
17027 var $tip = this.tip()
17029 var tipId = this.getUID(this.type)
17032 $tip.attr('id', tipId)
17033 this.$element.attr('aria-describedby', tipId)
17035 if (this.options.animation) $tip.addClass('fade')
17037 var placement = typeof this.options.placement == 'function' ?
17038 this.options.placement.call(this, $tip[
0], this.$element[
0]) :
17039 this.options.placement
17041 var autoToken = /\s?auto?\s?/i
17042 var autoPlace = autoToken.test(placement)
17043 if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
17047 .css({ top:
0, left:
0, display: 'block' })
17048 .addClass(placement)
17049 .data('bs.' + this.type, this)
17051 this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
17053 var pos = this.getPosition()
17054 var actualWidth = $tip[
0].offsetWidth
17055 var actualHeight = $tip[
0].offsetHeight
17058 var orgPlacement = placement
17059 var $parent = this.$element.parent()
17060 var parentDim = this.getPosition($parent)
17062 placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll
> parentDim.height ? 'top' :
17063 placement == 'top' && pos.top - parentDim.scroll - actualHeight <
0 ? 'bottom' :
17064 placement == 'right' && pos.right + actualWidth
> parentDim.width ? 'left' :
17065 placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' :
17069 .removeClass(orgPlacement)
17070 .addClass(placement)
17073 var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
17075 this.applyPlacement(calculatedOffset, placement)
17077 var complete = function () {
17078 that.$element.trigger('shown.bs.' + that.type)
17079 that.hoverState = null
17082 $.support.transition && this.$tip.hasClass('fade') ?
17084 .one('bsTransitionEnd', complete)
17085 .emulateTransitionEnd(
150) :
17090 Tooltip.prototype.applyPlacement = function (offset, placement) {
17091 var $tip = this.tip()
17092 var width = $tip[
0].offsetWidth
17093 var height = $tip[
0].offsetHeight
17095 // manually read margins because getBoundingClientRect includes difference
17096 var marginTop = parseInt($tip.css('margin-top'),
10)
17097 var marginLeft = parseInt($tip.css('margin-left'),
10)
17099 // we must check for NaN for ie
8/
9
17100 if (isNaN(marginTop)) marginTop =
0
17101 if (isNaN(marginLeft)) marginLeft =
0
17103 offset.top = offset.top + marginTop
17104 offset.left = offset.left + marginLeft
17106 // $.fn.offset doesn't round pixel values
17107 // so we use setOffset directly with our own function B-
0
17108 $.offset.setOffset($tip[
0], $.extend({
17109 using: function (props) {
17111 top: Math.round(props.top),
17112 left: Math.round(props.left)
17117 $tip.addClass('in')
17119 // check to see if placing tip in new offset caused the tip to resize itself
17120 var actualWidth = $tip[
0].offsetWidth
17121 var actualHeight = $tip[
0].offsetHeight
17123 if (placement == 'top' && actualHeight != height) {
17124 offset.top = offset.top + height - actualHeight
17127 var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
17129 if (delta.left) offset.left += delta.left
17130 else offset.top += delta.top
17132 var arrowDelta = delta.left ? delta.left *
2 - width + actualWidth : delta.top *
2 - height + actualHeight
17133 var arrowPosition = delta.left ? 'left' : 'top'
17134 var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
17136 $tip.offset(offset)
17137 this.replaceArrow(arrowDelta, $tip[
0][arrowOffsetPosition], arrowPosition)
17140 Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
17141 this.arrow().css(position, delta ? (
50 * (
1 - delta / dimension) + '%') : '')
17144 Tooltip.prototype.setContent = function () {
17145 var $tip = this.tip()
17146 var title = this.getTitle()
17148 $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
17149 $tip.removeClass('fade in top bottom left right')
17152 Tooltip.prototype.hide = function () {
17154 var $tip = this.tip()
17155 var e = $.Event('hide.bs.' + this.type)
17157 this.$element.removeAttr('aria-describedby')
17159 function complete() {
17160 if (that.hoverState != 'in') $tip.detach()
17161 that.$element.trigger('hidden.bs.' + that.type)
17164 this.$element.trigger(e)
17166 if (e.isDefaultPrevented()) return
17168 $tip.removeClass('in')
17170 $.support.transition && this.$tip.hasClass('fade') ?
17172 .one('bsTransitionEnd', complete)
17173 .emulateTransitionEnd(
150) :
17176 this.hoverState = null
17181 Tooltip.prototype.fixTitle = function () {
17182 var $e = this.$element
17183 if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
17184 $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
17188 Tooltip.prototype.hasContent = function () {
17189 return this.getTitle()
17192 Tooltip.prototype.getPosition = function ($element) {
17193 $element = $element || this.$element
17194 var el = $element[
0]
17195 var isBody = el.tagName == 'BODY'
17196 return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
17197 scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
17198 width: isBody ? $(window).width() : $element.outerWidth(),
17199 height: isBody ? $(window).height() : $element.outerHeight()
17200 }, isBody ? { top:
0, left:
0 } : $element.offset())
17203 Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
17204 return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width /
2 - actualWidth /
2 } :
17205 placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width /
2 - actualWidth /
2 } :
17206 placement == 'left' ? { top: pos.top + pos.height /
2 - actualHeight /
2, left: pos.left - actualWidth } :
17207 /* placement == 'right' */ { top: pos.top + pos.height /
2 - actualHeight /
2, left: pos.left + pos.width }
17211 Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
17212 var delta = { top:
0, left:
0 }
17213 if (!this.$viewport) return delta
17215 var viewportPadding = this.options.viewport && this.options.viewport.padding ||
0
17216 var viewportDimensions = this.getPosition(this.$viewport)
17218 if (/right|left/.test(placement)) {
17219 var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
17220 var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
17221 if (topEdgeOffset < viewportDimensions.top) { // top overflow
17222 delta.top = viewportDimensions.top - topEdgeOffset
17223 } else if (bottomEdgeOffset
> viewportDimensions.top + viewportDimensions.height) { // bottom overflow
17224 delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
17227 var leftEdgeOffset = pos.left - viewportPadding
17228 var rightEdgeOffset = pos.left + viewportPadding + actualWidth
17229 if (leftEdgeOffset < viewportDimensions.left) { // left overflow
17230 delta.left = viewportDimensions.left - leftEdgeOffset
17231 } else if (rightEdgeOffset
> viewportDimensions.width) { // right overflow
17232 delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
17239 Tooltip.prototype.getTitle = function () {
17241 var $e = this.$element
17242 var o = this.options
17244 title = $e.attr('data-original-title')
17245 || (typeof o.title == 'function' ? o.title.call($e[
0]) : o.title)
17250 Tooltip.prototype.getUID = function (prefix) {
17251 do prefix += ~~(Math.random() *
1000000)
17252 while (document.getElementById(prefix))
17256 Tooltip.prototype.tip = function () {
17257 return (this.$tip = this.$tip || $(this.options.template))
17260 Tooltip.prototype.arrow = function () {
17261 return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
17264 Tooltip.prototype.validate = function () {
17265 if (!this.$element[
0].parentNode) {
17267 this.$element = null
17268 this.options = null
17272 Tooltip.prototype.enable = function () {
17273 this.enabled = true
17276 Tooltip.prototype.disable = function () {
17277 this.enabled = false
17280 Tooltip.prototype.toggleEnabled = function () {
17281 this.enabled = !this.enabled
17284 Tooltip.prototype.toggle = function (e) {
17287 self = $(e.currentTarget).data('bs.' + this.type)
17289 self = new this.constructor(e.currentTarget, this.getDelegateOptions())
17290 $(e.currentTarget).data('bs.' + this.type, self)
17294 self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
17297 Tooltip.prototype.destroy = function () {
17298 clearTimeout(this.timeout)
17299 this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
17303 // TOOLTIP PLUGIN DEFINITION
17304 // =========================
17306 function Plugin(option) {
17307 return this.each(function () {
17308 var $this = $(this)
17309 var data = $this.data('bs.tooltip')
17310 var options = typeof option == 'object' && option
17312 if (!data && option == 'destroy') return
17313 if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
17314 if (typeof option == 'string') data[option]()
17318 var old = $.fn.tooltip
17320 $.fn.tooltip = Plugin
17321 $.fn.tooltip.Constructor = Tooltip
17324 // TOOLTIP NO CONFLICT
17325 // ===================
17327 $.fn.tooltip.noConflict = function () {
17334 /* ========================================================================
17335 * Bootstrap: popover.js v3.2
.0
17336 * http://getbootstrap.com/javascript/#popovers
17337 * ========================================================================
17338 * Copyright
2011-
2014 Twitter, Inc.
17339 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17340 * ======================================================================== */
17346 // POPOVER PUBLIC CLASS DEFINITION
17347 // ===============================
17349 var Popover = function (element, options) {
17350 this.init('popover', element, options)
17353 if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
17355 Popover.VERSION = '
3.2.0'
17357 Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
17358 placement: 'right',
17361 template: '
<div class=
"popover" role=
"tooltip"><div class=
"arrow"></div><h3 class=
"popover-title"></h3><div class=
"popover-content"></div></div>'
17365 // NOTE: POPOVER EXTENDS tooltip.js
17366 // ================================
17368 Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
17370 Popover.prototype.constructor = Popover
17372 Popover.prototype.getDefaults = function () {
17373 return Popover.DEFAULTS
17376 Popover.prototype.setContent = function () {
17377 var $tip = this.tip()
17378 var title = this.getTitle()
17379 var content = this.getContent()
17381 $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
17382 $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
17383 this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
17386 $tip.removeClass('fade top bottom left right in')
17388 // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
17389 // this manually by checking the contents.
17390 if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
17393 Popover.prototype.hasContent = function () {
17394 return this.getTitle() || this.getContent()
17397 Popover.prototype.getContent = function () {
17398 var $e = this.$element
17399 var o = this.options
17401 return $e.attr('data-content')
17402 || (typeof o.content == 'function' ?
17403 o.content.call($e[
0]) :
17407 Popover.prototype.arrow = function () {
17408 return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
17411 Popover.prototype.tip = function () {
17412 if (!this.$tip) this.$tip = $(this.options.template)
17417 // POPOVER PLUGIN DEFINITION
17418 // =========================
17420 function Plugin(option) {
17421 return this.each(function () {
17422 var $this = $(this)
17423 var data = $this.data('bs.popover')
17424 var options = typeof option == 'object' && option
17426 if (!data && option == 'destroy') return
17427 if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
17428 if (typeof option == 'string') data[option]()
17432 var old = $.fn.popover
17434 $.fn.popover = Plugin
17435 $.fn.popover.Constructor = Popover
17438 // POPOVER NO CONFLICT
17439 // ===================
17441 $.fn.popover.noConflict = function () {
17448 /* ========================================================================
17449 * Bootstrap: scrollspy.js v3.2
.0
17450 * http://getbootstrap.com/javascript/#scrollspy
17451 * ========================================================================
17452 * Copyright
2011-
2014 Twitter, Inc.
17453 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17454 * ======================================================================== */
17460 // SCROLLSPY CLASS DEFINITION
17461 // ==========================
17463 function ScrollSpy(element, options) {
17464 var process = $.proxy(this.process, this)
17466 this.$body = $('body')
17467 this.$scrollElement = $(element).is('body') ? $(window) : $(element)
17468 this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
17469 this.selector = (this.options.target || '') + ' .nav li
> a'
17472 this.activeTarget = null
17473 this.scrollHeight =
0
17475 this.$scrollElement.on('scroll.bs.scrollspy', process)
17480 ScrollSpy.VERSION = '
3.2.0'
17482 ScrollSpy.DEFAULTS = {
17486 ScrollSpy.prototype.getScrollHeight = function () {
17487 return this.$scrollElement[
0].scrollHeight || Math.max(this.$body[
0].scrollHeight, document.documentElement.scrollHeight)
17490 ScrollSpy.prototype.refresh = function () {
17491 var offsetMethod = 'offset'
17494 if (!$.isWindow(this.$scrollElement[
0])) {
17495 offsetMethod = 'position'
17496 offsetBase = this.$scrollElement.scrollTop()
17501 this.scrollHeight = this.getScrollHeight()
17506 .find(this.selector)
17509 var href = $el.data('target') || $el.attr('href')
17510 var $href = /^#./.test(href) && $(href)
17514 && $href.is(':visible')
17515 && [[$href[offsetMethod]().top + offsetBase, href]]) || null
17517 .sort(function (a, b) { return a[
0] - b[
0] })
17518 .each(function () {
17519 self.offsets.push(this[
0])
17520 self.targets.push(this[
1])
17524 ScrollSpy.prototype.process = function () {
17525 var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
17526 var scrollHeight = this.getScrollHeight()
17527 var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
17528 var offsets = this.offsets
17529 var targets = this.targets
17530 var activeTarget = this.activeTarget
17533 if (this.scrollHeight != scrollHeight) {
17537 if (scrollTop
>= maxScroll) {
17538 return activeTarget != (i = targets[targets.length -
1]) && this.activate(i)
17541 if (activeTarget && scrollTop <= offsets[
0]) {
17542 return activeTarget != (i = targets[
0]) && this.activate(i)
17545 for (i = offsets.length; i--;) {
17546 activeTarget != targets[i]
17547 && scrollTop
>= offsets[i]
17548 && (!offsets[i +
1] || scrollTop <= offsets[i +
1])
17549 && this.activate(targets[i])
17553 ScrollSpy.prototype.activate = function (target) {
17554 this.activeTarget = target
17557 .parentsUntil(this.options.target, '.active')
17558 .removeClass('active')
17560 var selector = this.selector +
17561 '[
data-target="' + target + '"],' +
17562 this.selector + '[
href="' + target + '"]'
17564 var active = $(selector)
17566 .addClass('active')
17568 if (active.parent('.dropdown-menu').length) {
17570 .closest('li.dropdown')
17571 .addClass('active')
17574 active.trigger('activate.bs.scrollspy')
17578 // SCROLLSPY PLUGIN DEFINITION
17579 // ===========================
17581 function Plugin(option) {
17582 return this.each(function () {
17583 var $this = $(this)
17584 var data = $this.data('bs.scrollspy')
17585 var options = typeof option == 'object' && option
17587 if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
17588 if (typeof option == 'string') data[option]()
17592 var old = $.fn.scrollspy
17594 $.fn.scrollspy = Plugin
17595 $.fn.scrollspy.Constructor = ScrollSpy
17598 // SCROLLSPY NO CONFLICT
17599 // =====================
17601 $.fn.scrollspy.noConflict = function () {
17602 $.fn.scrollspy = old
17607 // SCROLLSPY DATA-API
17608 // ==================
17610 $(window).on('load.bs.scrollspy.data-api', function () {
17611 $('[
data-spy="scroll"]').each(function () {
17613 Plugin.call($spy, $spy.data())
17619 /* ========================================================================
17620 * Bootstrap: tab.js v3.2
.0
17621 * http://getbootstrap.com/javascript/#tabs
17622 * ========================================================================
17623 * Copyright
2011-
2014 Twitter, Inc.
17624 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17625 * ======================================================================== */
17631 // TAB CLASS DEFINITION
17632 // ====================
17634 var Tab = function (element) {
17635 this.element = $(element)
17638 Tab.VERSION = '
3.2.0'
17640 Tab.prototype.show = function () {
17641 var $this = this.element
17642 var $ul = $this.closest('ul:not(.dropdown-menu)')
17643 var selector = $this.data('target')
17646 selector = $this.attr('href')
17647 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
17650 if ($this.parent('li').hasClass('active')) return
17652 var previous = $ul.find('.active:last a')[
0]
17653 var e = $.Event('show.bs.tab', {
17654 relatedTarget: previous
17659 if (e.isDefaultPrevented()) return
17661 var $target = $(selector)
17663 this.activate($this.closest('li'), $ul)
17664 this.activate($target, $target.parent(), function () {
17666 type: 'shown.bs.tab',
17667 relatedTarget: previous
17672 Tab.prototype.activate = function (element, container, callback) {
17673 var $active = container.find('
> .active')
17674 var transition = callback
17675 && $.support.transition
17676 && $active.hasClass('fade')
17680 .removeClass('active')
17681 .find('
> .dropdown-menu
> .active')
17682 .removeClass('active')
17684 element.addClass('active')
17687 element[
0].offsetWidth // reflow for transition
17688 element.addClass('in')
17690 element.removeClass('fade')
17693 if (element.parent('.dropdown-menu')) {
17694 element.closest('li.dropdown').addClass('active')
17697 callback && callback()
17702 .one('bsTransitionEnd', next)
17703 .emulateTransitionEnd(
150) :
17706 $active.removeClass('in')
17710 // TAB PLUGIN DEFINITION
17711 // =====================
17713 function Plugin(option) {
17714 return this.each(function () {
17715 var $this = $(this)
17716 var data = $this.data('bs.tab')
17718 if (!data) $this.data('bs.tab', (data = new Tab(this)))
17719 if (typeof option == 'string') data[option]()
17726 $.fn.tab.Constructor = Tab
17732 $.fn.tab.noConflict = function () {
17741 $(document).on('click.bs.tab.data-api', '[
data-toggle="tab"], [
data-toggle="pill"]', function (e) {
17743 Plugin.call($(this), 'show')
17748 /* ========================================================================
17749 * Bootstrap: affix.js v3.2
.0
17750 * http://getbootstrap.com/javascript/#affix
17751 * ========================================================================
17752 * Copyright
2011-
2014 Twitter, Inc.
17753 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17754 * ======================================================================== */
17760 // AFFIX CLASS DEFINITION
17761 // ======================
17763 var Affix = function (element, options) {
17764 this.options = $.extend({}, Affix.DEFAULTS, options)
17766 this.$target = $(this.options.target)
17767 .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
17768 .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
17770 this.$element = $(element)
17773 this.pinnedOffset = null
17775 this.checkPosition()
17778 Affix.VERSION = '
3.2.0'
17780 Affix.RESET = 'affix affix-top affix-bottom'
17787 Affix.prototype.getPinnedOffset = function () {
17788 if (this.pinnedOffset) return this.pinnedOffset
17789 this.$element.removeClass(Affix.RESET).addClass('affix')
17790 var scrollTop = this.$target.scrollTop()
17791 var position = this.$element.offset()
17792 return (this.pinnedOffset = position.top - scrollTop)
17795 Affix.prototype.checkPositionWithEventLoop = function () {
17796 setTimeout($.proxy(this.checkPosition, this),
1)
17799 Affix.prototype.checkPosition = function () {
17800 if (!this.$element.is(':visible')) return
17802 var scrollHeight = $(document).height()
17803 var scrollTop = this.$target.scrollTop()
17804 var position = this.$element.offset()
17805 var offset = this.options.offset
17806 var offsetTop = offset.top
17807 var offsetBottom = offset.bottom
17809 if (typeof offset != 'object') offsetBottom = offsetTop = offset
17810 if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
17811 if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
17813 var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
17814 offsetBottom != null && (position.top + this.$element.height()
>= scrollHeight - offsetBottom) ? 'bottom' :
17815 offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
17817 if (this.affixed === affix) return
17818 if (this.unpin != null) this.$element.css('top', '')
17820 var affixType = 'affix' + (affix ? '-' + affix : '')
17821 var e = $.Event(affixType + '.bs.affix')
17823 this.$element.trigger(e)
17825 if (e.isDefaultPrevented()) return
17827 this.affixed = affix
17828 this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
17831 .removeClass(Affix.RESET)
17832 .addClass(affixType)
17833 .trigger($.Event(affixType.replace('affix', 'affixed')))
17835 if (affix == 'bottom') {
17836 this.$element.offset({
17837 top: scrollHeight - this.$element.height() - offsetBottom
17843 // AFFIX PLUGIN DEFINITION
17844 // =======================
17846 function Plugin(option) {
17847 return this.each(function () {
17848 var $this = $(this)
17849 var data = $this.data('bs.affix')
17850 var options = typeof option == 'object' && option
17852 if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
17853 if (typeof option == 'string') data[option]()
17857 var old = $.fn.affix
17859 $.fn.affix = Plugin
17860 $.fn.affix.Constructor = Affix
17863 // AFFIX NO CONFLICT
17864 // =================
17866 $.fn.affix.noConflict = function () {
17875 $(window).on('load', function () {
17876 $('[
data-spy="affix"]').each(function () {
17878 var data = $spy.data()
17880 data.offset = data.offset || {}
17882 if (data.offsetBottom) data.offset.bottom = data.offsetBottom
17883 if (data.offsetTop) data.offset.top = data.offsetTop
17885 Plugin.call($spy, data)
17892 (function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Bitcoin=e()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&
&require;if(!u&&a)return a(o,!
0);if(i)return i(o,!
0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][
0].call(f.exports,function(e){var n=t[o][
1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&
&require;for(var o=
0;o
<r.length;o++)s(r[o]);return s})({
1:[function(_dereq_,module,exports){
17893 var assert = _dereq_('assert')
17895 module.exports = BigInteger
17897 // JavaScript engine analysis
17898 var canary =
0xdeadbeefcafe;
17899 var j_lm = ((canary&
0xffffff)==
0xefcafe);
17901 // (public) Constructor
17902 function BigInteger(a,b,c) {
17903 if (!(this instanceof BigInteger)) {
17904 return new BigInteger(a, b, c);
17908 if(
"number" == typeof a) this.fromNumber(a,b,c);
17909 else if(b == null &&
"string" != typeof a) this.fromString(a,
256);
17910 else this.fromString(a,b);
17914 var proto = BigInteger.prototype;
17916 // return new, unset BigInteger
17917 function nbi() { return new BigInteger(null); }
17922 // am: Compute w_j += (x*this_i), propagate carries,
17923 // c is initial carry, returns final carry.
17924 // c <
3*dvalue, x <
2*dvalue, this_i < dvalue
17925 // We need to select the fastest one that works in this environment.
17927 // am1: use a single mult and divide to get the high bits,
17928 // max digit bits should be
26 because
17929 // max internal value =
2*dvalue^
2-
2*dvalue (<
2^
53)
17930 function am1(i,x,w,j,c,n) {
17932 var v = x*this[i++]+w[j]+c;
17933 c = Math.floor(v/
0x4000000);
17934 w[j++] = v
&0x3ffffff;
17938 // am2 avoids a big mult-and-extract completely.
17939 // Max digit bits should be <=
30 because we do bitwise ops
17940 // on values up to
2*hdvalue^
2-hdvalue-
1 (<
2^
31)
17941 function am2(i,x,w,j,c,n) {
17942 var xl = x&
0x7fff, xh = x
>>15;
17944 var l = this[i]
&0x7fff;
17945 var h = this[i++]
>>15;
17947 l = xl*l+((m&
0x7fff)<
<15)+w[j]+(c&
0x3fffffff);
17948 c = (l
>>>30)+(m
>>>15)+xh*h+(c
>>>30);
17949 w[j++] = l
&0x3fffffff;
17953 // Alternately, set max digit bits to
28 since some
17954 // browsers slow down when dealing with
32-bit numbers.
17955 function am3(i,x,w,j,c,n) {
17956 var xl = x&
0x3fff, xh = x
>>14;
17958 var l = this[i]
&0x3fff;
17959 var h = this[i++]
>>14;
17961 l = xl*l+((m&
0x3fff)<
<14)+w[j]+c;
17962 c = (l
>>28)+(m
>>14)+xh*h;
17963 w[j++] = l
&0xfffffff;
17969 BigInteger.prototype.am = am1;
17973 if(j_lm && (navigator.appName ==
"Microsoft Internet Explorer")) {
17974 BigInteger.prototype.am = am2;
17977 else if(j_lm && (navigator.appName !=
"Netscape")) {
17978 BigInteger.prototype.am = am1;
17981 else { // Mozilla/Netscape seems to prefer am3
17982 BigInteger.prototype.am = am3;
17987 BigInteger.prototype.DB = dbits;
17988 BigInteger.prototype.DM = ((
1<
<dbits)-
1);
17989 var DV = BigInteger.prototype.DV = (
1<
<dbits);
17992 BigInteger.prototype.FV = Math.pow(
2,BI_FP);
17993 BigInteger.prototype.F1 = BI_FP-dbits;
17994 BigInteger.prototype.F2 =
2*dbits-BI_FP;
17996 // Digit conversions
17997 var BI_RM =
"0123456789abcdefghijklmnopqrstuvwxyz";
17998 var BI_RC = new Array();
18000 rr =
"0".charCodeAt(
0);
18001 for(vv =
0; vv <=
9; ++vv) BI_RC[rr++] = vv;
18002 rr =
"a".charCodeAt(
0);
18003 for(vv =
10; vv <
36; ++vv) BI_RC[rr++] = vv;
18004 rr =
"A".charCodeAt(
0);
18005 for(vv =
10; vv <
36; ++vv) BI_RC[rr++] = vv;
18007 function int2char(n) { return BI_RM.charAt(n); }
18008 function intAt(s,i) {
18009 var c = BI_RC[s.charCodeAt(i)];
18010 return (c==null)?-
1:c;
18013 // (protected) copy this to r
18014 function bnpCopyTo(r) {
18015 for(var i = this.t-
1; i
>=
0; --i) r[i] = this[i];
18020 // (protected) set from integer value x, -DV <= x < DV
18021 function bnpFromInt(x) {
18023 this.s = (x
<0)?-
1:
0;
18024 if(x
> 0) this[
0] = x;
18025 else if(x < -
1) this[
0] = x+DV;
18029 // return bigint initialized to value
18030 function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
18032 // (protected) set from string and radix
18033 function bnpFromString(s,b) {
18038 else if(b ==
8) k =
3;
18039 else if(b ==
256) k =
8; // byte array
18040 else if(b ==
2) k =
1;
18041 else if(b ==
32) k =
5;
18042 else if(b ==
4) k =
2;
18043 else { self.fromRadix(s,b); return; }
18046 var i = s.length, mi = false, sh =
0;
18048 var x = (k==
8)?s[i]&
0xff:intAt(s,i);
18050 if(s.charAt(i) == "-") mi = true;
18055 self[self.t++] = x;
18056 else if(sh+k
> self.DB) {
18057 self[self.t-
1] |= (x&((
1<<(self.DB-sh))-
1))<
<sh;
18058 self[self.t++] = (x
>>(self.DB-sh));
18061 self[self.t-
1] |= x<
<sh;
18063 if(sh
>= self.DB) sh -= self.DB;
18065 if(k ==
8 && (s[
0]&
0x80) !=
0) {
18067 if(sh
> 0) self[self.t-
1] |= ((
1<<(self.DB-sh))-
1)<
<sh;
18070 if(mi) BigInteger.ZERO.subTo(self,self);
18073 // (protected) clamp off excess high words
18074 function bnpClamp() {
18075 var c = this.s&this.DM;
18076 while(this.t
> 0 && this[this.t-
1] == c) --this.t;
18079 // (public) return string representation in given radix
18080 function bnToString(b) {
18082 if(self.s <
0) return
"-"+self.negate().toString(b);
18085 else if(b ==
8) k =
3;
18086 else if(b ==
2) k =
1;
18087 else if(b ==
32) k =
5;
18088 else if(b ==
4) k =
2;
18089 else return self.toRadix(b);
18090 var km = (
1<
<k)-
1, d, m = false, r =
"", i = self.t;
18091 var p = self.DB-(i*self.DB)%k;
18093 if(p < self.DB && (d = self[i]
>>p)
> 0) { m = true; r = int2char(d); }
18096 d = (self[i]&((
1<
<p)-
1))<<(k-p);
18097 d |= self[--i]
>>(p+=self.DB-k);
18100 d = (self[i]
>>(p-=k))
&km;
18101 if(p <=
0) { p += self.DB; --i; }
18103 if(d
> 0) m = true;
18104 if(m) r += int2char(d);
18111 function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
18114 function bnAbs() { return (this.s
<0)?this.negate():this; }
18116 // (public) return + if this
> a, - if this < a,
0 if equal
18117 function bnCompareTo(a) {
18118 var r = this.s-a.s;
18119 if(r !=
0) return r;
18122 if(r !=
0) return (this.s
<0)?-r:r;
18123 while(--i
>=
0) if((r=this[i]-a[i]) !=
0) return r;
18127 // returns bit length of the integer x
18128 function nbits(x) {
18130 if((t=x
>>>16) !=
0) { x = t; r +=
16; }
18131 if((t=x
>>8) !=
0) { x = t; r +=
8; }
18132 if((t=x
>>4) !=
0) { x = t; r +=
4; }
18133 if((t=x
>>2) !=
0) { x = t; r +=
2; }
18134 if((t=x
>>1) !=
0) { x = t; r +=
1; }
18138 // (public) return the number of bits in
"this"
18139 function bnBitLength() {
18140 if(this.t <=
0) return
0;
18141 return this.DB*(this.t-
1)+nbits(this[this.t-
1]^(this.s&this.DM));
18144 // (protected) r = this << n*DB
18145 function bnpDLShiftTo(n,r) {
18147 for(i = this.t-
1; i
>=
0; --i) r[i+n] = this[i];
18148 for(i = n-
1; i
>=
0; --i) r[i] =
0;
18153 // (protected) r = this
>> n*DB
18154 function bnpDRShiftTo(n,r) {
18155 for(var i = n; i < this.t; ++i) r[i-n] = this[i];
18156 r.t = Math.max(this.t-n,
0);
18160 // (protected) r = this << n
18161 function bnpLShiftTo(n,r) {
18163 var bs = n%self.DB;
18164 var cbs = self.DB-bs;
18165 var bm = (
1<
<cbs)-
1;
18166 var ds = Math.floor(n/self.DB), c = (self.s<
<bs)&self.DM, i;
18167 for(i = self.t-
1; i
>=
0; --i) {
18168 r[i+ds+
1] = (self[i]
>>cbs)|c;
18169 c = (self[i]&bm)<
<bs;
18171 for(i = ds-
1; i
>=
0; --i) r[i] =
0;
18178 // (protected) r = this
>> n
18179 function bnpRShiftTo(n,r) {
18182 var ds = Math.floor(n/self.DB);
18183 if(ds
>= self.t) { r.t =
0; return; }
18184 var bs = n%self.DB;
18185 var cbs = self.DB-bs;
18186 var bm = (
1<
<bs)-
1;
18187 r[
0] = self[ds]
>>bs;
18188 for(var i = ds+
1; i < self.t; ++i) {
18189 r[i-ds-
1] |= (self[i]&bm)<
<cbs;
18190 r[i-ds] = self[i]
>>bs;
18192 if(bs
> 0) r[self.t-ds-
1] |= (self.s&bm)<
<cbs;
18197 // (protected) r = this - a
18198 function bnpSubTo(a,r) {
18200 var i =
0, c =
0, m = Math.min(a.t,self.t);
18203 r[i++] = c&self.DM;
18208 while(i < self.t) {
18210 r[i++] = c&self.DM;
18219 r[i++] = c&self.DM;
18225 if(c < -
1) r[i++] = self.DV+c;
18226 else if(c
> 0) r[i++] = c;
18231 // (protected) r = this * a, r != this,a (HAC
14.12)
18232 //
"this" should be the larger one if appropriate.
18233 function bnpMultiplyTo(a,r) {
18234 var x = this.abs(), y = a.abs();
18237 while(--i
>=
0) r[i] =
0;
18238 for(i =
0; i < y.t; ++i) r[i+x.t] = x.am(
0,y[i],r,i,
0,x.t);
18241 if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
18244 // (protected) r = this^
2, r != this (HAC
14.16)
18245 function bnpSquareTo(r) {
18246 var x = this.abs();
18247 var i = r.t =
2*x.t;
18248 while(--i
>=
0) r[i] =
0;
18249 for(i =
0; i < x.t-
1; ++i) {
18250 var c = x.am(i,x[i],r,
2*i,
0,
1);
18251 if((r[i+x.t]+=x.am(i+
1,
2*x[i],r,
2*i+
1,c,x.t-i-
1))
>= x.DV) {
18256 if(r.t
> 0) r[r.t-
1] += x.am(i,x[i],r,
2*i,
0,
1);
18261 // (protected) divide this by m, quotient and remainder to q, r (HAC
14.20)
18262 // r != q, this != m. q or r may be null.
18263 function bnpDivRemTo(m,q,r) {
18266 if(pm.t <=
0) return;
18267 var pt = self.abs();
18269 if(q != null) q.fromInt(
0);
18270 if(r != null) self.copyTo(r);
18273 if(r == null) r = nbi();
18274 var y = nbi(), ts = self.s, ms = m.s;
18275 var nsh = self.DB-nbits(pm[pm.t-
1]); // normalize modulus
18276 if(nsh
> 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
18277 else { pm.copyTo(y); pt.copyTo(r); }
18280 if(y0 ==
0) return;
18281 var yt = y0*(
1<
<self.F1)+((ys
>1)?y[ys-
2]
>>self.F2:
0);
18282 var d1 = self.FV/yt, d2 = (
1<
<self.F1)/yt, e =
1<
<self.F2;
18283 var i = r.t, j = i-ys, t = (q==null)?nbi():q;
18285 if(r.compareTo(t)
>=
0) {
18289 BigInteger.ONE.dlShiftTo(ys,t);
18290 t.subTo(y,y); // "negative" y so we can replace sub with am later
18291 while(y.t < ys) y[y.t++] =
0;
18293 // Estimate quotient digit
18294 var qd = (r[--i]==y0)?self.DM:Math.floor(r[i]*d1+(r[i-
1]+e)*d2);
18295 if((r[i]+=y.am(
0,qd,r,j,
0,ys)) < qd) { // Try it out
18298 while(r[i] < --qd) r.subTo(t,r);
18303 if(ts != ms) BigInteger.ZERO.subTo(q,q);
18307 if(nsh
> 0) r.rShiftTo(nsh,r); // Denormalize remainder
18308 if(ts <
0) BigInteger.ZERO.subTo(r,r);
18311 // (public) this mod a
18312 function bnMod(a) {
18314 this.abs().divRemTo(a,null,r);
18315 if(this.s <
0 && r.compareTo(BigInteger.ZERO)
> 0) a.subTo(r,r);
18319 // Modular reduction using
"classic" algorithm
18320 function Classic(m) { this.m = m; }
18321 function cConvert(x) {
18322 if(x.s <
0 || x.compareTo(this.m)
>=
0) return x.mod(this.m);
18325 function cRevert(x) { return x; }
18326 function cReduce(x) { x.divRemTo(this.m,null,x); }
18327 function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
18328 function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
18330 Classic.prototype.convert = cConvert;
18331 Classic.prototype.revert = cRevert;
18332 Classic.prototype.reduce = cReduce;
18333 Classic.prototype.mulTo = cMulTo;
18334 Classic.prototype.sqrTo = cSqrTo;
18336 // (protected) return "-
1/this %
2^DB"; useful for Mont. reduction
18340 // xy(
2-xy) = (
1+km)(
1-km)
18341 // x[y(
2-xy)] =
1-k^
2m^
2
18342 // x[y(
2-xy)] ==
1 (mod m^
2)
18343 // if y is
1/x mod m, then y(
2-xy) is
1/x mod m^
2
18344 // should reduce x and y(
2-xy) by m^
2 at each step to keep size bounded.
18345 // JS multiply "overflows" differently from C/C++, so care is needed here.
18346 function bnpInvDigit() {
18347 if(this.t <
1) return
0;
18349 if((x&
1) ==
0) return
0;
18350 var y = x
&3; // y ==
1/x mod
2^
2
18351 y = (y*(
2-(x&
0xf)*y))
&0xf; // y ==
1/x mod
2^
4
18352 y = (y*(
2-(x&
0xff)*y))
&0xff; // y ==
1/x mod
2^
8
18353 y = (y*(
2-(((x&
0xffff)*y)&
0xffff)))
&0xffff; // y ==
1/x mod
2^
16
18354 // last step - calculate inverse mod DV directly;
18355 // assumes
16 < DB <=
32 and assumes ability to handle
48-bit ints
18356 y = (y*(
2-x*y%this.DV))%this.DV; // y ==
1/x mod
2^dbits
18357 // we really want the negative inverse, and -DV < y < DV
18358 return (y
>0)?this.DV-y:-y;
18361 // Montgomery reduction
18362 function Montgomery(m) {
18364 this.mp = m.invDigit();
18365 this.mpl = this.mp
&0x7fff;
18366 this.mph = this.mp
>>15;
18367 this.um = (
1<<(m.DB-
15))-
1;
18372 function montConvert(x) {
18374 x.abs().dlShiftTo(this.m.t,r);
18375 r.divRemTo(this.m,null,r);
18376 if(x.s <
0 && r.compareTo(BigInteger.ZERO)
> 0) this.m.subTo(r,r);
18381 function montRevert(x) {
18388 // x = x/R mod m (HAC
14.32)
18389 function montReduce(x) {
18390 while(x.t <= this.mt2) // pad x so am has enough room later
18392 for(var i =
0; i < this.m.t; ++i) {
18393 // faster way of calculating u0 = x[i]*mp mod DV
18394 var j = x[i]
&0x7fff;
18395 var u0 = (j*this.mpl+(((j*this.mph+(x[i]
>>15)*this.mpl)&this.um)<
<15))&x.DM;
18396 // use am to combine the multiply-shift-add into one call
18398 x[j] += this.m.am(
0,u0,x,i,
0,this.m.t);
18400 while(x[j]
>= x.DV) { x[j] -= x.DV; x[++j]++; }
18403 x.drShiftTo(this.m.t,x);
18404 if(x.compareTo(this.m)
>=
0) x.subTo(this.m,x);
18407 // r = "x^
2/R mod m"; x != r
18408 function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
18410 // r = "xy/R mod m"; x,y != r
18411 function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
18413 Montgomery.prototype.convert = montConvert;
18414 Montgomery.prototype.revert = montRevert;
18415 Montgomery.prototype.reduce = montReduce;
18416 Montgomery.prototype.mulTo = montMulTo;
18417 Montgomery.prototype.sqrTo = montSqrTo;
18419 // (protected) true iff this is even
18420 function bnpIsEven() { return ((this.t
>0)?(this[
0]&
1):this.s) ==
0; }
18422 // (protected) this^e, e <
2^
32, doing sqr and mul with
"r" (HAC
14.79)
18423 function bnpExp(e,z) {
18424 if(e
> 0xffffffff || e <
1) return BigInteger.ONE;
18425 var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-
1;
18429 if((e&(
1<
<i))
> 0) z.mulTo(r2,g,r);
18430 else { var t = r; r = r2; r2 = t; }
18432 return z.revert(r);
18435 // (public) this^e % m,
0 <= e <
2^
32
18436 function bnModPowInt(e,m) {
18438 if(e <
256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
18439 return this.exp(e,z);
18443 proto.copyTo = bnpCopyTo;
18444 proto.fromInt = bnpFromInt;
18445 proto.fromString = bnpFromString;
18446 proto.clamp = bnpClamp;
18447 proto.dlShiftTo = bnpDLShiftTo;
18448 proto.drShiftTo = bnpDRShiftTo;
18449 proto.lShiftTo = bnpLShiftTo;
18450 proto.rShiftTo = bnpRShiftTo;
18451 proto.subTo = bnpSubTo;
18452 proto.multiplyTo = bnpMultiplyTo;
18453 proto.squareTo = bnpSquareTo;
18454 proto.divRemTo = bnpDivRemTo;
18455 proto.invDigit = bnpInvDigit;
18456 proto.isEven = bnpIsEven;
18457 proto.exp = bnpExp;
18460 proto.toString = bnToString;
18461 proto.negate = bnNegate;
18463 proto.compareTo = bnCompareTo;
18464 proto.bitLength = bnBitLength;
18466 proto.modPowInt = bnModPowInt;
18470 function nbi() { return new BigInteger(null); }
18473 function bnClone() { var r = nbi(); this.copyTo(r); return r; }
18475 // (public) return value as integer
18476 function bnIntValue() {
18478 if(this.t ==
1) return this[
0]-this.DV;
18479 else if(this.t ==
0) return -
1;
18481 else if(this.t ==
1) return this[
0];
18482 else if(this.t ==
0) return
0;
18483 // assumes
16 < DB <
32
18484 return ((this[
1]&((
1<<(
32-this.DB))-
1))<
<this.DB)|this[
0];
18487 // (public) return value as byte
18488 function bnByteValue() { return (this.t==
0)?this.s:(this[
0]<
<24)
>>24; }
18490 // (public) return value as short (assumes DB
>=
16)
18491 function bnShortValue() { return (this.t==
0)?this.s:(this[
0]<
<16)
>>16; }
18493 // (protected) return x s.t. r^x < DV
18494 function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }
18496 // (public)
0 if this ==
0,
1 if this
> 0
18497 function bnSigNum() {
18498 if(this.s <
0) return -
1;
18499 else if(this.t <=
0 || (this.t ==
1 && this[
0] <=
0)) return
0;
18503 // (protected) convert to radix string
18504 function bnpToRadix(b) {
18505 if(b == null) b =
10;
18506 if(this.signum() ==
0 || b <
2 || b
> 36) return
"0";
18507 var cs = this.chunkSize(b);
18508 var a = Math.pow(b,cs);
18509 var d = nbv(a), y = nbi(), z = nbi(), r =
"";
18510 this.divRemTo(d,y,z);
18511 while(y.signum()
> 0) {
18512 r = (a+z.intValue()).toString(b).substr(
1) + r;
18515 return z.intValue().toString(b) + r;
18518 // (protected) convert from radix string
18519 function bnpFromRadix(s,b) {
18522 if(b == null) b =
10;
18523 var cs = self.chunkSize(b);
18524 var d = Math.pow(b,cs), mi = false, j =
0, w =
0;
18525 for(var i =
0; i < s.length; ++i) {
18526 var x = intAt(s,i);
18528 if(s.charAt(i) ==
"-" && self.signum() ==
0) mi = true;
18534 self.dAddOffset(w,
0);
18540 self.dMultiply(Math.pow(b,j));
18541 self.dAddOffset(w,
0);
18543 if(mi) BigInteger.ZERO.subTo(self,self);
18546 // (protected) alternate constructor
18547 function bnpFromNumber(a,b,c) {
18549 if(
"number" == typeof b) {
18550 // new BigInteger(int,int,RNG)
18551 if(a <
2) self.fromInt(
1);
18553 self.fromNumber(a,c);
18554 if(!self.testBit(a-
1)) // force MSB set
18555 self.bitwiseTo(BigInteger.ONE.shiftLeft(a-
1),op_or,self);
18556 if(self.isEven()) self.dAddOffset(
1,
0); // force odd
18557 while(!self.isProbablePrime(b)) {
18558 self.dAddOffset(
2,
0);
18559 if(self.bitLength()
> a) self.subTo(BigInteger.ONE.shiftLeft(a-
1),self);
18564 // new BigInteger(int,RNG)
18565 var x = new Array(), t = a
&7;
18566 x.length = (a
>>3)+
1;
18568 if(t
> 0) x[
0] &= ((
1<
<t)-
1); else x[
0] =
0;
18569 self.fromString(x,
256);
18573 // (public) convert to bigendian byte array
18574 function bnToByteArray() {
18576 var i = self.t, r = new Array();
18578 var p = self.DB-(i*self.DB)%
8, d, k =
0;
18580 if(p < self.DB && (d = self[i]
>>p) != (self.s&self.DM)
>>p)
18581 r[k++] = d|(self.s<<(self.DB-p));
18584 d = (self[i]&((
1<
<p)-
1))<<(
8-p);
18585 d |= self[--i]
>>(p+=self.DB-
8);
18588 d = (self[i]
>>(p-=
8))
&0xff;
18589 if(p <=
0) { p += self.DB; --i; }
18591 if((d&
0x80) !=
0) d |= -
256;
18592 if(k ===
0 && (self.s&
0x80) != (d&
0x80)) ++k;
18593 if(k
> 0 || d != self.s) r[k++] = d;
18599 function bnEquals(a) { return(this.compareTo(a)==
0); }
18600 function bnMin(a) { return(this.compareTo(a)
<0)?this:a; }
18601 function bnMax(a) { return(this.compareTo(a)
>0)?this:a; }
18603 // (protected) r = this op a (bitwise)
18604 function bnpBitwiseTo(a,op,r) {
18606 var i, f, m = Math.min(a.t,self.t);
18607 for(i =
0; i < m; ++i) r[i] = op(self[i],a[i]);
18610 for(i = m; i < self.t; ++i) r[i] = op(self[i],f);
18614 f = self.s&self.DM;
18615 for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);
18618 r.s = op(self.s,a.s);
18622 // (public) this & a
18623 function op_and(x,y) { return x
&y; }
18624 function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
18626 // (public) this | a
18627 function op_or(x,y) { return x|y; }
18628 function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
18630 // (public) this ^ a
18631 function op_xor(x,y) { return x^y; }
18632 function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
18634 // (public) this & ~a
18635 function op_andnot(x,y) { return x&~y; }
18636 function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
18641 for(var i =
0; i < this.t; ++i) r[i] = this.DM&~this[i];
18647 // (public) this << n
18648 function bnShiftLeft(n) {
18650 if(n <
0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
18654 // (public) this
>> n
18655 function bnShiftRight(n) {
18657 if(n <
0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
18661 // return index of lowest
1-bit in x, x <
2^
31
18663 if(x ==
0) return -
1;
18665 if((x&
0xffff) ==
0) { x
>>=
16; r +=
16; }
18666 if((x&
0xff) ==
0) { x
>>=
8; r +=
8; }
18667 if((x&
0xf) ==
0) { x
>>=
4; r +=
4; }
18668 if((x&
3) ==
0) { x
>>=
2; r +=
2; }
18669 if((x&
1) ==
0) ++r;
18673 // (public) returns index of lowest
1-bit (or -
1 if none)
18674 function bnGetLowestSetBit() {
18675 for(var i =
0; i < this.t; ++i)
18676 if(this[i] !=
0) return i*this.DB+lbit(this[i]);
18677 if(this.s <
0) return this.t*this.DB;
18681 // return number of
1 bits in x
18684 while(x !=
0) { x &= x-
1; ++r; }
18688 // (public) return number of set bits
18689 function bnBitCount() {
18690 var r =
0, x = this.s&this.DM;
18691 for(var i =
0; i < this.t; ++i) r += cbit(this[i]^x);
18695 // (public) true iff nth bit is set
18696 function bnTestBit(n) {
18697 var j = Math.floor(n/this.DB);
18698 if(j
>= this.t) return(this.s!=
0);
18699 return((this[j]&(
1<<(n%this.DB)))!=
0);
18702 // (protected) this op (
1<
<n)
18703 function bnpChangeBit(n,op) {
18704 var r = BigInteger.ONE.shiftLeft(n);
18705 this.bitwiseTo(r,op,r);
18709 // (public) this | (
1<
<n)
18710 function bnSetBit(n) { return this.changeBit(n,op_or); }
18712 // (public) this & ~(
1<
<n)
18713 function bnClearBit(n) { return this.changeBit(n,op_andnot); }
18715 // (public) this ^ (
1<
<n)
18716 function bnFlipBit(n) { return this.changeBit(n,op_xor); }
18718 // (protected) r = this + a
18719 function bnpAddTo(a,r) {
18722 var i =
0, c =
0, m = Math.min(a.t,self.t);
18725 r[i++] = c&self.DM;
18730 while(i < self.t) {
18732 r[i++] = c&self.DM;
18741 r[i++] = c&self.DM;
18747 if(c
> 0) r[i++] = c;
18748 else if(c < -
1) r[i++] = self.DV+c;
18753 // (public) this + a
18754 function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
18756 // (public) this - a
18757 function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
18759 // (public) this * a
18760 function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
18763 function bnSquare() { var r = nbi(); this.squareTo(r); return r; }
18765 // (public) this / a
18766 function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
18768 // (public) this % a
18769 function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
18771 // (public) [this/a,this%a]
18772 function bnDivideAndRemainder(a) {
18773 var q = nbi(), r = nbi();
18774 this.divRemTo(a,q,r);
18775 return new Array(q,r);
18778 // (protected) this *= n, this
>=
0,
1 < n < DV
18779 function bnpDMultiply(n) {
18780 this[this.t] = this.am(
0,n-
1,this,
0,
0,this.t);
18785 // (protected) this += n << w words, this
>=
0
18786 function bnpDAddOffset(n,w) {
18788 while(this.t <= w) this[this.t++] =
0;
18790 while(this[w]
>= this.DV) {
18791 this[w] -= this.DV;
18792 if(++w
>= this.t) this[this.t++] =
0;
18797 // A "null" reducer
18798 function NullExp() {}
18799 function nNop(x) { return x; }
18800 function nMulTo(x,y,r) { x.multiplyTo(y,r); }
18801 function nSqrTo(x,r) { x.squareTo(r); }
18803 NullExp.prototype.convert = nNop;
18804 NullExp.prototype.revert = nNop;
18805 NullExp.prototype.mulTo = nMulTo;
18806 NullExp.prototype.sqrTo = nSqrTo;
18809 function bnPow(e) { return this.exp(e,new NullExp()); }
18811 // (protected) r = lower n words of "this * a", a.t <= n
18812 // "this" should be the larger one if appropriate.
18813 function bnpMultiplyLowerTo(a,n,r) {
18814 var i = Math.min(this.t+a.t,n);
18815 r.s =
0; // assumes a,this
>=
0
18817 while(i
> 0) r[--i] =
0;
18819 for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(
0,a[i],r,i,
0,this.t);
18820 for(j = Math.min(a.t,n); i < j; ++i) this.am(
0,a[i],r,i,
0,n-i);
18824 // (protected) r =
"this * a" without lower n words, n
> 0
18825 //
"this" should be the larger one if appropriate.
18826 function bnpMultiplyUpperTo(a,n,r) {
18828 var i = r.t = this.t+a.t-n;
18829 r.s =
0; // assumes a,this
>=
0
18830 while(--i
>=
0) r[i] =
0;
18831 for(i = Math.max(n-this.t,
0); i < a.t; ++i)
18832 r[this.t+i-n] = this.am(n-i,a[i],r,
0,
0,this.t+i-n);
18837 // Barrett modular reduction
18838 function Barrett(m) {
18842 BigInteger.ONE.dlShiftTo(
2*m.t,this.r2);
18843 this.mu = this.r2.divide(m);
18847 function barrettConvert(x) {
18848 if(x.s <
0 || x.t
> 2*this.m.t) return x.mod(this.m);
18849 else if(x.compareTo(this.m) <
0) return x;
18850 else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
18853 function barrettRevert(x) { return x; }
18855 // x = x mod m (HAC
14.42)
18856 function barrettReduce(x) {
18858 x.drShiftTo(self.m.t-
1,self.r2);
18859 if(x.t
> self.m.t+
1) { x.t = self.m.t+
1; x.clamp(); }
18860 self.mu.multiplyUpperTo(self.r2,self.m.t+
1,self.q3);
18861 self.m.multiplyLowerTo(self.q3,self.m.t+
1,self.r2);
18862 while(x.compareTo(self.r2) <
0) x.dAddOffset(
1,self.m.t+
1);
18863 x.subTo(self.r2,x);
18864 while(x.compareTo(self.m)
>=
0) x.subTo(self.m,x);
18867 // r = x^
2 mod m; x != r
18868 function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
18870 // r = x*y mod m; x,y != r
18871 function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
18873 Barrett.prototype.convert = barrettConvert;
18874 Barrett.prototype.revert = barrettRevert;
18875 Barrett.prototype.reduce = barrettReduce;
18876 Barrett.prototype.mulTo = barrettMulTo;
18877 Barrett.prototype.sqrTo = barrettSqrTo;
18879 // (public) this^e % m (HAC
14.85)
18880 function bnModPow(e,m) {
18881 var i = e.bitLength(), k, r = nbv(
1), z;
18882 if(i <=
0) return r;
18883 else if(i <
18) k =
1;
18884 else if(i <
48) k =
3;
18885 else if(i <
144) k =
4;
18886 else if(i <
768) k =
5;
18889 z = new Classic(m);
18890 else if(m.isEven())
18891 z = new Barrett(m);
18893 z = new Montgomery(m);
18896 var g = new Array(), n =
3, k1 = k-
1, km = (
1<
<k)-
1;
18897 g[
1] = z.convert(this);
18903 z.mulTo(g2,g[n-
2],g[n]);
18908 var j = e.t-
1, w, is1 = true, r2 = nbi(), t;
18911 if(i
>= k1) w = (e[j]
>>(i-k1))
&km;
18913 w = (e[j]&((
1<<(i+
1))-
1))<<(k1-i);
18914 if(j
> 0) w |= e[j-
1]
>>(this.DB+i-k1);
18918 while((w&
1) ==
0) { w
>>=
1; --n; }
18919 if((i -= n) <
0) { i += this.DB; --j; }
18920 if(is1) { // ret ==
1, don't bother squaring or multiplying it
18925 while(n
> 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -=
2; }
18926 if(n
> 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
18927 z.mulTo(r2,g[w],r);
18930 while(j
>=
0 && (e[j]&(
1<
<i)) ==
0) {
18931 z.sqrTo(r,r2); t = r; r = r2; r2 = t;
18932 if(--i <
0) { i = this.DB-
1; --j; }
18935 return z.revert(r);
18938 // (public) gcd(this,a) (HAC
14.54)
18939 function bnGCD(a) {
18940 var x = (this.s
<0)?this.negate():this.clone();
18941 var y = (a.s
<0)?a.negate():a.clone();
18942 if(x.compareTo(y) <
0) { var t = x; x = y; y = t; }
18943 var i = x.getLowestSetBit(), g = y.getLowestSetBit();
18944 if(g <
0) return x;
18950 while(x.signum()
> 0) {
18951 if((i = x.getLowestSetBit())
> 0) x.rShiftTo(i,x);
18952 if((i = y.getLowestSetBit())
> 0) y.rShiftTo(i,y);
18953 if(x.compareTo(y)
>=
0) {
18962 if(g
> 0) y.lShiftTo(g,y);
18966 // (protected) this % n, n <
2^
26
18967 function bnpModInt(n) {
18968 if(n <=
0) return
0;
18969 var d = this.DV%n, r = (this.s
<0)?n-
1:
0;
18971 if(d ==
0) r = this[
0]%n;
18972 else for(var i = this.t-
1; i
>=
0; --i) r = (d*r+this[i])%n;
18976 // (public)
1/this % m (HAC
14.61)
18977 function bnModInverse(m) {
18978 var ac = m.isEven();
18979 if((this.isEven() && ac) || m.signum() ==
0) return BigInteger.ZERO;
18980 var u = m.clone(), v = this.clone();
18981 var a = nbv(
1), b = nbv(
0), c = nbv(
0), d = nbv(
1);
18982 while(u.signum() !=
0) {
18983 while(u.isEven()) {
18986 if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
18989 else if(!b.isEven()) b.subTo(m,b);
18992 while(v.isEven()) {
18995 if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
18998 else if(!d.isEven()) d.subTo(m,d);
19001 if(u.compareTo(v)
>=
0) {
19003 if(ac) a.subTo(c,a);
19008 if(ac) c.subTo(a,c);
19012 if(v.compareTo(BigInteger.ONE) !=
0) return BigInteger.ZERO;
19013 if(d.compareTo(m)
>=
0) return d.subtract(m);
19014 if(d.signum() <
0) d.addTo(m,d); else return d;
19015 if(d.signum() <
0) return d.add(m); else return d;
19019 proto.chunkSize = bnpChunkSize;
19020 proto.toRadix = bnpToRadix;
19021 proto.fromRadix = bnpFromRadix;
19022 proto.fromNumber = bnpFromNumber;
19023 proto.bitwiseTo = bnpBitwiseTo;
19024 proto.changeBit = bnpChangeBit;
19025 proto.addTo = bnpAddTo;
19026 proto.dMultiply = bnpDMultiply;
19027 proto.dAddOffset = bnpDAddOffset;
19028 proto.multiplyLowerTo = bnpMultiplyLowerTo;
19029 proto.multiplyUpperTo = bnpMultiplyUpperTo;
19030 proto.modInt = bnpModInt;
19033 proto.clone = bnClone;
19034 proto.intValue = bnIntValue;
19035 proto.byteValue = bnByteValue;
19036 proto.shortValue = bnShortValue;
19037 proto.signum = bnSigNum;
19038 proto.toByteArray = bnToByteArray;
19039 proto.equals = bnEquals;
19045 proto.andNot = bnAndNot;
19047 proto.shiftLeft = bnShiftLeft;
19048 proto.shiftRight = bnShiftRight;
19049 proto.getLowestSetBit = bnGetLowestSetBit;
19050 proto.bitCount = bnBitCount;
19051 proto.testBit = bnTestBit;
19052 proto.setBit = bnSetBit;
19053 proto.clearBit = bnClearBit;
19054 proto.flipBit = bnFlipBit;
19056 proto.subtract = bnSubtract;
19057 proto.multiply = bnMultiply;
19058 proto.divide = bnDivide;
19059 proto.remainder = bnRemainder;
19060 proto.divideAndRemainder = bnDivideAndRemainder;
19061 proto.modPow = bnModPow;
19062 proto.modInverse = bnModInverse;
19066 // JSBN-specific extension
19067 proto.square = bnSquare;
19069 // BigInteger interfaces not implemented in jsbn:
19071 // BigInteger(int signum, byte[] magnitude)
19072 // double doubleValue()
19073 // float floatValue()
19075 // long longValue()
19076 // static BigInteger valueOf(long val)
19079 BigInteger.ZERO = nbv(
0);
19080 BigInteger.ONE = nbv(
1);
19081 BigInteger.valueOf = nbv;
19083 },{"assert":
4}],
2:[function(_dereq_,module,exports){
19084 (function (Buffer){
19085 // FIXME: Kind of a weird way to throw exceptions, consider removing
19086 var assert = _dereq_('assert')
19087 var BigInteger = _dereq_('./bigi')
19090 * Turns a byte array into a big integer.
19092 * This function will interpret a byte array as a big integer in big
19095 BigInteger.fromByteArrayUnsigned = function(byteArray) {
19096 // BigInteger expects a DER integer conformant byte array
19097 if (byteArray[
0] &
0x80) {
19098 return new BigInteger([
0].concat(byteArray))
19101 return new BigInteger(byteArray)
19105 * Returns a byte array representation of the big integer.
19107 * This returns the absolute of the contained value in big endian
19108 * form. A value of zero results in an empty array.
19110 BigInteger.prototype.toByteArrayUnsigned = function() {
19111 var byteArray = this.toByteArray()
19112 return byteArray[
0] ===
0 ? byteArray.slice(
1) : byteArray
19115 BigInteger.fromDERInteger = function(byteArray) {
19116 return new BigInteger(byteArray)
19120 * Converts BigInteger to a DER integer representation.
19122 * The format for this value uses the most significant bit as a sign
19123 * bit. If the most significant bit is already set and the integer is
19124 * positive, a
0x00 is prepended.
19139 *
62300 =
> 0x00f35c
19142 BigInteger.prototype.toDERInteger = BigInteger.prototype.toByteArray
19144 BigInteger.fromBuffer = function(buffer) {
19145 // BigInteger expects a DER integer conformant byte array
19146 if (buffer[
0] &
0x80) {
19147 var byteArray = Array.prototype.slice.call(buffer)
19149 return new BigInteger([
0].concat(byteArray))
19152 return new BigInteger(buffer)
19155 BigInteger.fromHex = function(hex) {
19156 if (hex === '') return BigInteger.ZERO
19158 assert.equal(hex, hex.match(/^[A-Fa-f0-
9]+/), 'Invalid hex string')
19159 assert.equal(hex.length %
2,
0, 'Incomplete hex')
19160 return new BigInteger(hex,
16)
19163 BigInteger.prototype.toBuffer = function(size) {
19164 var byteArray = this.toByteArrayUnsigned()
19167 var padding = size - byteArray.length
19168 while (zeros.length < padding) zeros.push(
0)
19170 return new Buffer(zeros.concat(byteArray))
19173 BigInteger.prototype.toHex = function(size) {
19174 return this.toBuffer(size).toString('hex')
19177 }).call(this,_dereq_(
"buffer").Buffer)
19178 },{
"./bigi":
1,
"assert":
4,
"buffer":
8}],
3:[function(_dereq_,module,exports){
19179 var BigInteger = _dereq_('./bigi')
19182 _dereq_('./convert')
19184 module.exports = BigInteger
19185 },{
"./bigi":
1,
"./convert":
2}],
4:[function(_dereq_,module,exports){
19186 // http://wiki.commonjs.org/wiki/Unit_Testing/
1.0
19188 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
19190 // Originally from narwhal.js (http://narwhaljs.org)
19191 // Copyright (c)
2009 Thomas Robinson
<280north.com
>
19193 // Permission is hereby granted, free of charge, to any person obtaining a copy
19194 // of this software and associated documentation files (the 'Software'), to
19195 // deal in the Software without restriction, including without limitation the
19196 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
19197 // sell copies of the Software, and to permit persons to whom the Software is
19198 // furnished to do so, subject to the following conditions:
19200 // The above copyright notice and this permission notice shall be included in
19201 // all copies or substantial portions of the Software.
19203 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19204 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19205 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19206 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19207 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
19208 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19210 // when used in node, this will actually load the util module we depend on
19211 // versus loading the builtin util module as happens otherwise
19212 // this is a bug in node module loading as far as I am concerned
19213 var util = _dereq_('util/');
19215 var pSlice = Array.prototype.slice;
19216 var hasOwn = Object.prototype.hasOwnProperty;
19218 //
1. The assert module provides functions that throw
19219 // AssertionError's when particular conditions are not met. The
19220 // assert module must conform to the following interface.
19222 var assert = module.exports = ok;
19224 //
2. The AssertionError is defined in assert.
19225 // new assert.AssertionError({ message: message,
19227 // expected: expected })
19229 assert.AssertionError = function AssertionError(options) {
19230 this.name = 'AssertionError';
19231 this.actual = options.actual;
19232 this.expected = options.expected;
19233 this.operator = options.operator;
19234 if (options.message) {
19235 this.message = options.message;
19236 this.generatedMessage = false;
19238 this.message = getMessage(this);
19239 this.generatedMessage = true;
19241 var stackStartFunction = options.stackStartFunction || fail;
19243 if (Error.captureStackTrace) {
19244 Error.captureStackTrace(this, stackStartFunction);
19247 // non v8 browsers so we can have a stacktrace
19248 var err = new Error();
19250 var out = err.stack;
19252 // try to strip useless frames
19253 var fn_name = stackStartFunction.name;
19254 var idx = out.indexOf('\n' + fn_name);
19256 // once we have located the function frame
19257 // we need to strip out everything before it (and its line)
19258 var next_line = out.indexOf('\n', idx +
1);
19259 out = out.substring(next_line +
1);
19267 // assert.AssertionError instanceof Error
19268 util.inherits(assert.AssertionError, Error);
19270 function replacer(key, value) {
19271 if (util.isUndefined(value)) {
19274 if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) {
19275 return value.toString();
19277 if (util.isFunction(value) || util.isRegExp(value)) {
19278 return value.toString();
19283 function truncate(s, n) {
19284 if (util.isString(s)) {
19285 return s.length < n ? s : s.slice(
0, n);
19291 function getMessage(self) {
19292 return truncate(JSON.stringify(self.actual, replacer),
128) + ' ' +
19293 self.operator + ' ' +
19294 truncate(JSON.stringify(self.expected, replacer),
128);
19297 // At present only the three keys mentioned above are used and
19298 // understood by the spec. Implementations or sub modules can pass
19299 // other keys to the AssertionError's constructor - they will be
19302 //
3. All of the following functions must throw an AssertionError
19303 // when a corresponding condition is not met, with a message that
19304 // may be undefined if not provided. All assertion methods provide
19305 // both the actual and expected values to the assertion error for
19306 // display purposes.
19308 function fail(actual, expected, message, operator, stackStartFunction) {
19309 throw new assert.AssertionError({
19312 expected: expected,
19313 operator: operator,
19314 stackStartFunction: stackStartFunction
19318 // EXTENSION! allows for well behaved errors defined elsewhere.
19319 assert.fail = fail;
19321 //
4. Pure assertion tests whether a value is truthy, as determined
19323 // assert.ok(guard, message_opt);
19324 // This statement is equivalent to assert.equal(true, !!guard,
19325 // message_opt);. To test strictly for the value true, use
19326 // assert.strictEqual(true, guard, message_opt);.
19328 function ok(value, message) {
19329 if (!value) fail(value, true, message, '==', assert.ok);
19333 //
5. The equality assertion tests shallow, coercive equality with
19335 // assert.equal(actual, expected, message_opt);
19337 assert.equal = function equal(actual, expected, message) {
19338 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
19341 //
6. The non-equality assertion tests for whether two objects are not equal
19342 // with != assert.notEqual(actual, expected, message_opt);
19344 assert.notEqual = function notEqual(actual, expected, message) {
19345 if (actual == expected) {
19346 fail(actual, expected, message, '!=', assert.notEqual);
19350 //
7. The equivalence assertion tests a deep equality relation.
19351 // assert.deepEqual(actual, expected, message_opt);
19353 assert.deepEqual = function deepEqual(actual, expected, message) {
19354 if (!_deepEqual(actual, expected)) {
19355 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
19359 function _deepEqual(actual, expected) {
19360 //
7.1. All identical values are equivalent, as determined by ===.
19361 if (actual === expected) {
19364 } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
19365 if (actual.length != expected.length) return false;
19367 for (var i =
0; i < actual.length; i++) {
19368 if (actual[i] !== expected[i]) return false;
19373 //
7.2. If the expected value is a Date object, the actual value is
19374 // equivalent if it is also a Date object that refers to the same time.
19375 } else if (util.isDate(actual) && util.isDate(expected)) {
19376 return actual.getTime() === expected.getTime();
19378 //
7.3 If the expected value is a RegExp object, the actual value is
19379 // equivalent if it is also a RegExp object with the same source and
19380 // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
19381 } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
19382 return actual.source === expected.source &&
19383 actual.global === expected.global &&
19384 actual.multiline === expected.multiline &&
19385 actual.lastIndex === expected.lastIndex &&
19386 actual.ignoreCase === expected.ignoreCase;
19388 //
7.4. Other pairs that do not both pass typeof value == 'object',
19389 // equivalence is determined by ==.
19390 } else if (!util.isObject(actual) && !util.isObject(expected)) {
19391 return actual == expected;
19393 //
7.5 For all other Object pairs, including Array objects, equivalence is
19394 // determined by having the same number of owned properties (as verified
19395 // with Object.prototype.hasOwnProperty.call), the same set of keys
19396 // (although not necessarily the same order), equivalent values for every
19397 // corresponding key, and an identical 'prototype' property. Note: this
19398 // accounts for both named and indexed properties on Arrays.
19400 return objEquiv(actual, expected);
19404 function isArguments(object) {
19405 return Object.prototype.toString.call(object) == '[object Arguments]';
19408 function objEquiv(a, b) {
19409 if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
19411 // an identical 'prototype' property.
19412 if (a.prototype !== b.prototype) return false;
19413 //~~~I've managed to break Object.keys through screwy arguments passing.
19414 // Converting to array solves the problem.
19415 if (isArguments(a)) {
19416 if (!isArguments(b)) {
19419 a = pSlice.call(a);
19420 b = pSlice.call(b);
19421 return _deepEqual(a, b);
19424 var ka = objectKeys(a),
19425 kb = objectKeys(b),
19427 } catch (e) {//happens when one is a string literal and the other isn't
19430 // having the same number of owned properties (keys incorporates
19432 if (ka.length != kb.length)
19434 //the same set of keys (although not necessarily the same order),
19437 //~~~cheap key test
19438 for (i = ka.length -
1; i
>=
0; i--) {
19439 if (ka[i] != kb[i])
19442 //equivalent values for every corresponding key, and
19443 //~~~possibly expensive deep test
19444 for (i = ka.length -
1; i
>=
0; i--) {
19446 if (!_deepEqual(a[key], b[key])) return false;
19451 //
8. The non-equivalence assertion tests for any deep inequality.
19452 // assert.notDeepEqual(actual, expected, message_opt);
19454 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
19455 if (_deepEqual(actual, expected)) {
19456 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
19460 //
9. The strict equality assertion tests strict equality, as determined by ===.
19461 // assert.strictEqual(actual, expected, message_opt);
19463 assert.strictEqual = function strictEqual(actual, expected, message) {
19464 if (actual !== expected) {
19465 fail(actual, expected, message, '===', assert.strictEqual);
19469 //
10. The strict non-equality assertion tests for strict inequality, as
19470 // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
19472 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
19473 if (actual === expected) {
19474 fail(actual, expected, message, '!==', assert.notStrictEqual);
19478 function expectedException(actual, expected) {
19479 if (!actual || !expected) {
19483 if (Object.prototype.toString.call(expected) == '[object RegExp]') {
19484 return expected.test(actual);
19485 } else if (actual instanceof expected) {
19487 } else if (expected.call({}, actual) === true) {
19494 function _throws(shouldThrow, block, expected, message) {
19497 if (util.isString(expected)) {
19498 message = expected;
19508 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
19509 (message ? ' ' + message : '.');
19511 if (shouldThrow && !actual) {
19512 fail(actual, expected, 'Missing expected exception' + message);
19515 if (!shouldThrow && expectedException(actual, expected)) {
19516 fail(actual, expected, 'Got unwanted exception' + message);
19519 if ((shouldThrow && actual && expected &&
19520 !expectedException(actual, expected)) || (!shouldThrow && actual)) {
19525 //
11. Expected to throw an error:
19526 // assert.throws(block, Error_opt, message_opt);
19528 assert.throws = function(block, /*optional*/error, /*optional*/message) {
19529 _throws.apply(this, [true].concat(pSlice.call(arguments)));
19532 // EXTENSION! This is annoying to write outside this module.
19533 assert.doesNotThrow = function(block, /*optional*/message) {
19534 _throws.apply(this, [false].concat(pSlice.call(arguments)));
19537 assert.ifError = function(err) { if (err) {throw err;}};
19539 var objectKeys = Object.keys || function (obj) {
19541 for (var key in obj) {
19542 if (hasOwn.call(obj, key)) keys.push(key);
19547 },{"util/":
6}],
5:[function(_dereq_,module,exports){
19548 module.exports = function isBuffer(arg) {
19549 return arg && typeof arg === 'object'
19550 && typeof arg.copy === 'function'
19551 && typeof arg.fill === 'function'
19552 && typeof arg.readUInt8 === 'function';
19554 },{}],
6:[function(_dereq_,module,exports){
19555 (function (process,global){
19556 // Copyright Joyent, Inc. and other Node contributors.
19558 // Permission is hereby granted, free of charge, to any person obtaining a
19559 // copy of this software and associated documentation files (the
19560 // "Software"), to deal in the Software without restriction, including
19561 // without limitation the rights to use, copy, modify, merge, publish,
19562 // distribute, sublicense, and/or sell copies of the Software, and to permit
19563 // persons to whom the Software is furnished to do so, subject to the
19564 // following conditions:
19566 // The above copyright notice and this permission notice shall be included
19567 // in all copies or substantial portions of the Software.
19569 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19570 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19571 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
19572 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
19573 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19574 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19575 // USE OR OTHER DEALINGS IN THE SOFTWARE.
19577 var formatRegExp = /%[sdj%]/g;
19578 exports.format = function(f) {
19579 if (!isString(f)) {
19581 for (var i =
0; i < arguments.length; i++) {
19582 objects.push(inspect(arguments[i]));
19584 return objects.join(' ');
19588 var args = arguments;
19589 var len = args.length;
19590 var str = String(f).replace(formatRegExp, function(x) {
19591 if (x === '%%') return '%';
19592 if (i
>= len) return x;
19594 case '%s': return String(args[i++]);
19595 case '%d': return Number(args[i++]);
19598 return JSON.stringify(args[i++]);
19600 return '[Circular]';
19606 for (var x = args[i]; i < len; x = args[++i]) {
19607 if (isNull(x) || !isObject(x)) {
19610 str += ' ' + inspect(x);
19617 // Mark that a method should not be used.
19618 // Returns a modified function which warns once by default.
19619 // If --no-deprecation is set, then it is a no-op.
19620 exports.deprecate = function(fn, msg) {
19621 // Allow for deprecating things in the process of starting up.
19622 if (isUndefined(global.process)) {
19623 return function() {
19624 return exports.deprecate(fn, msg).apply(this, arguments);
19628 if (process.noDeprecation === true) {
19632 var warned = false;
19633 function deprecated() {
19635 if (process.throwDeprecation) {
19636 throw new Error(msg);
19637 } else if (process.traceDeprecation) {
19638 console.trace(msg);
19640 console.error(msg);
19644 return fn.apply(this, arguments);
19653 exports.debuglog = function(set) {
19654 if (isUndefined(debugEnviron))
19655 debugEnviron = process.env.NODE_DEBUG || '';
19656 set = set.toUpperCase();
19657 if (!debugs[set]) {
19658 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
19659 var pid = process.pid;
19660 debugs[set] = function() {
19661 var msg = exports.format.apply(exports, arguments);
19662 console.error('%s %d: %s', set, pid, msg);
19665 debugs[set] = function() {};
19668 return debugs[set];
19673 * Echos the value of a value. Trys to print the value out
19674 * in the best way possible given the different types.
19676 * @param {Object} obj The object to print out.
19677 * @param {Object} opts Optional options object that alters the output.
19679 /* legacy: obj, showHidden, depth, colors*/
19680 function inspect(obj, opts) {
19684 stylize: stylizeNoColor
19687 if (arguments.length
>=
3) ctx.depth = arguments[
2];
19688 if (arguments.length
>=
4) ctx.colors = arguments[
3];
19689 if (isBoolean(opts)) {
19691 ctx.showHidden = opts;
19693 // got an "options" object
19694 exports._extend(ctx, opts);
19696 // set default options
19697 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
19698 if (isUndefined(ctx.depth)) ctx.depth =
2;
19699 if (isUndefined(ctx.colors)) ctx.colors = false;
19700 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
19701 if (ctx.colors) ctx.stylize = stylizeWithColor;
19702 return formatValue(ctx, obj, ctx.depth);
19704 exports.inspect = inspect;
19707 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
19710 'italic' : [
3,
23],
19711 'underline' : [
4,
24],
19712 'inverse' : [
7,
27],
19713 'white' : [
37,
39],
19715 'black' : [
30,
39],
19718 'green' : [
32,
39],
19719 'magenta' : [
35,
39],
19721 'yellow' : [
33,
39]
19724 // Don't use 'blue' not visible on cmd.exe
19727 'number': 'yellow',
19728 'boolean': 'yellow',
19729 'undefined': 'grey',
19733 // "name": intentionally not styling
19738 function stylizeWithColor(str, styleType) {
19739 var style = inspect.styles[styleType];
19742 return '\u001b[' + inspect.colors[style][
0] + 'm' + str +
19743 '\u001b[' + inspect.colors[style][
1] + 'm';
19750 function stylizeNoColor(str, styleType) {
19755 function arrayToHash(array) {
19758 array.forEach(function(val, idx) {
19766 function formatValue(ctx, value, recurseTimes) {
19767 // Provide a hook for user-specified inspect functions.
19768 // Check that value is an object with an inspect function on it
19769 if (ctx.customInspect &&
19771 isFunction(value.inspect) &&
19772 // Filter out the util module, it's inspect function is special
19773 value.inspect !== exports.inspect &&
19774 // Also filter out any prototype objects using the circular check.
19775 !(value.constructor && value.constructor.prototype === value)) {
19776 var ret = value.inspect(recurseTimes, ctx);
19777 if (!isString(ret)) {
19778 ret = formatValue(ctx, ret, recurseTimes);
19783 // Primitive types cannot have properties
19784 var primitive = formatPrimitive(ctx, value);
19789 // Look up the keys of the object.
19790 var keys = Object.keys(value);
19791 var visibleKeys = arrayToHash(keys);
19793 if (ctx.showHidden) {
19794 keys = Object.getOwnPropertyNames(value);
19797 // IE doesn't make error fields non-enumerable
19798 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs
.94).aspx
19800 && (keys.indexOf('message')
>=
0 || keys.indexOf('description')
>=
0)) {
19801 return formatError(value);
19804 // Some type of object without properties can be shortcutted.
19805 if (keys.length ===
0) {
19806 if (isFunction(value)) {
19807 var name = value.name ? ': ' + value.name : '';
19808 return ctx.stylize('[Function' + name + ']', 'special');
19810 if (isRegExp(value)) {
19811 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
19813 if (isDate(value)) {
19814 return ctx.stylize(Date.prototype.toString.call(value), 'date');
19816 if (isError(value)) {
19817 return formatError(value);
19821 var base = '', array = false, braces = ['{', '}'];
19823 // Make Array say that they are Array
19824 if (isArray(value)) {
19826 braces = ['[', ']'];
19829 // Make functions say that they are functions
19830 if (isFunction(value)) {
19831 var n = value.name ? ': ' + value.name : '';
19832 base = ' [Function' + n + ']';
19835 // Make RegExps say that they are RegExps
19836 if (isRegExp(value)) {
19837 base = ' ' + RegExp.prototype.toString.call(value);
19840 // Make dates with properties first say the date
19841 if (isDate(value)) {
19842 base = ' ' + Date.prototype.toUTCString.call(value);
19845 // Make error with message first say the error
19846 if (isError(value)) {
19847 base = ' ' + formatError(value);
19850 if (keys.length ===
0 && (!array || value.length ==
0)) {
19851 return braces[
0] + base + braces[
1];
19854 if (recurseTimes <
0) {
19855 if (isRegExp(value)) {
19856 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
19858 return ctx.stylize('[Object]', 'special');
19862 ctx.seen.push(value);
19866 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
19868 output = keys.map(function(key) {
19869 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
19875 return reduceToSingleString(output, base, braces);
19879 function formatPrimitive(ctx, value) {
19880 if (isUndefined(value))
19881 return ctx.stylize('undefined', 'undefined');
19882 if (isString(value)) {
19883 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
19884 .replace(/'/g, "\\'")
19885 .replace(/\\"/g, '"') + '\'';
19886 return ctx.stylize(simple, 'string');
19888 if (isNumber(value))
19889 return ctx.stylize('' + value, 'number');
19890 if (isBoolean(value))
19891 return ctx.stylize('' + value, 'boolean');
19892 // For some reason typeof null is "object", so special case here.
19894 return ctx.stylize('null', 'null');
19898 function formatError(value) {
19899 return '[' + Error.prototype.toString.call(value) + ']';
19903 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
19905 for (var i =
0, l = value.length; i < l; ++i) {
19906 if (hasOwnProperty(value, String(i))) {
19907 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
19913 keys.forEach(function(key) {
19914 if (!key.match(/^\d+$/)) {
19915 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
19923 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
19924 var name, str, desc;
19925 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
19928 str = ctx.stylize('[Getter/Setter]', 'special');
19930 str = ctx.stylize('[Getter]', 'special');
19934 str = ctx.stylize('[Setter]', 'special');
19937 if (!hasOwnProperty(visibleKeys, key)) {
19938 name = '[' + key + ']';
19941 if (ctx.seen.indexOf(desc.value) <
0) {
19942 if (isNull(recurseTimes)) {
19943 str = formatValue(ctx, desc.value, null);
19945 str = formatValue(ctx, desc.value, recurseTimes -
1);
19947 if (str.indexOf('\n')
> -
1) {
19949 str = str.split('\n').map(function(line) {
19951 }).join('\n').substr(
2);
19953 str = '\n' + str.split('\n').map(function(line) {
19959 str = ctx.stylize('[Circular]', 'special');
19962 if (isUndefined(name)) {
19963 if (array && key.match(/^\d+$/)) {
19966 name = JSON.stringify('' + key);
19967 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-
9]*)"$/)) {
19968 name = name.substr(
1, name.length -
2);
19969 name = ctx.stylize(name, 'name');
19971 name = name.replace(/'/g, "\\'")
19972 .replace(/\\"/g, '"')
19973 .replace(/(^"|"$)/g, "'");
19974 name = ctx.stylize(name, 'string');
19978 return name + ': ' + str;
19982 function reduceToSingleString(output, base, braces) {
19983 var numLinesEst =
0;
19984 var length = output.reduce(function(prev, cur) {
19986 if (cur.indexOf('\n')
>=
0) numLinesEst++;
19987 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length +
1;
19992 (base === '' ? '' : base + '\n ') +
19994 output.join(',\n ') +
19999 return braces[
0] + base + ' ' + output.join(', ') + ' ' + braces[
1];
20003 // NOTE: These type checking functions intentionally don't use `instanceof`
20004 // because it is fragile and can be easily faked with `Object.create()`.
20005 function isArray(ar) {
20006 return Array.isArray(ar);
20008 exports.isArray = isArray;
20010 function isBoolean(arg) {
20011 return typeof arg === 'boolean';
20013 exports.isBoolean = isBoolean;
20015 function isNull(arg) {
20016 return arg === null;
20018 exports.isNull = isNull;
20020 function isNullOrUndefined(arg) {
20021 return arg == null;
20023 exports.isNullOrUndefined = isNullOrUndefined;
20025 function isNumber(arg) {
20026 return typeof arg === 'number';
20028 exports.isNumber = isNumber;
20030 function isString(arg) {
20031 return typeof arg === 'string';
20033 exports.isString = isString;
20035 function isSymbol(arg) {
20036 return typeof arg === 'symbol';
20038 exports.isSymbol = isSymbol;
20040 function isUndefined(arg) {
20041 return arg === void
0;
20043 exports.isUndefined = isUndefined;
20045 function isRegExp(re) {
20046 return isObject(re) && objectToString(re) === '[object RegExp]';
20048 exports.isRegExp = isRegExp;
20050 function isObject(arg) {
20051 return typeof arg === 'object' && arg !== null;
20053 exports.isObject = isObject;
20055 function isDate(d) {
20056 return isObject(d) && objectToString(d) === '[object Date]';
20058 exports.isDate = isDate;
20060 function isError(e) {
20061 return isObject(e) &&
20062 (objectToString(e) === '[object Error]' || e instanceof Error);
20064 exports.isError = isError;
20066 function isFunction(arg) {
20067 return typeof arg === 'function';
20069 exports.isFunction = isFunction;
20071 function isPrimitive(arg) {
20072 return arg === null ||
20073 typeof arg === 'boolean' ||
20074 typeof arg === 'number' ||
20075 typeof arg === 'string' ||
20076 typeof arg === 'symbol' || // ES6 symbol
20077 typeof arg === 'undefined';
20079 exports.isPrimitive = isPrimitive;
20081 exports.isBuffer = _dereq_('./support/isBuffer');
20083 function objectToString(o) {
20084 return Object.prototype.toString.call(o);
20089 return n <
10 ? '
0' + n.toString(
10) : n.toString(
10);
20093 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
20094 'Oct', 'Nov', 'Dec'];
20097 function timestamp() {
20098 var d = new Date();
20099 var time = [pad(d.getHours()),
20100 pad(d.getMinutes()),
20101 pad(d.getSeconds())].join(':');
20102 return [d.getDate(), months[d.getMonth()], time].join(' ');
20106 // log is just a thin wrapper to console.log that prepends a timestamp
20107 exports.log = function() {
20108 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
20113 * Inherit the prototype methods from one constructor into another.
20115 * The Function.prototype.inherits from lang.js rewritten as a standalone
20116 * function (not on Function.prototype). NOTE: If this file is to be loaded
20117 * during bootstrapping this function needs to be rewritten using some native
20118 * functions as prototype setup using normal JavaScript does not work as
20119 * expected during bootstrapping (see mirror.js in r114903).
20121 * @param {function} ctor Constructor function which needs to inherit the
20123 * @param {function} superCtor Constructor function to inherit prototype from.
20125 exports.inherits = _dereq_('inherits');
20127 exports._extend = function(origin, add) {
20128 // Don't do anything if add isn't an object
20129 if (!add || !isObject(add)) return origin;
20131 var keys = Object.keys(add);
20132 var i = keys.length;
20134 origin[keys[i]] = add[keys[i]];
20139 function hasOwnProperty(obj, prop) {
20140 return Object.prototype.hasOwnProperty.call(obj, prop);
20143 }).call(this,_dereq_(
"FWaASH"),typeof self !==
"undefined" ? self : typeof window !==
"undefined" ? window : {})
20144 },{
"./support/isBuffer":
5,
"FWaASH":
12,
"inherits":
11}],
7:[function(_dereq_,module,exports){
20146 },{}],
8:[function(_dereq_,module,exports){
20148 * The buffer module from node.js, for the browser.
20150 * at author Feross Aboukhadijeh
<feross@feross.org
> <http://feross.org
>
20154 var base64 = _dereq_('base64-js')
20155 var ieee754 = _dereq_('ieee754')
20157 exports.Buffer = Buffer
20158 exports.SlowBuffer = Buffer
20159 exports.INSPECT_MAX_BYTES =
50
20160 Buffer.poolSize =
8192
20163 * If `Buffer._useTypedArrays`:
20164 * === true Use Uint8Array implementation (fastest)
20165 * === false Use Object implementation (compatible down to IE6)
20167 Buffer._useTypedArrays = (function () {
20168 // Detect if browser supports Typed Arrays. Supported browsers are IE
10+, Firefox
4+,
20169 // Chrome
7+, Safari
5.1+, Opera
11.6+, iOS
4.2+. If the browser does not support adding
20170 // properties to `Uint8Array` instances, then that's the same as no `Uint8Array` support
20171 // because we need to be able to add all the node Buffer API methods. This is an issue
20172 // in Firefox
4-
29. Now fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=
695438
20174 var buf = new ArrayBuffer(
0)
20175 var arr = new Uint8Array(buf)
20176 arr.foo = function () { return
42 }
20177 return
42 === arr.foo() &&
20178 typeof arr.subarray === 'function' // Chrome
9-
10 lack `subarray`
20188 * The Buffer constructor returns instances of `Uint8Array` that are augmented
20189 * with function properties for all the node `Buffer` API functions. We use
20190 * `Uint8Array` so that square bracket notation works as expected -- it returns
20193 * By augmenting the instances, we can avoid modifying the `Uint8Array`
20196 function Buffer (subject, encoding, noZero) {
20197 if (!(this instanceof Buffer))
20198 return new Buffer(subject, encoding, noZero)
20200 var type = typeof subject
20202 if (encoding === 'base64' && type === 'string') {
20203 subject = base64clean(subject)
20208 if (type === 'number')
20209 length = coerce(subject)
20210 else if (type === 'string')
20211 length = Buffer.byteLength(subject, encoding)
20212 else if (type === 'object')
20213 length = coerce(subject.length) // assume that object is array-like
20215 throw new Error('First argument needs to be a number, array or string.')
20218 if (Buffer._useTypedArrays) {
20219 // Preferred: Return an augmented `Uint8Array` instance for best performance
20220 buf = Buffer._augment(new Uint8Array(length))
20222 // Fallback: Return THIS instance of Buffer (created by `new`)
20224 buf.length = length
20225 buf._isBuffer = true
20229 if (Buffer._useTypedArrays && typeof subject.byteLength === 'number') {
20230 // Speed optimization -- use set if we're copying from a typed array
20232 } else if (isArrayish(subject)) {
20233 // Treat array-ish objects as a byte array
20234 if (Buffer.isBuffer(subject)) {
20235 for (i =
0; i < length; i++)
20236 buf[i] = subject.readUInt8(i)
20238 for (i =
0; i < length; i++)
20239 buf[i] = ((subject[i] %
256) +
256) %
256
20241 } else if (type === 'string') {
20242 buf.write(subject,
0, encoding)
20243 } else if (type === 'number' && !Buffer._useTypedArrays && !noZero) {
20244 for (i =
0; i < length; i++) {
20255 Buffer.isEncoding = function (encoding) {
20256 switch (String(encoding).toLowerCase()) {
20274 Buffer.isBuffer = function (b) {
20275 return !!(b !== null && b !== undefined && b._isBuffer)
20278 Buffer.byteLength = function (str, encoding) {
20280 str = str.toString()
20281 switch (encoding || 'utf8') {
20283 ret = str.length /
2
20287 ret = utf8ToBytes(str).length
20295 ret = base64ToBytes(str).length
20301 ret = str.length *
2
20304 throw new Error('Unknown encoding')
20309 Buffer.concat = function (list, totalLength) {
20310 assert(isArray(list), 'Usage: Buffer.concat(list[, length])')
20312 if (list.length ===
0) {
20313 return new Buffer(
0)
20314 } else if (list.length ===
1) {
20319 if (totalLength === undefined) {
20321 for (i =
0; i < list.length; i++) {
20322 totalLength += list[i].length
20326 var buf = new Buffer(totalLength)
20328 for (i =
0; i < list.length; i++) {
20330 item.copy(buf, pos)
20336 Buffer.compare = function (a, b) {
20337 assert(Buffer.isBuffer(a) && Buffer.isBuffer(b), 'Arguments must be Buffers')
20340 for (var i =
0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}
20354 // BUFFER INSTANCE METHODS
20355 // =======================
20357 function hexWrite (buf, string, offset, length) {
20358 offset = Number(offset) ||
0
20359 var remaining = buf.length - offset
20363 length = Number(length)
20364 if (length
> remaining) {
20369 // must be an even number of digits
20370 var strLen = string.length
20371 assert(strLen %
2 ===
0, 'Invalid hex string')
20373 if (length
> strLen /
2) {
20374 length = strLen /
2
20376 for (var i =
0; i < length; i++) {
20377 var byte = parseInt(string.substr(i *
2,
2),
16)
20378 assert(!isNaN(byte), 'Invalid hex string')
20379 buf[offset + i] = byte
20384 function utf8Write (buf, string, offset, length) {
20385 var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length)
20386 return charsWritten
20389 function asciiWrite (buf, string, offset, length) {
20390 var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)
20391 return charsWritten
20394 function binaryWrite (buf, string, offset, length) {
20395 return asciiWrite(buf, string, offset, length)
20398 function base64Write (buf, string, offset, length) {
20399 var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)
20400 return charsWritten
20403 function utf16leWrite (buf, string, offset, length) {
20404 var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length)
20405 return charsWritten
20408 Buffer.prototype.write = function (string, offset, length, encoding) {
20409 // Support both (string, offset, length, encoding)
20410 // and the legacy (string, encoding, offset, length)
20411 if (isFinite(offset)) {
20412 if (!isFinite(length)) {
20417 var swap = encoding
20423 offset = Number(offset) ||
0
20424 var remaining = this.length - offset
20428 length = Number(length)
20429 if (length
> remaining) {
20433 encoding = String(encoding || 'utf8').toLowerCase()
20436 switch (encoding) {
20438 ret = hexWrite(this, string, offset, length)
20442 ret = utf8Write(this, string, offset, length)
20445 ret = asciiWrite(this, string, offset, length)
20448 ret = binaryWrite(this, string, offset, length)
20451 ret = base64Write(this, string, offset, length)
20457 ret = utf16leWrite(this, string, offset, length)
20460 throw new Error('Unknown encoding')
20465 Buffer.prototype.toString = function (encoding, start, end) {
20468 encoding = String(encoding || 'utf8').toLowerCase()
20469 start = Number(start) ||
0
20470 end = (end === undefined) ? self.length : Number(end)
20472 // Fastpath empty strings
20477 switch (encoding) {
20479 ret = hexSlice(self, start, end)
20483 ret = utf8Slice(self, start, end)
20486 ret = asciiSlice(self, start, end)
20489 ret = binarySlice(self, start, end)
20492 ret = base64Slice(self, start, end)
20498 ret = utf16leSlice(self, start, end)
20501 throw new Error('Unknown encoding')
20506 Buffer.prototype.toJSON = function () {
20509 data: Array.prototype.slice.call(this._arr || this,
0)
20513 Buffer.prototype.equals = function (b) {
20514 assert(Buffer.isBuffer(b), 'Argument must be a Buffer')
20515 return Buffer.compare(this, b) ===
0
20518 Buffer.prototype.compare = function (b) {
20519 assert(Buffer.isBuffer(b), 'Argument must be a Buffer')
20520 return Buffer.compare(this, b)
20523 // copy(targetBuffer, targetStart=
0, sourceStart=
0, sourceEnd=buffer.length)
20524 Buffer.prototype.copy = function (target, target_start, start, end) {
20527 if (!start) start =
0
20528 if (!end && end !==
0) end = this.length
20529 if (!target_start) target_start =
0
20531 // Copy
0 bytes; we're done
20532 if (end === start) return
20533 if (target.length ===
0 || source.length ===
0) return
20535 // Fatal error conditions
20536 assert(end
>= start, 'sourceEnd < sourceStart')
20537 assert(target_start
>=
0 && target_start < target.length,
20538 'targetStart out of bounds')
20539 assert(start
>=
0 && start < source.length, 'sourceStart out of bounds')
20540 assert(end
>=
0 && end <= source.length, 'sourceEnd out of bounds')
20543 if (end
> this.length)
20545 if (target.length - target_start < end - start)
20546 end = target.length - target_start + start
20548 var len = end - start
20550 if (len <
100 || !Buffer._useTypedArrays) {
20551 for (var i =
0; i < len; i++) {
20552 target[i + target_start] = this[i + start]
20555 target._set(this.subarray(start, start + len), target_start)
20559 function base64Slice (buf, start, end) {
20560 if (start ===
0 && end === buf.length) {
20561 return base64.fromByteArray(buf)
20563 return base64.fromByteArray(buf.slice(start, end))
20567 function utf8Slice (buf, start, end) {
20570 end = Math.min(buf.length, end)
20572 for (var i = start; i < end; i++) {
20573 if (buf[i] <=
0x7F) {
20574 res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
20577 tmp += '%' + buf[i].toString(
16)
20581 return res + decodeUtf8Char(tmp)
20584 function asciiSlice (buf, start, end) {
20586 end = Math.min(buf.length, end)
20588 for (var i = start; i < end; i++) {
20589 ret += String.fromCharCode(buf[i])
20594 function binarySlice (buf, start, end) {
20595 return asciiSlice(buf, start, end)
20598 function hexSlice (buf, start, end) {
20599 var len = buf.length
20601 if (!start || start <
0) start =
0
20602 if (!end || end <
0 || end
> len) end = len
20605 for (var i = start; i < end; i++) {
20606 out += toHex(buf[i])
20611 function utf16leSlice (buf, start, end) {
20612 var bytes = buf.slice(start, end)
20614 for (var i =
0; i < bytes.length; i +=
2) {
20615 res += String.fromCharCode(bytes[i] + bytes[i +
1] *
256)
20620 Buffer.prototype.slice = function (start, end) {
20621 var len = this.length
20622 start = clamp(start, len,
0)
20623 end = clamp(end, len, len)
20625 if (Buffer._useTypedArrays) {
20626 return Buffer._augment(this.subarray(start, end))
20628 var sliceLen = end - start
20629 var newBuf = new Buffer(sliceLen, undefined, true)
20630 for (var i =
0; i < sliceLen; i++) {
20631 newBuf[i] = this[i + start]
20637 // `get` will be removed in Node
0.13+
20638 Buffer.prototype.get = function (offset) {
20639 console.log('.get() is deprecated. Access using array indexes instead.')
20640 return this.readUInt8(offset)
20643 // `set` will be removed in Node
0.13+
20644 Buffer.prototype.set = function (v, offset) {
20645 console.log('.set() is deprecated. Access using array indexes instead.')
20646 return this.writeUInt8(v, offset)
20649 Buffer.prototype.readUInt8 = function (offset, noAssert) {
20651 assert(offset !== undefined && offset !== null, 'missing offset')
20652 assert(offset < this.length, 'Trying to read beyond buffer length')
20655 if (offset
>= this.length)
20658 return this[offset]
20661 function readUInt16 (buf, offset, littleEndian, noAssert) {
20663 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20664 assert(offset !== undefined && offset !== null, 'missing offset')
20665 assert(offset +
1 < buf.length, 'Trying to read beyond buffer length')
20668 var len = buf.length
20673 if (littleEndian) {
20675 if (offset +
1 < len)
20676 val |= buf[offset +
1] <<
8
20678 val = buf[offset] <<
8
20679 if (offset +
1 < len)
20680 val |= buf[offset +
1]
20685 Buffer.prototype.readUInt16LE = function (offset, noAssert) {
20686 return readUInt16(this, offset, true, noAssert)
20689 Buffer.prototype.readUInt16BE = function (offset, noAssert) {
20690 return readUInt16(this, offset, false, noAssert)
20693 function readUInt32 (buf, offset, littleEndian, noAssert) {
20695 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20696 assert(offset !== undefined && offset !== null, 'missing offset')
20697 assert(offset +
3 < buf.length, 'Trying to read beyond buffer length')
20700 var len = buf.length
20705 if (littleEndian) {
20706 if (offset +
2 < len)
20707 val = buf[offset +
2] <<
16
20708 if (offset +
1 < len)
20709 val |= buf[offset +
1] <<
8
20711 if (offset +
3 < len)
20712 val = val + (buf[offset +
3] <<
24 >>> 0)
20714 if (offset +
1 < len)
20715 val = buf[offset +
1] <<
16
20716 if (offset +
2 < len)
20717 val |= buf[offset +
2] <<
8
20718 if (offset +
3 < len)
20719 val |= buf[offset +
3]
20720 val = val + (buf[offset] <<
24 >>> 0)
20725 Buffer.prototype.readUInt32LE = function (offset, noAssert) {
20726 return readUInt32(this, offset, true, noAssert)
20729 Buffer.prototype.readUInt32BE = function (offset, noAssert) {
20730 return readUInt32(this, offset, false, noAssert)
20733 Buffer.prototype.readInt8 = function (offset, noAssert) {
20735 assert(offset !== undefined && offset !== null,
20737 assert(offset < this.length, 'Trying to read beyond buffer length')
20740 if (offset
>= this.length)
20743 var neg = this[offset] &
0x80
20745 return (
0xff - this[offset] +
1) * -
1
20747 return this[offset]
20750 function readInt16 (buf, offset, littleEndian, noAssert) {
20752 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20753 assert(offset !== undefined && offset !== null, 'missing offset')
20754 assert(offset +
1 < buf.length, 'Trying to read beyond buffer length')
20757 var len = buf.length
20761 var val = readUInt16(buf, offset, littleEndian, true)
20762 var neg = val &
0x8000
20764 return (
0xffff - val +
1) * -
1
20769 Buffer.prototype.readInt16LE = function (offset, noAssert) {
20770 return readInt16(this, offset, true, noAssert)
20773 Buffer.prototype.readInt16BE = function (offset, noAssert) {
20774 return readInt16(this, offset, false, noAssert)
20777 function readInt32 (buf, offset, littleEndian, noAssert) {
20779 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20780 assert(offset !== undefined && offset !== null, 'missing offset')
20781 assert(offset +
3 < buf.length, 'Trying to read beyond buffer length')
20784 var len = buf.length
20788 var val = readUInt32(buf, offset, littleEndian, true)
20789 var neg = val &
0x80000000
20791 return (
0xffffffff - val +
1) * -
1
20796 Buffer.prototype.readInt32LE = function (offset, noAssert) {
20797 return readInt32(this, offset, true, noAssert)
20800 Buffer.prototype.readInt32BE = function (offset, noAssert) {
20801 return readInt32(this, offset, false, noAssert)
20804 function readFloat (buf, offset, littleEndian, noAssert) {
20806 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20807 assert(offset +
3 < buf.length, 'Trying to read beyond buffer length')
20810 return ieee754.read(buf, offset, littleEndian,
23,
4)
20813 Buffer.prototype.readFloatLE = function (offset, noAssert) {
20814 return readFloat(this, offset, true, noAssert)
20817 Buffer.prototype.readFloatBE = function (offset, noAssert) {
20818 return readFloat(this, offset, false, noAssert)
20821 function readDouble (buf, offset, littleEndian, noAssert) {
20823 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20824 assert(offset +
7 < buf.length, 'Trying to read beyond buffer length')
20827 return ieee754.read(buf, offset, littleEndian,
52,
8)
20830 Buffer.prototype.readDoubleLE = function (offset, noAssert) {
20831 return readDouble(this, offset, true, noAssert)
20834 Buffer.prototype.readDoubleBE = function (offset, noAssert) {
20835 return readDouble(this, offset, false, noAssert)
20838 Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
20840 assert(value !== undefined && value !== null, 'missing value')
20841 assert(offset !== undefined && offset !== null, 'missing offset')
20842 assert(offset < this.length, 'trying to write beyond buffer length')
20843 verifuint(value,
0xff)
20846 if (offset
>= this.length) return
20848 this[offset] = value
20852 function writeUInt16 (buf, value, offset, littleEndian, noAssert) {
20854 assert(value !== undefined && value !== null, 'missing value')
20855 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20856 assert(offset !== undefined && offset !== null, 'missing offset')
20857 assert(offset +
1 < buf.length, 'trying to write beyond buffer length')
20858 verifuint(value,
0xffff)
20861 var len = buf.length
20865 for (var i =
0, j = Math.min(len - offset,
2); i < j; i++) {
20867 (value & (
0xff << (
8 * (littleEndian ? i :
1 - i))))
>>>
20868 (littleEndian ? i :
1 - i) *
8
20873 Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
20874 return writeUInt16(this, value, offset, true, noAssert)
20877 Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
20878 return writeUInt16(this, value, offset, false, noAssert)
20881 function writeUInt32 (buf, value, offset, littleEndian, noAssert) {
20883 assert(value !== undefined && value !== null, 'missing value')
20884 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20885 assert(offset !== undefined && offset !== null, 'missing offset')
20886 assert(offset +
3 < buf.length, 'trying to write beyond buffer length')
20887 verifuint(value,
0xffffffff)
20890 var len = buf.length
20894 for (var i =
0, j = Math.min(len - offset,
4); i < j; i++) {
20896 (value
>>> (littleEndian ? i :
3 - i) *
8) &
0xff
20901 Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
20902 return writeUInt32(this, value, offset, true, noAssert)
20905 Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
20906 return writeUInt32(this, value, offset, false, noAssert)
20909 Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
20911 assert(value !== undefined && value !== null, 'missing value')
20912 assert(offset !== undefined && offset !== null, 'missing offset')
20913 assert(offset < this.length, 'Trying to write beyond buffer length')
20914 verifsint(value,
0x7f, -
0x80)
20917 if (offset
>= this.length)
20921 this.writeUInt8(value, offset, noAssert)
20923 this.writeUInt8(
0xff + value +
1, offset, noAssert)
20927 function writeInt16 (buf, value, offset, littleEndian, noAssert) {
20929 assert(value !== undefined && value !== null, 'missing value')
20930 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20931 assert(offset !== undefined && offset !== null, 'missing offset')
20932 assert(offset +
1 < buf.length, 'Trying to write beyond buffer length')
20933 verifsint(value,
0x7fff, -
0x8000)
20936 var len = buf.length
20941 writeUInt16(buf, value, offset, littleEndian, noAssert)
20943 writeUInt16(buf,
0xffff + value +
1, offset, littleEndian, noAssert)
20947 Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
20948 return writeInt16(this, value, offset, true, noAssert)
20951 Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
20952 return writeInt16(this, value, offset, false, noAssert)
20955 function writeInt32 (buf, value, offset, littleEndian, noAssert) {
20957 assert(value !== undefined && value !== null, 'missing value')
20958 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20959 assert(offset !== undefined && offset !== null, 'missing offset')
20960 assert(offset +
3 < buf.length, 'Trying to write beyond buffer length')
20961 verifsint(value,
0x7fffffff, -
0x80000000)
20964 var len = buf.length
20969 writeUInt32(buf, value, offset, littleEndian, noAssert)
20971 writeUInt32(buf,
0xffffffff + value +
1, offset, littleEndian, noAssert)
20975 Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
20976 return writeInt32(this, value, offset, true, noAssert)
20979 Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
20980 return writeInt32(this, value, offset, false, noAssert)
20983 function writeFloat (buf, value, offset, littleEndian, noAssert) {
20985 assert(value !== undefined && value !== null, 'missing value')
20986 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20987 assert(offset !== undefined && offset !== null, 'missing offset')
20988 assert(offset +
3 < buf.length, 'Trying to write beyond buffer length')
20989 verifIEEE754(value,
3.4028234663852886e+38, -
3.4028234663852886e+38)
20992 var len = buf.length
20996 ieee754.write(buf, value, offset, littleEndian,
23,
4)
21000 Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
21001 return writeFloat(this, value, offset, true, noAssert)
21004 Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
21005 return writeFloat(this, value, offset, false, noAssert)
21008 function writeDouble (buf, value, offset, littleEndian, noAssert) {
21010 assert(value !== undefined && value !== null, 'missing value')
21011 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
21012 assert(offset !== undefined && offset !== null, 'missing offset')
21013 assert(offset +
7 < buf.length,
21014 'Trying to write beyond buffer length')
21015 verifIEEE754(value,
1.7976931348623157E+308, -
1.7976931348623157E+308)
21018 var len = buf.length
21022 ieee754.write(buf, value, offset, littleEndian,
52,
8)
21026 Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
21027 return writeDouble(this, value, offset, true, noAssert)
21030 Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
21031 return writeDouble(this, value, offset, false, noAssert)
21034 // fill(value, start=
0, end=buffer.length)
21035 Buffer.prototype.fill = function (value, start, end) {
21036 if (!value) value =
0
21037 if (!start) start =
0
21038 if (!end) end = this.length
21040 assert(end
>= start, 'end < start')
21042 // Fill
0 bytes; we're done
21043 if (end === start) return
21044 if (this.length ===
0) return
21046 assert(start
>=
0 && start < this.length, 'start out of bounds')
21047 assert(end
>=
0 && end <= this.length, 'end out of bounds')
21050 if (typeof value === 'number') {
21051 for (i = start; i < end; i++) {
21055 var bytes = utf8ToBytes(value.toString())
21056 var len = bytes.length
21057 for (i = start; i < end; i++) {
21058 this[i] = bytes[i % len]
21065 Buffer.prototype.inspect = function () {
21067 var len = this.length
21068 for (var i =
0; i < len; i++) {
21069 out[i] = toHex(this[i])
21070 if (i === exports.INSPECT_MAX_BYTES) {
21075 return '
<Buffer ' + out.join(' ') + '
>'
21079 * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
21080 * Added in Node
0.12. Only available in browsers that support ArrayBuffer.
21082 Buffer.prototype.toArrayBuffer = function () {
21083 if (typeof Uint8Array !== 'undefined') {
21084 if (Buffer._useTypedArrays) {
21085 return (new Buffer(this)).buffer
21087 var buf = new Uint8Array(this.length)
21088 for (var i =
0, len = buf.length; i < len; i +=
1) {
21094 throw new Error('Buffer.toArrayBuffer not supported in this browser')
21098 // HELPER FUNCTIONS
21099 // ================
21101 var BP = Buffer.prototype
21104 * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
21106 Buffer._augment = function (arr) {
21107 arr._isBuffer = true
21109 // save reference to original Uint8Array get/set methods before overwriting
21113 // deprecated, will be removed in node
0.13+
21117 arr.write = BP.write
21118 arr.toString = BP.toString
21119 arr.toLocaleString = BP.toString
21120 arr.toJSON = BP.toJSON
21121 arr.equals = BP.equals
21122 arr.compare = BP.compare
21124 arr.slice = BP.slice
21125 arr.readUInt8 = BP.readUInt8
21126 arr.readUInt16LE = BP.readUInt16LE
21127 arr.readUInt16BE = BP.readUInt16BE
21128 arr.readUInt32LE = BP.readUInt32LE
21129 arr.readUInt32BE = BP.readUInt32BE
21130 arr.readInt8 = BP.readInt8
21131 arr.readInt16LE = BP.readInt16LE
21132 arr.readInt16BE = BP.readInt16BE
21133 arr.readInt32LE = BP.readInt32LE
21134 arr.readInt32BE = BP.readInt32BE
21135 arr.readFloatLE = BP.readFloatLE
21136 arr.readFloatBE = BP.readFloatBE
21137 arr.readDoubleLE = BP.readDoubleLE
21138 arr.readDoubleBE = BP.readDoubleBE
21139 arr.writeUInt8 = BP.writeUInt8
21140 arr.writeUInt16LE = BP.writeUInt16LE
21141 arr.writeUInt16BE = BP.writeUInt16BE
21142 arr.writeUInt32LE = BP.writeUInt32LE
21143 arr.writeUInt32BE = BP.writeUInt32BE
21144 arr.writeInt8 = BP.writeInt8
21145 arr.writeInt16LE = BP.writeInt16LE
21146 arr.writeInt16BE = BP.writeInt16BE
21147 arr.writeInt32LE = BP.writeInt32LE
21148 arr.writeInt32BE = BP.writeInt32BE
21149 arr.writeFloatLE = BP.writeFloatLE
21150 arr.writeFloatBE = BP.writeFloatBE
21151 arr.writeDoubleLE = BP.writeDoubleLE
21152 arr.writeDoubleBE = BP.writeDoubleBE
21154 arr.inspect = BP.inspect
21155 arr.toArrayBuffer = BP.toArrayBuffer
21160 var INVALID_BASE64_RE = /[^+\/
0-
9A-z]/g
21162 function base64clean (str) {
21163 // Node strips out invalid characters like \n and \t from the string, base64-js does not
21164 str = stringtrim(str).replace(INVALID_BASE64_RE, '')
21165 // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
21166 while (str.length %
4 !==
0) {
21172 function stringtrim (str) {
21173 if (str.trim) return str.trim()
21174 return str.replace(/^\s+|\s+$/g, '')
21177 // slice(start, end)
21178 function clamp (index, len, defaultValue) {
21179 if (typeof index !== 'number') return defaultValue
21180 index = ~~index; // Coerce to integer.
21181 if (index
>= len) return len
21182 if (index
>=
0) return index
21184 if (index
>=
0) return index
21188 function coerce (length) {
21189 // Coerce length to a number (possibly NaN), round up
21190 // in case it's fractional (e.g.
123.456) then do a
21191 // double negate to coerce a NaN to
0. Easy, right?
21192 length = ~~Math.ceil(+length)
21193 return length <
0 ?
0 : length
21196 function isArray (subject) {
21197 return (Array.isArray || function (subject) {
21198 return Object.prototype.toString.call(subject) === '[object Array]'
21202 function isArrayish (subject) {
21203 return isArray(subject) || Buffer.isBuffer(subject) ||
21204 subject && typeof subject === 'object' &&
21205 typeof subject.length === 'number'
21208 function toHex (n) {
21209 if (n <
16) return '
0' + n.toString(
16)
21210 return n.toString(
16)
21213 function utf8ToBytes (str) {
21215 for (var i =
0; i < str.length; i++) {
21216 var b = str.charCodeAt(i)
21221 if (b
>=
0xD800 && b <=
0xDFFF) i++
21222 var h = encodeURIComponent(str.slice(start, i+
1)).substr(
1).split('%')
21223 for (var j =
0; j < h.length; j++) {
21224 byteArray.push(parseInt(h[j],
16))
21231 function asciiToBytes (str) {
21233 for (var i =
0; i < str.length; i++) {
21234 // Node's code seems to be doing this and not &
0x7F..
21235 byteArray.push(str.charCodeAt(i) &
0xFF)
21240 function utf16leToBytes (str) {
21243 for (var i =
0; i < str.length; i++) {
21244 c = str.charCodeAt(i)
21254 function base64ToBytes (str) {
21255 return base64.toByteArray(str)
21258 function blitBuffer (src, dst, offset, length) {
21259 for (var i =
0; i < length; i++) {
21260 if ((i + offset
>= dst.length) || (i
>= src.length))
21262 dst[i + offset] = src[i]
21267 function decodeUtf8Char (str) {
21269 return decodeURIComponent(str)
21271 return String.fromCharCode(
0xFFFD) // UTF
8 invalid char
21276 * We have to make sure that the value is a valid integer. This means that it
21277 * is non-negative. It has no fractional component and that it does not
21278 * exceed the maximum allowed value.
21280 function verifuint (value, max) {
21281 assert(typeof value === 'number', 'cannot write a non-number as a number')
21282 assert(value
>=
0, 'specified a negative value for writing an unsigned value')
21283 assert(value <= max, 'value is larger than maximum value for type')
21284 assert(Math.floor(value) === value, 'value has a fractional component')
21287 function verifsint (value, max, min) {
21288 assert(typeof value === 'number', 'cannot write a non-number as a number')
21289 assert(value <= max, 'value larger than maximum allowed value')
21290 assert(value
>= min, 'value smaller than minimum allowed value')
21291 assert(Math.floor(value) === value, 'value has a fractional component')
21294 function verifIEEE754 (value, max, min) {
21295 assert(typeof value === 'number', 'cannot write a non-number as a number')
21296 assert(value <= max, 'value larger than maximum allowed value')
21297 assert(value
>= min, 'value smaller than minimum allowed value')
21300 function assert (test, message) {
21301 if (!test) throw new Error(message || 'Failed assertion')
21304 },{"base64-js":
9,"ieee754":
10}],
9:[function(_dereq_,module,exports){
21305 var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
21307 ;(function (exports) {
21310 var Arr = (typeof Uint8Array !== 'undefined')
21314 var PLUS = '+'.charCodeAt(
0)
21315 var SLASH = '/'.charCodeAt(
0)
21316 var NUMBER = '
0'.charCodeAt(
0)
21317 var LOWER = 'a'.charCodeAt(
0)
21318 var UPPER = 'A'.charCodeAt(
0)
21320 function decode (elt) {
21321 var code = elt.charCodeAt(
0)
21324 if (code === SLASH)
21327 return -
1 //no match
21328 if (code < NUMBER +
10)
21329 return code - NUMBER +
26 +
26
21330 if (code < UPPER +
26)
21331 return code - UPPER
21332 if (code < LOWER +
26)
21333 return code - LOWER +
26
21336 function b64ToByteArray (b64) {
21337 var i, j, l, tmp, placeHolders, arr
21339 if (b64.length %
4 > 0) {
21340 throw new Error('Invalid string. Length must be a multiple of
4')
21343 // the number of equal signs (place holders)
21344 // if there are two placeholders, than the two characters before it
21345 // represent one byte
21346 // if there is only one, then the three characters before it represent
2 bytes
21347 // this is just a cheap hack to not do indexOf twice
21348 var len = b64.length
21349 placeHolders = '=' === b64.charAt(len -
2) ?
2 : '=' === b64.charAt(len -
1) ?
1 :
0
21351 // base64 is
4/
3 + up to two characters of the original data
21352 arr = new Arr(b64.length *
3 /
4 - placeHolders)
21354 // if there are placeholders, only get up to the last complete
4 chars
21355 l = placeHolders
> 0 ? b64.length -
4 : b64.length
21359 function push (v) {
21363 for (i =
0, j =
0; i < l; i +=
4, j +=
3) {
21364 tmp = (decode(b64.charAt(i)) <<
18) | (decode(b64.charAt(i +
1)) <<
12) | (decode(b64.charAt(i +
2)) <<
6) | decode(b64.charAt(i +
3))
21365 push((tmp &
0xFF0000)
>> 16)
21366 push((tmp &
0xFF00)
>> 8)
21370 if (placeHolders ===
2) {
21371 tmp = (decode(b64.charAt(i)) <<
2) | (decode(b64.charAt(i +
1))
>> 4)
21373 } else if (placeHolders ===
1) {
21374 tmp = (decode(b64.charAt(i)) <<
10) | (decode(b64.charAt(i +
1)) <<
4) | (decode(b64.charAt(i +
2))
>> 2)
21375 push((tmp
>> 8) &
0xFF)
21382 function uint8ToBase64 (uint8) {
21384 extraBytes = uint8.length %
3, // if we have
1 byte left, pad
2 bytes
21388 function encode (num) {
21389 return lookup.charAt(num)
21392 function tripletToBase64 (num) {
21393 return encode(num
>> 18 &
0x3F) + encode(num
>> 12 &
0x3F) + encode(num
>> 6 &
0x3F) + encode(num &
0x3F)
21396 // go through the array every three bytes, we'll deal with trailing stuff later
21397 for (i =
0, length = uint8.length - extraBytes; i < length; i +=
3) {
21398 temp = (uint8[i] <<
16) + (uint8[i +
1] <<
8) + (uint8[i +
2])
21399 output += tripletToBase64(temp)
21402 // pad the end with zeros, but make sure to not forget the extra bytes
21403 switch (extraBytes) {
21405 temp = uint8[uint8.length -
1]
21406 output += encode(temp
>> 2)
21407 output += encode((temp <<
4) &
0x3F)
21411 temp = (uint8[uint8.length -
2] <<
8) + (uint8[uint8.length -
1])
21412 output += encode(temp
>> 10)
21413 output += encode((temp
>> 4) &
0x3F)
21414 output += encode((temp <<
2) &
0x3F)
21422 exports.toByteArray = b64ToByteArray
21423 exports.fromByteArray = uint8ToBase64
21424 }(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
21426 },{}],
10:[function(_dereq_,module,exports){
21427 exports.read = function(buffer, offset, isLE, mLen, nBytes) {
21429 eLen = nBytes *
8 - mLen -
1,
21430 eMax = (
1 << eLen) -
1,
21433 i = isLE ? (nBytes -
1) :
0,
21435 s = buffer[offset + i];
21439 e = s & ((
1 << (-nBits)) -
1);
21442 for (; nBits
> 0; e = e *
256 + buffer[offset + i], i += d, nBits -=
8){};
21444 m = e & ((
1 << (-nBits)) -
1);
21447 for (; nBits
> 0; m = m *
256 + buffer[offset + i], i += d, nBits -=
8){};
21451 } else if (e === eMax) {
21452 return m ? NaN : ((s ? -
1 :
1) * Infinity);
21454 m = m + Math.pow(
2, mLen);
21457 return (s ? -
1 :
1) * m * Math.pow(
2, e - mLen);
21460 exports.write = function(buffer, value, offset, isLE, mLen, nBytes) {
21462 eLen = nBytes *
8 - mLen -
1,
21463 eMax = (
1 << eLen) -
1,
21465 rt = (mLen ===
23 ? Math.pow(
2, -
24) - Math.pow(
2, -
77) :
0),
21466 i = isLE ?
0 : (nBytes -
1),
21468 s = value <
0 || (value ===
0 &&
1 / value <
0) ?
1 :
0;
21470 value = Math.abs(value);
21472 if (isNaN(value) || value === Infinity) {
21473 m = isNaN(value) ?
1 :
0;
21476 e = Math.floor(Math.log(value) / Math.LN2);
21477 if (value * (c = Math.pow(
2, -e)) <
1) {
21481 if (e + eBias
>=
1) {
21484 value += rt * Math.pow(
2,
1 - eBias);
21486 if (value * c
>=
2) {
21491 if (e + eBias
>= eMax) {
21494 } else if (e + eBias
>=
1) {
21495 m = (value * c -
1) * Math.pow(
2, mLen);
21498 m = value * Math.pow(
2, eBias -
1) * Math.pow(
2, mLen);
21503 for (; mLen
>=
8; buffer[offset + i] = m &
0xff, i += d, m /=
256, mLen -=
8){};
21505 e = (e << mLen) | m;
21507 for (; eLen
> 0; buffer[offset + i] = e &
0xff, i += d, e /=
256, eLen -=
8){};
21509 buffer[offset + i - d] |= s *
128;
21512 },{}],
11:[function(_dereq_,module,exports){
21513 if (typeof Object.create === 'function') {
21514 // implementation from standard node.js 'util' module
21515 module.exports = function inherits(ctor, superCtor) {
21516 ctor.super_ = superCtor
21517 ctor.prototype = Object.create(superCtor.prototype, {
21527 // old school shim for old browsers
21528 module.exports = function inherits(ctor, superCtor) {
21529 ctor.super_ = superCtor
21530 var TempCtor = function () {}
21531 TempCtor.prototype = superCtor.prototype
21532 ctor.prototype = new TempCtor()
21533 ctor.prototype.constructor = ctor
21537 },{}],
12:[function(_dereq_,module,exports){
21538 // shim for using process in browser
21540 var process = module.exports = {};
21542 process.nextTick = (function () {
21543 var canSetImmediate = typeof window !== 'undefined'
21544 && window.setImmediate;
21545 var canPost = typeof window !== 'undefined'
21546 && window.postMessage && window.addEventListener
21549 if (canSetImmediate) {
21550 return function (f) { return window.setImmediate(f) };
21555 window.addEventListener('message', function (ev) {
21556 var source = ev.source;
21557 if ((source === window || source === null) && ev.data === 'process-tick') {
21558 ev.stopPropagation();
21559 if (queue.length
> 0) {
21560 var fn = queue.shift();
21566 return function nextTick(fn) {
21568 window.postMessage('process-tick', '*');
21572 return function nextTick(fn) {
21577 process.title = 'browser';
21578 process.browser = true;
21585 process.addListener = noop;
21586 process.once = noop;
21587 process.off = noop;
21588 process.removeListener = noop;
21589 process.removeAllListeners = noop;
21590 process.emit = noop;
21592 process.binding = function (name) {
21593 throw new Error('process.binding is not supported');
21597 process.cwd = function () { return '/' };
21598 process.chdir = function (dir) {
21599 throw new Error('process.chdir is not supported');
21602 },{}],
13:[function(_dereq_,module,exports){
21603 module.exports=_dereq_(
5)
21604 },{}],
14:[function(_dereq_,module,exports){
21605 module.exports=_dereq_(
6)
21606 },{
"./support/isBuffer":
13,
"FWaASH":
12,
"inherits":
11}],
15:[function(_dereq_,module,exports){
21607 (function (Buffer){
21608 // Base58 encoding/decoding
21609 // Originally written by Mike Hearn for BitcoinJ
21610 // Copyright (c)
2011 Google Inc
21611 // Ported to JavaScript by Stefan Thomas
21612 // Merged Buffer refactorings from base58-native by Stephen Pair
21613 // Copyright (c)
2013 BitPay Inc
21615 var assert = _dereq_('assert')
21616 var BigInteger = _dereq_('bigi')
21618 var ALPHABET = '
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
21619 var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
21620 var ALPHABET_MAP = {}
21621 for(var i =
0; i < ALPHABET.length; i++) {
21622 ALPHABET_MAP[ALPHABET.charAt(i)] = BigInteger.valueOf(i)
21624 var BASE = new BigInteger('
58')
21626 function encode(buffer) {
21627 var bi = BigInteger.fromBuffer(buffer)
21628 var result = new Buffer(buffer.length <<
1)
21630 var i = result.length -
1
21631 while (bi.signum()
> 0) {
21632 var remainder = bi.mod(BASE)
21633 bi = bi.divide(BASE)
21635 result[i] = ALPHABET_BUF[remainder.intValue()]
21639 // deal with leading zeros
21641 while (buffer[j] ===
0) {
21642 result[i] = ALPHABET_BUF[
0]
21647 return result.slice(i +
1, result.length).toString('ascii')
21650 function decode(string) {
21651 if (string.length ===
0) return new Buffer(
0)
21653 var num = BigInteger.ZERO
21655 for (var i =
0; i < string.length; i++) {
21656 num = num.multiply(BASE)
21658 var figure = ALPHABET_MAP[string.charAt(i)]
21659 assert.notEqual(figure, undefined, 'Non-base58 character')
21661 num = num.add(figure)
21664 // deal with leading zeros
21666 while ((j < string.length) && (string[j] === ALPHABET[
0])) {
21670 var buffer = num.toBuffer()
21671 var leadingZeros = new Buffer(j)
21672 leadingZeros.fill(
0)
21674 return Buffer.concat([leadingZeros, buffer])
21682 }).call(this,_dereq_(
"buffer").Buffer)
21683 },{
"assert":
4,
"bigi":
3,
"buffer":
8}],
16:[function(_dereq_,module,exports){
21684 (function (Buffer){
21685 var createHash = _dereq_('sha.js')
21687 var md5 = toConstructor(_dereq_('./md5'))
21688 var rmd160 = toConstructor(_dereq_('ripemd160'))
21690 function toConstructor (fn) {
21691 return function () {
21694 update: function (data, enc) {
21695 if(!Buffer.isBuffer(data)) data = new Buffer(data, enc)
21699 digest: function (enc) {
21700 var buf = Buffer.concat(buffers)
21703 return enc ? r.toString(enc) : r
21710 module.exports = function (alg) {
21711 if('md5' === alg) return new md5()
21712 if('rmd160' === alg) return new rmd160()
21713 return createHash(alg)
21716 }).call(this,_dereq_(
"buffer").Buffer)
21717 },{
"./md5":
20,
"buffer":
8,
"ripemd160":
21,
"sha.js":
23}],
17:[function(_dereq_,module,exports){
21718 (function (Buffer){
21719 var createHash = _dereq_('./create-hash')
21722 var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(
0)
21724 module.exports = Hmac
21726 function Hmac (alg, key) {
21727 if(!(this instanceof Hmac)) return new Hmac(alg, key)
21731 key = this._key = !Buffer.isBuffer(key) ? new Buffer(key) : key
21733 if(key.length
> blocksize) {
21734 key = createHash(alg).update(key).digest()
21735 } else if(key.length < blocksize) {
21736 key = Buffer.concat([key, zeroBuffer], blocksize)
21739 var ipad = this._ipad = new Buffer(blocksize)
21740 var opad = this._opad = new Buffer(blocksize)
21742 for(var i =
0; i < blocksize; i++) {
21743 ipad[i] = key[i] ^
0x36
21744 opad[i] = key[i] ^
0x5C
21747 this._hash = createHash(alg).update(ipad)
21750 Hmac.prototype.update = function (data, enc) {
21751 this._hash.update(data, enc)
21755 Hmac.prototype.digest = function (enc) {
21756 var h = this._hash.digest()
21757 return createHash(this._alg).update(this._opad).update(h).digest(enc)
21761 }).call(this,_dereq_("buffer").Buffer)
21762 },{"./create-hash":
16,"buffer":
8}],
18:[function(_dereq_,module,exports){
21763 (function (Buffer){
21765 var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(
0);
21768 function toArray(buf, bigEndian) {
21769 if ((buf.length % intSize) !==
0) {
21770 var len = buf.length + (intSize - (buf.length % intSize));
21771 buf = Buffer.concat([buf, zeroBuffer], len);
21775 var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE;
21776 for (var i =
0; i < buf.length; i += intSize) {
21777 arr.push(fn.call(buf, i));
21782 function toBuffer(arr, size, bigEndian) {
21783 var buf = new Buffer(size);
21784 var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE;
21785 for (var i =
0; i < arr.length; i++) {
21786 fn.call(buf, arr[i], i *
4, true);
21791 function hash(buf, fn, hashSize, bigEndian) {
21792 if (!Buffer.isBuffer(buf)) buf = new Buffer(buf);
21793 var arr = fn(toArray(buf, bigEndian), buf.length * chrsz);
21794 return toBuffer(arr, hashSize, bigEndian);
21797 module.exports = { hash: hash };
21799 }).call(this,_dereq_("buffer").Buffer)
21800 },{"buffer":
8}],
19:[function(_dereq_,module,exports){
21801 (function (Buffer){
21802 var rng = _dereq_('./rng')
21804 function error () {
21805 var m = [].slice.call(arguments).join(' ')
21808 'we accept pull requests',
21809 'http://github.com/dominictarr/crypto-browserify'
21813 exports.createHash = _dereq_('./create-hash')
21815 exports.createHmac = _dereq_('./create-hmac')
21817 exports.randomBytes = function(size, callback) {
21818 if (callback && callback.call) {
21820 callback.call(this, undefined, new Buffer(rng(size)))
21821 } catch (err) { callback(err) }
21823 return new Buffer(rng(size))
21827 function each(a, f) {
21832 exports.getHashes = function () {
21833 return ['sha1', 'sha256', 'md5', 'rmd160']
21837 var p = _dereq_('./pbkdf2')(exports.createHmac)
21838 exports.pbkdf2 = p.pbkdf2
21839 exports.pbkdf2Sync = p.pbkdf2Sync
21842 // the least I can do is make error messages for the rest of the node.js/crypto api.
21843 each(['createCredentials'
21847 , 'createDecipheriv'
21850 , 'createDiffieHellman'
21851 ], function (name) {
21852 exports[name] = function () {
21853 error('sorry,', name, 'is not implemented yet')
21857 }).call(this,_dereq_("buffer").Buffer)
21858 },{"./create-hash":
16,"./create-hmac":
17,"./pbkdf2":
27,"./rng":
28,"buffer":
8}],
20:[function(_dereq_,module,exports){
21860 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
21861 * Digest Algorithm, as defined in RFC
1321.
21862 * Version
2.1 Copyright (C) Paul Johnston
1999 -
2002.
21863 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
21864 * Distributed under the BSD License
21865 * See http://pajhome.org.uk/crypt/md5 for more info.
21868 var helpers = _dereq_('./helpers');
21871 * Calculate the MD5 of an array of little-endian words, and a bit length
21873 function core_md5(x, len)
21875 /* append padding */
21876 x[len
>> 5] |=
0x80 << ((len) %
32);
21877 x[(((len +
64)
>>> 9) <<
4) +
14] = len;
21879 var a =
1732584193;
21880 var b = -
271733879;
21881 var c = -
1732584194;
21884 for(var i =
0; i < x.length; i +=
16)
21891 a = md5_ff(a, b, c, d, x[i+
0],
7 , -
680876936);
21892 d = md5_ff(d, a, b, c, x[i+
1],
12, -
389564586);
21893 c = md5_ff(c, d, a, b, x[i+
2],
17,
606105819);
21894 b = md5_ff(b, c, d, a, x[i+
3],
22, -
1044525330);
21895 a = md5_ff(a, b, c, d, x[i+
4],
7 , -
176418897);
21896 d = md5_ff(d, a, b, c, x[i+
5],
12,
1200080426);
21897 c = md5_ff(c, d, a, b, x[i+
6],
17, -
1473231341);
21898 b = md5_ff(b, c, d, a, x[i+
7],
22, -
45705983);
21899 a = md5_ff(a, b, c, d, x[i+
8],
7 ,
1770035416);
21900 d = md5_ff(d, a, b, c, x[i+
9],
12, -
1958414417);
21901 c = md5_ff(c, d, a, b, x[i+
10],
17, -
42063);
21902 b = md5_ff(b, c, d, a, x[i+
11],
22, -
1990404162);
21903 a = md5_ff(a, b, c, d, x[i+
12],
7 ,
1804603682);
21904 d = md5_ff(d, a, b, c, x[i+
13],
12, -
40341101);
21905 c = md5_ff(c, d, a, b, x[i+
14],
17, -
1502002290);
21906 b = md5_ff(b, c, d, a, x[i+
15],
22,
1236535329);
21908 a = md5_gg(a, b, c, d, x[i+
1],
5 , -
165796510);
21909 d = md5_gg(d, a, b, c, x[i+
6],
9 , -
1069501632);
21910 c = md5_gg(c, d, a, b, x[i+
11],
14,
643717713);
21911 b = md5_gg(b, c, d, a, x[i+
0],
20, -
373897302);
21912 a = md5_gg(a, b, c, d, x[i+
5],
5 , -
701558691);
21913 d = md5_gg(d, a, b, c, x[i+
10],
9 ,
38016083);
21914 c = md5_gg(c, d, a, b, x[i+
15],
14, -
660478335);
21915 b = md5_gg(b, c, d, a, x[i+
4],
20, -
405537848);
21916 a = md5_gg(a, b, c, d, x[i+
9],
5 ,
568446438);
21917 d = md5_gg(d, a, b, c, x[i+
14],
9 , -
1019803690);
21918 c = md5_gg(c, d, a, b, x[i+
3],
14, -
187363961);
21919 b = md5_gg(b, c, d, a, x[i+
8],
20,
1163531501);
21920 a = md5_gg(a, b, c, d, x[i+
13],
5 , -
1444681467);
21921 d = md5_gg(d, a, b, c, x[i+
2],
9 , -
51403784);
21922 c = md5_gg(c, d, a, b, x[i+
7],
14,
1735328473);
21923 b = md5_gg(b, c, d, a, x[i+
12],
20, -
1926607734);
21925 a = md5_hh(a, b, c, d, x[i+
5],
4 , -
378558);
21926 d = md5_hh(d, a, b, c, x[i+
8],
11, -
2022574463);
21927 c = md5_hh(c, d, a, b, x[i+
11],
16,
1839030562);
21928 b = md5_hh(b, c, d, a, x[i+
14],
23, -
35309556);
21929 a = md5_hh(a, b, c, d, x[i+
1],
4 , -
1530992060);
21930 d = md5_hh(d, a, b, c, x[i+
4],
11,
1272893353);
21931 c = md5_hh(c, d, a, b, x[i+
7],
16, -
155497632);
21932 b = md5_hh(b, c, d, a, x[i+
10],
23, -
1094730640);
21933 a = md5_hh(a, b, c, d, x[i+
13],
4 ,
681279174);
21934 d = md5_hh(d, a, b, c, x[i+
0],
11, -
358537222);
21935 c = md5_hh(c, d, a, b, x[i+
3],
16, -
722521979);
21936 b = md5_hh(b, c, d, a, x[i+
6],
23,
76029189);
21937 a = md5_hh(a, b, c, d, x[i+
9],
4 , -
640364487);
21938 d = md5_hh(d, a, b, c, x[i+
12],
11, -
421815835);
21939 c = md5_hh(c, d, a, b, x[i+
15],
16,
530742520);
21940 b = md5_hh(b, c, d, a, x[i+
2],
23, -
995338651);
21942 a = md5_ii(a, b, c, d, x[i+
0],
6 , -
198630844);
21943 d = md5_ii(d, a, b, c, x[i+
7],
10,
1126891415);
21944 c = md5_ii(c, d, a, b, x[i+
14],
15, -
1416354905);
21945 b = md5_ii(b, c, d, a, x[i+
5],
21, -
57434055);
21946 a = md5_ii(a, b, c, d, x[i+
12],
6 ,
1700485571);
21947 d = md5_ii(d, a, b, c, x[i+
3],
10, -
1894986606);
21948 c = md5_ii(c, d, a, b, x[i+
10],
15, -
1051523);
21949 b = md5_ii(b, c, d, a, x[i+
1],
21, -
2054922799);
21950 a = md5_ii(a, b, c, d, x[i+
8],
6 ,
1873313359);
21951 d = md5_ii(d, a, b, c, x[i+
15],
10, -
30611744);
21952 c = md5_ii(c, d, a, b, x[i+
6],
15, -
1560198380);
21953 b = md5_ii(b, c, d, a, x[i+
13],
21,
1309151649);
21954 a = md5_ii(a, b, c, d, x[i+
4],
6 , -
145523070);
21955 d = md5_ii(d, a, b, c, x[i+
11],
10, -
1120210379);
21956 c = md5_ii(c, d, a, b, x[i+
2],
15,
718787259);
21957 b = md5_ii(b, c, d, a, x[i+
9],
21, -
343485551);
21959 a = safe_add(a, olda);
21960 b = safe_add(b, oldb);
21961 c = safe_add(c, oldc);
21962 d = safe_add(d, oldd);
21964 return Array(a, b, c, d);
21969 * These functions implement the four basic operations the algorithm uses.
21971 function md5_cmn(q, a, b, x, s, t)
21973 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
21975 function md5_ff(a, b, c, d, x, s, t)
21977 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
21979 function md5_gg(a, b, c, d, x, s, t)
21981 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
21983 function md5_hh(a, b, c, d, x, s, t)
21985 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
21987 function md5_ii(a, b, c, d, x, s, t)
21989 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
21993 * Add integers, wrapping at
2^
32. This uses
16-bit operations internally
21994 * to work around bugs in some JS interpreters.
21996 function safe_add(x, y)
21998 var lsw = (x &
0xFFFF) + (y &
0xFFFF);
21999 var msw = (x
>> 16) + (y
>> 16) + (lsw
>> 16);
22000 return (msw <<
16) | (lsw &
0xFFFF);
22004 * Bitwise rotate a
32-bit number to the left.
22006 function bit_rol(num, cnt)
22008 return (num << cnt) | (num
>>> (
32 - cnt));
22011 module.exports = function md5(buf) {
22012 return helpers.hash(buf, core_md5,
16);
22015 },{"./helpers":
18}],
21:[function(_dereq_,module,exports){
22016 (function (Buffer){
22018 module.exports = ripemd160
22024 code.google.com/p/crypto-js
22025 (c)
2009-
2013 by Jeff Mott. All rights reserved.
22026 code.google.com/p/crypto-js/wiki/License
22029 (c)
2012 by Cédric Mesnil. All rights reserved.
22031 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
22033 - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
22034 - 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.
22036 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22041 0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
22042 7,
4,
13,
1,
10,
6,
15,
3,
12,
0,
9,
5,
2,
14,
11,
8,
22043 3,
10,
14,
4,
9,
15,
8,
1,
2,
7,
0,
6,
13,
11,
5,
12,
22044 1,
9,
11,
10,
0,
8,
12,
4,
13,
3,
7,
15,
14,
5,
6,
2,
22045 4,
0,
5,
9,
7,
12,
2,
10,
14,
1,
3,
8,
11,
6,
15,
13];
22047 5,
14,
7,
0,
9,
2,
11,
4,
13,
6,
15,
8,
1,
10,
3,
12,
22048 6,
11,
3,
7,
0,
13,
5,
10,
14,
15,
8,
12,
4,
9,
1,
2,
22049 15,
5,
1,
3,
7,
14,
6,
9,
11,
8,
12,
2,
10,
0,
4,
13,
22050 8,
6,
4,
1,
3,
11,
15,
0,
5,
12,
2,
13,
9,
7,
10,
14,
22051 12,
15,
10,
4,
1,
5,
8,
7,
6,
2,
13,
14,
0,
3,
9,
11];
22053 11,
14,
15,
12,
5,
8,
7,
9,
11,
13,
14,
15,
6,
7,
9,
8,
22054 7,
6,
8,
13,
11,
9,
7,
15,
7,
12,
15,
9,
11,
7,
13,
12,
22055 11,
13,
6,
7,
14,
9,
13,
15,
14,
8,
13,
6,
5,
12,
7,
5,
22056 11,
12,
14,
15,
14,
15,
9,
8,
9,
14,
5,
6,
8,
6,
5,
12,
22057 9,
15,
5,
11,
6,
8,
13,
12,
5,
12,
13,
14,
11,
8,
5,
6 ];
22059 8,
9,
9,
11,
13,
15,
15,
5,
7,
7,
8,
11,
14,
14,
12,
6,
22060 9,
13,
15,
7,
12,
8,
9,
11,
7,
7,
12,
7,
6,
15,
13,
11,
22061 9,
7,
15,
11,
8,
6,
6,
14,
12,
13,
5,
14,
13,
13,
7,
5,
22062 15,
5,
8,
11,
14,
14,
6,
14,
6,
9,
12,
9,
12,
5,
15,
8,
22063 8,
5,
12,
9,
12,
5,
14,
6,
8,
13,
6,
5,
15,
13,
11,
11 ];
22065 var hl = [
0x00000000,
0x5A827999,
0x6ED9EBA1,
0x8F1BBCDC,
0xA953FD4E];
22066 var hr = [
0x50A28BE6,
0x5C4DD124,
0x6D703EF3,
0x7A6D76E9,
0x00000000];
22068 var bytesToWords = function (bytes) {
22070 for (var i =
0, b =
0; i < bytes.length; i++, b +=
8) {
22071 words[b
>>> 5] |= bytes[i] << (
24 - b %
32);
22076 var wordsToBytes = function (words) {
22078 for (var b =
0; b < words.length *
32; b +=
8) {
22079 bytes.push((words[b
>>> 5]
>>> (
24 - b %
32)) &
0xFF);
22084 var processBlock = function (H, M, offset) {
22087 for (var i =
0; i <
16; i++) {
22088 var offset_i = offset + i;
22089 var M_offset_i = M[offset_i];
22093 (((M_offset_i <<
8) | (M_offset_i
>>> 24)) &
0x00ff00ff) |
22094 (((M_offset_i <<
24) | (M_offset_i
>>> 8)) &
0xff00ff00)
22098 // Working variables
22099 var al, bl, cl, dl, el;
22100 var ar, br, cr, dr, er;
22109 for (var i =
0; i <
80; i +=
1) {
22110 t = (al + M[offset+zl[i]])|
0;
22112 t += f1(bl,cl,dl) + hl[
0];
22114 t += f2(bl,cl,dl) + hl[
1];
22116 t += f3(bl,cl,dl) + hl[
2];
22118 t += f4(bl,cl,dl) + hl[
3];
22119 } else {// if (i
<80) {
22120 t += f5(bl,cl,dl) + hl[
4];
22131 t = (ar + M[offset+zr[i]])|
0;
22133 t += f5(br,cr,dr) + hr[
0];
22135 t += f4(br,cr,dr) + hr[
1];
22137 t += f3(br,cr,dr) + hr[
2];
22139 t += f2(br,cr,dr) + hr[
3];
22140 } else {// if (i
<80) {
22141 t += f1(br,cr,dr) + hr[
4];
22144 t = rotl(t,sr[i]) ;
22152 // Intermediate hash value
22153 t = (H[
1] + cl + dr)|
0;
22154 H[
1] = (H[
2] + dl + er)|
0;
22155 H[
2] = (H[
3] + el + ar)|
0;
22156 H[
3] = (H[
4] + al + br)|
0;
22157 H[
4] = (H[
0] + bl + cr)|
0;
22161 function f1(x, y, z) {
22162 return ((x) ^ (y) ^ (z));
22165 function f2(x, y, z) {
22166 return (((x)&(y)) | ((~x)&(z)));
22169 function f3(x, y, z) {
22170 return (((x) | (~(y))) ^ (z));
22173 function f4(x, y, z) {
22174 return (((x) & (z)) | ((y)&(~(z))));
22177 function f5(x, y, z) {
22178 return ((x) ^ ((y) |(~(z))));
22181 function rotl(x,n) {
22182 return (x<
<n) | (x
>>>(
32-n));
22185 function ripemd160(message) {
22186 var H = [
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476,
0xC3D2E1F0];
22188 if (typeof message == 'string')
22189 message = new Buffer(message, 'utf8');
22191 var m = bytesToWords(message);
22193 var nBitsLeft = message.length *
8;
22194 var nBitsTotal = message.length *
8;
22197 m[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
22198 m[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = (
22199 (((nBitsTotal <<
8) | (nBitsTotal
>>> 24)) &
0x00ff00ff) |
22200 (((nBitsTotal <<
24) | (nBitsTotal
>>> 8)) &
0xff00ff00)
22203 for (var i=
0 ; i
<m.length; i +=
16) {
22204 processBlock(H, m, i);
22208 for (var i =
0; i <
5; i++) {
22213 H[i] = (((H_i <<
8) | (H_i
>>> 24)) &
0x00ff00ff) |
22214 (((H_i <<
24) | (H_i
>>> 8)) &
0xff00ff00);
22217 var digestbytes = wordsToBytes(H);
22218 return new Buffer(digestbytes);
22223 }).call(this,_dereq_(
"buffer").Buffer)
22224 },{
"buffer":
8}],
22:[function(_dereq_,module,exports){
22225 var u = _dereq_('./util')
22226 var write = u.write
22227 var fill = u.zeroFill
22229 module.exports = function (Buffer) {
22231 //prototype class for hash functions
22232 function Hash (blockSize, finalSize) {
22233 this._block = new Buffer(blockSize) //new Uint32Array(blockSize/
4)
22234 this._finalSize = finalSize
22235 this._blockSize = blockSize
22240 Hash.prototype.init = function () {
22245 function lengthOf(data, enc) {
22246 if(enc == null) return data.byteLength || data.length
22247 if(enc == 'ascii' || enc == 'binary') return data.length
22248 if(enc == 'hex') return data.length/
2
22249 if(enc == 'base64') return data.length/
3
22252 Hash.prototype.update = function (data, enc) {
22253 var bl = this._blockSize
22255 //I'd rather do this with a streaming encoder, like the opposite of
22256 //http://nodejs.org/api/string_decoder.html
22258 if(!enc && 'string' === typeof data)
22262 if(enc === 'utf-
8')
22265 if(enc === 'base64' || enc === 'utf8')
22266 data = new Buffer(data, enc), enc = null
22268 length = lengthOf(data, enc)
22270 length = data.byteLength || data.length
22272 var l = this._len += length
22273 var s = this._s = (this._s ||
0)
22275 var buffer = this._block
22277 var t = Math.min(length, f + bl)
22278 write(buffer, data, enc, s%bl, f, t)
22283 this._update(buffer)
22291 Hash.prototype.digest = function (enc) {
22292 var bl = this._blockSize
22293 var fl = this._finalSize
22294 var len = this._len*
8
22296 var x = this._block
22298 var bits = len % (bl*
8)
22300 //add end marker, so that appending
0's creats a different hash.
22301 x[this._len % bl] =
0x80
22302 fill(this._block, this._len % bl +
1)
22305 this._update(this._block)
22306 u.zeroFill(this._block,
0)
22309 //TODO: handle case where the bit length is
> Math.pow(
2,
29)
22310 x.writeInt32BE(len, fl +
4) //big endian
22312 var hash = this._update(this._block) || this._hash()
22313 if(enc == null) return hash
22314 return hash.toString(enc)
22317 Hash.prototype._update = function () {
22318 throw new Error('_update must be implemented by subclass')
22324 },{"./util":
26}],
23:[function(_dereq_,module,exports){
22325 var exports = module.exports = function (alg) {
22326 var Alg = exports[alg]
22327 if(!Alg) throw new Error(alg + ' is not supported (we accept pull requests)')
22331 var Buffer = _dereq_('buffer').Buffer
22332 var Hash = _dereq_('./hash')(Buffer)
22335 exports.sha1 = _dereq_('./sha1')(Buffer, Hash)
22336 exports.sha256 = _dereq_('./sha256')(Buffer, Hash)
22338 },{"./hash":
22,"./sha1":
24,"./sha256":
25,"buffer":
8}],
24:[function(_dereq_,module,exports){
22340 * A JavaScript implementation of the Secure Hash Algorithm, SHA-
1, as defined
22341 * in FIPS PUB
180-
1
22342 * Version
2.1a Copyright Paul Johnston
2000 -
2002.
22343 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
22344 * Distributed under the BSD License
22345 * See http://pajhome.org.uk/crypt/md5 for details.
22347 module.exports = function (Buffer, Hash) {
22349 var inherits = _dereq_('util').inherits
22351 inherits(Sha1, Hash)
22362 var W = new Int32Array(
80)
22368 return POOL.pop().init()
22370 if(!(this instanceof Sha1)) return new Sha1()
22372 Hash.call(this,
16*
4,
14*
4)
22378 Sha1.prototype.init = function () {
22379 this._a =
0x67452301
22380 this._b =
0xefcdab89
22381 this._c =
0x98badcfe
22382 this._d =
0x10325476
22383 this._e =
0xc3d2e1f0
22385 Hash.prototype.init.call(this)
22389 Sha1.prototype._POOL = POOL
22391 // assume that array is a Uint32Array with length=
16,
22392 // and that if it is the last block, it already has the length and the
1 bit appended.
22395 var isDV = new Buffer(
1) instanceof DataView
22396 function readInt32BE (X, i) {
22398 ? X.getInt32(i, false)
22402 Sha1.prototype._update = function (array) {
22404 var X = this._block
22406 var a, b, c, d, e, _a, _b, _c, _d, _e
22416 for(var j =
0; j <
80; j++) {
22419 //? X.getInt32(j*
4, false)
22420 //? readInt32BE(X, j*
4) //*/ X.readInt32BE(j*
4) //*/
22421 ? X.readInt32BE(j*
4)
22422 : rol(w[j -
3] ^ w[j -
8] ^ w[j -
14] ^ w[j -
16],
1)
22426 add(rol(a,
5), sha1_ft(j, b, c, d)),
22427 add(add(e, W), sha1_kt(j))
22437 this._a = add(a, _a)
22438 this._b = add(b, _b)
22439 this._c = add(c, _c)
22440 this._d = add(d, _d)
22441 this._e = add(e, _e)
22444 Sha1.prototype._hash = function () {
22445 if(POOL.length <
100) POOL.push(this)
22446 var H = new Buffer(
20)
22447 //console.log(this._a|
0, this._b|
0, this._c|
0, this._d|
0, this._e|
0)
22448 H.writeInt32BE(this._a|
0, A)
22449 H.writeInt32BE(this._b|
0, B)
22450 H.writeInt32BE(this._c|
0, C)
22451 H.writeInt32BE(this._d|
0, D)
22452 H.writeInt32BE(this._e|
0, E)
22457 * Perform the appropriate triplet combination function for the current
22460 function sha1_ft(t, b, c, d) {
22461 if(t <
20) return (b & c) | ((~b) & d);
22462 if(t <
40) return b ^ c ^ d;
22463 if(t <
60) return (b & c) | (b & d) | (c & d);
22468 * Determine the appropriate additive constant for the current iteration
22470 function sha1_kt(t) {
22471 return (t <
20) ?
1518500249 : (t <
40) ?
1859775393 :
22472 (t <
60) ? -
1894007588 : -
899497514;
22476 * Add integers, wrapping at
2^
32. This uses
16-bit operations internally
22477 * to work around bugs in some JS interpreters.
22478 * //dominictarr: this is
10 years old, so maybe this can be dropped?)
22481 function add(x, y) {
22482 return (x + y ) |
0
22483 //lets see how this goes on testling.
22484 // var lsw = (x &
0xFFFF) + (y &
0xFFFF);
22485 // var msw = (x
>> 16) + (y
>> 16) + (lsw
>> 16);
22486 // return (msw <<
16) | (lsw &
0xFFFF);
22490 * Bitwise rotate a
32-bit number to the left.
22492 function rol(num, cnt) {
22493 return (num << cnt) | (num
>>> (
32 - cnt));
22499 },{"util":
14}],
25:[function(_dereq_,module,exports){
22502 * A JavaScript implementation of the Secure Hash Algorithm, SHA-
256, as defined
22504 * Version
2.2-beta Copyright Angel Marin, Paul Johnston
2000 -
2009.
22505 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
22509 var inherits = _dereq_('util').inherits
22512 var u = _dereq_('./util')
22514 module.exports = function (Buffer, Hash) {
22517 0x428A2F98,
0x71374491,
0xB5C0FBCF,
0xE9B5DBA5,
22518 0x3956C25B,
0x59F111F1,
0x923F82A4,
0xAB1C5ED5,
22519 0xD807AA98,
0x12835B01,
0x243185BE,
0x550C7DC3,
22520 0x72BE5D74,
0x80DEB1FE,
0x9BDC06A7,
0xC19BF174,
22521 0xE49B69C1,
0xEFBE4786,
0x0FC19DC6,
0x240CA1CC,
22522 0x2DE92C6F,
0x4A7484AA,
0x5CB0A9DC,
0x76F988DA,
22523 0x983E5152,
0xA831C66D,
0xB00327C8,
0xBF597FC7,
22524 0xC6E00BF3,
0xD5A79147,
0x06CA6351,
0x14292967,
22525 0x27B70A85,
0x2E1B2138,
0x4D2C6DFC,
0x53380D13,
22526 0x650A7354,
0x766A0ABB,
0x81C2C92E,
0x92722C85,
22527 0xA2BFE8A1,
0xA81A664B,
0xC24B8B70,
0xC76C51A3,
22528 0xD192E819,
0xD6990624,
0xF40E3585,
0x106AA070,
22529 0x19A4C116,
0x1E376C08,
0x2748774C,
0x34B0BCB5,
22530 0x391C0CB3,
0x4ED8AA4A,
0x5B9CCA4F,
0x682E6FF3,
22531 0x748F82EE,
0x78A5636F,
0x84C87814,
0x8CC70208,
22532 0x90BEFFFA,
0xA4506CEB,
0xBEF9A3F7,
0xC67178F2
22535 inherits(Sha256, Hash)
22536 var W = new Array(
64)
22538 function Sha256() {
22539 // Closure compiler warning - this code lacks side effects - thus commented out
22540 // if(POOL.length) {
22541 // return POOL.shift().init()
22543 //this._data = new Buffer(
32)
22547 this._w = W //new Array(
64)
22549 Hash.call(this,
16*
4,
14*
4)
22552 Sha256.prototype.init = function () {
22554 this._a =
0x6a09e667|
0
22555 this._b =
0xbb67ae85|
0
22556 this._c =
0x3c6ef372|
0
22557 this._d =
0xa54ff53a|
0
22558 this._e =
0x510e527f|
0
22559 this._f =
0x9b05688c|
0
22560 this._g =
0x1f83d9ab|
0
22561 this._h =
0x5be0cd19|
0
22563 this._len = this._s =
0
22568 var safe_add = function(x, y) {
22569 var lsw = (x &
0xFFFF) + (y &
0xFFFF);
22570 var msw = (x
>> 16) + (y
>> 16) + (lsw
>> 16);
22571 return (msw <<
16) | (lsw &
0xFFFF);
22574 function S (X, n) {
22575 return (X
>>> n) | (X << (
32 - n));
22578 function R (X, n) {
22582 function Ch (x, y, z) {
22583 return ((x & y) ^ ((~x) & z));
22586 function Maj (x, y, z) {
22587 return ((x & y) ^ (x & z) ^ (y & z));
22590 function Sigma0256 (x) {
22591 return (S(x,
2) ^ S(x,
13) ^ S(x,
22));
22594 function Sigma1256 (x) {
22595 return (S(x,
6) ^ S(x,
11) ^ S(x,
25));
22598 function Gamma0256 (x) {
22599 return (S(x,
7) ^ S(x,
18) ^ R(x,
3));
22602 function Gamma1256 (x) {
22603 return (S(x,
17) ^ S(x,
19) ^ R(x,
10));
22606 Sha256.prototype._update = function(m) {
22607 var M = this._block
22609 var a, b, c, d, e, f, g, h
22621 for (var j =
0; j <
64; j++) {
22622 var w = W[j] = j <
16
22623 ? M.readInt32BE(j *
4)
22624 : Gamma1256(W[j -
2]) + W[j -
7] + Gamma0256(W[j -
15]) + W[j -
16]
22626 T1 = h + Sigma1256(e) + Ch(e, f, g) + K[j] + w
22628 T2 = Sigma0256(a) + Maj(a, b, c);
22629 h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2;
22632 this._a = (a + this._a) |
0
22633 this._b = (b + this._b) |
0
22634 this._c = (c + this._c) |
0
22635 this._d = (d + this._d) |
0
22636 this._e = (e + this._e) |
0
22637 this._f = (f + this._f) |
0
22638 this._g = (g + this._g) |
0
22639 this._h = (h + this._h) |
0
22643 Sha256.prototype._hash = function () {
22644 if(POOL.length <
10)
22647 var H = new Buffer(
32)
22649 H.writeInt32BE(this._a,
0)
22650 H.writeInt32BE(this._b,
4)
22651 H.writeInt32BE(this._c,
8)
22652 H.writeInt32BE(this._d,
12)
22653 H.writeInt32BE(this._e,
16)
22654 H.writeInt32BE(this._f,
20)
22655 H.writeInt32BE(this._g,
24)
22656 H.writeInt32BE(this._h,
28)
22665 },{"./util":
26,"util":
14}],
26:[function(_dereq_,module,exports){
22666 exports.write = write
22667 exports.zeroFill = zeroFill
22669 exports.toString = toString
22671 function write (buffer, string, enc, start, from, to, LE) {
22672 var l = (to - from)
22673 if(enc === 'ascii' || enc === 'binary') {
22674 for( var i =
0; i < l; i++) {
22675 buffer[start + i] = string.charCodeAt(i + from)
22678 else if(enc == null) {
22679 for( var i =
0; i < l; i++) {
22680 buffer[start + i] = string[i + from]
22683 else if(enc === 'hex') {
22684 for(var i =
0; i < l; i++) {
22686 buffer[start + i] = parseInt(string[j*
2] + string[(j*
2)+
1],
16)
22689 else if(enc === 'base64') {
22690 throw new Error('base64 encoding not yet supported')
22693 throw new Error(enc +' encoding not yet supported')
22696 //always fill to the end!
22697 function zeroFill(buf, from) {
22698 for(var i = from; i < buf.length; i++)
22703 },{}],
27:[function(_dereq_,module,exports){
22704 (function (Buffer){
22705 // JavaScript PBKDF2 Implementation
22706 // Based on http://git.io/qsv2zw
22707 // Licensed under LGPL v3
22708 // Copyright (c)
2013 jduncanator
22711 var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(
0)
22713 module.exports = function (createHmac, exports) {
22714 exports = exports || {}
22716 exports.pbkdf2 = function(password, salt, iterations, keylen, cb) {
22717 if('function' !== typeof cb)
22718 throw new Error('No callback provided to pbkdf2');
22719 setTimeout(function () {
22720 cb(null, exports.pbkdf2Sync(password, salt, iterations, keylen))
22724 exports.pbkdf2Sync = function(key, salt, iterations, keylen) {
22725 if('number' !== typeof iterations)
22726 throw new TypeError('Iterations not a number')
22728 throw new TypeError('Bad iterations')
22729 if('number' !== typeof keylen)
22730 throw new TypeError('Key length not a number')
22732 throw new TypeError('Bad key length')
22734 //stretch key to the correct length that hmac wants it,
22735 //otherwise this will happen every time hmac is called
22736 //twice per iteration.
22737 var key = !Buffer.isBuffer(key) ? new Buffer(key) : key
22739 if(key.length
> blocksize) {
22740 key = createHash(alg).update(key).digest()
22741 } else if(key.length < blocksize) {
22742 key = Buffer.concat([key, zeroBuffer], blocksize)
22746 var cplen, p =
0, i =
1, itmp = new Buffer(
4), digtmp;
22747 var out = new Buffer(keylen);
22755 /* We are unlikely to ever use more than
256 blocks (
5120 bits!)
22756 * but just in case...
22758 itmp[
0] = (i
>> 24) &
0xff;
22759 itmp[
1] = (i
>> 16) &
0xff;
22760 itmp[
2] = (i
>> 8) &
0xff;
22761 itmp[
3] = i &
0xff;
22763 HMAC = createHmac('sha1', key);
22766 digtmp = HMAC.digest();
22767 digtmp.copy(out, p,
0, cplen);
22769 for(var j =
1; j < iterations; j++) {
22770 HMAC = createHmac('sha1', key);
22771 HMAC.update(digtmp);
22772 digtmp = HMAC.digest();
22773 for(var k =
0; k < cplen; k++) {
22774 out[k] ^= digtmp[k];
22788 }).call(this,_dereq_(
"buffer").Buffer)
22789 },{
"buffer":
8}],
28:[function(_dereq_,module,exports){
22790 (function (Buffer){
22791 // Original code adapted from Robert Kieffer.
22792 // details at https://github.com/broofa/node-uuid
22796 var _global = this;
22798 var mathRNG, whatwgRNG;
22800 // NOTE: Math.random() does not guarantee
"cryptographic quality"
22801 mathRNG = function(size) {
22802 var bytes = new Buffer(size);
22805 for (var i =
0, r; i < size; i++) {
22806 if ((i &
0x03) ==
0) r = Math.random() *
0x100000000;
22807 bytes[i] = r
>>> ((i &
0x03) <<
3) &
0xff;
22813 if (_global.crypto && crypto.getRandomValues) {
22814 whatwgRNG = function(size) {
22815 var bytes = new Buffer(size); //in browserify, this is an extended Uint8Array
22816 crypto.getRandomValues(bytes);
22821 module.exports = whatwgRNG || mathRNG;
22825 }).call(this,_dereq_("buffer").Buffer)
22826 },{"buffer":
8}],
29:[function(_dereq_,module,exports){
22827 ;(function (root, factory, undef) {
22828 if (typeof exports === "object") {
22830 module.exports = exports = factory(_dereq_("./core"), _dereq_("./enc-base64"), _dereq_("./md5"), _dereq_("./evpkdf"), _dereq_("./cipher-core"));
22832 else if (typeof define === "function" && define.amd) {
22834 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
22837 // Global (browser)
22838 factory(root.CryptoJS);
22840 }(this, function (CryptoJS) {
22846 var BlockCipher = C_lib.BlockCipher;
22847 var C_algo = C.algo;
22852 var SUB_MIX_0 = [];
22853 var SUB_MIX_1 = [];
22854 var SUB_MIX_2 = [];
22855 var SUB_MIX_3 = [];
22856 var INV_SUB_MIX_0 = [];
22857 var INV_SUB_MIX_1 = [];
22858 var INV_SUB_MIX_2 = [];
22859 var INV_SUB_MIX_3 = [];
22861 // Compute lookup tables
22863 // Compute double table
22865 for (var i =
0; i <
256; i++) {
22869 d[i] = (i <<
1) ^
0x11b;
22876 for (var i =
0; i <
256; i++) {
22878 var sx = xi ^ (xi <<
1) ^ (xi <<
2) ^ (xi <<
3) ^ (xi <<
4);
22879 sx = (sx
>>> 8) ^ (sx &
0xff) ^
0x63;
22883 // Compute multiplication
22888 // Compute sub bytes, mix columns tables
22889 var t = (d[sx] *
0x101) ^ (sx *
0x1010100);
22890 SUB_MIX_0[x] = (t <<
24) | (t
>>> 8);
22891 SUB_MIX_1[x] = (t <<
16) | (t
>>> 16);
22892 SUB_MIX_2[x] = (t <<
8) | (t
>>> 24);
22895 // Compute inv sub bytes, inv mix columns tables
22896 var t = (x8 *
0x1010101) ^ (x4 *
0x10001) ^ (x2 *
0x101) ^ (x *
0x1010100);
22897 INV_SUB_MIX_0[sx] = (t <<
24) | (t
>>> 8);
22898 INV_SUB_MIX_1[sx] = (t <<
16) | (t
>>> 16);
22899 INV_SUB_MIX_2[sx] = (t <<
8) | (t
>>> 24);
22900 INV_SUB_MIX_3[sx] = t;
22902 // Compute next counter
22906 x = x2 ^ d[d[d[x8 ^ x2]]];
22912 // Precomputed Rcon lookup
22913 var RCON = [
0x00,
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80,
0x1b,
0x36];
22916 * AES block cipher algorithm.
22918 var AES = C_algo.AES = BlockCipher.extend({
22919 _doReset: function () {
22921 var key = this._key;
22922 var keyWords = key.words;
22923 var keySize = key.sigBytes /
4;
22925 // Compute number of rounds
22926 var nRounds = this._nRounds = keySize +
6
22928 // Compute number of key schedule rows
22929 var ksRows = (nRounds +
1) *
4;
22931 // Compute key schedule
22932 var keySchedule = this._keySchedule = [];
22933 for (var ksRow =
0; ksRow < ksRows; ksRow++) {
22934 if (ksRow < keySize) {
22935 keySchedule[ksRow] = keyWords[ksRow];
22937 var t = keySchedule[ksRow -
1];
22939 if (!(ksRow % keySize)) {
22941 t = (t <<
8) | (t
>>> 24);
22944 t = (SBOX[t
>>> 24] <<
24) | (SBOX[(t
>>> 16) &
0xff] <<
16) | (SBOX[(t
>>> 8) &
0xff] <<
8) | SBOX[t &
0xff];
22947 t ^= RCON[(ksRow / keySize) |
0] <<
24;
22948 } else if (keySize
> 6 && ksRow % keySize ==
4) {
22950 t = (SBOX[t
>>> 24] <<
24) | (SBOX[(t
>>> 16) &
0xff] <<
16) | (SBOX[(t
>>> 8) &
0xff] <<
8) | SBOX[t &
0xff];
22953 keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
22957 // Compute inv key schedule
22958 var invKeySchedule = this._invKeySchedule = [];
22959 for (var invKsRow =
0; invKsRow < ksRows; invKsRow++) {
22960 var ksRow = ksRows - invKsRow;
22962 if (invKsRow %
4) {
22963 var t = keySchedule[ksRow];
22965 var t = keySchedule[ksRow -
4];
22968 if (invKsRow <
4 || ksRow <=
4) {
22969 invKeySchedule[invKsRow] = t;
22971 invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t
>>> 24]] ^ INV_SUB_MIX_1[SBOX[(t
>>> 16) &
0xff]] ^
22972 INV_SUB_MIX_2[SBOX[(t
>>> 8) &
0xff]] ^ INV_SUB_MIX_3[SBOX[t &
0xff]];
22977 encryptBlock: function (M, offset) {
22978 this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
22981 decryptBlock: function (M, offset) {
22982 // Swap
2nd and
4th rows
22983 var t = M[offset +
1];
22984 M[offset +
1] = M[offset +
3];
22987 this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
22989 // Inv swap
2nd and
4th rows
22990 var t = M[offset +
1];
22991 M[offset +
1] = M[offset +
3];
22995 _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
22997 var nRounds = this._nRounds;
22999 // Get input, add round key
23000 var s0 = M[offset] ^ keySchedule[
0];
23001 var s1 = M[offset +
1] ^ keySchedule[
1];
23002 var s2 = M[offset +
2] ^ keySchedule[
2];
23003 var s3 = M[offset +
3] ^ keySchedule[
3];
23005 // Key schedule row counter
23009 for (var round =
1; round < nRounds; round++) {
23010 // Shift rows, sub bytes, mix columns, add round key
23011 var t0 = SUB_MIX_0[s0
>>> 24] ^ SUB_MIX_1[(s1
>>> 16) &
0xff] ^ SUB_MIX_2[(s2
>>> 8) &
0xff] ^ SUB_MIX_3[s3 &
0xff] ^ keySchedule[ksRow++];
23012 var t1 = SUB_MIX_0[s1
>>> 24] ^ SUB_MIX_1[(s2
>>> 16) &
0xff] ^ SUB_MIX_2[(s3
>>> 8) &
0xff] ^ SUB_MIX_3[s0 &
0xff] ^ keySchedule[ksRow++];
23013 var t2 = SUB_MIX_0[s2
>>> 24] ^ SUB_MIX_1[(s3
>>> 16) &
0xff] ^ SUB_MIX_2[(s0
>>> 8) &
0xff] ^ SUB_MIX_3[s1 &
0xff] ^ keySchedule[ksRow++];
23014 var t3 = SUB_MIX_0[s3
>>> 24] ^ SUB_MIX_1[(s0
>>> 16) &
0xff] ^ SUB_MIX_2[(s1
>>> 8) &
0xff] ^ SUB_MIX_3[s2 &
0xff] ^ keySchedule[ksRow++];
23023 // Shift rows, sub bytes, add round key
23024 var t0 = ((SBOX[s0
>>> 24] <<
24) | (SBOX[(s1
>>> 16) &
0xff] <<
16) | (SBOX[(s2
>>> 8) &
0xff] <<
8) | SBOX[s3 &
0xff]) ^ keySchedule[ksRow++];
23025 var t1 = ((SBOX[s1
>>> 24] <<
24) | (SBOX[(s2
>>> 16) &
0xff] <<
16) | (SBOX[(s3
>>> 8) &
0xff] <<
8) | SBOX[s0 &
0xff]) ^ keySchedule[ksRow++];
23026 var t2 = ((SBOX[s2
>>> 24] <<
24) | (SBOX[(s3
>>> 16) &
0xff] <<
16) | (SBOX[(s0
>>> 8) &
0xff] <<
8) | SBOX[s1 &
0xff]) ^ keySchedule[ksRow++];
23027 var t3 = ((SBOX[s3
>>> 24] <<
24) | (SBOX[(s0
>>> 16) &
0xff] <<
16) | (SBOX[(s1
>>> 8) &
0xff] <<
8) | SBOX[s2 &
0xff]) ^ keySchedule[ksRow++];
23031 M[offset +
1] = t1;
23032 M[offset +
2] = t2;
23033 M[offset +
3] = t3;
23040 * Shortcut functions to the cipher's object interface.
23044 * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
23045 * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
23047 C.AES = BlockCipher._createHelper(AES);
23051 return CryptoJS.AES;
23054 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
30:[function(_dereq_,module,exports){
23055 ;(function (root, factory) {
23056 if (typeof exports ===
"object") {
23058 module.exports = exports = factory(_dereq_(
"./core"));
23060 else if (typeof define ===
"function" && define.amd) {
23062 define([
"./core"], factory);
23065 // Global (browser)
23066 factory(root.CryptoJS);
23068 }(this, function (CryptoJS) {
23071 * Cipher core components.
23073 CryptoJS.lib.Cipher || (function (undefined) {
23077 var Base = C_lib.Base;
23078 var WordArray = C_lib.WordArray;
23079 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
23081 var Utf8 = C_enc.Utf8;
23082 var Base64 = C_enc.Base64;
23083 var C_algo = C.algo;
23084 var EvpKDF = C_algo.EvpKDF;
23087 * Abstract base cipher template.
23089 * @property {number} keySize This cipher's key size. Default:
4 (
128 bits)
23090 * @property {number} ivSize This cipher's IV size. Default:
4 (
128 bits)
23091 * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
23092 * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
23094 var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
23096 * Configuration options.
23098 * @property {WordArray} iv The IV to use for this operation.
23100 cfg: Base.extend(),
23103 * Creates this cipher in encryption mode.
23105 * @param {WordArray} key The key.
23106 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23108 * @return {Cipher} A cipher instance.
23114 * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
23116 createEncryptor: function (key, cfg) {
23117 return this.create(this._ENC_XFORM_MODE, key, cfg);
23121 * Creates this cipher in decryption mode.
23123 * @param {WordArray} key The key.
23124 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23126 * @return {Cipher} A cipher instance.
23132 * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
23134 createDecryptor: function (key, cfg) {
23135 return this.create(this._DEC_XFORM_MODE, key, cfg);
23139 * Initializes a newly created cipher.
23141 * @param {number} xformMode Either the encryption or decryption transormation mode constant.
23142 * @param {WordArray} key The key.
23143 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23147 * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
23149 init: function (xformMode, key, cfg) {
23150 // Apply config defaults
23151 this.cfg = this.cfg.extend(cfg);
23153 // Store transform mode and key
23154 this._xformMode = xformMode;
23157 // Set initial values
23162 * Resets this cipher to its initial state.
23168 reset: function () {
23169 // Reset data buffer
23170 BufferedBlockAlgorithm.reset.call(this);
23172 // Perform concrete-cipher logic
23177 * Adds data to be encrypted or decrypted.
23179 * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
23181 * @return {WordArray} The data after processing.
23185 * var encrypted = cipher.process('data');
23186 * var encrypted = cipher.process(wordArray);
23188 process: function (dataUpdate) {
23190 this._append(dataUpdate);
23192 // Process available blocks
23193 return this._process();
23197 * Finalizes the encryption or decryption process.
23198 * Note that the finalize operation is effectively a destructive, read-once operation.
23200 * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
23202 * @return {WordArray} The data after final processing.
23206 * var encrypted = cipher.finalize();
23207 * var encrypted = cipher.finalize('data');
23208 * var encrypted = cipher.finalize(wordArray);
23210 finalize: function (dataUpdate) {
23211 // Final data update
23213 this._append(dataUpdate);
23216 // Perform concrete-cipher logic
23217 var finalProcessedData = this._doFinalize();
23219 return finalProcessedData;
23226 _ENC_XFORM_MODE:
1,
23228 _DEC_XFORM_MODE:
2,
23231 * Creates shortcut functions to a cipher's object interface.
23233 * @param {Cipher} cipher The cipher to create a helper for.
23235 * @return {Object} An object with encrypt and decrypt shortcut functions.
23241 * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
23243 _createHelper: (function () {
23244 function selectCipherStrategy(key) {
23245 if (typeof key == 'string') {
23246 return PasswordBasedCipher;
23248 return SerializableCipher;
23252 return function (cipher) {
23254 encrypt: function (message, key, cfg) {
23255 return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
23258 decrypt: function (ciphertext, key, cfg) {
23259 return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
23267 * Abstract base stream cipher template.
23269 * @property {number} blockSize The number of
32-bit words this cipher operates on. Default:
1 (
32 bits)
23271 var StreamCipher = C_lib.StreamCipher = Cipher.extend({
23272 _doFinalize: function () {
23273 // Process partial blocks
23274 var finalProcessedBlocks = this._process(!!'flush');
23276 return finalProcessedBlocks;
23285 var C_mode = C.mode = {};
23288 * Abstract base block cipher mode template.
23290 var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
23292 * Creates this mode for encryption.
23294 * @param {Cipher} cipher A block cipher instance.
23295 * @param {Array} iv The IV words.
23301 * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
23303 createEncryptor: function (cipher, iv) {
23304 return this.Encryptor.create(cipher, iv);
23308 * Creates this mode for decryption.
23310 * @param {Cipher} cipher A block cipher instance.
23311 * @param {Array} iv The IV words.
23317 * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
23319 createDecryptor: function (cipher, iv) {
23320 return this.Decryptor.create(cipher, iv);
23324 * Initializes a newly created mode.
23326 * @param {Cipher} cipher A block cipher instance.
23327 * @param {Array} iv The IV words.
23331 * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
23333 init: function (cipher, iv) {
23334 this._cipher = cipher;
23340 * Cipher Block Chaining mode.
23342 var CBC = C_mode.CBC = (function () {
23344 * Abstract base CBC mode.
23346 var CBC = BlockCipherMode.extend();
23351 CBC.Encryptor = CBC.extend({
23353 * Processes the data block at offset.
23355 * @param {Array} words The data words to operate on.
23356 * @param {number} offset The offset where the block starts.
23360 * mode.processBlock(data.words, offset);
23362 processBlock: function (words, offset) {
23364 var cipher = this._cipher;
23365 var blockSize = cipher.blockSize;
23368 xorBlock.call(this, words, offset, blockSize);
23369 cipher.encryptBlock(words, offset);
23371 // Remember this block to use with next block
23372 this._prevBlock = words.slice(offset, offset + blockSize);
23379 CBC.Decryptor = CBC.extend({
23381 * Processes the data block at offset.
23383 * @param {Array} words The data words to operate on.
23384 * @param {number} offset The offset where the block starts.
23388 * mode.processBlock(data.words, offset);
23390 processBlock: function (words, offset) {
23392 var cipher = this._cipher;
23393 var blockSize = cipher.blockSize;
23395 // Remember this block to use with next block
23396 var thisBlock = words.slice(offset, offset + blockSize);
23399 cipher.decryptBlock(words, offset);
23400 xorBlock.call(this, words, offset, blockSize);
23402 // This block becomes the previous block
23403 this._prevBlock = thisBlock;
23407 function xorBlock(words, offset, blockSize) {
23411 // Choose mixing block
23415 // Remove IV for subsequent blocks
23416 this._iv = undefined;
23418 var block = this._prevBlock;
23422 for (var i =
0; i < blockSize; i++) {
23423 words[offset + i] ^= block[i];
23431 * Padding namespace.
23433 var C_pad = C.pad = {};
23436 * PKCS #
5/
7 padding strategy.
23438 var Pkcs7 = C_pad.Pkcs7 = {
23440 * Pads data using the algorithm defined in PKCS #
5/
7.
23442 * @param {WordArray} data The data to pad.
23443 * @param {number} blockSize The multiple that the data should be padded to.
23449 * CryptoJS.pad.Pkcs7.pad(wordArray,
4);
23451 pad: function (data, blockSize) {
23453 var blockSizeBytes = blockSize *
4;
23455 // Count padding bytes
23456 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
23458 // Create padding word
23459 var paddingWord = (nPaddingBytes <<
24) | (nPaddingBytes <<
16) | (nPaddingBytes <<
8) | nPaddingBytes;
23462 var paddingWords = [];
23463 for (var i =
0; i < nPaddingBytes; i +=
4) {
23464 paddingWords.push(paddingWord);
23466 var padding = WordArray.create(paddingWords, nPaddingBytes);
23469 data.concat(padding);
23473 * Unpads data that had been padded using the algorithm defined in PKCS #
5/
7.
23475 * @param {WordArray} data The data to unpad.
23481 * CryptoJS.pad.Pkcs7.unpad(wordArray);
23483 unpad: function (data) {
23484 // Get number of padding bytes from last byte
23485 var nPaddingBytes = data.words[(data.sigBytes -
1)
>>> 2] &
0xff;
23488 data.sigBytes -= nPaddingBytes;
23493 * Abstract base block cipher template.
23495 * @property {number} blockSize The number of
32-bit words this cipher operates on. Default:
4 (
128 bits)
23497 var BlockCipher = C_lib.BlockCipher = Cipher.extend({
23499 * Configuration options.
23501 * @property {Mode} mode The block mode to use. Default: CBC
23502 * @property {Padding} padding The padding strategy to use. Default: Pkcs7
23504 cfg: Cipher.cfg.extend({
23509 reset: function () {
23511 Cipher.reset.call(this);
23514 var cfg = this.cfg;
23516 var mode = cfg.mode;
23518 // Reset block mode
23519 if (this._xformMode == this._ENC_XFORM_MODE) {
23520 var modeCreator = mode.createEncryptor;
23521 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
23522 var modeCreator = mode.createDecryptor;
23524 // Keep at least one block in the buffer for unpadding
23525 this._minBufferSize =
1;
23527 this._mode = modeCreator.call(mode, this, iv && iv.words);
23530 _doProcessBlock: function (words, offset) {
23531 this._mode.processBlock(words, offset);
23534 _doFinalize: function () {
23536 var padding = this.cfg.padding;
23539 if (this._xformMode == this._ENC_XFORM_MODE) {
23541 padding.pad(this._data, this.blockSize);
23543 // Process final blocks
23544 var finalProcessedBlocks = this._process(!!'flush');
23545 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
23546 // Process final blocks
23547 var finalProcessedBlocks = this._process(!!'flush');
23550 padding.unpad(finalProcessedBlocks);
23553 return finalProcessedBlocks;
23560 * A collection of cipher parameters.
23562 * @property {WordArray} ciphertext The raw ciphertext.
23563 * @property {WordArray} key The key to this ciphertext.
23564 * @property {WordArray} iv The IV used in the ciphering operation.
23565 * @property {WordArray} salt The salt used with a key derivation function.
23566 * @property {Cipher} algorithm The cipher algorithm.
23567 * @property {Mode} mode The block mode used in the ciphering operation.
23568 * @property {Padding} padding The padding scheme used in the ciphering operation.
23569 * @property {number} blockSize The block size of the cipher.
23570 * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
23572 var CipherParams = C_lib.CipherParams = Base.extend({
23574 * Initializes a newly created cipher params object.
23576 * @param {Object} cipherParams An object with any of the possible cipher parameters.
23580 * var cipherParams = CryptoJS.lib.CipherParams.create({
23581 * ciphertext: ciphertextWordArray,
23582 * key: keyWordArray,
23584 * salt: saltWordArray,
23585 * algorithm: CryptoJS.algo.AES,
23586 * mode: CryptoJS.mode.CBC,
23587 * padding: CryptoJS.pad.PKCS7,
23589 * formatter: CryptoJS.format.OpenSSL
23592 init: function (cipherParams) {
23593 this.mixIn(cipherParams);
23597 * Converts this cipher params object to a string.
23599 * @param {Format} formatter (Optional) The formatting strategy to use.
23601 * @return {string} The stringified cipher params.
23603 * @throws Error If neither the formatter nor the default formatter is set.
23607 * var string = cipherParams + '';
23608 * var string = cipherParams.toString();
23609 * var string = cipherParams.toString(CryptoJS.format.OpenSSL);
23611 toString: function (formatter) {
23612 return (formatter || this.formatter).stringify(this);
23617 * Format namespace.
23619 var C_format = C.format = {};
23622 * OpenSSL formatting strategy.
23624 var OpenSSLFormatter = C_format.OpenSSL = {
23626 * Converts a cipher params object to an OpenSSL-compatible string.
23628 * @param {CipherParams} cipherParams The cipher params object.
23630 * @return {string} The OpenSSL-compatible string.
23636 * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
23638 stringify: function (cipherParams) {
23640 var ciphertext = cipherParams.ciphertext;
23641 var salt = cipherParams.salt;
23645 var wordArray = WordArray.create([
0x53616c74,
0x65645f5f]).concat(salt).concat(ciphertext);
23647 var wordArray = ciphertext;
23650 return wordArray.toString(Base64);
23654 * Converts an OpenSSL-compatible string to a cipher params object.
23656 * @param {string} openSSLStr The OpenSSL-compatible string.
23658 * @return {CipherParams} The cipher params object.
23664 * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
23666 parse: function (openSSLStr) {
23668 var ciphertext = Base64.parse(openSSLStr);
23671 var ciphertextWords = ciphertext.words;
23674 if (ciphertextWords[
0] ==
0x53616c74 && ciphertextWords[
1] ==
0x65645f5f) {
23676 var salt = WordArray.create(ciphertextWords.slice(
2,
4));
23678 // Remove salt from ciphertext
23679 ciphertextWords.splice(
0,
4);
23680 ciphertext.sigBytes -=
16;
23683 return CipherParams.create({ ciphertext: ciphertext, salt: salt });
23688 * A cipher wrapper that returns ciphertext as a serializable cipher params object.
23690 var SerializableCipher = C_lib.SerializableCipher = Base.extend({
23692 * Configuration options.
23694 * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
23697 format: OpenSSLFormatter
23701 * Encrypts a message.
23703 * @param {Cipher} cipher The cipher algorithm to use.
23704 * @param {WordArray|string} message The message to encrypt.
23705 * @param {WordArray} key The key.
23706 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23708 * @return {CipherParams} A cipher params object.
23714 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
23715 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
23716 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
23718 encrypt: function (cipher, message, key, cfg) {
23719 // Apply config defaults
23720 cfg = this.cfg.extend(cfg);
23723 var encryptor = cipher.createEncryptor(key, cfg);
23724 var ciphertext = encryptor.finalize(message);
23727 var cipherCfg = encryptor.cfg;
23729 // Create and return serializable cipher params
23730 return CipherParams.create({
23731 ciphertext: ciphertext,
23735 mode: cipherCfg.mode,
23736 padding: cipherCfg.padding,
23737 blockSize: cipher.blockSize,
23738 formatter: cfg.format
23743 * Decrypts serialized ciphertext.
23745 * @param {Cipher} cipher The cipher algorithm to use.
23746 * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
23747 * @param {WordArray} key The key.
23748 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23750 * @return {WordArray} The plaintext.
23756 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
23757 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
23759 decrypt: function (cipher, ciphertext, key, cfg) {
23760 // Apply config defaults
23761 cfg = this.cfg.extend(cfg);
23763 // Convert string to CipherParams
23764 ciphertext = this._parse(ciphertext, cfg.format);
23767 var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
23773 * Converts serialized ciphertext to CipherParams,
23774 * else assumed CipherParams already and returns ciphertext unchanged.
23776 * @param {CipherParams|string} ciphertext The ciphertext.
23777 * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
23779 * @return {CipherParams} The unserialized ciphertext.
23785 * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
23787 _parse: function (ciphertext, format) {
23788 if (typeof ciphertext == 'string') {
23789 return format.parse(ciphertext, this);
23797 * Key derivation function namespace.
23799 var C_kdf = C.kdf = {};
23802 * OpenSSL key derivation function.
23804 var OpenSSLKdf = C_kdf.OpenSSL = {
23806 * Derives a key and IV from a password.
23808 * @param {string} password The password to derive from.
23809 * @param {number} keySize The size in words of the key to generate.
23810 * @param {number} ivSize The size in words of the IV to generate.
23811 * @param {WordArray|string} salt (Optional) A
64-bit salt to use. If omitted, a salt will be generated randomly.
23813 * @return {CipherParams} A cipher params object with the key, IV, and salt.
23819 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password',
256/
32,
128/
32);
23820 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password',
256/
32,
128/
32, 'saltsalt');
23822 execute: function (password, keySize, ivSize, salt) {
23823 // Generate random salt
23825 salt = WordArray.random(
64/
8);
23828 // Derive key and IV
23829 var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
23831 // Separate key and IV
23832 var iv = WordArray.create(key.words.slice(keySize), ivSize *
4);
23833 key.sigBytes = keySize *
4;
23836 return CipherParams.create({ key: key, iv: iv, salt: salt });
23841 * A serializable cipher wrapper that derives the key from a password,
23842 * and returns ciphertext as a serializable cipher params object.
23844 var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
23846 * Configuration options.
23848 * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
23850 cfg: SerializableCipher.cfg.extend({
23855 * Encrypts a message using a password.
23857 * @param {Cipher} cipher The cipher algorithm to use.
23858 * @param {WordArray|string} message The message to encrypt.
23859 * @param {string} password The password.
23860 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23862 * @return {CipherParams} A cipher params object.
23868 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
23869 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
23871 encrypt: function (cipher, message, password, cfg) {
23872 // Apply config defaults
23873 cfg = this.cfg.extend(cfg);
23875 // Derive key and other params
23876 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
23878 // Add IV to config
23879 cfg.iv = derivedParams.iv;
23882 var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
23884 // Mix in derived params
23885 ciphertext.mixIn(derivedParams);
23891 * Decrypts serialized ciphertext using a password.
23893 * @param {Cipher} cipher The cipher algorithm to use.
23894 * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
23895 * @param {string} password The password.
23896 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23898 * @return {WordArray} The plaintext.
23904 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
23905 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
23907 decrypt: function (cipher, ciphertext, password, cfg) {
23908 // Apply config defaults
23909 cfg = this.cfg.extend(cfg);
23911 // Convert string to CipherParams
23912 ciphertext = this._parse(ciphertext, cfg.format);
23914 // Derive key and other params
23915 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
23917 // Add IV to config
23918 cfg.iv = derivedParams.iv;
23921 var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
23930 },{
"./core":
31}],
31:[function(_dereq_,module,exports){
23931 ;(function (root, factory) {
23932 if (typeof exports ===
"object") {
23934 module.exports = exports = factory();
23936 else if (typeof define ===
"function" && define.amd) {
23938 define([], factory);
23941 // Global (browser)
23942 root.CryptoJS = factory();
23944 }(this, function () {
23947 * CryptoJS core components.
23949 var CryptoJS = CryptoJS || (function (Math, undefined) {
23951 * CryptoJS namespace.
23956 * Library namespace.
23958 var C_lib = C.lib = {};
23961 * Base object for prototypal inheritance.
23963 var Base = C_lib.Base = (function () {
23968 * Creates a new object that inherits from this object.
23970 * @param {Object} overrides Properties to copy into the new object.
23972 * @return {Object} The new object.
23978 * var MyType = CryptoJS.lib.Base.extend({
23981 * method: function () {
23985 extend: function (overrides) {
23987 F.prototype = this;
23988 var subtype = new F();
23992 subtype.mixIn(overrides);
23995 // Create default initializer
23996 if (!subtype.hasOwnProperty('init')) {
23997 subtype.init = function () {
23998 subtype.$super.init.apply(this, arguments);
24002 // Initializer's prototype is the subtype object
24003 subtype.init.prototype = subtype;
24005 // Reference supertype
24006 subtype.$super = this;
24012 * Extends this object and runs the init method.
24013 * Arguments to create() will be passed to init().
24015 * @return {Object} The new object.
24021 * var instance = MyType.create();
24023 create: function () {
24024 var instance = this.extend();
24025 instance.init.apply(instance, arguments);
24031 * Initializes a newly created object.
24032 * Override this method to add some logic when your objects are created.
24036 * var MyType = CryptoJS.lib.Base.extend({
24037 * init: function () {
24042 init: function () {
24046 * Copies properties into this object.
24048 * @param {Object} properties The properties to mix in.
24056 mixIn: function (properties) {
24057 for (var propertyName in properties) {
24058 if (properties.hasOwnProperty(propertyName)) {
24059 this[propertyName] = properties[propertyName];
24063 // IE won't copy toString using the loop above
24064 if (properties.hasOwnProperty('toString')) {
24065 this.toString = properties.toString;
24070 * Creates a copy of this object.
24072 * @return {Object} The clone.
24076 * var clone = instance.clone();
24078 clone: function () {
24079 return this.init.prototype.extend(this);
24085 * An array of
32-bit words.
24087 * @property {Array} words The array of
32-bit words.
24088 * @property {number} sigBytes The number of significant bytes in this word array.
24090 var WordArray = C_lib.WordArray = Base.extend({
24092 * Initializes a newly created word array.
24094 * @param {Array} words (Optional) An array of
32-bit words.
24095 * @param {number} sigBytes (Optional) The number of significant bytes in the words.
24099 * var wordArray = CryptoJS.lib.WordArray.create();
24100 * var wordArray = CryptoJS.lib.WordArray.create([
0x00010203,
0x04050607]);
24101 * var wordArray = CryptoJS.lib.WordArray.create([
0x00010203,
0x04050607],
6);
24103 init: function (words, sigBytes) {
24104 words = this.words = words || [];
24106 if (sigBytes != undefined) {
24107 this.sigBytes = sigBytes;
24109 this.sigBytes = words.length *
4;
24114 * Converts this word array to a string.
24116 * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
24118 * @return {string} The stringified word array.
24122 * var string = wordArray + '';
24123 * var string = wordArray.toString();
24124 * var string = wordArray.toString(CryptoJS.enc.Utf8);
24126 toString: function (encoder) {
24127 return (encoder || Hex).stringify(this);
24131 * Concatenates a word array to this word array.
24133 * @param {WordArray} wordArray The word array to append.
24135 * @return {WordArray} This word array.
24139 * wordArray1.concat(wordArray2);
24141 concat: function (wordArray) {
24143 var thisWords = this.words;
24144 var thatWords = wordArray.words;
24145 var thisSigBytes = this.sigBytes;
24146 var thatSigBytes = wordArray.sigBytes;
24148 // Clamp excess bits
24152 if (thisSigBytes %
4) {
24153 // Copy one byte at a time
24154 for (var i =
0; i < thatSigBytes; i++) {
24155 var thatByte = (thatWords[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24156 thisWords[(thisSigBytes + i)
>>> 2] |= thatByte << (
24 - ((thisSigBytes + i) %
4) *
8);
24158 } else if (thatWords.length
> 0xffff) {
24159 // Copy one word at a time
24160 for (var i =
0; i < thatSigBytes; i +=
4) {
24161 thisWords[(thisSigBytes + i)
>>> 2] = thatWords[i
>>> 2];
24164 // Copy all words at once
24165 thisWords.push.apply(thisWords, thatWords);
24167 this.sigBytes += thatSigBytes;
24174 * Removes insignificant bits.
24178 * wordArray.clamp();
24180 clamp: function () {
24182 var words = this.words;
24183 var sigBytes = this.sigBytes;
24186 words[sigBytes
>>> 2] &=
0xffffffff << (
32 - (sigBytes %
4) *
8);
24187 words.length = Math.ceil(sigBytes /
4);
24191 * Creates a copy of this word array.
24193 * @return {WordArray} The clone.
24197 * var clone = wordArray.clone();
24199 clone: function () {
24200 var clone = Base.clone.call(this);
24201 clone.words = this.words.slice(
0);
24207 * Creates a word array filled with random bytes.
24209 * @param {number} nBytes The number of random bytes to generate.
24211 * @return {WordArray} The random word array.
24217 * var wordArray = CryptoJS.lib.WordArray.random(
16);
24219 random: function (nBytes) {
24221 for (var i =
0; i < nBytes; i +=
4) {
24222 words.push((Math.random() *
0x100000000) |
0);
24225 return new WordArray.init(words, nBytes);
24230 * Encoder namespace.
24232 var C_enc = C.enc = {};
24235 * Hex encoding strategy.
24237 var Hex = C_enc.Hex = {
24239 * Converts a word array to a hex string.
24241 * @param {WordArray} wordArray The word array.
24243 * @return {string} The hex string.
24249 * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
24251 stringify: function (wordArray) {
24253 var words = wordArray.words;
24254 var sigBytes = wordArray.sigBytes;
24258 for (var i =
0; i < sigBytes; i++) {
24259 var bite = (words[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24260 hexChars.push((bite
>>> 4).toString(
16));
24261 hexChars.push((bite &
0x0f).toString(
16));
24264 return hexChars.join('');
24268 * Converts a hex string to a word array.
24270 * @param {string} hexStr The hex string.
24272 * @return {WordArray} The word array.
24278 * var wordArray = CryptoJS.enc.Hex.parse(hexString);
24280 parse: function (hexStr) {
24282 var hexStrLength = hexStr.length;
24286 for (var i =
0; i < hexStrLength; i +=
2) {
24287 words[i
>>> 3] |= parseInt(hexStr.substr(i,
2),
16) << (
24 - (i %
8) *
4);
24290 return new WordArray.init(words, hexStrLength /
2);
24295 * Latin1 encoding strategy.
24297 var Latin1 = C_enc.Latin1 = {
24299 * Converts a word array to a Latin1 string.
24301 * @param {WordArray} wordArray The word array.
24303 * @return {string} The Latin1 string.
24309 * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
24311 stringify: function (wordArray) {
24313 var words = wordArray.words;
24314 var sigBytes = wordArray.sigBytes;
24317 var latin1Chars = [];
24318 for (var i =
0; i < sigBytes; i++) {
24319 var bite = (words[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24320 latin1Chars.push(String.fromCharCode(bite));
24323 return latin1Chars.join('');
24327 * Converts a Latin1 string to a word array.
24329 * @param {string} latin1Str The Latin1 string.
24331 * @return {WordArray} The word array.
24337 * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
24339 parse: function (latin1Str) {
24341 var latin1StrLength = latin1Str.length;
24345 for (var i =
0; i < latin1StrLength; i++) {
24346 words[i
>>> 2] |= (latin1Str.charCodeAt(i) &
0xff) << (
24 - (i %
4) *
8);
24349 return new WordArray.init(words, latin1StrLength);
24354 * UTF-
8 encoding strategy.
24356 var Utf8 = C_enc.Utf8 = {
24358 * Converts a word array to a UTF-
8 string.
24360 * @param {WordArray} wordArray The word array.
24362 * @return {string} The UTF-
8 string.
24368 * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
24370 stringify: function (wordArray) {
24372 return decodeURIComponent(escape(Latin1.stringify(wordArray)));
24374 throw new Error('Malformed UTF-
8 data');
24379 * Converts a UTF-
8 string to a word array.
24381 * @param {string} utf8Str The UTF-
8 string.
24383 * @return {WordArray} The word array.
24389 * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
24391 parse: function (utf8Str) {
24392 return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
24397 * Abstract buffered block algorithm template.
24399 * The property blockSize must be implemented in a concrete subtype.
24401 * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default:
0
24403 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
24405 * Resets this block algorithm's data buffer to its initial state.
24409 * bufferedBlockAlgorithm.reset();
24411 reset: function () {
24413 this._data = new WordArray.init();
24414 this._nDataBytes =
0;
24418 * Adds new data to this block algorithm's buffer.
24420 * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-
8.
24424 * bufferedBlockAlgorithm._append('data');
24425 * bufferedBlockAlgorithm._append(wordArray);
24427 _append: function (data) {
24428 // Convert string to WordArray, else assume WordArray already
24429 if (typeof data == 'string') {
24430 data = Utf8.parse(data);
24434 this._data.concat(data);
24435 this._nDataBytes += data.sigBytes;
24439 * Processes available data blocks.
24441 * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
24443 * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
24445 * @return {WordArray} The processed data.
24449 * var processedData = bufferedBlockAlgorithm._process();
24450 * var processedData = bufferedBlockAlgorithm._process(!!'flush');
24452 _process: function (doFlush) {
24454 var data = this._data;
24455 var dataWords = data.words;
24456 var dataSigBytes = data.sigBytes;
24457 var blockSize = this.blockSize;
24458 var blockSizeBytes = blockSize *
4;
24460 // Count blocks ready
24461 var nBlocksReady = dataSigBytes / blockSizeBytes;
24463 // Round up to include partial blocks
24464 nBlocksReady = Math.ceil(nBlocksReady);
24466 // Round down to include only full blocks,
24467 // less the number of blocks that must remain in the buffer
24468 nBlocksReady = Math.max((nBlocksReady |
0) - this._minBufferSize,
0);
24471 // Count words ready
24472 var nWordsReady = nBlocksReady * blockSize;
24474 // Count bytes ready
24475 var nBytesReady = Math.min(nWordsReady *
4, dataSigBytes);
24479 for (var offset =
0; offset < nWordsReady; offset += blockSize) {
24480 // Perform concrete-algorithm logic
24481 this._doProcessBlock(dataWords, offset);
24484 // Remove processed words
24485 var processedWords = dataWords.splice(
0, nWordsReady);
24486 data.sigBytes -= nBytesReady;
24489 // Return processed words
24490 return new WordArray.init(processedWords, nBytesReady);
24494 * Creates a copy of this object.
24496 * @return {Object} The clone.
24500 * var clone = bufferedBlockAlgorithm.clone();
24502 clone: function () {
24503 var clone = Base.clone.call(this);
24504 clone._data = this._data.clone();
24513 * Abstract hasher template.
24515 * @property {number} blockSize The number of
32-bit words this hasher operates on. Default:
16 (
512 bits)
24517 var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
24519 * Configuration options.
24521 cfg: Base.extend(),
24524 * Initializes a newly created hasher.
24526 * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
24530 * var hasher = CryptoJS.algo.SHA256.create();
24532 init: function (cfg) {
24533 // Apply config defaults
24534 this.cfg = this.cfg.extend(cfg);
24536 // Set initial values
24541 * Resets this hasher to its initial state.
24547 reset: function () {
24548 // Reset data buffer
24549 BufferedBlockAlgorithm.reset.call(this);
24551 // Perform concrete-hasher logic
24556 * Updates this hasher with a message.
24558 * @param {WordArray|string} messageUpdate The message to append.
24560 * @return {Hasher} This hasher.
24564 * hasher.update('message');
24565 * hasher.update(wordArray);
24567 update: function (messageUpdate) {
24569 this._append(messageUpdate);
24579 * Finalizes the hash computation.
24580 * Note that the finalize operation is effectively a destructive, read-once operation.
24582 * @param {WordArray|string} messageUpdate (Optional) A final message update.
24584 * @return {WordArray} The hash.
24588 * var hash = hasher.finalize();
24589 * var hash = hasher.finalize('message');
24590 * var hash = hasher.finalize(wordArray);
24592 finalize: function (messageUpdate) {
24593 // Final message update
24594 if (messageUpdate) {
24595 this._append(messageUpdate);
24598 // Perform concrete-hasher logic
24599 var hash = this._doFinalize();
24607 * Creates a shortcut function to a hasher's object interface.
24609 * @param {Hasher} hasher The hasher to create a helper for.
24611 * @return {Function} The shortcut function.
24617 * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
24619 _createHelper: function (hasher) {
24620 return function (message, cfg) {
24621 return new hasher.init(cfg).finalize(message);
24626 * Creates a shortcut function to the HMAC's object interface.
24628 * @param {Hasher} hasher The hasher to use in this HMAC helper.
24630 * @return {Function} The shortcut function.
24636 * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
24638 _createHmacHelper: function (hasher) {
24639 return function (message, key) {
24640 return new C_algo.HMAC.init(hasher, key).finalize(message);
24646 * Algorithm namespace.
24648 var C_algo = C.algo = {};
24657 },{}],
32:[function(_dereq_,module,exports){
24658 ;(function (root, factory) {
24659 if (typeof exports ===
"object") {
24661 module.exports = exports = factory(_dereq_(
"./core"));
24663 else if (typeof define ===
"function" && define.amd) {
24665 define([
"./core"], factory);
24668 // Global (browser)
24669 factory(root.CryptoJS);
24671 }(this, function (CryptoJS) {
24677 var WordArray = C_lib.WordArray;
24681 * Base64 encoding strategy.
24683 var Base64 = C_enc.Base64 = {
24685 * Converts a word array to a Base64 string.
24687 * @param {WordArray} wordArray The word array.
24689 * @return {string} The Base64 string.
24695 * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
24697 stringify: function (wordArray) {
24699 var words = wordArray.words;
24700 var sigBytes = wordArray.sigBytes;
24701 var map = this._map;
24703 // Clamp excess bits
24707 var base64Chars = [];
24708 for (var i =
0; i < sigBytes; i +=
3) {
24709 var byte1 = (words[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24710 var byte2 = (words[(i +
1)
>>> 2]
>>> (
24 - ((i +
1) %
4) *
8)) &
0xff;
24711 var byte3 = (words[(i +
2)
>>> 2]
>>> (
24 - ((i +
2) %
4) *
8)) &
0xff;
24713 var triplet = (byte1 <<
16) | (byte2 <<
8) | byte3;
24715 for (var j =
0; (j <
4) && (i + j *
0.75 < sigBytes); j++) {
24716 base64Chars.push(map.charAt((triplet
>>> (
6 * (
3 - j))) &
0x3f));
24721 var paddingChar = map.charAt(
64);
24723 while (base64Chars.length %
4) {
24724 base64Chars.push(paddingChar);
24728 return base64Chars.join('');
24732 * Converts a Base64 string to a word array.
24734 * @param {string} base64Str The Base64 string.
24736 * @return {WordArray} The word array.
24742 * var wordArray = CryptoJS.enc.Base64.parse(base64String);
24744 parse: function (base64Str) {
24746 var base64StrLength = base64Str.length;
24747 var map = this._map;
24750 var paddingChar = map.charAt(
64);
24752 var paddingIndex = base64Str.indexOf(paddingChar);
24753 if (paddingIndex != -
1) {
24754 base64StrLength = paddingIndex;
24761 for (var i =
0; i < base64StrLength; i++) {
24763 var bits1 = map.indexOf(base64Str.charAt(i -
1)) << ((i %
4) *
2);
24764 var bits2 = map.indexOf(base64Str.charAt(i))
>>> (
6 - (i %
4) *
2);
24765 words[nBytes
>>> 2] |= (bits1 | bits2) << (
24 - (nBytes %
4) *
8);
24770 return WordArray.create(words, nBytes);
24773 _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
24778 return CryptoJS.enc.Base64;
24781 },{
"./core":
31}],
33:[function(_dereq_,module,exports){
24782 ;(function (root, factory) {
24783 if (typeof exports ===
"object") {
24785 module.exports = exports = factory(_dereq_(
"./core"));
24787 else if (typeof define ===
"function" && define.amd) {
24789 define([
"./core"], factory);
24792 // Global (browser)
24793 factory(root.CryptoJS);
24795 }(this, function (CryptoJS) {
24801 var WordArray = C_lib.WordArray;
24805 * UTF-
16 BE encoding strategy.
24807 var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
24809 * Converts a word array to a UTF-
16 BE string.
24811 * @param {WordArray} wordArray The word array.
24813 * @return {string} The UTF-
16 BE string.
24819 * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
24821 stringify: function (wordArray) {
24823 var words = wordArray.words;
24824 var sigBytes = wordArray.sigBytes;
24827 var utf16Chars = [];
24828 for (var i =
0; i < sigBytes; i +=
2) {
24829 var codePoint = (words[i
>>> 2]
>>> (
16 - (i %
4) *
8)) &
0xffff;
24830 utf16Chars.push(String.fromCharCode(codePoint));
24833 return utf16Chars.join('');
24837 * Converts a UTF-
16 BE string to a word array.
24839 * @param {string} utf16Str The UTF-
16 BE string.
24841 * @return {WordArray} The word array.
24847 * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
24849 parse: function (utf16Str) {
24851 var utf16StrLength = utf16Str.length;
24855 for (var i =
0; i < utf16StrLength; i++) {
24856 words[i
>>> 1] |= utf16Str.charCodeAt(i) << (
16 - (i %
2) *
16);
24859 return WordArray.create(words, utf16StrLength *
2);
24864 * UTF-
16 LE encoding strategy.
24868 * Converts a word array to a UTF-
16 LE string.
24870 * @param {WordArray} wordArray The word array.
24872 * @return {string} The UTF-
16 LE string.
24878 * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
24880 stringify: function (wordArray) {
24882 var words = wordArray.words;
24883 var sigBytes = wordArray.sigBytes;
24886 var utf16Chars = [];
24887 for (var i =
0; i < sigBytes; i +=
2) {
24888 var codePoint = swapEndian((words[i
>>> 2]
>>> (
16 - (i %
4) *
8)) &
0xffff);
24889 utf16Chars.push(String.fromCharCode(codePoint));
24892 return utf16Chars.join('');
24896 * Converts a UTF-
16 LE string to a word array.
24898 * @param {string} utf16Str The UTF-
16 LE string.
24900 * @return {WordArray} The word array.
24906 * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
24908 parse: function (utf16Str) {
24910 var utf16StrLength = utf16Str.length;
24914 for (var i =
0; i < utf16StrLength; i++) {
24915 words[i
>>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (
16 - (i %
2) *
16));
24918 return WordArray.create(words, utf16StrLength *
2);
24922 function swapEndian(word) {
24923 return ((word <<
8) &
0xff00ff00) | ((word
>>> 8) &
0x00ff00ff);
24928 return CryptoJS.enc.Utf16;
24931 },{
"./core":
31}],
34:[function(_dereq_,module,exports){
24932 ;(function (root, factory, undef) {
24933 if (typeof exports ===
"object") {
24935 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./sha1"), _dereq_(
"./hmac"));
24937 else if (typeof define ===
"function" && define.amd) {
24939 define([
"./core",
"./sha1",
"./hmac"], factory);
24942 // Global (browser)
24943 factory(root.CryptoJS);
24945 }(this, function (CryptoJS) {
24951 var Base = C_lib.Base;
24952 var WordArray = C_lib.WordArray;
24953 var C_algo = C.algo;
24954 var MD5 = C_algo.MD5;
24957 * This key derivation function is meant to conform with EVP_BytesToKey.
24958 * www.openssl.org/docs/crypto/EVP_BytesToKey.html
24960 var EvpKDF = C_algo.EvpKDF = Base.extend({
24962 * Configuration options.
24964 * @property {number} keySize The key size in words to generate. Default:
4 (
128 bits)
24965 * @property {Hasher} hasher The hash algorithm to use. Default: MD5
24966 * @property {number} iterations The number of iterations to perform. Default:
1
24975 * Initializes a newly created key derivation function.
24977 * @param {Object} cfg (Optional) The configuration options to use for the derivation.
24981 * var kdf = CryptoJS.algo.EvpKDF.create();
24982 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize:
8 });
24983 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize:
8, iterations:
1000 });
24985 init: function (cfg) {
24986 this.cfg = this.cfg.extend(cfg);
24990 * Derives a key from a password.
24992 * @param {WordArray|string} password The password.
24993 * @param {WordArray|string} salt A salt.
24995 * @return {WordArray} The derived key.
24999 * var key = kdf.compute(password, salt);
25001 compute: function (password, salt) {
25003 var cfg = this.cfg;
25006 var hasher = cfg.hasher.create();
25009 var derivedKey = WordArray.create();
25012 var derivedKeyWords = derivedKey.words;
25013 var keySize = cfg.keySize;
25014 var iterations = cfg.iterations;
25017 while (derivedKeyWords.length < keySize) {
25019 hasher.update(block);
25021 var block = hasher.update(password).finalize(salt);
25025 for (var i =
1; i < iterations; i++) {
25026 block = hasher.finalize(block);
25030 derivedKey.concat(block);
25032 derivedKey.sigBytes = keySize *
4;
25039 * Derives a key from a password.
25041 * @param {WordArray|string} password The password.
25042 * @param {WordArray|string} salt A salt.
25043 * @param {Object} cfg (Optional) The configuration options to use for this computation.
25045 * @return {WordArray} The derived key.
25051 * var key = CryptoJS.EvpKDF(password, salt);
25052 * var key = CryptoJS.EvpKDF(password, salt, { keySize:
8 });
25053 * var key = CryptoJS.EvpKDF(password, salt, { keySize:
8, iterations:
1000 });
25055 C.EvpKDF = function (password, salt, cfg) {
25056 return EvpKDF.create(cfg).compute(password, salt);
25061 return CryptoJS.EvpKDF;
25064 },{
"./core":
31,
"./hmac":
36,
"./sha1":
55}],
35:[function(_dereq_,module,exports){
25065 ;(function (root, factory, undef) {
25066 if (typeof exports ===
"object") {
25068 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25070 else if (typeof define ===
"function" && define.amd) {
25072 define([
"./core",
"./cipher-core"], factory);
25075 // Global (browser)
25076 factory(root.CryptoJS);
25078 }(this, function (CryptoJS) {
25080 (function (undefined) {
25084 var CipherParams = C_lib.CipherParams;
25086 var Hex = C_enc.Hex;
25087 var C_format = C.format;
25089 var HexFormatter = C_format.Hex = {
25091 * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
25093 * @param {CipherParams} cipherParams The cipher params object.
25095 * @return {string} The hexadecimally encoded string.
25101 * var hexString = CryptoJS.format.Hex.stringify(cipherParams);
25103 stringify: function (cipherParams) {
25104 return cipherParams.ciphertext.toString(Hex);
25108 * Converts a hexadecimally encoded ciphertext string to a cipher params object.
25110 * @param {string} input The hexadecimally encoded string.
25112 * @return {CipherParams} The cipher params object.
25118 * var cipherParams = CryptoJS.format.Hex.parse(hexString);
25120 parse: function (input) {
25121 var ciphertext = Hex.parse(input);
25122 return CipherParams.create({ ciphertext: ciphertext });
25128 return CryptoJS.format.Hex;
25131 },{
"./cipher-core":
30,
"./core":
31}],
36:[function(_dereq_,module,exports){
25132 ;(function (root, factory) {
25133 if (typeof exports ===
"object") {
25135 module.exports = exports = factory(_dereq_(
"./core"));
25137 else if (typeof define ===
"function" && define.amd) {
25139 define([
"./core"], factory);
25142 // Global (browser)
25143 factory(root.CryptoJS);
25145 }(this, function (CryptoJS) {
25151 var Base = C_lib.Base;
25153 var Utf8 = C_enc.Utf8;
25154 var C_algo = C.algo;
25159 var HMAC = C_algo.HMAC = Base.extend({
25161 * Initializes a newly created HMAC.
25163 * @param {Hasher} hasher The hash algorithm to use.
25164 * @param {WordArray|string} key The secret key.
25168 * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
25170 init: function (hasher, key) {
25172 hasher = this._hasher = new hasher.init();
25174 // Convert string to WordArray, else assume WordArray already
25175 if (typeof key == 'string') {
25176 key = Utf8.parse(key);
25180 var hasherBlockSize = hasher.blockSize;
25181 var hasherBlockSizeBytes = hasherBlockSize *
4;
25183 // Allow arbitrary length keys
25184 if (key.sigBytes
> hasherBlockSizeBytes) {
25185 key = hasher.finalize(key);
25188 // Clamp excess bits
25191 // Clone key for inner and outer pads
25192 var oKey = this._oKey = key.clone();
25193 var iKey = this._iKey = key.clone();
25196 var oKeyWords = oKey.words;
25197 var iKeyWords = iKey.words;
25199 // XOR keys with pad constants
25200 for (var i =
0; i < hasherBlockSize; i++) {
25201 oKeyWords[i] ^=
0x5c5c5c5c;
25202 iKeyWords[i] ^=
0x36363636;
25204 oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
25206 // Set initial values
25211 * Resets this HMAC to its initial state.
25215 * hmacHasher.reset();
25217 reset: function () {
25219 var hasher = this._hasher;
25223 hasher.update(this._iKey);
25227 * Updates this HMAC with a message.
25229 * @param {WordArray|string} messageUpdate The message to append.
25231 * @return {HMAC} This HMAC instance.
25235 * hmacHasher.update('message');
25236 * hmacHasher.update(wordArray);
25238 update: function (messageUpdate) {
25239 this._hasher.update(messageUpdate);
25246 * Finalizes the HMAC computation.
25247 * Note that the finalize operation is effectively a destructive, read-once operation.
25249 * @param {WordArray|string} messageUpdate (Optional) A final message update.
25251 * @return {WordArray} The HMAC.
25255 * var hmac = hmacHasher.finalize();
25256 * var hmac = hmacHasher.finalize('message');
25257 * var hmac = hmacHasher.finalize(wordArray);
25259 finalize: function (messageUpdate) {
25261 var hasher = this._hasher;
25264 var innerHash = hasher.finalize(messageUpdate);
25266 var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
25275 },{"./core":
31}],
37:[function(_dereq_,module,exports){
25276 ;(function (root, factory, undef) {
25277 if (typeof exports === "object") {
25279 module.exports = exports = factory(_dereq_("./core"), _dereq_("./x64-core"), _dereq_("./lib-typedarrays"), _dereq_("./enc-utf16"), _dereq_("./enc-base64"), _dereq_("./md5"), _dereq_("./sha1"), _dereq_("./sha256"), _dereq_("./sha224"), _dereq_("./sha512"), _dereq_("./sha384"), _dereq_("./sha3"), _dereq_("./ripemd160"), _dereq_("./hmac"), _dereq_("./pbkdf2"), _dereq_("./evpkdf"), _dereq_("./cipher-core"), _dereq_("./mode-cfb"), _dereq_("./mode-ctr"), _dereq_("./mode-ctr-gladman"), _dereq_("./mode-ofb"), _dereq_("./mode-ecb"), _dereq_("./pad-ansix923"), _dereq_("./pad-iso10126"), _dereq_("./pad-iso97971"), _dereq_("./pad-zeropadding"), _dereq_("./pad-nopadding"), _dereq_("./format-hex"), _dereq_("./aes"), _dereq_("./tripledes"), _dereq_("./rc4"), _dereq_("./rabbit"), _dereq_("./rabbit-legacy"));
25281 else if (typeof define === "function" && define.amd) {
25283 define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory);
25286 // Global (browser)
25287 factory(root.CryptoJS);
25289 }(this, function (CryptoJS) {
25294 },{"./aes":
29,"./cipher-core":
30,"./core":
31,"./enc-base64":
32,"./enc-utf16":
33,"./evpkdf":
34,"./format-hex":
35,"./hmac":
36,"./lib-typedarrays":
38,"./md5":
39,"./mode-cfb":
40,"./mode-ctr":
42,"./mode-ctr-gladman":
41,"./mode-ecb":
43,"./mode-ofb":
44,"./pad-ansix923":
45,"./pad-iso10126":
46,"./pad-iso97971":
47,"./pad-nopadding":
48,"./pad-zeropadding":
49,"./pbkdf2":
50,"./rabbit":
52,"./rabbit-legacy":
51,"./rc4":
53,"./ripemd160":
54,"./sha1":
55,"./sha224":
56,"./sha256":
57,"./sha3":
58,"./sha384":
59,"./sha512":
60,"./tripledes":
61,"./x64-core":
62}],
38:[function(_dereq_,module,exports){
25295 ;(function (root, factory) {
25296 if (typeof exports === "object") {
25298 module.exports = exports = factory(_dereq_("./core"));
25300 else if (typeof define === "function" && define.amd) {
25302 define(["./core"], factory);
25305 // Global (browser)
25306 factory(root.CryptoJS);
25308 }(this, function (CryptoJS) {
25311 // Check if typed arrays are supported
25312 if (typeof ArrayBuffer != 'function') {
25319 var WordArray = C_lib.WordArray;
25321 // Reference original init
25322 var superInit = WordArray.init;
25324 // Augment WordArray.init to handle typed arrays
25325 var subInit = WordArray.init = function (typedArray) {
25326 // Convert buffers to uint8
25327 if (typedArray instanceof ArrayBuffer) {
25328 typedArray = new Uint8Array(typedArray);
25331 // Convert other array views to uint8
25333 typedArray instanceof Int8Array ||
25334 typedArray instanceof Uint8ClampedArray ||
25335 typedArray instanceof Int16Array ||
25336 typedArray instanceof Uint16Array ||
25337 typedArray instanceof Int32Array ||
25338 typedArray instanceof Uint32Array ||
25339 typedArray instanceof Float32Array ||
25340 typedArray instanceof Float64Array
25342 typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
25345 // Handle Uint8Array
25346 if (typedArray instanceof Uint8Array) {
25348 var typedArrayByteLength = typedArray.byteLength;
25352 for (var i =
0; i < typedArrayByteLength; i++) {
25353 words[i
>>> 2] |= typedArray[i] << (
24 - (i %
4) *
8);
25356 // Initialize this word array
25357 superInit.call(this, words, typedArrayByteLength);
25359 // Else call normal init
25360 superInit.apply(this, arguments);
25364 subInit.prototype = WordArray;
25368 return CryptoJS.lib.WordArray;
25371 },{
"./core":
31}],
39:[function(_dereq_,module,exports){
25372 ;(function (root, factory) {
25373 if (typeof exports ===
"object") {
25375 module.exports = exports = factory(_dereq_(
"./core"));
25377 else if (typeof define ===
"function" && define.amd) {
25379 define([
"./core"], factory);
25382 // Global (browser)
25383 factory(root.CryptoJS);
25385 }(this, function (CryptoJS) {
25391 var WordArray = C_lib.WordArray;
25392 var Hasher = C_lib.Hasher;
25393 var C_algo = C.algo;
25398 // Compute constants
25400 for (var i =
0; i <
64; i++) {
25401 T[i] = (Math.abs(Math.sin(i +
1)) *
0x100000000) |
0;
25406 * MD5 hash algorithm.
25408 var MD5 = C_algo.MD5 = Hasher.extend({
25409 _doReset: function () {
25410 this._hash = new WordArray.init([
25411 0x67452301,
0xefcdab89,
25412 0x98badcfe,
0x10325476
25416 _doProcessBlock: function (M, offset) {
25418 for (var i =
0; i <
16; i++) {
25420 var offset_i = offset + i;
25421 var M_offset_i = M[offset_i];
25424 (((M_offset_i <<
8) | (M_offset_i
>>> 24)) &
0x00ff00ff) |
25425 (((M_offset_i <<
24) | (M_offset_i
>>> 8)) &
0xff00ff00)
25430 var H = this._hash.words;
25432 var M_offset_0 = M[offset +
0];
25433 var M_offset_1 = M[offset +
1];
25434 var M_offset_2 = M[offset +
2];
25435 var M_offset_3 = M[offset +
3];
25436 var M_offset_4 = M[offset +
4];
25437 var M_offset_5 = M[offset +
5];
25438 var M_offset_6 = M[offset +
6];
25439 var M_offset_7 = M[offset +
7];
25440 var M_offset_8 = M[offset +
8];
25441 var M_offset_9 = M[offset +
9];
25442 var M_offset_10 = M[offset +
10];
25443 var M_offset_11 = M[offset +
11];
25444 var M_offset_12 = M[offset +
12];
25445 var M_offset_13 = M[offset +
13];
25446 var M_offset_14 = M[offset +
14];
25447 var M_offset_15 = M[offset +
15];
25449 // Working varialbes
25456 a = FF(a, b, c, d, M_offset_0,
7, T[
0]);
25457 d = FF(d, a, b, c, M_offset_1,
12, T[
1]);
25458 c = FF(c, d, a, b, M_offset_2,
17, T[
2]);
25459 b = FF(b, c, d, a, M_offset_3,
22, T[
3]);
25460 a = FF(a, b, c, d, M_offset_4,
7, T[
4]);
25461 d = FF(d, a, b, c, M_offset_5,
12, T[
5]);
25462 c = FF(c, d, a, b, M_offset_6,
17, T[
6]);
25463 b = FF(b, c, d, a, M_offset_7,
22, T[
7]);
25464 a = FF(a, b, c, d, M_offset_8,
7, T[
8]);
25465 d = FF(d, a, b, c, M_offset_9,
12, T[
9]);
25466 c = FF(c, d, a, b, M_offset_10,
17, T[
10]);
25467 b = FF(b, c, d, a, M_offset_11,
22, T[
11]);
25468 a = FF(a, b, c, d, M_offset_12,
7, T[
12]);
25469 d = FF(d, a, b, c, M_offset_13,
12, T[
13]);
25470 c = FF(c, d, a, b, M_offset_14,
17, T[
14]);
25471 b = FF(b, c, d, a, M_offset_15,
22, T[
15]);
25473 a = GG(a, b, c, d, M_offset_1,
5, T[
16]);
25474 d = GG(d, a, b, c, M_offset_6,
9, T[
17]);
25475 c = GG(c, d, a, b, M_offset_11,
14, T[
18]);
25476 b = GG(b, c, d, a, M_offset_0,
20, T[
19]);
25477 a = GG(a, b, c, d, M_offset_5,
5, T[
20]);
25478 d = GG(d, a, b, c, M_offset_10,
9, T[
21]);
25479 c = GG(c, d, a, b, M_offset_15,
14, T[
22]);
25480 b = GG(b, c, d, a, M_offset_4,
20, T[
23]);
25481 a = GG(a, b, c, d, M_offset_9,
5, T[
24]);
25482 d = GG(d, a, b, c, M_offset_14,
9, T[
25]);
25483 c = GG(c, d, a, b, M_offset_3,
14, T[
26]);
25484 b = GG(b, c, d, a, M_offset_8,
20, T[
27]);
25485 a = GG(a, b, c, d, M_offset_13,
5, T[
28]);
25486 d = GG(d, a, b, c, M_offset_2,
9, T[
29]);
25487 c = GG(c, d, a, b, M_offset_7,
14, T[
30]);
25488 b = GG(b, c, d, a, M_offset_12,
20, T[
31]);
25490 a = HH(a, b, c, d, M_offset_5,
4, T[
32]);
25491 d = HH(d, a, b, c, M_offset_8,
11, T[
33]);
25492 c = HH(c, d, a, b, M_offset_11,
16, T[
34]);
25493 b = HH(b, c, d, a, M_offset_14,
23, T[
35]);
25494 a = HH(a, b, c, d, M_offset_1,
4, T[
36]);
25495 d = HH(d, a, b, c, M_offset_4,
11, T[
37]);
25496 c = HH(c, d, a, b, M_offset_7,
16, T[
38]);
25497 b = HH(b, c, d, a, M_offset_10,
23, T[
39]);
25498 a = HH(a, b, c, d, M_offset_13,
4, T[
40]);
25499 d = HH(d, a, b, c, M_offset_0,
11, T[
41]);
25500 c = HH(c, d, a, b, M_offset_3,
16, T[
42]);
25501 b = HH(b, c, d, a, M_offset_6,
23, T[
43]);
25502 a = HH(a, b, c, d, M_offset_9,
4, T[
44]);
25503 d = HH(d, a, b, c, M_offset_12,
11, T[
45]);
25504 c = HH(c, d, a, b, M_offset_15,
16, T[
46]);
25505 b = HH(b, c, d, a, M_offset_2,
23, T[
47]);
25507 a = II(a, b, c, d, M_offset_0,
6, T[
48]);
25508 d = II(d, a, b, c, M_offset_7,
10, T[
49]);
25509 c = II(c, d, a, b, M_offset_14,
15, T[
50]);
25510 b = II(b, c, d, a, M_offset_5,
21, T[
51]);
25511 a = II(a, b, c, d, M_offset_12,
6, T[
52]);
25512 d = II(d, a, b, c, M_offset_3,
10, T[
53]);
25513 c = II(c, d, a, b, M_offset_10,
15, T[
54]);
25514 b = II(b, c, d, a, M_offset_1,
21, T[
55]);
25515 a = II(a, b, c, d, M_offset_8,
6, T[
56]);
25516 d = II(d, a, b, c, M_offset_15,
10, T[
57]);
25517 c = II(c, d, a, b, M_offset_6,
15, T[
58]);
25518 b = II(b, c, d, a, M_offset_13,
21, T[
59]);
25519 a = II(a, b, c, d, M_offset_4,
6, T[
60]);
25520 d = II(d, a, b, c, M_offset_11,
10, T[
61]);
25521 c = II(c, d, a, b, M_offset_2,
15, T[
62]);
25522 b = II(b, c, d, a, M_offset_9,
21, T[
63]);
25524 // Intermediate hash value
25525 H[
0] = (H[
0] + a) |
0;
25526 H[
1] = (H[
1] + b) |
0;
25527 H[
2] = (H[
2] + c) |
0;
25528 H[
3] = (H[
3] + d) |
0;
25531 _doFinalize: function () {
25533 var data = this._data;
25534 var dataWords = data.words;
25536 var nBitsTotal = this._nDataBytes *
8;
25537 var nBitsLeft = data.sigBytes *
8;
25540 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
25542 var nBitsTotalH = Math.floor(nBitsTotal /
0x100000000);
25543 var nBitsTotalL = nBitsTotal;
25544 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
15] = (
25545 (((nBitsTotalH <<
8) | (nBitsTotalH
>>> 24)) &
0x00ff00ff) |
25546 (((nBitsTotalH <<
24) | (nBitsTotalH
>>> 8)) &
0xff00ff00)
25548 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = (
25549 (((nBitsTotalL <<
8) | (nBitsTotalL
>>> 24)) &
0x00ff00ff) |
25550 (((nBitsTotalL <<
24) | (nBitsTotalL
>>> 8)) &
0xff00ff00)
25553 data.sigBytes = (dataWords.length +
1) *
4;
25555 // Hash final blocks
25559 var hash = this._hash;
25560 var H = hash.words;
25563 for (var i =
0; i <
4; i++) {
25567 H[i] = (((H_i <<
8) | (H_i
>>> 24)) &
0x00ff00ff) |
25568 (((H_i <<
24) | (H_i
>>> 8)) &
0xff00ff00);
25571 // Return final computed hash
25575 clone: function () {
25576 var clone = Hasher.clone.call(this);
25577 clone._hash = this._hash.clone();
25583 function FF(a, b, c, d, x, s, t) {
25584 var n = a + ((b & c) | (~b & d)) + x + t;
25585 return ((n << s) | (n
>>> (
32 - s))) + b;
25588 function GG(a, b, c, d, x, s, t) {
25589 var n = a + ((b & d) | (c & ~d)) + x + t;
25590 return ((n << s) | (n
>>> (
32 - s))) + b;
25593 function HH(a, b, c, d, x, s, t) {
25594 var n = a + (b ^ c ^ d) + x + t;
25595 return ((n << s) | (n
>>> (
32 - s))) + b;
25598 function II(a, b, c, d, x, s, t) {
25599 var n = a + (c ^ (b | ~d)) + x + t;
25600 return ((n << s) | (n
>>> (
32 - s))) + b;
25604 * Shortcut function to the hasher's object interface.
25606 * @param {WordArray|string} message The message to hash.
25608 * @return {WordArray} The hash.
25614 * var hash = CryptoJS.MD5('message');
25615 * var hash = CryptoJS.MD5(wordArray);
25617 C.MD5 = Hasher._createHelper(MD5);
25620 * Shortcut function to the HMAC's object interface.
25622 * @param {WordArray|string} message The message to hash.
25623 * @param {WordArray|string} key The secret key.
25625 * @return {WordArray} The HMAC.
25631 * var hmac = CryptoJS.HmacMD5(message, key);
25633 C.HmacMD5 = Hasher._createHmacHelper(MD5);
25637 return CryptoJS.MD5;
25640 },{"./core":
31}],
40:[function(_dereq_,module,exports){
25641 ;(function (root, factory, undef) {
25642 if (typeof exports === "object") {
25644 module.exports = exports = factory(_dereq_("./core"), _dereq_("./cipher-core"));
25646 else if (typeof define === "function" && define.amd) {
25648 define(["./core", "./cipher-core"], factory);
25651 // Global (browser)
25652 factory(root.CryptoJS);
25654 }(this, function (CryptoJS) {
25657 * Cipher Feedback block mode.
25659 CryptoJS.mode.CFB = (function () {
25660 var CFB = CryptoJS.lib.BlockCipherMode.extend();
25662 CFB.Encryptor = CFB.extend({
25663 processBlock: function (words, offset) {
25665 var cipher = this._cipher;
25666 var blockSize = cipher.blockSize;
25668 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
25670 // Remember this block to use with next block
25671 this._prevBlock = words.slice(offset, offset + blockSize);
25675 CFB.Decryptor = CFB.extend({
25676 processBlock: function (words, offset) {
25678 var cipher = this._cipher;
25679 var blockSize = cipher.blockSize;
25681 // Remember this block to use with next block
25682 var thisBlock = words.slice(offset, offset + blockSize);
25684 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
25686 // This block becomes the previous block
25687 this._prevBlock = thisBlock;
25691 function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
25695 // Generate keystream
25697 var keystream = iv.slice(
0);
25699 // Remove IV for subsequent blocks
25700 this._iv = undefined;
25702 var keystream = this._prevBlock;
25704 cipher.encryptBlock(keystream,
0);
25707 for (var i =
0; i < blockSize; i++) {
25708 words[offset + i] ^= keystream[i];
25716 return CryptoJS.mode.CFB;
25719 },{"./cipher-core":
30,"./core":
31}],
41:[function(_dereq_,module,exports){
25720 ;(function (root, factory, undef) {
25721 if (typeof exports === "object") {
25723 module.exports = exports = factory(_dereq_("./core"), _dereq_("./cipher-core"));
25725 else if (typeof define === "function" && define.amd) {
25727 define(["./core", "./cipher-core"], factory);
25730 // Global (browser)
25731 factory(root.CryptoJS);
25733 }(this, function (CryptoJS) {
25736 * Counter block mode compatible with Dr Brian Gladman fileenc.c
25737 * derived from CryptoJS.mode.CTR
25738 * Jan Hruby jhruby.web@gmail.com
25740 CryptoJS.mode.CTRGladman = (function () {
25741 var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
25743 function incWord(word)
25745 if (((word
>> 24) &
0xff) ===
0xff) { //overflow
25746 var b1 = (word
>> 16)
&0xff;
25747 var b2 = (word
>> 8)
&0xff;
25748 var b3 = word &
0xff;
25750 if (b1 ===
0xff) // overflow b1
25776 word += (b1 <<
16);
25782 word += (
0x01 <<
24);
25787 function incCounter(counter)
25789 if ((counter[
0] = incWord(counter[
0])) ===
0)
25791 // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j <
8
25792 counter[
1] = incWord(counter[
1]);
25797 var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
25798 processBlock: function (words, offset) {
25800 var cipher = this._cipher
25801 var blockSize = cipher.blockSize;
25803 var counter = this._counter;
25805 // Generate keystream
25807 counter = this._counter = iv.slice(
0);
25809 // Remove IV for subsequent blocks
25810 this._iv = undefined;
25813 incCounter(counter);
25815 var keystream = counter.slice(
0);
25816 cipher.encryptBlock(keystream,
0);
25819 for (var i =
0; i < blockSize; i++) {
25820 words[offset + i] ^= keystream[i];
25825 CTRGladman.Decryptor = Encryptor;
25833 return CryptoJS.mode.CTRGladman;
25836 },{
"./cipher-core":
30,
"./core":
31}],
42:[function(_dereq_,module,exports){
25837 ;(function (root, factory, undef) {
25838 if (typeof exports ===
"object") {
25840 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25842 else if (typeof define ===
"function" && define.amd) {
25844 define([
"./core",
"./cipher-core"], factory);
25847 // Global (browser)
25848 factory(root.CryptoJS);
25850 }(this, function (CryptoJS) {
25853 * Counter block mode.
25855 CryptoJS.mode.CTR = (function () {
25856 var CTR = CryptoJS.lib.BlockCipherMode.extend();
25858 var Encryptor = CTR.Encryptor = CTR.extend({
25859 processBlock: function (words, offset) {
25861 var cipher = this._cipher
25862 var blockSize = cipher.blockSize;
25864 var counter = this._counter;
25866 // Generate keystream
25868 counter = this._counter = iv.slice(
0);
25870 // Remove IV for subsequent blocks
25871 this._iv = undefined;
25873 var keystream = counter.slice(
0);
25874 cipher.encryptBlock(keystream,
0);
25876 // Increment counter
25877 counter[blockSize -
1] = (counter[blockSize -
1] +
1) |
0
25880 for (var i =
0; i < blockSize; i++) {
25881 words[offset + i] ^= keystream[i];
25886 CTR.Decryptor = Encryptor;
25892 return CryptoJS.mode.CTR;
25895 },{
"./cipher-core":
30,
"./core":
31}],
43:[function(_dereq_,module,exports){
25896 ;(function (root, factory, undef) {
25897 if (typeof exports ===
"object") {
25899 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25901 else if (typeof define ===
"function" && define.amd) {
25903 define([
"./core",
"./cipher-core"], factory);
25906 // Global (browser)
25907 factory(root.CryptoJS);
25909 }(this, function (CryptoJS) {
25912 * Electronic Codebook block mode.
25914 CryptoJS.mode.ECB = (function () {
25915 var ECB = CryptoJS.lib.BlockCipherMode.extend();
25917 ECB.Encryptor = ECB.extend({
25918 processBlock: function (words, offset) {
25919 this._cipher.encryptBlock(words, offset);
25923 ECB.Decryptor = ECB.extend({
25924 processBlock: function (words, offset) {
25925 this._cipher.decryptBlock(words, offset);
25933 return CryptoJS.mode.ECB;
25936 },{
"./cipher-core":
30,
"./core":
31}],
44:[function(_dereq_,module,exports){
25937 ;(function (root, factory, undef) {
25938 if (typeof exports ===
"object") {
25940 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25942 else if (typeof define ===
"function" && define.amd) {
25944 define([
"./core",
"./cipher-core"], factory);
25947 // Global (browser)
25948 factory(root.CryptoJS);
25950 }(this, function (CryptoJS) {
25953 * Output Feedback block mode.
25955 CryptoJS.mode.OFB = (function () {
25956 var OFB = CryptoJS.lib.BlockCipherMode.extend();
25958 var Encryptor = OFB.Encryptor = OFB.extend({
25959 processBlock: function (words, offset) {
25961 var cipher = this._cipher
25962 var blockSize = cipher.blockSize;
25964 var keystream = this._keystream;
25966 // Generate keystream
25968 keystream = this._keystream = iv.slice(
0);
25970 // Remove IV for subsequent blocks
25971 this._iv = undefined;
25973 cipher.encryptBlock(keystream,
0);
25976 for (var i =
0; i < blockSize; i++) {
25977 words[offset + i] ^= keystream[i];
25982 OFB.Decryptor = Encryptor;
25988 return CryptoJS.mode.OFB;
25991 },{
"./cipher-core":
30,
"./core":
31}],
45:[function(_dereq_,module,exports){
25992 ;(function (root, factory, undef) {
25993 if (typeof exports ===
"object") {
25995 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25997 else if (typeof define ===
"function" && define.amd) {
25999 define([
"./core",
"./cipher-core"], factory);
26002 // Global (browser)
26003 factory(root.CryptoJS);
26005 }(this, function (CryptoJS) {
26008 * ANSI X
.923 padding strategy.
26010 CryptoJS.pad.AnsiX923 = {
26011 pad: function (data, blockSize) {
26013 var dataSigBytes = data.sigBytes;
26014 var blockSizeBytes = blockSize *
4;
26016 // Count padding bytes
26017 var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
26019 // Compute last byte position
26020 var lastBytePos = dataSigBytes + nPaddingBytes -
1;
26024 data.words[lastBytePos
>>> 2] |= nPaddingBytes << (
24 - (lastBytePos %
4) *
8);
26025 data.sigBytes += nPaddingBytes;
26028 unpad: function (data) {
26029 // Get number of padding bytes from last byte
26030 var nPaddingBytes = data.words[(data.sigBytes -
1)
>>> 2] &
0xff;
26033 data.sigBytes -= nPaddingBytes;
26038 return CryptoJS.pad.Ansix923;
26041 },{
"./cipher-core":
30,
"./core":
31}],
46:[function(_dereq_,module,exports){
26042 ;(function (root, factory, undef) {
26043 if (typeof exports ===
"object") {
26045 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26047 else if (typeof define ===
"function" && define.amd) {
26049 define([
"./core",
"./cipher-core"], factory);
26052 // Global (browser)
26053 factory(root.CryptoJS);
26055 }(this, function (CryptoJS) {
26058 * ISO
10126 padding strategy.
26060 CryptoJS.pad.Iso10126 = {
26061 pad: function (data, blockSize) {
26063 var blockSizeBytes = blockSize *
4;
26065 // Count padding bytes
26066 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
26069 data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes -
1)).
26070 concat(CryptoJS.lib.WordArray.create([nPaddingBytes <<
24],
1));
26073 unpad: function (data) {
26074 // Get number of padding bytes from last byte
26075 var nPaddingBytes = data.words[(data.sigBytes -
1)
>>> 2] &
0xff;
26078 data.sigBytes -= nPaddingBytes;
26083 return CryptoJS.pad.Iso10126;
26086 },{
"./cipher-core":
30,
"./core":
31}],
47:[function(_dereq_,module,exports){
26087 ;(function (root, factory, undef) {
26088 if (typeof exports ===
"object") {
26090 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26092 else if (typeof define ===
"function" && define.amd) {
26094 define([
"./core",
"./cipher-core"], factory);
26097 // Global (browser)
26098 factory(root.CryptoJS);
26100 }(this, function (CryptoJS) {
26103 * ISO/IEC
9797-
1 Padding Method
2.
26105 CryptoJS.pad.Iso97971 = {
26106 pad: function (data, blockSize) {
26108 data.concat(CryptoJS.lib.WordArray.create([
0x80000000],
1));
26110 // Zero pad the rest
26111 CryptoJS.pad.ZeroPadding.pad(data, blockSize);
26114 unpad: function (data) {
26115 // Remove zero padding
26116 CryptoJS.pad.ZeroPadding.unpad(data);
26118 // Remove one more byte -- the
0x80 byte
26124 return CryptoJS.pad.Iso97971;
26127 },{
"./cipher-core":
30,
"./core":
31}],
48:[function(_dereq_,module,exports){
26128 ;(function (root, factory, undef) {
26129 if (typeof exports ===
"object") {
26131 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26133 else if (typeof define ===
"function" && define.amd) {
26135 define([
"./core",
"./cipher-core"], factory);
26138 // Global (browser)
26139 factory(root.CryptoJS);
26141 }(this, function (CryptoJS) {
26144 * A noop padding strategy.
26146 CryptoJS.pad.NoPadding = {
26150 unpad: function () {
26155 return CryptoJS.pad.NoPadding;
26158 },{
"./cipher-core":
30,
"./core":
31}],
49:[function(_dereq_,module,exports){
26159 ;(function (root, factory, undef) {
26160 if (typeof exports ===
"object") {
26162 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26164 else if (typeof define ===
"function" && define.amd) {
26166 define([
"./core",
"./cipher-core"], factory);
26169 // Global (browser)
26170 factory(root.CryptoJS);
26172 }(this, function (CryptoJS) {
26175 * Zero padding strategy.
26177 CryptoJS.pad.ZeroPadding = {
26178 pad: function (data, blockSize) {
26180 var blockSizeBytes = blockSize *
4;
26184 data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
26187 unpad: function (data) {
26189 var dataWords = data.words;
26192 var i = data.sigBytes -
1;
26193 while (!((dataWords[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff)) {
26196 data.sigBytes = i +
1;
26201 return CryptoJS.pad.ZeroPadding;
26204 },{"./cipher-core":
30,"./core":
31}],
50:[function(_dereq_,module,exports){
26205 ;(function (root, factory, undef) {
26206 if (typeof exports === "object") {
26208 module.exports = exports = factory(_dereq_("./core"), _dereq_("./sha1"), _dereq_("./hmac"));
26210 else if (typeof define === "function" && define.amd) {
26212 define(["./core", "./sha1", "./hmac"], factory);
26215 // Global (browser)
26216 factory(root.CryptoJS);
26218 }(this, function (CryptoJS) {
26224 var Base = C_lib.Base;
26225 var WordArray = C_lib.WordArray;
26226 var C_algo = C.algo;
26227 var SHA1 = C_algo.SHA1;
26228 var HMAC = C_algo.HMAC;
26231 * Password-Based Key Derivation Function
2 algorithm.
26233 var PBKDF2 = C_algo.PBKDF2 = Base.extend({
26235 * Configuration options.
26237 * @property {number} keySize The key size in words to generate. Default:
4 (
128 bits)
26238 * @property {Hasher} hasher The hasher to use. Default: SHA1
26239 * @property {number} iterations The number of iterations to perform. Default:
1
26248 * Initializes a newly created key derivation function.
26250 * @param {Object} cfg (Optional) The configuration options to use for the derivation.
26254 * var kdf = CryptoJS.algo.PBKDF2.create();
26255 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize:
8 });
26256 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize:
8, iterations:
1000 });
26258 init: function (cfg) {
26259 this.cfg = this.cfg.extend(cfg);
26263 * Computes the Password-Based Key Derivation Function
2.
26265 * @param {WordArray|string} password The password.
26266 * @param {WordArray|string} salt A salt.
26268 * @return {WordArray} The derived key.
26272 * var key = kdf.compute(password, salt);
26274 compute: function (password, salt) {
26276 var cfg = this.cfg;
26279 var hmac = HMAC.create(cfg.hasher, password);
26282 var derivedKey = WordArray.create();
26283 var blockIndex = WordArray.create([
0x00000001]);
26286 var derivedKeyWords = derivedKey.words;
26287 var blockIndexWords = blockIndex.words;
26288 var keySize = cfg.keySize;
26289 var iterations = cfg.iterations;
26292 while (derivedKeyWords.length < keySize) {
26293 var block = hmac.update(salt).finalize(blockIndex);
26297 var blockWords = block.words;
26298 var blockWordsLength = blockWords.length;
26301 var intermediate = block;
26302 for (var i =
1; i < iterations; i++) {
26303 intermediate = hmac.finalize(intermediate);
26307 var intermediateWords = intermediate.words;
26309 // XOR intermediate with block
26310 for (var j =
0; j < blockWordsLength; j++) {
26311 blockWords[j] ^= intermediateWords[j];
26315 derivedKey.concat(block);
26316 blockIndexWords[
0]++;
26318 derivedKey.sigBytes = keySize *
4;
26325 * Computes the Password-Based Key Derivation Function
2.
26327 * @param {WordArray|string} password The password.
26328 * @param {WordArray|string} salt A salt.
26329 * @param {Object} cfg (Optional) The configuration options to use for this computation.
26331 * @return {WordArray} The derived key.
26337 * var key = CryptoJS.PBKDF2(password, salt);
26338 * var key = CryptoJS.PBKDF2(password, salt, { keySize:
8 });
26339 * var key = CryptoJS.PBKDF2(password, salt, { keySize:
8, iterations:
1000 });
26341 C.PBKDF2 = function (password, salt, cfg) {
26342 return PBKDF2.create(cfg).compute(password, salt);
26347 return CryptoJS.PBKDF2;
26350 },{"./core":
31,"./hmac":
36,"./sha1":
55}],
51:[function(_dereq_,module,exports){
26351 ;(function (root, factory, undef) {
26352 if (typeof exports === "object") {
26354 module.exports = exports = factory(_dereq_("./core"), _dereq_("./enc-base64"), _dereq_("./md5"), _dereq_("./evpkdf"), _dereq_("./cipher-core"));
26356 else if (typeof define === "function" && define.amd) {
26358 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
26361 // Global (browser)
26362 factory(root.CryptoJS);
26364 }(this, function (CryptoJS) {
26370 var StreamCipher = C_lib.StreamCipher;
26371 var C_algo = C.algo;
26373 // Reusable objects
26379 * Rabbit stream cipher algorithm.
26381 * This is a legacy version that neglected to convert the key to little-endian.
26382 * This error doesn't affect the cipher's security,
26383 * but it does affect its compatibility with other implementations.
26385 var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
26386 _doReset: function () {
26388 var K = this._key.words;
26389 var iv = this.cfg.iv;
26391 // Generate initial state values
26392 var X = this._X = [
26393 K[
0], (K[
3] <<
16) | (K[
2]
>>> 16),
26394 K[
1], (K[
0] <<
16) | (K[
3]
>>> 16),
26395 K[
2], (K[
1] <<
16) | (K[
0]
>>> 16),
26396 K[
3], (K[
2] <<
16) | (K[
1]
>>> 16)
26399 // Generate initial counter values
26400 var C = this._C = [
26401 (K[
2] <<
16) | (K[
2]
>>> 16), (K[
0] &
0xffff0000) | (K[
1] &
0x0000ffff),
26402 (K[
3] <<
16) | (K[
3]
>>> 16), (K[
1] &
0xffff0000) | (K[
2] &
0x0000ffff),
26403 (K[
0] <<
16) | (K[
0]
>>> 16), (K[
2] &
0xffff0000) | (K[
3] &
0x0000ffff),
26404 (K[
1] <<
16) | (K[
1]
>>> 16), (K[
3] &
0xffff0000) | (K[
0] &
0x0000ffff)
26410 // Iterate the system four times
26411 for (var i =
0; i <
4; i++) {
26412 nextState.call(this);
26415 // Modify the counters
26416 for (var i =
0; i <
8; i++) {
26417 C[i] ^= X[(i +
4) &
7];
26427 // Generate four subvectors
26428 var i0 = (((IV_0 <<
8) | (IV_0
>>> 24)) &
0x00ff00ff) | (((IV_0 <<
24) | (IV_0
>>> 8)) &
0xff00ff00);
26429 var i2 = (((IV_1 <<
8) | (IV_1
>>> 24)) &
0x00ff00ff) | (((IV_1 <<
24) | (IV_1
>>> 8)) &
0xff00ff00);
26430 var i1 = (i0
>>> 16) | (i2 &
0xffff0000);
26431 var i3 = (i2 <<
16) | (i0 &
0x0000ffff);
26433 // Modify counter values
26443 // Iterate the system four times
26444 for (var i =
0; i <
4; i++) {
26445 nextState.call(this);
26450 _doProcessBlock: function (M, offset) {
26454 // Iterate the system
26455 nextState.call(this);
26457 // Generate four keystream words
26458 S[
0] = X[
0] ^ (X[
5]
>>> 16) ^ (X[
3] <<
16);
26459 S[
1] = X[
2] ^ (X[
7]
>>> 16) ^ (X[
5] <<
16);
26460 S[
2] = X[
4] ^ (X[
1]
>>> 16) ^ (X[
7] <<
16);
26461 S[
3] = X[
6] ^ (X[
3]
>>> 16) ^ (X[
1] <<
16);
26463 for (var i =
0; i <
4; i++) {
26465 S[i] = (((S[i] <<
8) | (S[i]
>>> 24)) &
0x00ff00ff) |
26466 (((S[i] <<
24) | (S[i]
>>> 8)) &
0xff00ff00);
26469 M[offset + i] ^= S[i];
26478 function nextState() {
26483 // Save old counter values
26484 for (var i =
0; i <
8; i++) {
26488 // Calculate new counter values
26489 C[
0] = (C[
0] +
0x4d34d34d + this._b) |
0;
26490 C[
1] = (C[
1] +
0xd34d34d3 + ((C[
0]
>>> 0) < (C_[
0]
>>> 0) ?
1 :
0)) |
0;
26491 C[
2] = (C[
2] +
0x34d34d34 + ((C[
1]
>>> 0) < (C_[
1]
>>> 0) ?
1 :
0)) |
0;
26492 C[
3] = (C[
3] +
0x4d34d34d + ((C[
2]
>>> 0) < (C_[
2]
>>> 0) ?
1 :
0)) |
0;
26493 C[
4] = (C[
4] +
0xd34d34d3 + ((C[
3]
>>> 0) < (C_[
3]
>>> 0) ?
1 :
0)) |
0;
26494 C[
5] = (C[
5] +
0x34d34d34 + ((C[
4]
>>> 0) < (C_[
4]
>>> 0) ?
1 :
0)) |
0;
26495 C[
6] = (C[
6] +
0x4d34d34d + ((C[
5]
>>> 0) < (C_[
5]
>>> 0) ?
1 :
0)) |
0;
26496 C[
7] = (C[
7] +
0xd34d34d3 + ((C[
6]
>>> 0) < (C_[
6]
>>> 0) ?
1 :
0)) |
0;
26497 this._b = (C[
7]
>>> 0) < (C_[
7]
>>> 0) ?
1 :
0;
26499 // Calculate the g-values
26500 for (var i =
0; i <
8; i++) {
26501 var gx = X[i] + C[i];
26503 // Construct high and low argument for squaring
26504 var ga = gx &
0xffff;
26505 var gb = gx
>>> 16;
26507 // Calculate high and low result of squaring
26508 var gh = ((((ga * ga)
>>> 17) + ga * gb)
>>> 15) + gb * gb;
26509 var gl = (((gx &
0xffff0000) * gx) |
0) + (((gx &
0x0000ffff) * gx) |
0);
26515 // Calculate new state values
26516 X[
0] = (G[
0] + ((G[
7] <<
16) | (G[
7]
>>> 16)) + ((G[
6] <<
16) | (G[
6]
>>> 16))) |
0;
26517 X[
1] = (G[
1] + ((G[
0] <<
8) | (G[
0]
>>> 24)) + G[
7]) |
0;
26518 X[
2] = (G[
2] + ((G[
1] <<
16) | (G[
1]
>>> 16)) + ((G[
0] <<
16) | (G[
0]
>>> 16))) |
0;
26519 X[
3] = (G[
3] + ((G[
2] <<
8) | (G[
2]
>>> 24)) + G[
1]) |
0;
26520 X[
4] = (G[
4] + ((G[
3] <<
16) | (G[
3]
>>> 16)) + ((G[
2] <<
16) | (G[
2]
>>> 16))) |
0;
26521 X[
5] = (G[
5] + ((G[
4] <<
8) | (G[
4]
>>> 24)) + G[
3]) |
0;
26522 X[
6] = (G[
6] + ((G[
5] <<
16) | (G[
5]
>>> 16)) + ((G[
4] <<
16) | (G[
4]
>>> 16))) |
0;
26523 X[
7] = (G[
7] + ((G[
6] <<
8) | (G[
6]
>>> 24)) + G[
5]) |
0;
26527 * Shortcut functions to the cipher's object interface.
26531 * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
26532 * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
26534 C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
26538 return CryptoJS.RabbitLegacy;
26541 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
52:[function(_dereq_,module,exports){
26542 ;(function (root, factory, undef) {
26543 if (typeof exports ===
"object") {
26545 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./enc-base64"), _dereq_(
"./md5"), _dereq_(
"./evpkdf"), _dereq_(
"./cipher-core"));
26547 else if (typeof define ===
"function" && define.amd) {
26549 define([
"./core",
"./enc-base64",
"./md5",
"./evpkdf",
"./cipher-core"], factory);
26552 // Global (browser)
26553 factory(root.CryptoJS);
26555 }(this, function (CryptoJS) {
26561 var StreamCipher = C_lib.StreamCipher;
26562 var C_algo = C.algo;
26564 // Reusable objects
26570 * Rabbit stream cipher algorithm
26572 var Rabbit = C_algo.Rabbit = StreamCipher.extend({
26573 _doReset: function () {
26575 var K = this._key.words;
26576 var iv = this.cfg.iv;
26579 for (var i =
0; i <
4; i++) {
26580 K[i] = (((K[i] <<
8) | (K[i]
>>> 24)) &
0x00ff00ff) |
26581 (((K[i] <<
24) | (K[i]
>>> 8)) &
0xff00ff00);
26584 // Generate initial state values
26585 var X = this._X = [
26586 K[
0], (K[
3] <<
16) | (K[
2]
>>> 16),
26587 K[
1], (K[
0] <<
16) | (K[
3]
>>> 16),
26588 K[
2], (K[
1] <<
16) | (K[
0]
>>> 16),
26589 K[
3], (K[
2] <<
16) | (K[
1]
>>> 16)
26592 // Generate initial counter values
26593 var C = this._C = [
26594 (K[
2] <<
16) | (K[
2]
>>> 16), (K[
0] &
0xffff0000) | (K[
1] &
0x0000ffff),
26595 (K[
3] <<
16) | (K[
3]
>>> 16), (K[
1] &
0xffff0000) | (K[
2] &
0x0000ffff),
26596 (K[
0] <<
16) | (K[
0]
>>> 16), (K[
2] &
0xffff0000) | (K[
3] &
0x0000ffff),
26597 (K[
1] <<
16) | (K[
1]
>>> 16), (K[
3] &
0xffff0000) | (K[
0] &
0x0000ffff)
26603 // Iterate the system four times
26604 for (var i =
0; i <
4; i++) {
26605 nextState.call(this);
26608 // Modify the counters
26609 for (var i =
0; i <
8; i++) {
26610 C[i] ^= X[(i +
4) &
7];
26620 // Generate four subvectors
26621 var i0 = (((IV_0 <<
8) | (IV_0
>>> 24)) &
0x00ff00ff) | (((IV_0 <<
24) | (IV_0
>>> 8)) &
0xff00ff00);
26622 var i2 = (((IV_1 <<
8) | (IV_1
>>> 24)) &
0x00ff00ff) | (((IV_1 <<
24) | (IV_1
>>> 8)) &
0xff00ff00);
26623 var i1 = (i0
>>> 16) | (i2 &
0xffff0000);
26624 var i3 = (i2 <<
16) | (i0 &
0x0000ffff);
26626 // Modify counter values
26636 // Iterate the system four times
26637 for (var i =
0; i <
4; i++) {
26638 nextState.call(this);
26643 _doProcessBlock: function (M, offset) {
26647 // Iterate the system
26648 nextState.call(this);
26650 // Generate four keystream words
26651 S[
0] = X[
0] ^ (X[
5]
>>> 16) ^ (X[
3] <<
16);
26652 S[
1] = X[
2] ^ (X[
7]
>>> 16) ^ (X[
5] <<
16);
26653 S[
2] = X[
4] ^ (X[
1]
>>> 16) ^ (X[
7] <<
16);
26654 S[
3] = X[
6] ^ (X[
3]
>>> 16) ^ (X[
1] <<
16);
26656 for (var i =
0; i <
4; i++) {
26658 S[i] = (((S[i] <<
8) | (S[i]
>>> 24)) &
0x00ff00ff) |
26659 (((S[i] <<
24) | (S[i]
>>> 8)) &
0xff00ff00);
26662 M[offset + i] ^= S[i];
26671 function nextState() {
26676 // Save old counter values
26677 for (var i =
0; i <
8; i++) {
26681 // Calculate new counter values
26682 C[
0] = (C[
0] +
0x4d34d34d + this._b) |
0;
26683 C[
1] = (C[
1] +
0xd34d34d3 + ((C[
0]
>>> 0) < (C_[
0]
>>> 0) ?
1 :
0)) |
0;
26684 C[
2] = (C[
2] +
0x34d34d34 + ((C[
1]
>>> 0) < (C_[
1]
>>> 0) ?
1 :
0)) |
0;
26685 C[
3] = (C[
3] +
0x4d34d34d + ((C[
2]
>>> 0) < (C_[
2]
>>> 0) ?
1 :
0)) |
0;
26686 C[
4] = (C[
4] +
0xd34d34d3 + ((C[
3]
>>> 0) < (C_[
3]
>>> 0) ?
1 :
0)) |
0;
26687 C[
5] = (C[
5] +
0x34d34d34 + ((C[
4]
>>> 0) < (C_[
4]
>>> 0) ?
1 :
0)) |
0;
26688 C[
6] = (C[
6] +
0x4d34d34d + ((C[
5]
>>> 0) < (C_[
5]
>>> 0) ?
1 :
0)) |
0;
26689 C[
7] = (C[
7] +
0xd34d34d3 + ((C[
6]
>>> 0) < (C_[
6]
>>> 0) ?
1 :
0)) |
0;
26690 this._b = (C[
7]
>>> 0) < (C_[
7]
>>> 0) ?
1 :
0;
26692 // Calculate the g-values
26693 for (var i =
0; i <
8; i++) {
26694 var gx = X[i] + C[i];
26696 // Construct high and low argument for squaring
26697 var ga = gx &
0xffff;
26698 var gb = gx
>>> 16;
26700 // Calculate high and low result of squaring
26701 var gh = ((((ga * ga)
>>> 17) + ga * gb)
>>> 15) + gb * gb;
26702 var gl = (((gx &
0xffff0000) * gx) |
0) + (((gx &
0x0000ffff) * gx) |
0);
26708 // Calculate new state values
26709 X[
0] = (G[
0] + ((G[
7] <<
16) | (G[
7]
>>> 16)) + ((G[
6] <<
16) | (G[
6]
>>> 16))) |
0;
26710 X[
1] = (G[
1] + ((G[
0] <<
8) | (G[
0]
>>> 24)) + G[
7]) |
0;
26711 X[
2] = (G[
2] + ((G[
1] <<
16) | (G[
1]
>>> 16)) + ((G[
0] <<
16) | (G[
0]
>>> 16))) |
0;
26712 X[
3] = (G[
3] + ((G[
2] <<
8) | (G[
2]
>>> 24)) + G[
1]) |
0;
26713 X[
4] = (G[
4] + ((G[
3] <<
16) | (G[
3]
>>> 16)) + ((G[
2] <<
16) | (G[
2]
>>> 16))) |
0;
26714 X[
5] = (G[
5] + ((G[
4] <<
8) | (G[
4]
>>> 24)) + G[
3]) |
0;
26715 X[
6] = (G[
6] + ((G[
5] <<
16) | (G[
5]
>>> 16)) + ((G[
4] <<
16) | (G[
4]
>>> 16))) |
0;
26716 X[
7] = (G[
7] + ((G[
6] <<
8) | (G[
6]
>>> 24)) + G[
5]) |
0;
26720 * Shortcut functions to the cipher's object interface.
26724 * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
26725 * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
26727 C.Rabbit = StreamCipher._createHelper(Rabbit);
26731 return CryptoJS.Rabbit;
26734 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
53:[function(_dereq_,module,exports){
26735 ;(function (root, factory, undef) {
26736 if (typeof exports ===
"object") {
26738 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./enc-base64"), _dereq_(
"./md5"), _dereq_(
"./evpkdf"), _dereq_(
"./cipher-core"));
26740 else if (typeof define ===
"function" && define.amd) {
26742 define([
"./core",
"./enc-base64",
"./md5",
"./evpkdf",
"./cipher-core"], factory);
26745 // Global (browser)
26746 factory(root.CryptoJS);
26748 }(this, function (CryptoJS) {
26754 var StreamCipher = C_lib.StreamCipher;
26755 var C_algo = C.algo;
26758 * RC4 stream cipher algorithm.
26760 var RC4 = C_algo.RC4 = StreamCipher.extend({
26761 _doReset: function () {
26763 var key = this._key;
26764 var keyWords = key.words;
26765 var keySigBytes = key.sigBytes;
26768 var S = this._S = [];
26769 for (var i =
0; i <
256; i++) {
26774 for (var i =
0, j =
0; i <
256; i++) {
26775 var keyByteIndex = i % keySigBytes;
26776 var keyByte = (keyWords[keyByteIndex
>>> 2]
>>> (
24 - (keyByteIndex %
4) *
8)) &
0xff;
26778 j = (j + S[i] + keyByte) %
256;
26787 this._i = this._j =
0;
26790 _doProcessBlock: function (M, offset) {
26791 M[offset] ^= generateKeystreamWord.call(this);
26799 function generateKeystreamWord() {
26805 // Generate keystream word
26806 var keystreamWord =
0;
26807 for (var n =
0; n <
4; n++) {
26809 j = (j + S[i]) %
256;
26816 keystreamWord |= S[(S[i] + S[j]) %
256] << (
24 - n *
8);
26823 return keystreamWord;
26827 * Shortcut functions to the cipher's object interface.
26831 * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
26832 * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
26834 C.RC4 = StreamCipher._createHelper(RC4);
26837 * Modified RC4 stream cipher algorithm.
26839 var RC4Drop = C_algo.RC4Drop = RC4.extend({
26841 * Configuration options.
26843 * @property {number} drop The number of keystream words to drop. Default
192
26845 cfg: RC4.cfg.extend({
26849 _doReset: function () {
26850 RC4._doReset.call(this);
26853 for (var i = this.cfg.drop; i
> 0; i--) {
26854 generateKeystreamWord.call(this);
26860 * Shortcut functions to the cipher's object interface.
26864 * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
26865 * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
26867 C.RC4Drop = StreamCipher._createHelper(RC4Drop);
26871 return CryptoJS.RC4;
26874 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
54:[function(_dereq_,module,exports){
26875 ;(function (root, factory) {
26876 if (typeof exports ===
"object") {
26878 module.exports = exports = factory(_dereq_(
"./core"));
26880 else if (typeof define ===
"function" && define.amd) {
26882 define([
"./core"], factory);
26885 // Global (browser)
26886 factory(root.CryptoJS);
26888 }(this, function (CryptoJS) {
26891 (c)
2012 by Cédric Mesnil. All rights reserved.
26893 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
26895 - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
26896 - 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.
26898 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26905 var WordArray = C_lib.WordArray;
26906 var Hasher = C_lib.Hasher;
26907 var C_algo = C.algo;
26910 var _zl = WordArray.create([
26911 0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
26912 7,
4,
13,
1,
10,
6,
15,
3,
12,
0,
9,
5,
2,
14,
11,
8,
26913 3,
10,
14,
4,
9,
15,
8,
1,
2,
7,
0,
6,
13,
11,
5,
12,
26914 1,
9,
11,
10,
0,
8,
12,
4,
13,
3,
7,
15,
14,
5,
6,
2,
26915 4,
0,
5,
9,
7,
12,
2,
10,
14,
1,
3,
8,
11,
6,
15,
13]);
26916 var _zr = WordArray.create([
26917 5,
14,
7,
0,
9,
2,
11,
4,
13,
6,
15,
8,
1,
10,
3,
12,
26918 6,
11,
3,
7,
0,
13,
5,
10,
14,
15,
8,
12,
4,
9,
1,
2,
26919 15,
5,
1,
3,
7,
14,
6,
9,
11,
8,
12,
2,
10,
0,
4,
13,
26920 8,
6,
4,
1,
3,
11,
15,
0,
5,
12,
2,
13,
9,
7,
10,
14,
26921 12,
15,
10,
4,
1,
5,
8,
7,
6,
2,
13,
14,
0,
3,
9,
11]);
26922 var _sl = WordArray.create([
26923 11,
14,
15,
12,
5,
8,
7,
9,
11,
13,
14,
15,
6,
7,
9,
8,
26924 7,
6,
8,
13,
11,
9,
7,
15,
7,
12,
15,
9,
11,
7,
13,
12,
26925 11,
13,
6,
7,
14,
9,
13,
15,
14,
8,
13,
6,
5,
12,
7,
5,
26926 11,
12,
14,
15,
14,
15,
9,
8,
9,
14,
5,
6,
8,
6,
5,
12,
26927 9,
15,
5,
11,
6,
8,
13,
12,
5,
12,
13,
14,
11,
8,
5,
6 ]);
26928 var _sr = WordArray.create([
26929 8,
9,
9,
11,
13,
15,
15,
5,
7,
7,
8,
11,
14,
14,
12,
6,
26930 9,
13,
15,
7,
12,
8,
9,
11,
7,
7,
12,
7,
6,
15,
13,
11,
26931 9,
7,
15,
11,
8,
6,
6,
14,
12,
13,
5,
14,
13,
13,
7,
5,
26932 15,
5,
8,
11,
14,
14,
6,
14,
6,
9,
12,
9,
12,
5,
15,
8,
26933 8,
5,
12,
9,
12,
5,
14,
6,
8,
13,
6,
5,
15,
13,
11,
11 ]);
26935 var _hl = WordArray.create([
0x00000000,
0x5A827999,
0x6ED9EBA1,
0x8F1BBCDC,
0xA953FD4E]);
26936 var _hr = WordArray.create([
0x50A28BE6,
0x5C4DD124,
0x6D703EF3,
0x7A6D76E9,
0x00000000]);
26939 * RIPEMD160 hash algorithm.
26941 var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
26942 _doReset: function () {
26943 this._hash = WordArray.create([
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476,
0xC3D2E1F0]);
26946 _doProcessBlock: function (M, offset) {
26949 for (var i =
0; i <
16; i++) {
26951 var offset_i = offset + i;
26952 var M_offset_i = M[offset_i];
26956 (((M_offset_i <<
8) | (M_offset_i
>>> 24)) &
0x00ff00ff) |
26957 (((M_offset_i <<
24) | (M_offset_i
>>> 8)) &
0xff00ff00)
26961 var H = this._hash.words;
26962 var hl = _hl.words;
26963 var hr = _hr.words;
26964 var zl = _zl.words;
26965 var zr = _zr.words;
26966 var sl = _sl.words;
26967 var sr = _sr.words;
26969 // Working variables
26970 var al, bl, cl, dl, el;
26971 var ar, br, cr, dr, er;
26980 for (var i =
0; i <
80; i +=
1) {
26981 t = (al + M[offset+zl[i]])|
0;
26983 t += f1(bl,cl,dl) + hl[
0];
26985 t += f2(bl,cl,dl) + hl[
1];
26987 t += f3(bl,cl,dl) + hl[
2];
26989 t += f4(bl,cl,dl) + hl[
3];
26990 } else {// if (i
<80) {
26991 t += f5(bl,cl,dl) + hl[
4];
27002 t = (ar + M[offset+zr[i]])|
0;
27004 t += f5(br,cr,dr) + hr[
0];
27006 t += f4(br,cr,dr) + hr[
1];
27008 t += f3(br,cr,dr) + hr[
2];
27010 t += f2(br,cr,dr) + hr[
3];
27011 } else {// if (i
<80) {
27012 t += f1(br,cr,dr) + hr[
4];
27015 t = rotl(t,sr[i]) ;
27023 // Intermediate hash value
27024 t = (H[
1] + cl + dr)|
0;
27025 H[
1] = (H[
2] + dl + er)|
0;
27026 H[
2] = (H[
3] + el + ar)|
0;
27027 H[
3] = (H[
4] + al + br)|
0;
27028 H[
4] = (H[
0] + bl + cr)|
0;
27032 _doFinalize: function () {
27034 var data = this._data;
27035 var dataWords = data.words;
27037 var nBitsTotal = this._nDataBytes *
8;
27038 var nBitsLeft = data.sigBytes *
8;
27041 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
27042 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = (
27043 (((nBitsTotal <<
8) | (nBitsTotal
>>> 24)) &
0x00ff00ff) |
27044 (((nBitsTotal <<
24) | (nBitsTotal
>>> 8)) &
0xff00ff00)
27046 data.sigBytes = (dataWords.length +
1) *
4;
27048 // Hash final blocks
27052 var hash = this._hash;
27053 var H = hash.words;
27056 for (var i =
0; i <
5; i++) {
27061 H[i] = (((H_i <<
8) | (H_i
>>> 24)) &
0x00ff00ff) |
27062 (((H_i <<
24) | (H_i
>>> 8)) &
0xff00ff00);
27065 // Return final computed hash
27069 clone: function () {
27070 var clone = Hasher.clone.call(this);
27071 clone._hash = this._hash.clone();
27078 function f1(x, y, z) {
27079 return ((x) ^ (y) ^ (z));
27083 function f2(x, y, z) {
27084 return (((x)&(y)) | ((~x)&(z)));
27087 function f3(x, y, z) {
27088 return (((x) | (~(y))) ^ (z));
27091 function f4(x, y, z) {
27092 return (((x) & (z)) | ((y)&(~(z))));
27095 function f5(x, y, z) {
27096 return ((x) ^ ((y) |(~(z))));
27100 function rotl(x,n) {
27101 return (x<
<n) | (x
>>>(
32-n));
27106 * Shortcut function to the hasher's object interface.
27108 * @param {WordArray|string} message The message to hash.
27110 * @return {WordArray} The hash.
27116 * var hash = CryptoJS.RIPEMD160('message');
27117 * var hash = CryptoJS.RIPEMD160(wordArray);
27119 C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
27122 * Shortcut function to the HMAC's object interface.
27124 * @param {WordArray|string} message The message to hash.
27125 * @param {WordArray|string} key The secret key.
27127 * @return {WordArray} The HMAC.
27133 * var hmac = CryptoJS.HmacRIPEMD160(message, key);
27135 C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
27139 return CryptoJS.RIPEMD160;
27142 },{"./core":
31}],
55:[function(_dereq_,module,exports){
27143 ;(function (root, factory) {
27144 if (typeof exports === "object") {
27146 module.exports = exports = factory(_dereq_("./core"));
27148 else if (typeof define === "function" && define.amd) {
27150 define(["./core"], factory);
27153 // Global (browser)
27154 factory(root.CryptoJS);
27156 }(this, function (CryptoJS) {
27162 var WordArray = C_lib.WordArray;
27163 var Hasher = C_lib.Hasher;
27164 var C_algo = C.algo;
27170 * SHA-
1 hash algorithm.
27172 var SHA1 = C_algo.SHA1 = Hasher.extend({
27173 _doReset: function () {
27174 this._hash = new WordArray.init([
27175 0x67452301,
0xefcdab89,
27176 0x98badcfe,
0x10325476,
27181 _doProcessBlock: function (M, offset) {
27183 var H = this._hash.words;
27185 // Working variables
27193 for (var i =
0; i <
80; i++) {
27195 W[i] = M[offset + i] |
0;
27197 var n = W[i -
3] ^ W[i -
8] ^ W[i -
14] ^ W[i -
16];
27198 W[i] = (n <<
1) | (n
>>> 31);
27201 var t = ((a <<
5) | (a
>>> 27)) + e + W[i];
27203 t += ((b & c) | (~b & d)) +
0x5a827999;
27204 } else if (i <
40) {
27205 t += (b ^ c ^ d) +
0x6ed9eba1;
27206 } else if (i <
60) {
27207 t += ((b & c) | (b & d) | (c & d)) -
0x70e44324;
27208 } else /* if (i <
80) */ {
27209 t += (b ^ c ^ d) -
0x359d3e2a;
27214 c = (b <<
30) | (b
>>> 2);
27219 // Intermediate hash value
27220 H[
0] = (H[
0] + a) |
0;
27221 H[
1] = (H[
1] + b) |
0;
27222 H[
2] = (H[
2] + c) |
0;
27223 H[
3] = (H[
3] + d) |
0;
27224 H[
4] = (H[
4] + e) |
0;
27227 _doFinalize: function () {
27229 var data = this._data;
27230 var dataWords = data.words;
27232 var nBitsTotal = this._nDataBytes *
8;
27233 var nBitsLeft = data.sigBytes *
8;
27236 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
27237 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = Math.floor(nBitsTotal /
0x100000000);
27238 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
15] = nBitsTotal;
27239 data.sigBytes = dataWords.length *
4;
27241 // Hash final blocks
27244 // Return final computed hash
27248 clone: function () {
27249 var clone = Hasher.clone.call(this);
27250 clone._hash = this._hash.clone();
27257 * Shortcut function to the hasher's object interface.
27259 * @param {WordArray|string} message The message to hash.
27261 * @return {WordArray} The hash.
27267 * var hash = CryptoJS.SHA1('message');
27268 * var hash = CryptoJS.SHA1(wordArray);
27270 C.SHA1 = Hasher._createHelper(SHA1);
27273 * Shortcut function to the HMAC's object interface.
27275 * @param {WordArray|string} message The message to hash.
27276 * @param {WordArray|string} key The secret key.
27278 * @return {WordArray} The HMAC.
27284 * var hmac = CryptoJS.HmacSHA1(message, key);
27286 C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
27290 return CryptoJS.SHA1;
27293 },{
"./core":
31}],
56:[function(_dereq_,module,exports){
27294 ;(function (root, factory, undef) {
27295 if (typeof exports ===
"object") {
27297 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./sha256"));
27299 else if (typeof define ===
"function" && define.amd) {
27301 define([
"./core",
"./sha256"], factory);
27304 // Global (browser)
27305 factory(root.CryptoJS);
27307 }(this, function (CryptoJS) {
27313 var WordArray = C_lib.WordArray;
27314 var C_algo = C.algo;
27315 var SHA256 = C_algo.SHA256;
27318 * SHA-
224 hash algorithm.
27320 var SHA224 = C_algo.SHA224 = SHA256.extend({
27321 _doReset: function () {
27322 this._hash = new WordArray.init([
27323 0xc1059ed8,
0x367cd507,
0x3070dd17,
0xf70e5939,
27324 0xffc00b31,
0x68581511,
0x64f98fa7,
0xbefa4fa4
27328 _doFinalize: function () {
27329 var hash = SHA256._doFinalize.call(this);
27331 hash.sigBytes -=
4;
27338 * Shortcut function to the hasher's object interface.
27340 * @param {WordArray|string} message The message to hash.
27342 * @return {WordArray} The hash.
27348 * var hash = CryptoJS.SHA224('message');
27349 * var hash = CryptoJS.SHA224(wordArray);
27351 C.SHA224 = SHA256._createHelper(SHA224);
27354 * Shortcut function to the HMAC's object interface.
27356 * @param {WordArray|string} message The message to hash.
27357 * @param {WordArray|string} key The secret key.
27359 * @return {WordArray} The HMAC.
27365 * var hmac = CryptoJS.HmacSHA224(message, key);
27367 C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
27371 return CryptoJS.SHA224;
27374 },{
"./core":
31,
"./sha256":
57}],
57:[function(_dereq_,module,exports){
27375 ;(function (root, factory) {
27376 if (typeof exports ===
"object") {
27378 module.exports = exports = factory(_dereq_(
"./core"));
27380 else if (typeof define ===
"function" && define.amd) {
27382 define([
"./core"], factory);
27385 // Global (browser)
27386 factory(root.CryptoJS);
27388 }(this, function (CryptoJS) {
27394 var WordArray = C_lib.WordArray;
27395 var Hasher = C_lib.Hasher;
27396 var C_algo = C.algo;
27398 // Initialization and round constants tables
27402 // Compute constants
27404 function isPrime(n) {
27405 var sqrtN = Math.sqrt(n);
27406 for (var factor =
2; factor <= sqrtN; factor++) {
27407 if (!(n % factor)) {
27415 function getFractionalBits(n) {
27416 return ((n - (n |
0)) *
0x100000000) |
0;
27421 while (nPrime <
64) {
27424 H[nPrime] = getFractionalBits(Math.pow(n,
1 /
2));
27426 K[nPrime] = getFractionalBits(Math.pow(n,
1 /
3));
27439 * SHA-
256 hash algorithm.
27441 var SHA256 = C_algo.SHA256 = Hasher.extend({
27442 _doReset: function () {
27443 this._hash = new WordArray.init(H.slice(
0));
27446 _doProcessBlock: function (M, offset) {
27448 var H = this._hash.words;
27450 // Working variables
27461 for (var i =
0; i <
64; i++) {
27463 W[i] = M[offset + i] |
0;
27465 var gamma0x = W[i -
15];
27466 var gamma0 = ((gamma0x <<
25) | (gamma0x
>>> 7)) ^
27467 ((gamma0x <<
14) | (gamma0x
>>> 18)) ^
27470 var gamma1x = W[i -
2];
27471 var gamma1 = ((gamma1x <<
15) | (gamma1x
>>> 17)) ^
27472 ((gamma1x <<
13) | (gamma1x
>>> 19)) ^
27475 W[i] = gamma0 + W[i -
7] + gamma1 + W[i -
16];
27478 var ch = (e & f) ^ (~e & g);
27479 var maj = (a & b) ^ (a & c) ^ (b & c);
27481 var sigma0 = ((a <<
30) | (a
>>> 2)) ^ ((a <<
19) | (a
>>> 13)) ^ ((a <<
10) | (a
>>> 22));
27482 var sigma1 = ((e <<
26) | (e
>>> 6)) ^ ((e <<
21) | (e
>>> 11)) ^ ((e <<
7) | (e
>>> 25));
27484 var t1 = h + sigma1 + ch + K[i] + W[i];
27485 var t2 = sigma0 + maj;
27497 // Intermediate hash value
27498 H[
0] = (H[
0] + a) |
0;
27499 H[
1] = (H[
1] + b) |
0;
27500 H[
2] = (H[
2] + c) |
0;
27501 H[
3] = (H[
3] + d) |
0;
27502 H[
4] = (H[
4] + e) |
0;
27503 H[
5] = (H[
5] + f) |
0;
27504 H[
6] = (H[
6] + g) |
0;
27505 H[
7] = (H[
7] + h) |
0;
27508 _doFinalize: function () {
27510 var data = this._data;
27511 var dataWords = data.words;
27513 var nBitsTotal = this._nDataBytes *
8;
27514 var nBitsLeft = data.sigBytes *
8;
27517 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
27518 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = Math.floor(nBitsTotal /
0x100000000);
27519 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
15] = nBitsTotal;
27520 data.sigBytes = dataWords.length *
4;
27522 // Hash final blocks
27525 // Return final computed hash
27529 clone: function () {
27530 var clone = Hasher.clone.call(this);
27531 clone._hash = this._hash.clone();
27538 * Shortcut function to the hasher's object interface.
27540 * @param {WordArray|string} message The message to hash.
27542 * @return {WordArray} The hash.
27548 * var hash = CryptoJS.SHA256('message');
27549 * var hash = CryptoJS.SHA256(wordArray);
27551 C.SHA256 = Hasher._createHelper(SHA256);
27554 * Shortcut function to the HMAC's object interface.
27556 * @param {WordArray|string} message The message to hash.
27557 * @param {WordArray|string} key The secret key.
27559 * @return {WordArray} The HMAC.
27565 * var hmac = CryptoJS.HmacSHA256(message, key);
27567 C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
27571 return CryptoJS.SHA256;
27574 },{
"./core":
31}],
58:[function(_dereq_,module,exports){
27575 ;(function (root, factory, undef) {
27576 if (typeof exports ===
"object") {
27578 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./x64-core"));
27580 else if (typeof define ===
"function" && define.amd) {
27582 define([
"./core",
"./x64-core"], factory);
27585 // Global (browser)
27586 factory(root.CryptoJS);
27588 }(this, function (CryptoJS) {
27594 var WordArray = C_lib.WordArray;
27595 var Hasher = C_lib.Hasher;
27597 var X64Word = C_x64.Word;
27598 var C_algo = C.algo;
27600 // Constants tables
27601 var RHO_OFFSETS = [];
27602 var PI_INDEXES = [];
27603 var ROUND_CONSTANTS = [];
27605 // Compute Constants
27607 // Compute rho offset constants
27609 for (var t =
0; t <
24; t++) {
27610 RHO_OFFSETS[x +
5 * y] = ((t +
1) * (t +
2) /
2) %
64;
27613 var newY = (
2 * x +
3 * y) %
5;
27618 // Compute pi index constants
27619 for (var x =
0; x <
5; x++) {
27620 for (var y =
0; y <
5; y++) {
27621 PI_INDEXES[x +
5 * y] = y + ((
2 * x +
3 * y) %
5) *
5;
27625 // Compute round constants
27627 for (var i =
0; i <
24; i++) {
27628 var roundConstantMsw =
0;
27629 var roundConstantLsw =
0;
27631 for (var j =
0; j <
7; j++) {
27633 var bitPosition = (
1 << j) -
1;
27634 if (bitPosition <
32) {
27635 roundConstantLsw ^=
1 << bitPosition;
27636 } else /* if (bitPosition
>=
32) */ {
27637 roundConstantMsw ^=
1 << (bitPosition -
32);
27641 // Compute next LFSR
27643 // Primitive polynomial over GF(
2): x^
8 + x^
6 + x^
5 + x^
4 +
1
27644 LFSR = (LFSR <<
1) ^
0x71;
27650 ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
27654 // Reusable objects for temporary values
27657 for (var i =
0; i <
25; i++) {
27658 T[i] = X64Word.create();
27663 * SHA-
3 hash algorithm.
27665 var SHA3 = C_algo.SHA3 = Hasher.extend({
27667 * Configuration options.
27669 * @property {number} outputLength
27670 * The desired number of bits in the output hash.
27671 * Only values permitted are:
224,
256,
384,
512.
27674 cfg: Hasher.cfg.extend({
27678 _doReset: function () {
27679 var state = this._state = []
27680 for (var i =
0; i <
25; i++) {
27681 state[i] = new X64Word.init();
27684 this.blockSize = (
1600 -
2 * this.cfg.outputLength) /
32;
27687 _doProcessBlock: function (M, offset) {
27689 var state = this._state;
27690 var nBlockSizeLanes = this.blockSize /
2;
27693 for (var i =
0; i < nBlockSizeLanes; i++) {
27695 var M2i = M[offset +
2 * i];
27696 var M2i1 = M[offset +
2 * i +
1];
27700 (((M2i <<
8) | (M2i
>>> 24)) &
0x00ff00ff) |
27701 (((M2i <<
24) | (M2i
>>> 8)) &
0xff00ff00)
27704 (((M2i1 <<
8) | (M2i1
>>> 24)) &
0x00ff00ff) |
27705 (((M2i1 <<
24) | (M2i1
>>> 8)) &
0xff00ff00)
27708 // Absorb message into state
27709 var lane = state[i];
27715 for (var round =
0; round <
24; round++) {
27717 for (var x =
0; x <
5; x++) {
27718 // Mix column lanes
27719 var tMsw =
0, tLsw =
0;
27720 for (var y =
0; y <
5; y++) {
27721 var lane = state[x +
5 * y];
27726 // Temporary values
27731 for (var x =
0; x <
5; x++) {
27733 var Tx4 = T[(x +
4) %
5];
27734 var Tx1 = T[(x +
1) %
5];
27735 var Tx1Msw = Tx1.high;
27736 var Tx1Lsw = Tx1.low;
27738 // Mix surrounding columns
27739 var tMsw = Tx4.high ^ ((Tx1Msw <<
1) | (Tx1Lsw
>>> 31));
27740 var tLsw = Tx4.low ^ ((Tx1Lsw <<
1) | (Tx1Msw
>>> 31));
27741 for (var y =
0; y <
5; y++) {
27742 var lane = state[x +
5 * y];
27749 for (var laneIndex =
1; laneIndex <
25; laneIndex++) {
27751 var lane = state[laneIndex];
27752 var laneMsw = lane.high;
27753 var laneLsw = lane.low;
27754 var rhoOffset = RHO_OFFSETS[laneIndex];
27757 if (rhoOffset <
32) {
27758 var tMsw = (laneMsw << rhoOffset) | (laneLsw
>>> (
32 - rhoOffset));
27759 var tLsw = (laneLsw << rhoOffset) | (laneMsw
>>> (
32 - rhoOffset));
27760 } else /* if (rhoOffset
>=
32) */ {
27761 var tMsw = (laneLsw << (rhoOffset -
32)) | (laneMsw
>>> (
64 - rhoOffset));
27762 var tLsw = (laneMsw << (rhoOffset -
32)) | (laneLsw
>>> (
64 - rhoOffset));
27766 var TPiLane = T[PI_INDEXES[laneIndex]];
27767 TPiLane.high = tMsw;
27768 TPiLane.low = tLsw;
27771 // Rho pi at x = y =
0
27773 var state0 = state[
0];
27774 T0.high = state0.high;
27775 T0.low = state0.low;
27778 for (var x =
0; x <
5; x++) {
27779 for (var y =
0; y <
5; y++) {
27781 var laneIndex = x +
5 * y;
27782 var lane = state[laneIndex];
27783 var TLane = T[laneIndex];
27784 var Tx1Lane = T[((x +
1) %
5) +
5 * y];
27785 var Tx2Lane = T[((x +
2) %
5) +
5 * y];
27788 lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
27789 lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
27794 var lane = state[
0];
27795 var roundConstant = ROUND_CONSTANTS[round];
27796 lane.high ^= roundConstant.high;
27797 lane.low ^= roundConstant.low;;
27801 _doFinalize: function () {
27803 var data = this._data;
27804 var dataWords = data.words;
27805 var nBitsTotal = this._nDataBytes *
8;
27806 var nBitsLeft = data.sigBytes *
8;
27807 var blockSizeBits = this.blockSize *
32;
27810 dataWords[nBitsLeft
>>> 5] |=
0x1 << (
24 - nBitsLeft %
32);
27811 dataWords[((Math.ceil((nBitsLeft +
1) / blockSizeBits) * blockSizeBits)
>>> 5) -
1] |=
0x80;
27812 data.sigBytes = dataWords.length *
4;
27814 // Hash final blocks
27818 var state = this._state;
27819 var outputLengthBytes = this.cfg.outputLength /
8;
27820 var outputLengthLanes = outputLengthBytes /
8;
27823 var hashWords = [];
27824 for (var i =
0; i < outputLengthLanes; i++) {
27826 var lane = state[i];
27827 var laneMsw = lane.high;
27828 var laneLsw = lane.low;
27832 (((laneMsw <<
8) | (laneMsw
>>> 24)) &
0x00ff00ff) |
27833 (((laneMsw <<
24) | (laneMsw
>>> 8)) &
0xff00ff00)
27836 (((laneLsw <<
8) | (laneLsw
>>> 24)) &
0x00ff00ff) |
27837 (((laneLsw <<
24) | (laneLsw
>>> 8)) &
0xff00ff00)
27840 // Squeeze state to retrieve hash
27841 hashWords.push(laneLsw);
27842 hashWords.push(laneMsw);
27845 // Return final computed hash
27846 return new WordArray.init(hashWords, outputLengthBytes);
27849 clone: function () {
27850 var clone = Hasher.clone.call(this);
27852 var state = clone._state = this._state.slice(
0);
27853 for (var i =
0; i <
25; i++) {
27854 state[i] = state[i].clone();
27862 * Shortcut function to the hasher's object interface.
27864 * @param {WordArray|string} message The message to hash.
27866 * @return {WordArray} The hash.
27872 * var hash = CryptoJS.SHA3('message');
27873 * var hash = CryptoJS.SHA3(wordArray);
27875 C.SHA3 = Hasher._createHelper(SHA3);
27878 * Shortcut function to the HMAC's object interface.
27880 * @param {WordArray|string} message The message to hash.
27881 * @param {WordArray|string} key The secret key.
27883 * @return {WordArray} The HMAC.
27889 * var hmac = CryptoJS.HmacSHA3(message, key);
27891 C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
27895 return CryptoJS.SHA3;
27898 },{
"./core":
31,
"./x64-core":
62}],
59:[function(_dereq_,module,exports){
27899 ;(function (root, factory, undef) {
27900 if (typeof exports ===
"object") {
27902 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./x64-core"), _dereq_(
"./sha512"));
27904 else if (typeof define ===
"function" && define.amd) {
27906 define([
"./core",
"./x64-core",
"./sha512"], factory);
27909 // Global (browser)
27910 factory(root.CryptoJS);
27912 }(this, function (CryptoJS) {
27918 var X64Word = C_x64.Word;
27919 var X64WordArray = C_x64.WordArray;
27920 var C_algo = C.algo;
27921 var SHA512 = C_algo.SHA512;
27924 * SHA-
384 hash algorithm.
27926 var SHA384 = C_algo.SHA384 = SHA512.extend({
27927 _doReset: function () {
27928 this._hash = new X64WordArray.init([
27929 new X64Word.init(
0xcbbb9d5d,
0xc1059ed8), new X64Word.init(
0x629a292a,
0x367cd507),
27930 new X64Word.init(
0x9159015a,
0x3070dd17), new X64Word.init(
0x152fecd8,
0xf70e5939),
27931 new X64Word.init(
0x67332667,
0xffc00b31), new X64Word.init(
0x8eb44a87,
0x68581511),
27932 new X64Word.init(
0xdb0c2e0d,
0x64f98fa7), new X64Word.init(
0x47b5481d,
0xbefa4fa4)
27936 _doFinalize: function () {
27937 var hash = SHA512._doFinalize.call(this);
27939 hash.sigBytes -=
16;
27946 * Shortcut function to the hasher's object interface.
27948 * @param {WordArray|string} message The message to hash.
27950 * @return {WordArray} The hash.
27956 * var hash = CryptoJS.SHA384('message');
27957 * var hash = CryptoJS.SHA384(wordArray);
27959 C.SHA384 = SHA512._createHelper(SHA384);
27962 * Shortcut function to the HMAC's object interface.
27964 * @param {WordArray|string} message The message to hash.
27965 * @param {WordArray|string} key The secret key.
27967 * @return {WordArray} The HMAC.
27973 * var hmac = CryptoJS.HmacSHA384(message, key);
27975 C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
27979 return CryptoJS.SHA384;
27982 },{
"./core":
31,
"./sha512":
60,
"./x64-core":
62}],
60:[function(_dereq_,module,exports){
27983 ;(function (root, factory, undef) {
27984 if (typeof exports ===
"object") {
27986 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./x64-core"));
27988 else if (typeof define ===
"function" && define.amd) {
27990 define([
"./core",
"./x64-core"], factory);
27993 // Global (browser)
27994 factory(root.CryptoJS);
27996 }(this, function (CryptoJS) {
28002 var Hasher = C_lib.Hasher;
28004 var X64Word = C_x64.Word;
28005 var X64WordArray = C_x64.WordArray;
28006 var C_algo = C.algo;
28008 function X64Word_create() {
28009 return X64Word.create.apply(X64Word, arguments);
28014 X64Word_create(
0x428a2f98,
0xd728ae22), X64Word_create(
0x71374491,
0x23ef65cd),
28015 X64Word_create(
0xb5c0fbcf,
0xec4d3b2f), X64Word_create(
0xe9b5dba5,
0x8189dbbc),
28016 X64Word_create(
0x3956c25b,
0xf348b538), X64Word_create(
0x59f111f1,
0xb605d019),
28017 X64Word_create(
0x923f82a4,
0xaf194f9b), X64Word_create(
0xab1c5ed5,
0xda6d8118),
28018 X64Word_create(
0xd807aa98,
0xa3030242), X64Word_create(
0x12835b01,
0x45706fbe),
28019 X64Word_create(
0x243185be,
0x4ee4b28c), X64Word_create(
0x550c7dc3,
0xd5ffb4e2),
28020 X64Word_create(
0x72be5d74,
0xf27b896f), X64Word_create(
0x80deb1fe,
0x3b1696b1),
28021 X64Word_create(
0x9bdc06a7,
0x25c71235), X64Word_create(
0xc19bf174,
0xcf692694),
28022 X64Word_create(
0xe49b69c1,
0x9ef14ad2), X64Word_create(
0xefbe4786,
0x384f25e3),
28023 X64Word_create(
0x0fc19dc6,
0x8b8cd5b5), X64Word_create(
0x240ca1cc,
0x77ac9c65),
28024 X64Word_create(
0x2de92c6f,
0x592b0275), X64Word_create(
0x4a7484aa,
0x6ea6e483),
28025 X64Word_create(
0x5cb0a9dc,
0xbd41fbd4), X64Word_create(
0x76f988da,
0x831153b5),
28026 X64Word_create(
0x983e5152,
0xee66dfab), X64Word_create(
0xa831c66d,
0x2db43210),
28027 X64Word_create(
0xb00327c8,
0x98fb213f), X64Word_create(
0xbf597fc7,
0xbeef0ee4),
28028 X64Word_create(
0xc6e00bf3,
0x3da88fc2), X64Word_create(
0xd5a79147,
0x930aa725),
28029 X64Word_create(
0x06ca6351,
0xe003826f), X64Word_create(
0x14292967,
0x0a0e6e70),
28030 X64Word_create(
0x27b70a85,
0x46d22ffc), X64Word_create(
0x2e1b2138,
0x5c26c926),
28031 X64Word_create(
0x4d2c6dfc,
0x5ac42aed), X64Word_create(
0x53380d13,
0x9d95b3df),
28032 X64Word_create(
0x650a7354,
0x8baf63de), X64Word_create(
0x766a0abb,
0x3c77b2a8),
28033 X64Word_create(
0x81c2c92e,
0x47edaee6), X64Word_create(
0x92722c85,
0x1482353b),
28034 X64Word_create(
0xa2bfe8a1,
0x4cf10364), X64Word_create(
0xa81a664b,
0xbc423001),
28035 X64Word_create(
0xc24b8b70,
0xd0f89791), X64Word_create(
0xc76c51a3,
0x0654be30),
28036 X64Word_create(
0xd192e819,
0xd6ef5218), X64Word_create(
0xd6990624,
0x5565a910),
28037 X64Word_create(
0xf40e3585,
0x5771202a), X64Word_create(
0x106aa070,
0x32bbd1b8),
28038 X64Word_create(
0x19a4c116,
0xb8d2d0c8), X64Word_create(
0x1e376c08,
0x5141ab53),
28039 X64Word_create(
0x2748774c,
0xdf8eeb99), X64Word_create(
0x34b0bcb5,
0xe19b48a8),
28040 X64Word_create(
0x391c0cb3,
0xc5c95a63), X64Word_create(
0x4ed8aa4a,
0xe3418acb),
28041 X64Word_create(
0x5b9cca4f,
0x7763e373), X64Word_create(
0x682e6ff3,
0xd6b2b8a3),
28042 X64Word_create(
0x748f82ee,
0x5defb2fc), X64Word_create(
0x78a5636f,
0x43172f60),
28043 X64Word_create(
0x84c87814,
0xa1f0ab72), X64Word_create(
0x8cc70208,
0x1a6439ec),
28044 X64Word_create(
0x90befffa,
0x23631e28), X64Word_create(
0xa4506ceb,
0xde82bde9),
28045 X64Word_create(
0xbef9a3f7,
0xb2c67915), X64Word_create(
0xc67178f2,
0xe372532b),
28046 X64Word_create(
0xca273ece,
0xea26619c), X64Word_create(
0xd186b8c7,
0x21c0c207),
28047 X64Word_create(
0xeada7dd6,
0xcde0eb1e), X64Word_create(
0xf57d4f7f,
0xee6ed178),
28048 X64Word_create(
0x06f067aa,
0x72176fba), X64Word_create(
0x0a637dc5,
0xa2c898a6),
28049 X64Word_create(
0x113f9804,
0xbef90dae), X64Word_create(
0x1b710b35,
0x131c471b),
28050 X64Word_create(
0x28db77f5,
0x23047d84), X64Word_create(
0x32caab7b,
0x40c72493),
28051 X64Word_create(
0x3c9ebe0a,
0x15c9bebc), X64Word_create(
0x431d67c4,
0x9c100d4c),
28052 X64Word_create(
0x4cc5d4be,
0xcb3e42b6), X64Word_create(
0x597f299c,
0xfc657e2a),
28053 X64Word_create(
0x5fcb6fab,
0x3ad6faec), X64Word_create(
0x6c44198c,
0x4a475817)
28056 // Reusable objects
28059 for (var i =
0; i <
80; i++) {
28060 W[i] = X64Word_create();
28065 * SHA-
512 hash algorithm.
28067 var SHA512 = C_algo.SHA512 = Hasher.extend({
28068 _doReset: function () {
28069 this._hash = new X64WordArray.init([
28070 new X64Word.init(
0x6a09e667,
0xf3bcc908), new X64Word.init(
0xbb67ae85,
0x84caa73b),
28071 new X64Word.init(
0x3c6ef372,
0xfe94f82b), new X64Word.init(
0xa54ff53a,
0x5f1d36f1),
28072 new X64Word.init(
0x510e527f,
0xade682d1), new X64Word.init(
0x9b05688c,
0x2b3e6c1f),
28073 new X64Word.init(
0x1f83d9ab,
0xfb41bd6b), new X64Word.init(
0x5be0cd19,
0x137e2179)
28077 _doProcessBlock: function (M, offset) {
28079 var H = this._hash.words;
28107 // Working variables
28126 for (var i =
0; i <
80; i++) {
28132 var Wih = Wi.high = M[offset + i *
2] |
0;
28133 var Wil = Wi.low = M[offset + i *
2 +
1] |
0;
28136 var gamma0x = W[i -
15];
28137 var gamma0xh = gamma0x.high;
28138 var gamma0xl = gamma0x.low;
28139 var gamma0h = ((gamma0xh
>>> 1) | (gamma0xl <<
31)) ^ ((gamma0xh
>>> 8) | (gamma0xl <<
24)) ^ (gamma0xh
>>> 7);
28140 var gamma0l = ((gamma0xl
>>> 1) | (gamma0xh <<
31)) ^ ((gamma0xl
>>> 8) | (gamma0xh <<
24)) ^ ((gamma0xl
>>> 7) | (gamma0xh <<
25));
28143 var gamma1x = W[i -
2];
28144 var gamma1xh = gamma1x.high;
28145 var gamma1xl = gamma1x.low;
28146 var gamma1h = ((gamma1xh
>>> 19) | (gamma1xl <<
13)) ^ ((gamma1xh <<
3) | (gamma1xl
>>> 29)) ^ (gamma1xh
>>> 6);
28147 var gamma1l = ((gamma1xl
>>> 19) | (gamma1xh <<
13)) ^ ((gamma1xl <<
3) | (gamma1xh
>>> 29)) ^ ((gamma1xl
>>> 6) | (gamma1xh <<
26));
28149 // W[i] = gamma0 + W[i -
7] + gamma1 + W[i -
16]
28150 var Wi7 = W[i -
7];
28151 var Wi7h = Wi7.high;
28152 var Wi7l = Wi7.low;
28154 var Wi16 = W[i -
16];
28155 var Wi16h = Wi16.high;
28156 var Wi16l = Wi16.low;
28158 var Wil = gamma0l + Wi7l;
28159 var Wih = gamma0h + Wi7h + ((Wil
>>> 0) < (gamma0l
>>> 0) ?
1 :
0);
28160 var Wil = Wil + gamma1l;
28161 var Wih = Wih + gamma1h + ((Wil
>>> 0) < (gamma1l
>>> 0) ?
1 :
0);
28162 var Wil = Wil + Wi16l;
28163 var Wih = Wih + Wi16h + ((Wil
>>> 0) < (Wi16l
>>> 0) ?
1 :
0);
28169 var chh = (eh & fh) ^ (~eh & gh);
28170 var chl = (el & fl) ^ (~el & gl);
28171 var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
28172 var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
28174 var sigma0h = ((ah
>>> 28) | (al <<
4)) ^ ((ah <<
30) | (al
>>> 2)) ^ ((ah <<
25) | (al
>>> 7));
28175 var sigma0l = ((al
>>> 28) | (ah <<
4)) ^ ((al <<
30) | (ah
>>> 2)) ^ ((al <<
25) | (ah
>>> 7));
28176 var sigma1h = ((eh
>>> 14) | (el <<
18)) ^ ((eh
>>> 18) | (el <<
14)) ^ ((eh <<
23) | (el
>>> 9));
28177 var sigma1l = ((el
>>> 14) | (eh <<
18)) ^ ((el
>>> 18) | (eh <<
14)) ^ ((el <<
23) | (eh
>>> 9));
28179 // t1 = h + sigma1 + ch + K[i] + W[i]
28184 var t1l = hl + sigma1l;
28185 var t1h = hh + sigma1h + ((t1l
>>> 0) < (hl
>>> 0) ?
1 :
0);
28186 var t1l = t1l + chl;
28187 var t1h = t1h + chh + ((t1l
>>> 0) < (chl
>>> 0) ?
1 :
0);
28188 var t1l = t1l + Kil;
28189 var t1h = t1h + Kih + ((t1l
>>> 0) < (Kil
>>> 0) ?
1 :
0);
28190 var t1l = t1l + Wil;
28191 var t1h = t1h + Wih + ((t1l
>>> 0) < (Wil
>>> 0) ?
1 :
0);
28193 // t2 = sigma0 + maj
28194 var t2l = sigma0l + majl;
28195 var t2h = sigma0h + majh + ((t2l
>>> 0) < (sigma0l
>>> 0) ?
1 :
0);
28197 // Update working variables
28204 el = (dl + t1l) |
0;
28205 eh = (dh + t1h + ((el
>>> 0) < (dl
>>> 0) ?
1 :
0)) |
0;
28212 al = (t1l + t2l) |
0;
28213 ah = (t1h + t2h + ((al
>>> 0) < (t1l
>>> 0) ?
1 :
0)) |
0;
28216 // Intermediate hash value
28217 H0l = H0.low = (H0l + al);
28218 H0.high = (H0h + ah + ((H0l
>>> 0) < (al
>>> 0) ?
1 :
0));
28219 H1l = H1.low = (H1l + bl);
28220 H1.high = (H1h + bh + ((H1l
>>> 0) < (bl
>>> 0) ?
1 :
0));
28221 H2l = H2.low = (H2l + cl);
28222 H2.high = (H2h + ch + ((H2l
>>> 0) < (cl
>>> 0) ?
1 :
0));
28223 H3l = H3.low = (H3l + dl);
28224 H3.high = (H3h + dh + ((H3l
>>> 0) < (dl
>>> 0) ?
1 :
0));
28225 H4l = H4.low = (H4l + el);
28226 H4.high = (H4h + eh + ((H4l
>>> 0) < (el
>>> 0) ?
1 :
0));
28227 H5l = H5.low = (H5l + fl);
28228 H5.high = (H5h + fh + ((H5l
>>> 0) < (fl
>>> 0) ?
1 :
0));
28229 H6l = H6.low = (H6l + gl);
28230 H6.high = (H6h + gh + ((H6l
>>> 0) < (gl
>>> 0) ?
1 :
0));
28231 H7l = H7.low = (H7l + hl);
28232 H7.high = (H7h + hh + ((H7l
>>> 0) < (hl
>>> 0) ?
1 :
0));
28235 _doFinalize: function () {
28237 var data = this._data;
28238 var dataWords = data.words;
28240 var nBitsTotal = this._nDataBytes *
8;
28241 var nBitsLeft = data.sigBytes *
8;
28244 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
28245 dataWords[(((nBitsLeft +
128)
>>> 10) <<
5) +
30] = Math.floor(nBitsTotal /
0x100000000);
28246 dataWords[(((nBitsLeft +
128)
>>> 10) <<
5) +
31] = nBitsTotal;
28247 data.sigBytes = dataWords.length *
4;
28249 // Hash final blocks
28252 // Convert hash to
32-bit word array before returning
28253 var hash = this._hash.toX32();
28255 // Return final computed hash
28259 clone: function () {
28260 var clone = Hasher.clone.call(this);
28261 clone._hash = this._hash.clone();
28270 * Shortcut function to the hasher's object interface.
28272 * @param {WordArray|string} message The message to hash.
28274 * @return {WordArray} The hash.
28280 * var hash = CryptoJS.SHA512('message');
28281 * var hash = CryptoJS.SHA512(wordArray);
28283 C.SHA512 = Hasher._createHelper(SHA512);
28286 * Shortcut function to the HMAC's object interface.
28288 * @param {WordArray|string} message The message to hash.
28289 * @param {WordArray|string} key The secret key.
28291 * @return {WordArray} The HMAC.
28297 * var hmac = CryptoJS.HmacSHA512(message, key);
28299 C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
28303 return CryptoJS.SHA512;
28306 },{
"./core":
31,
"./x64-core":
62}],
61:[function(_dereq_,module,exports){
28307 ;(function (root, factory, undef) {
28308 if (typeof exports ===
"object") {
28310 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./enc-base64"), _dereq_(
"./md5"), _dereq_(
"./evpkdf"), _dereq_(
"./cipher-core"));
28312 else if (typeof define ===
"function" && define.amd) {
28314 define([
"./core",
"./enc-base64",
"./md5",
"./evpkdf",
"./cipher-core"], factory);
28317 // Global (browser)
28318 factory(root.CryptoJS);
28320 }(this, function (CryptoJS) {
28326 var WordArray = C_lib.WordArray;
28327 var BlockCipher = C_lib.BlockCipher;
28328 var C_algo = C.algo;
28330 // Permuted Choice
1 constants
28332 57,
49,
41,
33,
25,
17,
9,
1,
28333 58,
50,
42,
34,
26,
18,
10,
2,
28334 59,
51,
43,
35,
27,
19,
11,
3,
28335 60,
52,
44,
36,
63,
55,
47,
39,
28336 31,
23,
15,
7,
62,
54,
46,
38,
28337 30,
22,
14,
6,
61,
53,
45,
37,
28338 29,
21,
13,
5,
28,
20,
12,
4
28341 // Permuted Choice
2 constants
28343 14,
17,
11,
24,
1,
5,
28344 3,
28,
15,
6,
21,
10,
28345 23,
19,
12,
4,
26,
8,
28346 16,
7,
27,
20,
13,
2,
28347 41,
52,
31,
37,
47,
55,
28348 30,
40,
51,
45,
33,
48,
28349 44,
49,
39,
56,
34,
53,
28350 46,
42,
50,
36,
29,
32
28353 // Cumulative bit shift constants
28354 var BIT_SHIFTS = [
1,
2,
4,
6,
8,
10,
12,
14,
15,
17,
19,
21,
23,
25,
27,
28];
28356 // SBOXes and round permutation constants
28360 0x10000000:
0x8000,
28361 0x20000000:
0x808002,
28364 0x50000000:
0x808202,
28365 0x60000000:
0x800202,
28366 0x70000000:
0x800000,
28368 0x90000000:
0x800200,
28369 0xa0000000:
0x8200,
28370 0xb0000000:
0x808000,
28371 0xc0000000:
0x8002,
28372 0xd0000000:
0x800002,
28374 0xf0000000:
0x8202,
28376 0x18000000:
0x808202,
28377 0x28000000:
0x8202,
28378 0x38000000:
0x8000,
28379 0x48000000:
0x808200,
28381 0x68000000:
0x808002,
28383 0x88000000:
0x800200,
28384 0x98000000:
0x8200,
28385 0xa8000000:
0x808000,
28386 0xb8000000:
0x800202,
28387 0xc8000000:
0x800002,
28388 0xd8000000:
0x8002,
28390 0xf8000000:
0x800000,
28393 0x20000001:
0x808200,
28394 0x30000001:
0x800000,
28395 0x40000001:
0x808002,
28396 0x50000001:
0x8200,
28398 0x70000001:
0x800202,
28399 0x80000001:
0x808202,
28400 0x90000001:
0x808000,
28401 0xa0000001:
0x800002,
28402 0xb0000001:
0x8202,
28404 0xd0000001:
0x800200,
28405 0xe0000001:
0x8002,
28407 0x8000001:
0x808202,
28408 0x18000001:
0x808000,
28409 0x28000001:
0x800000,
28411 0x48000001:
0x8000,
28412 0x58000001:
0x800002,
28414 0x78000001:
0x8202,
28415 0x88000001:
0x8002,
28416 0x98000001:
0x800202,
28418 0xb8000001:
0x808200,
28419 0xc8000001:
0x800200,
28421 0xe8000001:
0x8200,
28422 0xf8000001:
0x808002
28427 0x2000000:
0x80000,
28428 0x3000000:
0x40080010,
28429 0x4000000:
0x40000010,
28430 0x5000000:
0x40084000,
28431 0x6000000:
0x40004000,
28433 0x8000000:
0x84000,
28434 0x9000000:
0x40004010,
28435 0xa000000:
0x40000000,
28436 0xb000000:
0x84010,
28437 0xc000000:
0x80010,
28440 0xf000000:
0x40080000,
28441 0x800000:
0x40004000,
28442 0x1800000:
0x84010,
28444 0x3800000:
0x40004010,
28445 0x4800000:
0x40084010,
28446 0x5800000:
0x40000000,
28447 0x6800000:
0x80000,
28448 0x7800000:
0x40080010,
28449 0x8800000:
0x80010,
28452 0xb800000:
0x40080000,
28453 0xc800000:
0x40000010,
28454 0xd800000:
0x84000,
28455 0xe800000:
0x40084000,
28458 0x11000000:
0x40080010,
28459 0x12000000:
0x40004010,
28460 0x13000000:
0x40084000,
28461 0x14000000:
0x40080000,
28463 0x16000000:
0x84010,
28464 0x17000000:
0x4000,
28465 0x18000000:
0x4010,
28466 0x19000000:
0x80000,
28467 0x1a000000:
0x80010,
28468 0x1b000000:
0x40000010,
28469 0x1c000000:
0x84000,
28470 0x1d000000:
0x40004000,
28471 0x1e000000:
0x40000000,
28472 0x1f000000:
0x40084010,
28473 0x10800000:
0x84010,
28474 0x11800000:
0x80000,
28475 0x12800000:
0x40080000,
28476 0x13800000:
0x4000,
28477 0x14800000:
0x40004000,
28478 0x15800000:
0x40084010,
28480 0x17800000:
0x40000000,
28481 0x18800000:
0x40084000,
28482 0x19800000:
0x40000010,
28483 0x1a800000:
0x40004010,
28484 0x1b800000:
0x80010,
28486 0x1d800000:
0x4010,
28487 0x1e800000:
0x40080010,
28488 0x1f800000:
0x84000
28493 0x200000:
0x4000100,
28496 0x500000:
0x4000004,
28497 0x600000:
0x4010104,
28498 0x700000:
0x4010000,
28499 0x800000:
0x4000000,
28500 0x900000:
0x4010100,
28502 0xb00000:
0x4010004,
28503 0xc00000:
0x4000104,
28507 0x80000:
0x4010100,
28508 0x180000:
0x4010004,
28510 0x380000:
0x4000100,
28511 0x480000:
0x4000004,
28517 0xa80000:
0x4010000,
28520 0xd80000:
0x4000104,
28521 0xe80000:
0x4010104,
28522 0xf80000:
0x4000000,
28523 0x1000000:
0x4010100,
28524 0x1100000:
0x10004,
28525 0x1200000:
0x10000,
28526 0x1300000:
0x4000100,
28528 0x1500000:
0x4010104,
28529 0x1600000:
0x4000004,
28531 0x1800000:
0x4000104,
28532 0x1900000:
0x4000000,
28534 0x1b00000:
0x10100,
28535 0x1c00000:
0x4010000,
28537 0x1e00000:
0x10104,
28538 0x1f00000:
0x4010004,
28539 0x1080000:
0x4000000,
28541 0x1280000:
0x4010100,
28543 0x1480000:
0x10004,
28544 0x1580000:
0x4000100,
28546 0x1780000:
0x4010004,
28547 0x1880000:
0x10000,
28548 0x1980000:
0x4010104,
28549 0x1a80000:
0x10104,
28550 0x1b80000:
0x4000004,
28551 0x1c80000:
0x4000104,
28552 0x1d80000:
0x4010000,
28558 0x10000:
0x80001040,
28560 0x30000:
0x80400000,
28563 0x60000:
0x80000040,
28565 0x80000:
0x80000000,
28568 0xb0000:
0x80001000,
28569 0xc0000:
0x80400040,
28572 0xf0000:
0x80401040,
28573 0x8000:
0x80001040,
28575 0x28000:
0x80400040,
28576 0x38000:
0x80001000,
28578 0x58000:
0x80401040,
28580 0x78000:
0x80400000,
28582 0x98000:
0x80401000,
28585 0xc8000:
0x80000000,
28588 0xf8000:
0x80000040,
28589 0x100000:
0x400040,
28590 0x110000:
0x401000,
28591 0x120000:
0x80000040,
28594 0x150000:
0x80400040,
28595 0x160000:
0x80401000,
28596 0x170000:
0x80001040,
28597 0x180000:
0x80401040,
28598 0x190000:
0x80000000,
28599 0x1a0000:
0x80400000,
28600 0x1b0000:
0x401040,
28601 0x1c0000:
0x80001000,
28602 0x1d0000:
0x400000,
28605 0x108000:
0x80400000,
28606 0x118000:
0x80401040,
28608 0x138000:
0x401000,
28609 0x148000:
0x400040,
28610 0x158000:
0x80000000,
28611 0x168000:
0x80001040,
28613 0x188000:
0x80000040,
28615 0x1a8000:
0x80001000,
28616 0x1b8000:
0x80400040,
28618 0x1d8000:
0x80401000,
28619 0x1e8000:
0x400000,
28626 0x3000:
0x20000000,
28627 0x4000:
0x20040080,
28629 0x6000:
0x21000080,
28632 0x9000:
0x20040000,
28633 0xa000:
0x20000080,
28634 0xb000:
0x21040080,
28635 0xc000:
0x21040000,
28638 0xf000:
0x21000000,
28640 0x1800:
0x21000080,
28644 0x5800:
0x20040080,
28645 0x6800:
0x21040000,
28646 0x7800:
0x20000000,
28647 0x8800:
0x20040000,
28649 0xa800:
0x21040080,
28651 0xc800:
0x20000080,
28652 0xd800:
0x21000000,
28657 0x12000:
0x20000000,
28658 0x13000:
0x21000080,
28659 0x14000:
0x1000080,
28660 0x15000:
0x21040000,
28661 0x16000:
0x20040080,
28662 0x17000:
0x1000000,
28663 0x18000:
0x21040080,
28664 0x19000:
0x21000000,
28665 0x1a000:
0x1040000,
28666 0x1b000:
0x20040000,
28668 0x1d000:
0x20000080,
28670 0x1f000:
0x1040080,
28671 0x10800:
0x21000080,
28672 0x11800:
0x1000000,
28673 0x12800:
0x1040000,
28674 0x13800:
0x20040080,
28675 0x14800:
0x20000000,
28676 0x15800:
0x1040080,
28678 0x17800:
0x21040000,
28680 0x19800:
0x21040080,
28682 0x1b800:
0x21000000,
28683 0x1c800:
0x1000080,
28685 0x1e800:
0x20040000,
28686 0x1f800:
0x20000080
28721 0x1000:
0x10002000,
28722 0x1100:
0x10200008,
28723 0x1200:
0x10202008,
28726 0x1500:
0x10000000,
28727 0x1600:
0x10000008,
28732 0x1b00:
0x10200000,
28734 0x1d00:
0x10002008,
28735 0x1e00:
0x10202000,
28740 0x1380:
0x10000008,
28741 0x1480:
0x10002000,
28743 0x1680:
0x10202008,
28744 0x1780:
0x10200000,
28745 0x1880:
0x10202000,
28746 0x1980:
0x10200008,
28751 0x1e80:
0x10000000,
28838 0x80000001:
0x8020820,
28839 0x80000002:
0x8000820,
28840 0x80000003:
0x8000000,
28841 0x80000004:
0x8020000,
28842 0x80000005:
0x20800,
28843 0x80000006:
0x20820,
28845 0x80000008:
0x8000020,
28847 0x8000000a:
0x20020,
28848 0x8000000b:
0x8020800,
28850 0x8000000d:
0x8020020,
28851 0x8000000e:
0x8000800,
28852 0x8000000f:
0x20000,
28869 0x80000010:
0x20000,
28871 0x80000012:
0x8020020,
28872 0x80000013:
0x20820,
28874 0x80000015:
0x8020000,
28875 0x80000016:
0x8000000,
28876 0x80000017:
0x8000820,
28877 0x80000018:
0x8020820,
28878 0x80000019:
0x8000020,
28879 0x8000001a:
0x8000800,
28881 0x8000001c:
0x20800,
28883 0x8000001e:
0x20020,
28884 0x8000001f:
0x8020800
28888 // Masks that select the SBOX input
28890 0xf8000001,
0x1f800000,
0x01f80000,
0x001f8000,
28891 0x0001f800,
0x00001f80,
0x000001f8,
0x8000001f
28895 * DES block cipher algorithm.
28897 var DES = C_algo.DES = BlockCipher.extend({
28898 _doReset: function () {
28900 var key = this._key;
28901 var keyWords = key.words;
28903 // Select
56 bits according to PC1
28905 for (var i =
0; i <
56; i++) {
28906 var keyBitPos = PC1[i] -
1;
28907 keyBits[i] = (keyWords[keyBitPos
>>> 5]
>>> (
31 - keyBitPos %
32)) &
1;
28910 // Assemble
16 subkeys
28911 var subKeys = this._subKeys = [];
28912 for (var nSubKey =
0; nSubKey <
16; nSubKey++) {
28914 var subKey = subKeys[nSubKey] = [];
28917 var bitShift = BIT_SHIFTS[nSubKey];
28919 // Select
48 bits according to PC2
28920 for (var i =
0; i <
24; i++) {
28921 // Select from the left
28 key bits
28922 subKey[(i /
6) |
0] |= keyBits[((PC2[i] -
1) + bitShift) %
28] << (
31 - i %
6);
28924 // Select from the right
28 key bits
28925 subKey[
4 + ((i /
6) |
0)] |= keyBits[
28 + (((PC2[i +
24] -
1) + bitShift) %
28)] << (
31 - i %
6);
28928 // Since each subkey is applied to an expanded
32-bit input,
28929 // the subkey can be broken into
8 values scaled to
32-bits,
28930 // which allows the key to be used without expansion
28931 subKey[
0] = (subKey[
0] <<
1) | (subKey[
0]
>>> 31);
28932 for (var i =
1; i <
7; i++) {
28933 subKey[i] = subKey[i]
>>> ((i -
1) *
4 +
3);
28935 subKey[
7] = (subKey[
7] <<
5) | (subKey[
7]
>>> 27);
28938 // Compute inverse subkeys
28939 var invSubKeys = this._invSubKeys = [];
28940 for (var i =
0; i <
16; i++) {
28941 invSubKeys[i] = subKeys[
15 - i];
28945 encryptBlock: function (M, offset) {
28946 this._doCryptBlock(M, offset, this._subKeys);
28949 decryptBlock: function (M, offset) {
28950 this._doCryptBlock(M, offset, this._invSubKeys);
28953 _doCryptBlock: function (M, offset, subKeys) {
28955 this._lBlock = M[offset];
28956 this._rBlock = M[offset +
1];
28958 // Initial permutation
28959 exchangeLR.call(this,
4,
0x0f0f0f0f);
28960 exchangeLR.call(this,
16,
0x0000ffff);
28961 exchangeRL.call(this,
2,
0x33333333);
28962 exchangeRL.call(this,
8,
0x00ff00ff);
28963 exchangeLR.call(this,
1,
0x55555555);
28966 for (var round =
0; round <
16; round++) {
28968 var subKey = subKeys[round];
28969 var lBlock = this._lBlock;
28970 var rBlock = this._rBlock;
28972 // Feistel function
28974 for (var i =
0; i <
8; i++) {
28975 f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i])
>>> 0];
28977 this._lBlock = rBlock;
28978 this._rBlock = lBlock ^ f;
28981 // Undo swap from last round
28982 var t = this._lBlock;
28983 this._lBlock = this._rBlock;
28986 // Final permutation
28987 exchangeLR.call(this,
1,
0x55555555);
28988 exchangeRL.call(this,
8,
0x00ff00ff);
28989 exchangeRL.call(this,
2,
0x33333333);
28990 exchangeLR.call(this,
16,
0x0000ffff);
28991 exchangeLR.call(this,
4,
0x0f0f0f0f);
28994 M[offset] = this._lBlock;
28995 M[offset +
1] = this._rBlock;
29005 // Swap bits across the left and right words
29006 function exchangeLR(offset, mask) {
29007 var t = ((this._lBlock
>>> offset) ^ this._rBlock) & mask;
29009 this._lBlock ^= t << offset;
29012 function exchangeRL(offset, mask) {
29013 var t = ((this._rBlock
>>> offset) ^ this._lBlock) & mask;
29015 this._rBlock ^= t << offset;
29019 * Shortcut functions to the cipher's object interface.
29023 * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
29024 * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
29026 C.DES = BlockCipher._createHelper(DES);
29029 * Triple-DES block cipher algorithm.
29031 var TripleDES = C_algo.TripleDES = BlockCipher.extend({
29032 _doReset: function () {
29034 var key = this._key;
29035 var keyWords = key.words;
29037 // Create DES instances
29038 this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(
0,
2)));
29039 this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(
2,
4)));
29040 this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(
4,
6)));
29043 encryptBlock: function (M, offset) {
29044 this._des1.encryptBlock(M, offset);
29045 this._des2.decryptBlock(M, offset);
29046 this._des3.encryptBlock(M, offset);
29049 decryptBlock: function (M, offset) {
29050 this._des3.decryptBlock(M, offset);
29051 this._des2.encryptBlock(M, offset);
29052 this._des1.decryptBlock(M, offset);
29063 * Shortcut functions to the cipher's object interface.
29067 * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
29068 * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
29070 C.TripleDES = BlockCipher._createHelper(TripleDES);
29074 return CryptoJS.TripleDES;
29077 },{"./cipher-core":
30,"./core":
31,"./enc-base64":
32,"./evpkdf":
34,"./md5":
39}],
62:[function(_dereq_,module,exports){
29078 ;(function (root, factory) {
29079 if (typeof exports === "object") {
29081 module.exports = exports = factory(_dereq_("./core"));
29083 else if (typeof define === "function" && define.amd) {
29085 define(["./core"], factory);
29088 // Global (browser)
29089 factory(root.CryptoJS);
29091 }(this, function (CryptoJS) {
29093 (function (undefined) {
29097 var Base = C_lib.Base;
29098 var X32WordArray = C_lib.WordArray;
29103 var C_x64 = C.x64 = {};
29108 var X64Word = C_x64.Word = Base.extend({
29110 * Initializes a newly created
64-bit word.
29112 * @param {number} high The high
32 bits.
29113 * @param {number} low The low
32 bits.
29117 * var x64Word = CryptoJS.x64.Word.create(
0x00010203,
0x04050607);
29119 init: function (high, low) {
29125 * Bitwise NOTs this word.
29127 * @return {X64Word} A new x64-Word object after negating.
29131 * var negated = x64Word.not();
29133 // not: function () {
29134 // var high = ~this.high;
29135 // var low = ~this.low;
29137 // return X64Word.create(high, low);
29141 * Bitwise ANDs this word with the passed word.
29143 * @param {X64Word} word The x64-Word to AND with this word.
29145 * @return {X64Word} A new x64-Word object after ANDing.
29149 * var anded = x64Word.and(anotherX64Word);
29151 // and: function (word) {
29152 // var high = this.high & word.high;
29153 // var low = this.low & word.low;
29155 // return X64Word.create(high, low);
29159 * Bitwise ORs this word with the passed word.
29161 * @param {X64Word} word The x64-Word to OR with this word.
29163 * @return {X64Word} A new x64-Word object after ORing.
29167 * var ored = x64Word.or(anotherX64Word);
29169 // or: function (word) {
29170 // var high = this.high | word.high;
29171 // var low = this.low | word.low;
29173 // return X64Word.create(high, low);
29177 * Bitwise XORs this word with the passed word.
29179 * @param {X64Word} word The x64-Word to XOR with this word.
29181 * @return {X64Word} A new x64-Word object after XORing.
29185 * var xored = x64Word.xor(anotherX64Word);
29187 // xor: function (word) {
29188 // var high = this.high ^ word.high;
29189 // var low = this.low ^ word.low;
29191 // return X64Word.create(high, low);
29195 * Shifts this word n bits to the left.
29197 * @param {number} n The number of bits to shift.
29199 * @return {X64Word} A new x64-Word object after shifting.
29203 * var shifted = x64Word.shiftL(
25);
29205 // shiftL: function (n) {
29207 // var high = (this.high << n) | (this.low
>>> (
32 - n));
29208 // var low = this.low << n;
29210 // var high = this.low << (n -
32);
29214 // return X64Word.create(high, low);
29218 * Shifts this word n bits to the right.
29220 * @param {number} n The number of bits to shift.
29222 * @return {X64Word} A new x64-Word object after shifting.
29226 * var shifted = x64Word.shiftR(
7);
29228 // shiftR: function (n) {
29230 // var low = (this.low
>>> n) | (this.high << (
32 - n));
29231 // var high = this.high
>>> n;
29233 // var low = this.high
>>> (n -
32);
29237 // return X64Word.create(high, low);
29241 * Rotates this word n bits to the left.
29243 * @param {number} n The number of bits to rotate.
29245 * @return {X64Word} A new x64-Word object after rotating.
29249 * var rotated = x64Word.rotL(
25);
29251 // rotL: function (n) {
29252 // return this.shiftL(n).or(this.shiftR(
64 - n));
29256 * Rotates this word n bits to the right.
29258 * @param {number} n The number of bits to rotate.
29260 * @return {X64Word} A new x64-Word object after rotating.
29264 * var rotated = x64Word.rotR(
7);
29266 // rotR: function (n) {
29267 // return this.shiftR(n).or(this.shiftL(
64 - n));
29271 * Adds this word with the passed word.
29273 * @param {X64Word} word The x64-Word to add with this word.
29275 * @return {X64Word} A new x64-Word object after adding.
29279 * var added = x64Word.add(anotherX64Word);
29281 // add: function (word) {
29282 // var low = (this.low + word.low) |
0;
29283 // var carry = (low
>>> 0) < (this.low
>>> 0) ?
1 :
0;
29284 // var high = (this.high + word.high + carry) |
0;
29286 // return X64Word.create(high, low);
29291 * An array of
64-bit words.
29293 * @property {Array} words The array of CryptoJS.x64.Word objects.
29294 * @property {number} sigBytes The number of significant bytes in this word array.
29296 var X64WordArray = C_x64.WordArray = Base.extend({
29298 * Initializes a newly created word array.
29300 * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
29301 * @param {number} sigBytes (Optional) The number of significant bytes in the words.
29305 * var wordArray = CryptoJS.x64.WordArray.create();
29307 * var wordArray = CryptoJS.x64.WordArray.create([
29308 * CryptoJS.x64.Word.create(
0x00010203,
0x04050607),
29309 * CryptoJS.x64.Word.create(
0x18191a1b,
0x1c1d1e1f)
29312 * var wordArray = CryptoJS.x64.WordArray.create([
29313 * CryptoJS.x64.Word.create(
0x00010203,
0x04050607),
29314 * CryptoJS.x64.Word.create(
0x18191a1b,
0x1c1d1e1f)
29317 init: function (words, sigBytes) {
29318 words = this.words = words || [];
29320 if (sigBytes != undefined) {
29321 this.sigBytes = sigBytes;
29323 this.sigBytes = words.length *
8;
29328 * Converts this
64-bit word array to a
32-bit word array.
29330 * @return {CryptoJS.lib.WordArray} This word array's data as a
32-bit word array.
29334 * var x32WordArray = x64WordArray.toX32();
29336 toX32: function () {
29338 var x64Words = this.words;
29339 var x64WordsLength = x64Words.length;
29343 for (var i =
0; i < x64WordsLength; i++) {
29344 var x64Word = x64Words[i];
29345 x32Words.push(x64Word.high);
29346 x32Words.push(x64Word.low);
29349 return X32WordArray.create(x32Words, this.sigBytes);
29353 * Creates a copy of this word array.
29355 * @return {X64WordArray} The clone.
29359 * var clone = x64WordArray.clone();
29361 clone: function () {
29362 var clone = Base.clone.call(this);
29364 // Clone
"words" array
29365 var words = clone.words = this.words.slice(
0);
29367 // Clone each X64Word object
29368 var wordsLength = words.length;
29369 for (var i =
0; i < wordsLength; i++) {
29370 words[i] = words[i].clone();
29382 },{
"./core":
31}],
63:[function(_dereq_,module,exports){
29383 var assert = _dereq_('assert')
29384 var BigInteger = _dereq_('bigi')
29386 var Point = _dereq_('./point')
29388 function Curve(p, a, b, Gx, Gy, n, h) {
29392 this.G = Point.fromAffine(this, Gx, Gy)
29396 this.infinity = new Point(this, null, null, BigInteger.ZERO)
29399 this.pOverFour = p.add(BigInteger.ONE).shiftRight(
2)
29402 Curve.prototype.pointFromX = function(isOdd, x) {
29403 var alpha = x.pow(
3).add(this.a.multiply(x)).add(this.b).mod(this.p)
29404 var beta = alpha.modPow(this.pOverFour, this.p)
29407 if (beta.isEven() ^ !isOdd) {
29408 y = this.p.subtract(y) // -y % p
29411 return Point.fromAffine(this, x, y)
29414 Curve.prototype.isInfinity = function(Q) {
29415 if (Q === this.infinity) return true
29417 return Q.z.signum() ===
0 && Q.y.signum() !==
0
29420 Curve.prototype.isOnCurve = function(Q) {
29421 if (this.isInfinity(Q)) return true
29429 // Check that xQ and yQ are integers in the interval [
0, p -
1]
29430 if (x.signum() <
0 || x.compareTo(p)
>=
0) return false
29431 if (y.signum() <
0 || y.compareTo(p)
>=
0) return false
29433 // and check that y^
2 = x^
3 + ax + b (mod p)
29434 var lhs = y.square().mod(p)
29435 var rhs = x.pow(
3).add(a.multiply(x)).add(b).mod(p)
29436 return lhs.equals(rhs)
29440 * Validate an elliptic curve point.
29442 * See SEC
1, section
3.2.2.1: Elliptic Curve Public Key Validation Primitive
29444 Curve.prototype.validate = function(Q) {
29446 assert(!this.isInfinity(Q), 'Point is at infinity')
29447 assert(this.isOnCurve(Q), 'Point is not on the curve')
29449 // Check nQ = O (where Q is a scalar multiple of G)
29450 var nQ = Q.multiply(this.n)
29451 assert(this.isInfinity(nQ), 'Point is not a scalar multiple of G')
29456 module.exports = Curve
29458 },{"./point":
67,"assert":
4,"bigi":
3}],
64:[function(_dereq_,module,exports){
29461 "p": "fffffffdffffffffffffffffffffffff",
29462 "a": "fffffffdfffffffffffffffffffffffc",
29463 "b": "e87579c11079f43dd824993c2cee5ed3",
29464 "n": "fffffffe0000000075a30d1b9038a115",
29466 "Gx": "
161ff7528b899b2d0c28607ca52c5b86",
29467 "Gy": "cf5ac8395bafeb13c02da292dded7a83"
29470 "p": "fffffffffffffffffffffffffffffffeffffac73",
29473 "n": "
0100000000000000000001b8fa16dfab9aca16b6b3",
29475 "Gx": "
3b4c382ce37aa192a4019e763036f4f5dd4d7ebb",
29476 "Gy": "
938cf935318fdced6bc28286531733c3f03c4fee"
29479 "p": "ffffffffffffffffffffffffffffffff7fffffff",
29480 "a": "ffffffffffffffffffffffffffffffff7ffffffc",
29481 "b": "
1c97befc54bd7a8b65acf89f81d4d4adc565fa45",
29482 "n": "
0100000000000000000001f4c8f927aed3ca752257",
29484 "Gx": "
4a96b5688ef573284664698968c38bb913cbfc82",
29485 "Gy": "
23a628553168947d59dcc912042351377ac5fb32"
29488 "p": "fffffffffffffffffffffffffffffffffffffffeffffee37",
29491 "n": "fffffffffffffffffffffffe26f2fc170f69466a74defd8d",
29493 "Gx": "db4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d",
29494 "Gy": "
9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d"
29497 "p": "fffffffffffffffffffffffffffffffeffffffffffffffff",
29498 "a": "fffffffffffffffffffffffffffffffefffffffffffffffc",
29499 "b": "
64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1",
29500 "n": "ffffffffffffffffffffffff99def836146bc9b1b4d22831",
29502 "Gx": "
188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012",
29503 "Gy": "
07192b95ffc8da78631011ed6b24cdd573f977a11e794811"
29506 "p": "ffffffffffffffffffffffffffffffff000000000000000000000001",
29507 "a": "fffffffffffffffffffffffffffffffefffffffffffffffffffffffe",
29508 "b": "b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4",
29509 "n": "ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
29511 "Gx": "b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
29512 "Gy": "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"
29515 "p": "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
29518 "n": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
29520 "Gx": "
79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
29521 "Gy": "
483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
29524 "p": "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
29525 "a": "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc",
29526 "b": "
5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b",
29527 "n": "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
29529 "Gx": "
6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
29530 "Gy": "
4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
29534 },{}],
65:[function(_dereq_,module,exports){
29535 var Point = _dereq_('./point')
29536 var Curve = _dereq_('./curve')
29538 var getCurveByName = _dereq_('./names')
29543 getCurveByName: getCurveByName
29546 },{"./curve":
63,"./names":
66,"./point":
67}],
66:[function(_dereq_,module,exports){
29547 var BigInteger = _dereq_('bigi')
29549 var curves = _dereq_('./curves')
29550 var Curve = _dereq_('./curve')
29552 function getCurveByName(name) {
29553 var curve = curves[name]
29554 if (!curve) return null
29556 var p = new BigInteger(curve.p,
16)
29557 var a = new BigInteger(curve.a,
16)
29558 var b = new BigInteger(curve.b,
16)
29559 var n = new BigInteger(curve.n,
16)
29560 var h = new BigInteger(curve.h,
16)
29561 var Gx = new BigInteger(curve.Gx,
16)
29562 var Gy = new BigInteger(curve.Gy,
16)
29564 return new Curve(p, a, b, Gx, Gy, n, h)
29567 module.exports = getCurveByName
29569 },{"./curve":
63,"./curves":
64,"bigi":
3}],
67:[function(_dereq_,module,exports){
29570 (function (Buffer){
29571 var assert = _dereq_('assert')
29572 var BigInteger = _dereq_('bigi')
29574 var THREE = BigInteger.valueOf(
3)
29576 function Point(curve, x, y, z) {
29577 assert.notStrictEqual(z, undefined, 'Missing Z coordinate')
29585 this.compressed = true
29588 Object.defineProperty(Point.prototype, 'zInv', {
29590 if (this._zInv === null) {
29591 this._zInv = this.z.modInverse(this.curve.p)
29598 Object.defineProperty(Point.prototype, 'affineX', {
29600 return this.x.multiply(this.zInv).mod(this.curve.p)
29604 Object.defineProperty(Point.prototype, 'affineY', {
29606 return this.y.multiply(this.zInv).mod(this.curve.p)
29610 Point.fromAffine = function(curve, x, y) {
29611 return new Point(curve, x, y, BigInteger.ONE)
29614 Point.prototype.equals = function(other) {
29615 if (other === this) return true
29616 if (this.curve.isInfinity(this)) return this.curve.isInfinity(other)
29617 if (this.curve.isInfinity(other)) return this.curve.isInfinity(this)
29619 // u = Y2 * Z1 - Y1 * Z2
29620 var u = other.y.multiply(this.z).subtract(this.y.multiply(other.z)).mod(this.curve.p)
29622 if (u.signum() !==
0) return false
29624 // v = X2 * Z1 - X1 * Z2
29625 var v = other.x.multiply(this.z).subtract(this.x.multiply(other.z)).mod(this.curve.p)
29627 return v.signum() ===
0
29630 Point.prototype.negate = function() {
29631 var y = this.curve.p.subtract(this.y)
29633 return new Point(this.curve, this.x, y, this.z)
29636 Point.prototype.add = function(b) {
29637 if (this.curve.isInfinity(this)) return b
29638 if (this.curve.isInfinity(b)) return this
29645 // u = Y2 * Z1 - Y1 * Z2
29646 var u = y2.multiply(this.z).subtract(y1.multiply(b.z)).mod(this.curve.p)
29647 // v = X2 * Z1 - X1 * Z2
29648 var v = x2.multiply(this.z).subtract(x1.multiply(b.z)).mod(this.curve.p)
29650 if (v.signum() ===
0) {
29651 if (u.signum() ===
0) {
29652 return this.twice() // this == b, so double
29655 return this.curve.infinity // this = -b, so infinity
29658 var v2 = v.square()
29659 var v3 = v2.multiply(v)
29660 var x1v2 = x1.multiply(v2)
29661 var zu2 = u.square().multiply(this.z)
29663 // x3 = v * (z2 * (z1 * u^
2 -
2 * x1 * v^
2) - v^
3)
29664 var x3 = zu2.subtract(x1v2.shiftLeft(
1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.p)
29665 // y3 = z2 * (
3 * x1 * u * v^
2 - y1 * v^
3 - z1 * u^
3) + u * v^
3
29666 var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.p)
29667 // z3 = v^
3 * z1 * z2
29668 var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.p)
29670 return new Point(this.curve, x3, y3, z3)
29673 Point.prototype.twice = function() {
29674 if (this.curve.isInfinity(this)) return this
29675 if (this.y.signum() ===
0) return this.curve.infinity
29680 var y1z1 = y1.multiply(this.z)
29681 var y1sqz1 = y1z1.multiply(y1).mod(this.curve.p)
29682 var a = this.curve.a
29684 // w =
3 * x1^
2 + a * z1^
2
29685 var w = x1.square().multiply(THREE)
29687 if (a.signum() !==
0) {
29688 w = w.add(this.z.square().multiply(a))
29691 w = w.mod(this.curve.p)
29692 // x3 =
2 * y1 * z1 * (w^
2 -
8 * x1 * y1^
2 * z1)
29693 var x3 = w.square().subtract(x1.shiftLeft(
3).multiply(y1sqz1)).shiftLeft(
1).multiply(y1z1).mod(this.curve.p)
29694 // y3 =
4 * y1^
2 * z1 * (
3 * w * x1 -
2 * y1^
2 * z1) - w^
3
29695 var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(
1)).shiftLeft(
2).multiply(y1sqz1).subtract(w.pow(
3)).mod(this.curve.p)
29696 // z3 =
8 * (y1 * z1)^
3
29697 var z3 = y1z1.pow(
3).shiftLeft(
3).mod(this.curve.p)
29699 return new Point(this.curve, x3, y3, z3)
29702 // Simple NAF (Non-Adjacent Form) multiplication algorithm
29703 // TODO: modularize the multiplication algorithm
29704 Point.prototype.multiply = function(k) {
29705 if (this.curve.isInfinity(this)) return this
29706 if (k.signum() ===
0) return this.curve.infinity
29709 var h = e.multiply(THREE)
29711 var neg = this.negate()
29714 for (var i = h.bitLength() -
2; i
> 0; --i) {
29717 var hBit = h.testBit(i)
29718 var eBit = e.testBit(i)
29720 if (hBit != eBit) {
29721 R = R.add(hBit ? this : neg)
29728 // Compute this*j + x*k (simultaneous multiplication)
29729 Point.prototype.multiplyTwo = function(j, x, k) {
29732 if (j.bitLength()
> k.bitLength())
29733 i = j.bitLength() -
1
29735 i = k.bitLength() -
1
29737 var R = this.curve.infinity
29738 var both = this.add(x)
29743 var jBit = j.testBit(i)
29744 var kBit = k.testBit(i)
29765 Point.prototype.getEncoded = function(compressed) {
29766 if (compressed == undefined) compressed = this.compressed
29767 if (this.curve.isInfinity(this)) return new Buffer('
00', 'hex') // Infinity point encoded is simply '
00'
29769 var x = this.affineX
29770 var y = this.affineY
29774 // Determine size of q in bytes
29775 var byteLength = Math.floor((this.curve.p.bitLength() +
7) /
8)
29779 buffer = new Buffer(
1 + byteLength)
29780 buffer.writeUInt8(y.isEven() ?
0x02 :
0x03,
0)
29784 buffer = new Buffer(
1 + byteLength + byteLength)
29785 buffer.writeUInt8(
0x04,
0)
29787 y.toBuffer(byteLength).copy(buffer,
1 + byteLength)
29790 x.toBuffer(byteLength).copy(buffer,
1)
29795 Point.decodeFrom = function(curve, buffer) {
29796 var type = buffer.readUInt8(
0)
29797 var compressed = (type !==
4)
29799 var x = BigInteger.fromBuffer(buffer.slice(
1,
33))
29800 var byteLength = Math.floor((curve.p.bitLength() +
7) /
8)
29804 assert.equal(buffer.length, byteLength +
1, 'Invalid sequence length')
29805 assert(type ===
0x02 || type ===
0x03, 'Invalid sequence tag')
29807 var isOdd = (type ===
0x03)
29808 Q = curve.pointFromX(isOdd, x)
29811 assert.equal(buffer.length,
1 + byteLength + byteLength, 'Invalid sequence length')
29813 var y = BigInteger.fromBuffer(buffer.slice(
1 + byteLength))
29814 Q = Point.fromAffine(curve, x, y)
29817 Q.compressed = compressed
29821 Point.prototype.toString = function () {
29822 if (this.curve.isInfinity(this)) return '(INFINITY)'
29824 return '(' + this.affineX.toString() + ',' + this.affineY.toString() + ')'
29827 module.exports = Point
29829 }).call(this,_dereq_("buffer").Buffer)
29830 },{"assert":
4,"bigi":
3,"buffer":
8}],
68:[function(_dereq_,module,exports){
29831 (function (process,Buffer){
29832 // Closure compiler error - result of 'not' operator not being used
29833 //!function(globals){
29834 (function(globals){
29838 if (typeof define !== 'undefined' && define.amd) { //require.js / AMD
29839 define([], function() {
29840 return secureRandom
29842 } else if (typeof module !== 'undefined' && module.exports) { //CommonJS
29843 module.exports = secureRandom
29844 } else { //script / browser
29845 globals.secureRandom = secureRandom
29849 //options.type is the only valid option
29850 function secureRandom(count, options) {
29851 options = options || {type: 'Array'}
29852 //we check for process.pid to prevent browserify from tricking us
29853 if (typeof process != 'undefined' && typeof process.pid == 'number') {
29854 return nodeRandom(count, options)
29856 var crypto = window.crypto || window.msCrypto
29857 if (!crypto) throw new Error("Your browser does not support window.crypto.")
29858 return browserRandom(count, options)
29862 function nodeRandom(count, options) {
29863 var crypto = _dereq_('crypto')
29864 var buf = crypto.randomBytes(count)
29866 switch (options.type) {
29868 return [].slice.call(buf)
29872 var arr = new Uint8Array(count)
29873 for (var i =
0; i < count; ++i) { arr[i] = buf.readUInt8(i) }
29876 throw new Error(options.type + " is unsupported.")
29880 function browserRandom(count, options) {
29881 var nativeArr = new Uint8Array(count)
29882 var crypto = window.crypto || window.msCrypto
29883 crypto.getRandomValues(nativeArr)
29885 switch (options.type) {
29887 return [].slice.call(nativeArr)
29889 try { var b = new Buffer(
1) } catch(e) { throw new Error('Buffer not supported in this environment. Use Node.js or Browserify for browser support.')}
29890 return new Buffer(nativeArr)
29894 throw new Error(options.type + " is unsupported.")
29898 secureRandom.randomArray = function(byteCount) {
29899 return secureRandom(byteCount, {type: 'Array'})
29902 secureRandom.randomUint8Array = function(byteCount) {
29903 return secureRandom(byteCount, {type: 'Uint8Array'})
29906 secureRandom.randomBuffer = function(byteCount) {
29907 return secureRandom(byteCount, {type: 'Buffer'})
29913 }).call(this,_dereq_("FWaASH"),_dereq_("buffer").Buffer)
29914 },{"FWaASH":
12,"buffer":
8,"crypto":
7}],
69:[function(_dereq_,module,exports){
29915 (function (Buffer){
29916 var assert = _dereq_('assert')
29917 var base58check = _dereq_('./base58check')
29918 var networks = _dereq_('./networks')
29919 var scripts = _dereq_('./scripts')
29921 function findScriptTypeByVersion(version) {
29922 for (var networkName in networks) {
29923 var network = networks[networkName]
29925 if (version === network.pubKeyHash) return 'pubkeyhash'
29926 if (version === network.scriptHash) return 'scripthash'
29930 function Address(hash, version) {
29931 assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
29932 assert.strictEqual(hash.length,
20, 'Invalid hash length')
29933 assert.strictEqual(version &
0xff, version, 'Invalid version byte')
29936 this.version = version
29939 // Import functions
29940 Address.fromBase58Check = function(string) {
29941 var payload = base58check.decode(string)
29942 var version = payload.readUInt8(
0)
29943 var hash = payload.slice(
1)
29945 return new Address(hash, version)
29948 Address.fromOutputScript = function(script, network) {
29949 network = network || networks.bitcoin
29951 var type = scripts.classifyOutput(script)
29953 if (type === 'pubkeyhash') return new Address(script.chunks[
2], network.pubKeyHash)
29954 if (type === 'scripthash') return new Address(script.chunks[
1], network.scriptHash)
29956 assert(false, type + ' has no matching Address')
29959 // Export functions
29960 Address.prototype.toBase58Check = function () {
29961 var payload = new Buffer(
21)
29962 payload.writeUInt8(this.version,
0)
29963 this.hash.copy(payload,
1)
29965 return base58check.encode(payload)
29968 Address.prototype.toOutputScript = function() {
29969 var scriptType = findScriptTypeByVersion(this.version)
29971 if (scriptType === 'pubkeyhash') return scripts.pubKeyHashOutput(this.hash)
29972 if (scriptType === 'scripthash') return scripts.scriptHashOutput(this.hash)
29974 assert(false, this.toString() + ' has no matching Script')
29977 Address.prototype.toString = Address.prototype.toBase58Check
29979 module.exports = Address
29981 }).call(this,_dereq_("buffer").Buffer)
29982 },{"./base58check":
70,"./networks":
81,"./scripts":
84,"assert":
4,"buffer":
8}],
70:[function(_dereq_,module,exports){
29983 (function (Buffer){
29984 // https://en.bitcoin.it/wiki/Base58Check_encoding
29985 var assert = _dereq_('assert')
29986 var base58 = _dereq_('bs58')
29987 var crypto = _dereq_('./crypto')
29989 // Encode a buffer as a base58-check-encoded string
29990 function encode(payload) {
29991 var checksum = crypto.hash256(payload).slice(
0,
4)
29993 return base58.encode(Buffer.concat([
29999 // Decode a base58-check-encoded string to a buffer
30000 function decode(string) {
30001 var buffer = base58.decode(string)
30003 var payload = buffer.slice(
0, -
4)
30004 var checksum = buffer.slice(-
4)
30005 var newChecksum = crypto.hash256(payload).slice(
0,
4)
30007 assert.deepEqual(newChecksum, checksum, 'Invalid checksum')
30017 }).call(this,_dereq_("buffer").Buffer)
30018 },{"./crypto":
73,"assert":
4,"bs58":
15,"buffer":
8}],
71:[function(_dereq_,module,exports){
30019 var assert = _dereq_('assert')
30020 var opcodes = _dereq_('./opcodes')
30022 // https://github.com/feross/buffer/blob/master/index.js#L1127
30023 function verifuint(value, max) {
30024 assert(typeof value === 'number', 'cannot write a non-number as a number')
30025 assert(value
>=
0, 'specified a negative value for writing an unsigned value')
30026 assert(value <= max, 'value is larger than maximum value for type')
30027 assert(Math.floor(value) === value, 'value has a fractional component')
30030 function pushDataSize(i) {
30031 return i < opcodes.OP_PUSHDATA1 ?
1
30037 function readPushDataInt(buffer, offset) {
30038 var opcode = buffer.readUInt8(offset)
30042 if (opcode < opcodes.OP_PUSHDATA1) {
30047 } else if (opcode === opcodes.OP_PUSHDATA1) {
30048 number = buffer.readUInt8(offset +
1)
30052 } else if (opcode === opcodes.OP_PUSHDATA2) {
30053 number = buffer.readUInt16LE(offset +
1)
30058 assert.equal(opcode, opcodes.OP_PUSHDATA4, 'Unexpected opcode')
30060 number = buffer.readUInt32LE(offset +
1)
30072 function readUInt64LE(buffer, offset) {
30073 var a = buffer.readUInt32LE(offset)
30074 var b = buffer.readUInt32LE(offset +
4)
30077 verifuint(b + a,
0x001fffffffffffff)
30082 function readVarInt(buffer, offset) {
30083 var t = buffer.readUInt8(offset)
30092 } else if (t <
254) {
30093 number = buffer.readUInt16LE(offset +
1)
30097 } else if (t <
255) {
30098 number = buffer.readUInt32LE(offset +
1)
30103 number = readUInt64LE(buffer, offset +
1)
30113 function writePushDataInt(buffer, number, offset) {
30114 var size = pushDataSize(number)
30118 buffer.writeUInt8(number, offset)
30121 } else if (size ===
2) {
30122 buffer.writeUInt8(opcodes.OP_PUSHDATA1, offset)
30123 buffer.writeUInt8(number, offset +
1)
30126 } else if (size ===
3) {
30127 buffer.writeUInt8(opcodes.OP_PUSHDATA2, offset)
30128 buffer.writeUInt16LE(number, offset +
1)
30132 buffer.writeUInt8(opcodes.OP_PUSHDATA4, offset)
30133 buffer.writeUInt32LE(number, offset +
1)
30140 function writeUInt64LE(buffer, value, offset) {
30141 verifuint(value,
0x001fffffffffffff)
30143 buffer.writeInt32LE(value & -
1, offset)
30144 buffer.writeUInt32LE(Math.floor(value /
0x100000000), offset +
4)
30147 function varIntSize(i) {
30150 : i <
0x100000000 ?
5
30154 function writeVarInt(buffer, number, offset) {
30155 var size = varIntSize(number)
30159 buffer.writeUInt8(number, offset)
30162 } else if (size ===
3) {
30163 buffer.writeUInt8(
253, offset)
30164 buffer.writeUInt16LE(number, offset +
1)
30167 } else if (size ===
5) {
30168 buffer.writeUInt8(
254, offset)
30169 buffer.writeUInt32LE(number, offset +
1)
30173 buffer.writeUInt8(
255, offset)
30174 writeUInt64LE(buffer, number, offset +
1)
30181 pushDataSize: pushDataSize,
30182 readPushDataInt: readPushDataInt,
30183 readUInt64LE: readUInt64LE,
30184 readVarInt: readVarInt,
30185 varIntSize: varIntSize,
30186 writePushDataInt: writePushDataInt,
30187 writeUInt64LE: writeUInt64LE,
30188 writeVarInt: writeVarInt
30191 },{"./opcodes":
82,"assert":
4}],
72:[function(_dereq_,module,exports){
30192 (function (Buffer){
30193 var assert = _dereq_('assert')
30194 var Crypto = _dereq_('crypto-js')
30195 var WordArray = Crypto.lib.WordArray
30197 function bufferToWordArray(buffer) {
30198 assert(Buffer.isBuffer(buffer), 'Expected Buffer, got', buffer)
30201 for (var i =
0, b =
0; i < buffer.length; i++, b +=
8) {
30202 words[b
>>> 5] |= buffer[i] << (
24 - b %
32)
30205 return new WordArray.init(words, buffer.length)
30208 function wordArrayToBuffer(wordArray) {
30209 assert(Array.isArray(wordArray.words), 'Expected WordArray, got' + wordArray)
30211 var words = wordArray.words
30212 var buffer = new Buffer(words.length *
4)
30214 words.forEach(function(value, i) {
30215 buffer.writeInt32BE(value & -
1, i *
4)
30222 bufferToWordArray: bufferToWordArray,
30223 wordArrayToBuffer: wordArrayToBuffer
30226 }).call(this,_dereq_(
"buffer").Buffer)
30227 },{
"assert":
4,
"buffer":
8,
"crypto-js":
37}],
73:[function(_dereq_,module,exports){
30228 (function (Buffer){
30229 // Crypto, crypto, where art thou crypto
30230 var assert = _dereq_('assert')
30231 var CryptoJS = _dereq_('crypto-js')
30232 var crypto = _dereq_('crypto')
30233 var convert = _dereq_('./convert')
30235 function hash160(buffer) {
30236 return ripemd160(sha256(buffer))
30239 function hash256(buffer) {
30240 return sha256(sha256(buffer))
30243 function ripemd160(buffer) {
30244 return crypto.createHash('rmd160').update(buffer).digest()
30247 function sha1(buffer) {
30248 return crypto.createHash('sha1').update(buffer).digest()
30251 function sha256(buffer) {
30252 return crypto.createHash('sha256').update(buffer).digest()
30255 // FIXME: Name not consistent with others
30256 function HmacSHA256(buffer, secret) {
30257 return crypto.createHmac('sha256', secret).update(buffer).digest()
30260 function HmacSHA512(data, secret) {
30261 assert(Buffer.isBuffer(data), 'Expected Buffer for data, got ' + data)
30262 assert(Buffer.isBuffer(secret), 'Expected Buffer for secret, got ' + secret)
30264 var dataWords = convert.bufferToWordArray(data)
30265 var secretWords = convert.bufferToWordArray(secret)
30267 var hash = CryptoJS.HmacSHA512(dataWords, secretWords)
30269 return convert.wordArrayToBuffer(hash)
30273 ripemd160: ripemd160,
30278 HmacSHA256: HmacSHA256,
30279 HmacSHA512: HmacSHA512
30282 }).call(this,_dereq_(
"buffer").Buffer)
30283 },{
"./convert":
72,
"assert":
4,
"buffer":
8,
"crypto":
19,
"crypto-js":
37}],
74:[function(_dereq_,module,exports){
30284 (function (Buffer){
30285 var assert = _dereq_('assert')
30286 var crypto = _dereq_('./crypto')
30288 var BigInteger = _dereq_('bigi')
30289 var ECSignature = _dereq_('./ecsignature')
30290 var Point = _dereq_('ecurve').Point
30292 // https://tools.ietf.org/html/rfc6979#section-
3.2
30293 function deterministicGenerateK(curve, hash, d) {
30294 assert(Buffer.isBuffer(hash), 'Hash must be a Buffer, not ' + hash)
30295 assert.equal(hash.length,
32, 'Hash must be
256 bit')
30296 assert(d instanceof BigInteger, 'Private key must be a BigInteger')
30298 var x = d.toBuffer(
32)
30299 var k = new Buffer(
32)
30300 var v = new Buffer(
32)
30309 k = crypto.HmacSHA256(Buffer.concat([v, new Buffer([
0]), x, hash]), k)
30312 v = crypto.HmacSHA256(v, k)
30315 k = crypto.HmacSHA256(Buffer.concat([v, new Buffer([
1]), x, hash]), k)
30318 v = crypto.HmacSHA256(v, k)
30320 // Step H1/H2a, ignored as tlen === qlen (
256 bit)
30322 v = crypto.HmacSHA256(v, k)
30324 var T = BigInteger.fromBuffer(v)
30326 // Step H3, repeat until T is within the interval [
1, n -
1]
30327 while ((T.signum() <=
0) || (T.compareTo(curve.n)
>=
0)) {
30328 k = crypto.HmacSHA256(Buffer.concat([v, new Buffer([
0])]), k)
30329 v = crypto.HmacSHA256(v, k)
30331 T = BigInteger.fromBuffer(v)
30337 function sign(curve, hash, d) {
30338 var k = deterministicGenerateK(curve, hash, d)
30342 var Q = G.multiply(k)
30343 var e = BigInteger.fromBuffer(hash)
30345 var r = Q.affineX.mod(n)
30346 assert.notEqual(r.signum(),
0, 'Invalid R value')
30348 var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n)
30349 assert.notEqual(s.signum(),
0, 'Invalid S value')
30351 var N_OVER_TWO = n.shiftRight(
1)
30353 // enforce low S values, see bip62: 'low s values in signatures'
30354 if (s.compareTo(N_OVER_TWO)
> 0) {
30358 return new ECSignature(r, s)
30361 function verify(curve, hash, signature, Q) {
30362 var e = BigInteger.fromBuffer(hash)
30364 return verifyRaw(curve, e, signature, Q)
30367 function verifyRaw(curve, e, signature, Q) {
30371 var r = signature.r
30372 var s = signature.s
30374 if (r.signum() ===
0 || r.compareTo(n)
>=
0) return false
30375 if (s.signum() ===
0 || s.compareTo(n)
>=
0) return false
30377 var c = s.modInverse(n)
30379 var u1 = e.multiply(c).mod(n)
30380 var u2 = r.multiply(c).mod(n)
30382 var point = G.multiplyTwo(u1, Q, u2)
30383 var v = point.affineX.mod(n)
30389 * Recover a public key from a signature.
30391 * See SEC
1: Elliptic Curve Cryptography, section
4.1.6, "Public
30392 * Key Recovery Operation".
30394 * http://www.secg.org/download/aid-
780/sec1-v2.pdf
30396 function recoverPubKey(curve, e, signature, i) {
30397 assert.strictEqual(i &
3, i, 'Recovery param is more than two bits')
30399 var r = signature.r
30400 var s = signature.s
30402 // A set LSB signifies that the y-coordinate is odd
30405 // The more significant bit specifies whether we should use the
30406 // first or second candidate key.
30407 var isSecondKey = i
>> 1
30412 //
1.1 Let x = r + jn
30413 var x = isSecondKey ? r.add(n) : r
30414 var R = curve.pointFromX(isYOdd, x)
30416 //
1.4 Check that nR is at infinity
30417 var nR = R.multiply(n)
30418 assert(curve.isInfinity(nR), 'nR is not a valid curve point')
30420 // Compute -e from e
30421 var eNeg = e.negate().mod(n)
30423 //
1.6.1 Compute Q = r^-
1 (sR - eG)
30424 // Q = r^-
1 (sR + -eG)
30425 var rInv = r.modInverse(n)
30427 var Q = R.multiplyTwo(s, G, eNeg).multiply(rInv)
30434 * Calculate pubkey extraction parameter.
30436 * When extracting a pubkey from a signature, we have to
30437 * distinguish four different cases. Rather than putting this
30438 * burden on the verifier, Bitcoin includes a
2-bit value with the
30441 * This function simply tries all four cases and returns the value
30442 * that resulted in a successful pubkey recovery.
30444 function calcPubKeyRecoveryParam(curve, e, signature, Q) {
30445 for (var i =
0; i <
4; i++) {
30446 var Qprime = recoverPubKey(curve, e, signature, i)
30449 if (Qprime.equals(Q)) {
30454 throw new Error('Unable to find valid recovery factor')
30458 calcPubKeyRecoveryParam: calcPubKeyRecoveryParam,
30459 deterministicGenerateK: deterministicGenerateK,
30460 recoverPubKey: recoverPubKey,
30463 verifyRaw: verifyRaw
30466 }).call(this,_dereq_(
"buffer").Buffer)
30467 },{
"./crypto":
73,
"./ecsignature":
77,
"assert":
4,
"bigi":
3,
"buffer":
8,
"ecurve":
65}],
75:[function(_dereq_,module,exports){
30468 (function (Buffer){
30469 var assert = _dereq_('assert')
30470 var base58check = _dereq_('./base58check')
30471 var ecdsa = _dereq_('./ecdsa')
30472 var networks = _dereq_('./networks')
30473 var secureRandom = _dereq_('secure-random')
30475 var BigInteger = _dereq_('bigi')
30476 var ECPubKey = _dereq_('./ecpubkey')
30478 var ecurve = _dereq_('ecurve')
30479 var curve = ecurve.getCurveByName('secp256k1')
30481 function ECKey(d, compressed) {
30482 assert(d.signum()
> 0, 'Private key must be greater than
0')
30483 assert(d.compareTo(curve.n) <
0, 'Private key must be less than the curve order')
30485 var Q = curve.G.multiply(d)
30488 this.pub = new ECPubKey(Q, compressed)
30491 // Static constructors
30492 ECKey.fromWIF = function(string) {
30493 var payload = base58check.decode(string)
30494 var compressed = false
30496 // Ignore the version byte
30497 payload = payload.slice(
1)
30499 if (payload.length ===
33) {
30500 assert.strictEqual(payload[
32],
0x01, 'Invalid compression flag')
30502 // Truncate the compression flag
30503 payload = payload.slice(
0, -
1)
30507 assert.equal(payload.length,
32, 'Invalid WIF payload length')
30509 var d = BigInteger.fromBuffer(payload)
30510 return new ECKey(d, compressed)
30513 ECKey.makeRandom = function(compressed, rng) {
30514 rng = rng || secureRandom.randomBuffer
30516 var buffer = rng(
32)
30517 assert(Buffer.isBuffer(buffer), 'Expected Buffer, got ' + buffer)
30519 var d = BigInteger.fromBuffer(buffer)
30522 return new ECKey(d, compressed)
30525 // Export functions
30526 ECKey.prototype.toWIF = function(network) {
30527 network = network || networks.bitcoin
30529 var bufferLen = this.pub.compressed ?
34 :
33
30530 var buffer = new Buffer(bufferLen)
30532 buffer.writeUInt8(network.wif,
0)
30533 this.d.toBuffer(
32).copy(buffer,
1)
30535 if (this.pub.compressed) {
30536 buffer.writeUInt8(
0x01,
33)
30539 return base58check.encode(buffer)
30543 ECKey.prototype.sign = function(hash) {
30544 return ecdsa.sign(curve, hash, this.d)
30547 module.exports = ECKey
30549 }).call(this,_dereq_(
"buffer").Buffer)
30550 },{
"./base58check":
70,
"./ecdsa":
74,
"./ecpubkey":
76,
"./networks":
81,
"assert":
4,
"bigi":
3,
"buffer":
8,
"ecurve":
65,
"secure-random":
68}],
76:[function(_dereq_,module,exports){
30551 (function (Buffer){
30552 var assert = _dereq_('assert')
30553 var crypto = _dereq_('./crypto')
30554 var ecdsa = _dereq_('./ecdsa')
30555 var networks = _dereq_('./networks')
30557 var Address = _dereq_('./address')
30559 var ecurve = _dereq_('ecurve')
30560 var curve = ecurve.getCurveByName('secp256k1')
30562 function ECPubKey(Q, compressed) {
30563 assert(Q instanceof ecurve.Point, 'Expected Point, got ' + Q)
30565 if (compressed == undefined) compressed = true
30566 assert.strictEqual(typeof compressed, 'boolean', 'Expected boolean, got ' + compressed)
30568 this.compressed = compressed
30572 // Static constructors
30573 ECPubKey.fromBuffer = function(buffer) {
30574 var Q = ecurve.Point.decodeFrom(curve, buffer)
30575 return new ECPubKey(Q, Q.compressed)
30578 ECPubKey.fromHex = function(hex) {
30579 return ECPubKey.fromBuffer(new Buffer(hex, 'hex'))
30583 ECPubKey.prototype.getAddress = function(network) {
30584 network = network || networks.bitcoin
30586 return new Address(crypto.hash160(this.toBuffer()), network.pubKeyHash)
30589 ECPubKey.prototype.verify = function(hash, signature) {
30590 return ecdsa.verify(curve, hash, signature, this.Q)
30593 // Export functions
30594 ECPubKey.prototype.toBuffer = function() {
30595 return this.Q.getEncoded(this.compressed)
30598 ECPubKey.prototype.toHex = function() {
30599 return this.toBuffer().toString('hex')
30602 module.exports = ECPubKey
30604 }).call(this,_dereq_(
"buffer").Buffer)
30605 },{
"./address":
69,
"./crypto":
73,
"./ecdsa":
74,
"./networks":
81,
"assert":
4,
"buffer":
8,
"ecurve":
65}],
77:[function(_dereq_,module,exports){
30606 (function (Buffer){
30607 var assert = _dereq_('assert')
30608 var BigInteger = _dereq_('bigi')
30610 function ECSignature(r, s) {
30611 assert(r instanceof BigInteger, 'Expected BigInteger, got ' + r)
30612 assert(s instanceof BigInteger, 'Expected BigInteger, got ' + s)
30617 // Import operations
30618 ECSignature.parseCompact = function(buffer) {
30619 assert.equal(buffer.length,
65, 'Invalid signature length')
30620 var i = buffer.readUInt8(
0) -
27
30623 assert.equal(i, i &
7, 'Invalid signature parameter')
30624 var compressed = !!(i &
4)
30626 // Recovery param only
30629 var r = BigInteger.fromBuffer(buffer.slice(
1,
33))
30630 var s = BigInteger.fromBuffer(buffer.slice(
33))
30633 compressed: compressed,
30635 signature: new ECSignature(r, s)
30639 ECSignature.fromDER = function(buffer) {
30640 assert.equal(buffer.readUInt8(
0),
0x30, 'Not a DER sequence')
30641 assert.equal(buffer.readUInt8(
1), buffer.length -
2, 'Invalid sequence length')
30642 assert.equal(buffer.readUInt8(
2),
0x02, 'Expected a DER integer')
30644 var rLen = buffer.readUInt8(
3)
30645 assert(rLen
> 0, 'R length is zero')
30647 var offset =
4 + rLen
30648 assert.equal(buffer.readUInt8(offset),
0x02, 'Expected a DER integer (
2)')
30650 var sLen = buffer.readUInt8(offset +
1)
30651 assert(sLen
> 0, 'S length is zero')
30653 var rB = buffer.slice(
4, offset)
30654 var sB = buffer.slice(offset +
2)
30657 if (rLen
> 1 && rB.readUInt8(
0) ===
0x00) {
30658 assert(rB.readUInt8(
1) &
0x80, 'R value excessively padded')
30661 if (sLen
> 1 && sB.readUInt8(
0) ===
0x00) {
30662 assert(sB.readUInt8(
1) &
0x80, 'S value excessively padded')
30665 assert.equal(offset, buffer.length, 'Invalid DER encoding')
30666 var r = BigInteger.fromDERInteger(rB)
30667 var s = BigInteger.fromDERInteger(sB)
30669 assert(r.signum()
>=
0, 'R value is negative')
30670 assert(s.signum()
>=
0, 'S value is negative')
30672 return new ECSignature(r, s)
30675 // FIXME:
0x00,
0x04,
0x80 are SIGHASH_* boundary constants, importing Transaction causes a circular dependency
30676 ECSignature.parseScriptSignature = function(buffer) {
30677 var hashType = buffer.readUInt8(buffer.length -
1)
30678 var hashTypeMod = hashType & ~
0x80
30680 assert(hashTypeMod
> 0x00 && hashTypeMod <
0x04, 'Invalid hashType')
30683 signature: ECSignature.fromDER(buffer.slice(
0, -
1)),
30688 // Export operations
30689 ECSignature.prototype.toCompact = function(i, compressed) {
30690 if (compressed) i +=
4
30693 var buffer = new Buffer(
65)
30694 buffer.writeUInt8(i,
0)
30696 this.r.toBuffer(
32).copy(buffer,
1)
30697 this.s.toBuffer(
32).copy(buffer,
33)
30702 ECSignature.prototype.toDER = function() {
30703 var rBa = this.r.toDERInteger()
30704 var sBa = this.s.toDERInteger()
30707 sequence.push(
0x02) // INTEGER
30708 sequence.push(rBa.length)
30709 sequence = sequence.concat(rBa)
30711 sequence.push(
0x02) // INTEGER
30712 sequence.push(sBa.length)
30713 sequence = sequence.concat(sBa)
30715 sequence.unshift(sequence.length)
30716 sequence.unshift(
0x30) // SEQUENCE
30718 return new Buffer(sequence)
30721 ECSignature.prototype.toScriptSignature = function(hashType) {
30722 var hashTypeBuffer = new Buffer(
1)
30723 hashTypeBuffer.writeUInt8(hashType,
0)
30725 return Buffer.concat([this.toDER(), hashTypeBuffer])
30728 module.exports = ECSignature
30730 }).call(this,_dereq_(
"buffer").Buffer)
30731 },{
"assert":
4,
"bigi":
3,
"buffer":
8}],
78:[function(_dereq_,module,exports){
30732 (function (Buffer){
30733 var assert = _dereq_('assert')
30734 var base58check = _dereq_('./base58check')
30735 var crypto = _dereq_('./crypto')
30736 var networks = _dereq_('./networks')
30738 var BigInteger = _dereq_('bigi')
30739 var ECKey = _dereq_('./eckey')
30740 var ECPubKey = _dereq_('./ecpubkey')
30742 var ecurve = _dereq_('ecurve')
30743 var curve = ecurve.getCurveByName('secp256k1')
30745 function findBIP32ParamsByVersion(version) {
30746 for (var name in networks) {
30747 var network = networks[name]
30749 for (var type in network.bip32) {
30750 if (version != network.bip32[type]) continue
30753 isPrivate: (type === 'private'),
30759 assert(false, 'Could not find version ' + version.toString(
16))
30762 function HDNode(K, chainCode, network) {
30763 network = network || networks.bitcoin
30765 assert(Buffer.isBuffer(chainCode), 'Expected Buffer, got ' + chainCode)
30766 assert(network.bip32, 'Unknown BIP32 constants for network')
30768 this.chainCode = chainCode
30771 this.network = network
30773 if (K instanceof BigInteger) {
30774 this.privKey = new ECKey(K, true)
30775 this.pubKey = this.privKey.pub
30777 this.pubKey = new ECPubKey(K, true)
30781 HDNode.MASTER_SECRET = new Buffer('Bitcoin seed')
30782 HDNode.HIGHEST_BIT =
0x80000000
30785 HDNode.fromSeedBuffer = function(seed, network) {
30786 var I = crypto.HmacSHA512(seed, HDNode.MASTER_SECRET)
30787 var IL = I.slice(
0,
32)
30788 var IR = I.slice(
32)
30790 // In case IL is
0 or
>= n, the master key is invalid
30791 // This is handled by `new ECKey` in the HDNode constructor
30792 var pIL = BigInteger.fromBuffer(IL)
30794 return new HDNode(pIL, IR, network)
30797 HDNode.fromSeedHex = function(hex, network) {
30798 return HDNode.fromSeedBuffer(new Buffer(hex, 'hex'), network)
30801 HDNode.fromBase58 = function(string) {
30802 return HDNode.fromBuffer(base58check.decode(string))
30805 HDNode.fromBuffer = function(buffer) {
30806 assert.strictEqual(buffer.length, HDNode.LENGTH, 'Invalid buffer length')
30808 //
4 byte: version bytes
30809 var version = buffer.readUInt32BE(
0)
30810 var params = findBIP32ParamsByVersion(version)
30812 //
1 byte: depth:
0x00 for master nodes,
0x01 for level-
1 descendants, ...
30813 var depth = buffer.readUInt8(
4)
30815 //
4 bytes: the fingerprint of the parent's key (
0x00000000 if master key)
30816 var parentFingerprint = buffer.readUInt32BE(
5)
30818 assert.strictEqual(parentFingerprint,
0x00000000, 'Invalid parent fingerprint')
30821 //
4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
30822 // This is encoded in MSB order. (
0x00000000 if master key)
30823 var index = buffer.readUInt32BE(
9)
30824 assert(depth
> 0 || index ===
0, 'Invalid index')
30826 //
32 bytes: the chain code
30827 var chainCode = buffer.slice(
13,
45)
30830 //
33 bytes: private key data (
0x00 + k)
30831 if (params.isPrivate) {
30832 assert.strictEqual(buffer.readUInt8(
45),
0x00, 'Invalid private key')
30833 var data = buffer.slice(
46,
78)
30834 var d = BigInteger.fromBuffer(data)
30835 hd = new HDNode(d, chainCode, params.network)
30837 //
33 bytes: public key data (
0x02 + X or
0x03 + X)
30839 var data = buffer.slice(
45,
78)
30840 var Q = ecurve.Point.decodeFrom(curve, data)
30841 assert.equal(Q.compressed, true, 'Invalid public key')
30843 // Verify that the X coordinate in the public point corresponds to a point on the curve.
30844 // If not, the extended public key is invalid.
30847 hd = new HDNode(Q, chainCode, params.network)
30852 hd.parentFingerprint = parentFingerprint
30857 HDNode.fromHex = function(hex) {
30858 return HDNode.fromBuffer(new Buffer(hex, 'hex'))
30861 HDNode.prototype.getIdentifier = function() {
30862 return crypto.hash160(this.pubKey.toBuffer())
30865 HDNode.prototype.getFingerprint = function() {
30866 return this.getIdentifier().slice(
0,
4)
30869 HDNode.prototype.getAddress = function() {
30870 return this.pubKey.getAddress(this.network)
30873 HDNode.prototype.toBase58 = function(isPrivate) {
30874 return base58check.encode(this.toBuffer(isPrivate))
30877 HDNode.prototype.toBuffer = function(isPrivate) {
30878 if (isPrivate == undefined) isPrivate = !!this.privKey
30881 var version = isPrivate ? this.network.bip32.private : this.network.bip32.public
30882 var buffer = new Buffer(HDNode.LENGTH)
30884 //
4 bytes: version bytes
30885 buffer.writeUInt32BE(version,
0)
30888 //
1 byte: depth:
0x00 for master nodes,
0x01 for level-
1 descendants, ....
30889 buffer.writeUInt8(this.depth,
4)
30891 //
4 bytes: the fingerprint of the parent's key (
0x00000000 if master key)
30892 var fingerprint = (this.depth ===
0) ?
0x00000000 : this.parentFingerprint
30893 buffer.writeUInt32BE(fingerprint,
5)
30895 //
4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
30896 // This is encoded in Big endian. (
0x00000000 if master key)
30897 buffer.writeUInt32BE(this.index,
9)
30899 //
32 bytes: the chain code
30900 this.chainCode.copy(buffer,
13)
30902 //
33 bytes: the public key or private key data
30904 assert(this.privKey, 'Missing private key')
30906 //
0x00 + k for private keys
30907 buffer.writeUInt8(
0,
45)
30908 this.privKey.d.toBuffer(
32).copy(buffer,
46)
30911 // X9.62 encoding for public keys
30912 this.pubKey.toBuffer().copy(buffer,
45)
30918 HDNode.prototype.toHex = function(isPrivate) {
30919 return this.toBuffer(isPrivate).toString('hex')
30922 // https://github.com/bitcoin/bips/blob/master/bip-
0032.mediawiki#child-key-derivation-ckd-functions
30923 HDNode.prototype.derive = function(index) {
30924 var isHardened = index
>= HDNode.HIGHEST_BIT
30925 var indexBuffer = new Buffer(
4)
30926 indexBuffer.writeUInt32BE(index,
0)
30932 assert(this.privKey, 'Could not derive hardened child key')
30934 // data =
0x00 || ser256(kpar) || ser32(index)
30935 data = Buffer.concat([
30936 this.privKey.d.toBuffer(
33),
30942 // data = serP(point(kpar)) || ser32(index)
30943 // = serP(Kpar) || ser32(index)
30944 data = Buffer.concat([
30945 this.pubKey.toBuffer(),
30950 var I = crypto.HmacSHA512(data, this.chainCode)
30951 var IL = I.slice(
0,
32)
30952 var IR = I.slice(
32)
30954 var pIL = BigInteger.fromBuffer(IL)
30956 // In case parse256(IL)
>= n, proceed with the next value for i
30957 if (pIL.compareTo(curve.n)
>=
0) {
30958 return this.derive(index +
1)
30961 // Private parent key -
> private child key
30963 if (this.privKey) {
30964 // ki = parse256(IL) + kpar (mod n)
30965 var ki = pIL.add(this.privKey.d).mod(curve.n)
30967 // In case ki ==
0, proceed with the next value for i
30968 if (ki.signum() ===
0) {
30969 return this.derive(index +
1)
30972 hd = new HDNode(ki, IR, this.network)
30974 // Public parent key -
> public child key
30976 // Ki = point(parse256(IL)) + Kpar
30978 var Ki = curve.G.multiply(pIL).add(this.pubKey.Q)
30980 // In case Ki is the point at infinity, proceed with the next value for i
30981 if (curve.isInfinity(Ki)) {
30982 return this.derive(index +
1)
30985 hd = new HDNode(Ki, IR, this.network)
30988 hd.depth = this.depth +
1
30990 hd.parentFingerprint = this.getFingerprint().readUInt32BE(
0)
30995 HDNode.prototype.deriveHardened = function(index) {
30996 // Only derives hardened private keys by default
30997 return this.derive(index + HDNode.HIGHEST_BIT)
31000 HDNode.prototype.toString = HDNode.prototype.toBase58
31002 module.exports = HDNode
31004 }).call(this,_dereq_("buffer").Buffer)
31005 },{"./base58check":
70,"./crypto":
73,"./eckey":
75,"./ecpubkey":
76,"./networks":
81,"assert":
4,"bigi":
3,"buffer":
8,"ecurve":
65}],
79:[function(_dereq_,module,exports){
31007 Address: _dereq_('./address'),
31008 base58check: _dereq_('./base58check'),
31009 bufferutils: _dereq_('./bufferutils'),
31010 convert: _dereq_('./convert'),
31011 crypto: _dereq_('./crypto'),
31012 ecdsa: _dereq_('./ecdsa'),
31013 ECKey: _dereq_('./eckey'),
31014 ECPubKey: _dereq_('./ecpubkey'),
31015 ECSignature: _dereq_('./ecsignature'),
31016 Message: _dereq_('./message'),
31017 opcodes: _dereq_('./opcodes'),
31018 HDNode: _dereq_('./hdnode'),
31019 Script: _dereq_('./script'),
31020 scripts: _dereq_('./scripts'),
31021 Transaction: _dereq_('./transaction'),
31022 networks: _dereq_('./networks'),
31023 Wallet: _dereq_('./wallet')
31026 },{"./address":
69,"./base58check":
70,"./bufferutils":
71,"./convert":
72,"./crypto":
73,"./ecdsa":
74,"./eckey":
75,"./ecpubkey":
76,"./ecsignature":
77,"./hdnode":
78,"./message":
80,"./networks":
81,"./opcodes":
82,"./script":
83,"./scripts":
84,"./transaction":
85,"./wallet":
86}],
80:[function(_dereq_,module,exports){
31027 (function (Buffer){
31028 /// Implements Bitcoin's feature for signing arbitrary messages.
31029 var Address = _dereq_('./address')
31030 var BigInteger = _dereq_('bigi')
31031 var bufferutils = _dereq_('./bufferutils')
31032 var crypto = _dereq_('./crypto')
31033 var ecdsa = _dereq_('./ecdsa')
31034 var networks = _dereq_('./networks')
31036 var Address = _dereq_('./address')
31037 var ECPubKey = _dereq_('./ecpubkey')
31038 var ECSignature = _dereq_('./ecsignature')
31040 var ecurve = _dereq_('ecurve')
31041 var ecparams = ecurve.getCurveByName('secp256k1')
31043 function magicHash(message, network) {
31044 var magicPrefix = new Buffer(network.magicPrefix)
31045 var messageBuffer = new Buffer(message)
31046 var lengthBuffer = new Buffer(bufferutils.varIntSize(messageBuffer.length))
31047 bufferutils.writeVarInt(lengthBuffer, messageBuffer.length,
0)
31049 var buffer = Buffer.concat([magicPrefix, lengthBuffer, messageBuffer])
31050 return crypto.hash256(buffer)
31053 function sign(privKey, message, network) {
31054 network = network || networks.bitcoin
31056 var hash = magicHash(message, network)
31057 var signature = privKey.sign(hash)
31058 var e = BigInteger.fromBuffer(hash)
31059 var i = ecdsa.calcPubKeyRecoveryParam(ecparams, e, signature, privKey.pub.Q)
31061 return signature.toCompact(i, privKey.pub.compressed)
31064 // TODO: network could be implied from address
31065 function verify(address, signatureBuffer, message, network) {
31066 if (address instanceof Address) {
31067 address = address.toString()
31069 network = network || networks.bitcoin
31071 var hash = magicHash(message, network)
31072 var parsed = ECSignature.parseCompact(signatureBuffer)
31073 var e = BigInteger.fromBuffer(hash)
31074 var Q = ecdsa.recoverPubKey(ecparams, e, parsed.signature, parsed.i)
31076 var pubKey = new ECPubKey(Q, parsed.compressed)
31077 return pubKey.getAddress(network).toString() === address
31081 magicHash: magicHash,
31086 }).call(this,_dereq_("buffer").Buffer)
31087 },{"./address":
69,"./bufferutils":
71,"./crypto":
73,"./ecdsa":
74,"./ecpubkey":
76,"./ecsignature":
77,"./networks":
81,"bigi":
3,"buffer":
8,"ecurve":
65}],
81:[function(_dereq_,module,exports){
31088 // https://en.bitcoin.it/wiki/List_of_address_prefixes
31089 // Dogecoin BIP32 is a proposed standard: https://bitcointalk.org/index.php?topic=
409731
31093 magicPrefix: '\x18Bitcoin Signed Message:\n',
31095 public:
0x0488b21e,
31096 private:
0x0488ade4
31101 dustThreshold:
546, // https://github.com/bitcoin/bitcoin/blob/v0.9
.2/src/core.h#L151-L162
31102 feePerKb:
10000, // https://github.com/bitcoin/bitcoin/blob/v0.9
.2/src/main.cpp#L53
31103 estimateFee: estimateFee('bitcoin')
31106 magicPrefix: '\x19Dogecoin Signed Message:\n',
31108 public:
0x02facafd,
31109 private:
0x02fac398
31114 dustThreshold:
0, // https://github.com/dogecoin/dogecoin/blob/v1.7
.1/src/core.h#L155-L160
31115 dustSoftThreshold:
100000000, // https://github.com/dogecoin/dogecoin/blob/v1.7
.1/src/main.h#L62
31116 feePerKb:
100000000, // https://github.com/dogecoin/dogecoin/blob/v1.7
.1/src/main.cpp#L58
31117 estimateFee: estimateFee('dogecoin')
31120 magicPrefix: '\x19Litecoin Signed Message:\n',
31122 public:
0x019da462,
31123 private:
0x019d9cfe
31128 dustThreshold:
0, // https://github.com/litecoin-project/litecoin/blob/v0.8
.7.2/src/main.cpp#L360-L365
31129 dustSoftThreshold:
100000, // https://github.com/litecoin-project/litecoin/blob/v0.8
.7.2/src/main.h#L53
31130 feePerKb:
100000, // https://github.com/litecoin-project/litecoin/blob/v0.8
.7.2/src/main.cpp#L56
31131 estimateFee: estimateFee('litecoin')
31134 magicPrefix: '\x18Bitcoin Signed Message:\n',
31136 public:
0x043587cf,
31137 private:
0x04358394
31142 dustThreshold:
546,
31144 estimateFee: estimateFee('testnet')
31148 function estimateFee(type) {
31149 return function(tx) {
31150 var network = networks[type]
31151 var baseFee = network.feePerKb
31152 var byteSize = tx.toBuffer().length
31154 var fee = baseFee * Math.ceil(byteSize /
1000)
31155 if (network.dustSoftThreshold == undefined) return fee
31157 tx.outs.forEach(function(e){
31158 if (e.value < network.dustSoftThreshold) {
31167 module.exports = networks
31169 },{}],
82:[function(_dereq_,module,exports){
31210 OP_TOALTSTACK :
107,
31211 OP_FROMALTSTACK :
108,
31243 OP_EQUALVERIFY :
136,
31244 OP_RESERVED1 :
137,
31245 OP_RESERVED2 :
138,
31255 OP_0NOTEQUAL :
146,
31268 OP_NUMEQUALVERIFY :
157,
31269 OP_NUMNOTEQUAL :
158,
31271 OP_GREATERTHAN :
160,
31272 OP_LESSTHANOREQUAL :
161,
31273 OP_GREATERTHANOREQUAL :
162,
31280 OP_RIPEMD160 :
166,
31285 OP_CODESEPARATOR :
171,
31287 OP_CHECKSIGVERIFY :
173,
31288 OP_CHECKMULTISIG :
174,
31289 OP_CHECKMULTISIGVERIFY :
175,
31303 // template matching params
31304 OP_PUBKEYHASH :
253,
31306 OP_INVALIDOPCODE :
255
31309 },{}],
83:[function(_dereq_,module,exports){
31310 (function (Buffer){
31311 var assert = _dereq_('assert')
31312 var bufferutils = _dereq_('./bufferutils')
31313 var crypto = _dereq_('./crypto')
31314 var opcodes = _dereq_('./opcodes')
31316 function Script(buffer, chunks) {
31317 assert(Buffer.isBuffer(buffer), 'Expected Buffer, got ' + buffer)
31318 assert(Array.isArray(chunks), 'Expected Array, got ' + chunks)
31320 this.buffer = buffer
31321 this.chunks = chunks
31324 // Import operations
31325 Script.fromASM = function(asm) {
31326 var strChunks = asm.split(' ')
31328 var chunks = strChunks.map(function(strChunk) {
31329 if (strChunk in opcodes) {
31330 return opcodes[strChunk]
31333 return new Buffer(strChunk, 'hex')
31337 return Script.fromChunks(chunks)
31340 Script.fromBuffer = function(buffer) {
31345 while (i < buffer.length) {
31346 var opcode = buffer.readUInt8(i)
31348 if ((opcode
> opcodes.OP_0) && (opcode <= opcodes.OP_PUSHDATA4)) {
31349 var d = bufferutils.readPushDataInt(buffer, i)
31352 var data = buffer.slice(i, i + d.number)
31358 chunks.push(opcode)
31364 return new Script(buffer, chunks)
31367 Script.fromChunks = function(chunks) {
31368 assert(Array.isArray(chunks), 'Expected Array, got ' + chunks)
31370 var bufferSize = chunks.reduce(function(accum, chunk) {
31371 if (Buffer.isBuffer(chunk)) {
31372 return accum + bufferutils.pushDataSize(chunk.length) + chunk.length
31378 var buffer = new Buffer(bufferSize)
31381 chunks.forEach(function(chunk) {
31382 if (Buffer.isBuffer(chunk)) {
31383 offset += bufferutils.writePushDataInt(buffer, chunk.length, offset)
31385 chunk.copy(buffer, offset)
31386 offset += chunk.length
31389 buffer.writeUInt8(chunk, offset)
31394 assert.equal(offset, buffer.length, 'Could not decode chunks')
31395 return new Script(buffer, chunks)
31398 Script.fromHex = function(hex) {
31399 return Script.fromBuffer(new Buffer(hex, 'hex'))
31403 Script.EMPTY = Script.fromChunks([])
31406 Script.prototype.getHash = function() {
31407 return crypto.hash160(this.buffer)
31410 // FIXME: doesn't work for data chunks, maybe time to use buffertools.compare...
31411 Script.prototype.without = function(needle) {
31412 return Script.fromChunks(this.chunks.filter(function(op) {
31413 return op !== needle
31417 // Export operations
31418 var reverseOps = []
31419 for (var op in opcodes) {
31420 var code = opcodes[op]
31421 reverseOps[code] = op
31424 Script.prototype.toASM = function() {
31425 return this.chunks.map(function(chunk) {
31426 if (Buffer.isBuffer(chunk)) {
31427 return chunk.toString('hex')
31430 return reverseOps[chunk]
31435 Script.prototype.toBuffer = function() {
31439 Script.prototype.toHex = function() {
31440 return this.toBuffer().toString('hex')
31443 module.exports = Script
31445 }).call(this,_dereq_("buffer").Buffer)
31446 },{"./bufferutils":
71,"./crypto":
73,"./opcodes":
82,"assert":
4,"buffer":
8}],
84:[function(_dereq_,module,exports){
31447 (function (Buffer){
31448 var assert = _dereq_('assert')
31449 var opcodes = _dereq_('./opcodes')
31451 // FIXME: use ECPubKey, currently the circular dependency breaks everything.
31454 // * Remove ECPubKey.getAddress
31455 // - Minimal change, but likely unpopular
31456 // * Move all script related functionality out of Address
31457 // - Means a lot of changes to Transaction/Wallet
31458 // * Ignore it (existing solution)
31459 // * Some form of hackery with commonjs
31461 var ecurve = _dereq_('ecurve')
31462 var curve = ecurve.getCurveByName('secp256k1')
31464 var ECSignature = _dereq_('./ecsignature')
31465 var Script = _dereq_('./script')
31467 function classifyOutput(script) {
31468 assert(script instanceof Script, 'Expected Script, got ', script)
31470 if (isPubKeyHashOutput.call(script)) {
31471 return 'pubkeyhash'
31472 } else if (isScriptHashOutput.call(script)) {
31473 return 'scripthash'
31474 } else if (isMultisigOutput.call(script)) {
31476 } else if (isPubKeyOutput.call(script)) {
31478 } else if (isNulldataOutput.call(script)) {
31481 return 'nonstandard'
31485 function classifyInput(script) {
31486 assert(script instanceof Script, 'Expected Script, got ', script)
31488 if (isPubKeyHashInput.call(script)) {
31489 return 'pubkeyhash'
31490 } else if (isScriptHashInput.call(script)) {
31491 return 'scripthash'
31492 } else if (isMultisigInput.call(script)) {
31494 } else if (isPubKeyInput.call(script)) {
31497 return 'nonstandard'
31501 function isCanonicalPubKey(buffer) {
31502 if (!Buffer.isBuffer(buffer)) return false
31506 ecurve.Point.decodeFrom(curve, buffer)
31508 if (!(e.message.match(/Invalid sequence (length|tag)/))) throw e
31516 function isCanonicalSignature(buffer) {
31517 if (!Buffer.isBuffer(buffer)) return false
31520 ECSignature.parseScriptSignature(buffer)
31522 if (!(e.message.match(/Not a DER sequence|Invalid sequence length|Expected a DER integer|R length is zero|S length is zero|R value excessively padded|S value excessively padded|R value is negative|S value is negative|Invalid hashType/))) throw e
31530 function isPubKeyHashInput() {
31531 return this.chunks.length ===
2 &&
31532 isCanonicalSignature(this.chunks[
0]) &&
31533 isCanonicalPubKey(this.chunks[
1])
31536 function isPubKeyHashOutput() {
31537 return this.chunks.length ===
5 &&
31538 this.chunks[
0] === opcodes.OP_DUP &&
31539 this.chunks[
1] === opcodes.OP_HASH160 &&
31540 Buffer.isBuffer(this.chunks[
2]) &&
31541 this.chunks[
2].length ===
20 &&
31542 this.chunks[
3] === opcodes.OP_EQUALVERIFY &&
31543 this.chunks[
4] === opcodes.OP_CHECKSIG
31546 function isPubKeyInput() {
31547 return this.chunks.length ===
1 &&
31548 isCanonicalSignature(this.chunks[
0])
31551 function isPubKeyOutput() {
31552 return this.chunks.length ===
2 &&
31553 isCanonicalPubKey(this.chunks[
0]) &&
31554 this.chunks[
1] === opcodes.OP_CHECKSIG
31557 function isScriptHashInput() {
31558 if (this.chunks.length <
2) return false
31559 var lastChunk = this.chunks[this.chunks.length -
1]
31561 if (!Buffer.isBuffer(lastChunk)) return false
31563 var scriptSig = Script.fromChunks(this.chunks.slice(
0, -
1))
31564 var scriptPubKey = Script.fromBuffer(lastChunk)
31566 return classifyInput(scriptSig) === classifyOutput(scriptPubKey)
31569 function isScriptHashOutput() {
31570 return this.chunks.length ===
3 &&
31571 this.chunks[
0] === opcodes.OP_HASH160 &&
31572 Buffer.isBuffer(this.chunks[
1]) &&
31573 this.chunks[
1].length ===
20 &&
31574 this.chunks[
2] === opcodes.OP_EQUAL
31577 function isMultisigInput() {
31578 return this.chunks[
0] === opcodes.OP_0 &&
31579 this.chunks.slice(
1).every(isCanonicalSignature)
31582 function isMultisigOutput() {
31583 if (this.chunks <
4) return false
31584 if (this.chunks[this.chunks.length -
1] !== opcodes.OP_CHECKMULTISIG) return false
31586 var mOp = this.chunks[
0]
31587 if (mOp === opcodes.OP_0) return false
31588 if (mOp < opcodes.OP_1) return false
31589 if (mOp
> opcodes.OP_16) return false
31591 var nOp = this.chunks[this.chunks.length -
2]
31592 if (nOp === opcodes.OP_0) return false
31593 if (nOp < opcodes.OP_1) return false
31594 if (nOp
> opcodes.OP_16) return false
31596 var m = mOp - (opcodes.OP_1 -
1)
31597 var n = nOp - (opcodes.OP_1 -
1)
31598 if (n < m) return false
31600 var pubKeys = this.chunks.slice(
1, -
2)
31601 if (n < pubKeys.length) return false
31603 return pubKeys.every(isCanonicalPubKey)
31606 function isNulldataOutput() {
31607 return this.chunks[
0] === opcodes.OP_RETURN
31610 // Standard Script Templates
31611 // {pubKey} OP_CHECKSIG
31612 function pubKeyOutput(pubKey) {
31613 return Script.fromChunks([
31615 opcodes.OP_CHECKSIG
31619 // OP_DUP OP_HASH160 {pubKeyHash} OP_EQUALVERIFY OP_CHECKSIG
31620 function pubKeyHashOutput(hash) {
31621 assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
31623 return Script.fromChunks([
31625 opcodes.OP_HASH160,
31627 opcodes.OP_EQUALVERIFY,
31628 opcodes.OP_CHECKSIG
31632 // OP_HASH160 {scriptHash} OP_EQUAL
31633 function scriptHashOutput(hash) {
31634 assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
31636 return Script.fromChunks([
31637 opcodes.OP_HASH160,
31643 // m [pubKeys ...] n OP_CHECKMULTISIG
31644 function multisigOutput(m, pubKeys) {
31645 assert(Array.isArray(pubKeys), 'Expected Array, got ' + pubKeys)
31646 assert(pubKeys.length
>= m, 'Not enough pubKeys provided')
31648 var pubKeyBuffers = pubKeys.map(function(pubKey) {
31649 return pubKey.toBuffer()
31651 var n = pubKeys.length
31653 return Script.fromChunks([].concat(
31654 (opcodes.OP_1 -
1) + m,
31656 (opcodes.OP_1 -
1) + n,
31657 opcodes.OP_CHECKMULTISIG
31662 function pubKeyInput(signature) {
31663 assert(Buffer.isBuffer(signature), 'Expected Buffer, got ' + signature)
31665 return Script.fromChunks([signature])
31668 // {signature} {pubKey}
31669 function pubKeyHashInput(signature, pubKey) {
31670 assert(Buffer.isBuffer(signature), 'Expected Buffer, got ' + signature)
31672 return Script.fromChunks([signature, pubKey.toBuffer()])
31675 //
<scriptSig> {serialized scriptPubKey script}
31676 function scriptHashInput(scriptSig, scriptPubKey) {
31677 return Script.fromChunks([].concat(
31679 scriptPubKey.toBuffer()
31683 // OP_0 [signatures ...]
31684 function multisigInput(signatures, scriptPubKey) {
31685 if (scriptPubKey) {
31686 assert(isMultisigOutput.call(scriptPubKey))
31688 var m = scriptPubKey.chunks[
0]
31689 var k = m - (opcodes.OP_1 -
1)
31690 assert(k <= signatures.length, 'Not enough signatures provided')
31693 return Script.fromChunks([].concat(opcodes.OP_0, signatures))
31697 classifyInput: classifyInput,
31698 classifyOutput: classifyOutput,
31699 multisigInput: multisigInput,
31700 multisigOutput: multisigOutput,
31701 pubKeyHashInput: pubKeyHashInput,
31702 pubKeyHashOutput: pubKeyHashOutput,
31703 pubKeyInput: pubKeyInput,
31704 pubKeyOutput: pubKeyOutput,
31705 scriptHashInput: scriptHashInput,
31706 scriptHashOutput: scriptHashOutput
31709 }).call(this,_dereq_("buffer").Buffer)
31710 },{"./ecsignature":
77,"./opcodes":
82,"./script":
83,"assert":
4,"buffer":
8,"ecurve":
65}],
85:[function(_dereq_,module,exports){
31711 (function (Buffer){
31712 var assert = _dereq_('assert')
31713 var bufferutils = _dereq_('./bufferutils')
31714 var crypto = _dereq_('./crypto')
31715 var opcodes = _dereq_('./opcodes')
31716 var scripts = _dereq_('./scripts')
31718 var Address = _dereq_('./address')
31719 var ECKey = _dereq_('./eckey')
31720 var ECSignature = _dereq_('./ecsignature')
31721 var Script = _dereq_('./script')
31723 Transaction.DEFAULT_SEQUENCE =
0xffffffff
31724 Transaction.SIGHASH_ALL =
0x01
31725 Transaction.SIGHASH_NONE =
0x02
31726 Transaction.SIGHASH_SINGLE =
0x03
31727 Transaction.SIGHASH_ANYONECANPAY =
0x80
31729 function Transaction() {
31737 * Create a new txin.
31739 * Can be called with any of:
31741 * - A transaction and an index
31742 * - A transaction hash and an index
31744 * Note that this method does not sign the created input.
31746 Transaction.prototype.addInput = function(tx, index, sequence) {
31747 if (sequence == undefined) sequence = Transaction.DEFAULT_SEQUENCE
31751 if (typeof tx === 'string') {
31752 hash = new Buffer(tx, 'hex')
31754 // TxId hex is big-endian, we need little-endian
31755 Array.prototype.reverse.call(hash)
31757 } else if (tx instanceof Transaction) {
31758 hash = tx.getHash()
31764 assert(Buffer.isBuffer(hash), 'Expected Transaction, txId or txHash, got ' + tx)
31765 assert.equal(hash.length,
32, 'Expected hash length of
32, got ' + hash.length)
31766 assert.equal(typeof index, 'number', 'Expected number index, got ' + index)
31768 return (this.ins.push({
31771 script: Script.EMPTY,
31777 * Create a new txout.
31779 * Can be called with:
31781 * - A base58 address string and a value
31782 * - An Address object and a value
31783 * - A scriptPubKey Script and a value
31785 Transaction.prototype.addOutput = function(scriptPubKey, value) {
31786 // Attempt to get a valid address if it's a base58 address string
31787 if (typeof scriptPubKey === 'string') {
31788 scriptPubKey = Address.fromBase58Check(scriptPubKey)
31791 // Attempt to get a valid script if it's an Address object
31792 if (scriptPubKey instanceof Address) {
31793 var address = scriptPubKey
31795 scriptPubKey = address.toOutputScript()
31798 return (this.outs.push({
31799 script: scriptPubKey,
31804 Transaction.prototype.toBuffer = function () {
31805 var txInSize = this.ins.reduce(function(a, x) {
31806 return a + (
40 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
31809 var txOutSize = this.outs.reduce(function(a, x) {
31810 return a + (
8 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
31813 var buffer = new Buffer(
31815 bufferutils.varIntSize(this.ins.length) +
31816 bufferutils.varIntSize(this.outs.length) +
31822 function writeSlice(slice) {
31823 slice.copy(buffer, offset)
31824 offset += slice.length
31826 function writeUInt32(i) {
31827 buffer.writeUInt32LE(i, offset)
31830 function writeUInt64(i) {
31831 bufferutils.writeUInt64LE(buffer, i, offset)
31834 function writeVarInt(i) {
31835 var n = bufferutils.writeVarInt(buffer, i, offset)
31839 writeUInt32(this.version)
31840 writeVarInt(this.ins.length)
31842 this.ins.forEach(function(txin) {
31843 writeSlice(txin.hash)
31844 writeUInt32(txin.index)
31845 writeVarInt(txin.script.buffer.length)
31846 writeSlice(txin.script.buffer)
31847 writeUInt32(txin.sequence)
31850 writeVarInt(this.outs.length)
31851 this.outs.forEach(function(txout) {
31852 writeUInt64(txout.value)
31853 writeVarInt(txout.script.buffer.length)
31854 writeSlice(txout.script.buffer)
31857 writeUInt32(this.locktime)
31862 Transaction.prototype.toHex = function() {
31863 return this.toBuffer().toString('hex')
31867 * Hash transaction for signing a specific input.
31869 * Bitcoin uses a different hash for each signed transaction input. This
31870 * method copies the transaction, makes the necessary changes based on the
31871 * hashType, serializes and finally hashes the result. This hash can then be
31872 * used to sign the transaction input in question.
31874 Transaction.prototype.hashForSignature = function(prevOutScript, inIndex, hashType) {
31875 assert(inIndex
>=
0, 'Invalid vin index')
31876 assert(inIndex < this.ins.length, 'Invalid vin index')
31877 assert(prevOutScript instanceof Script, 'Invalid Script object')
31879 var txTmp = this.clone()
31880 var hashScript = prevOutScript.without(opcodes.OP_CODESEPARATOR)
31882 // Blank out other inputs' signatures
31883 txTmp.ins.forEach(function(txin) {
31884 txin.script = Script.EMPTY
31886 txTmp.ins[inIndex].script = hashScript
31888 var hashTypeModifier = hashType &
0x1f
31889 if (hashTypeModifier === Transaction.SIGHASH_NONE) {
31890 assert(false, 'SIGHASH_NONE not yet supported')
31892 } else if (hashTypeModifier === Transaction.SIGHASH_SINGLE) {
31893 assert(false, 'SIGHASH_SINGLE not yet supported')
31897 if (hashType & Transaction.SIGHASH_ANYONECANPAY) {
31898 assert(false, 'SIGHASH_ANYONECANPAY not yet supported')
31901 var hashTypeBuffer = new Buffer(
4)
31902 hashTypeBuffer.writeInt32LE(hashType,
0)
31904 var buffer = Buffer.concat([txTmp.toBuffer(), hashTypeBuffer])
31905 return crypto.hash256(buffer)
31908 Transaction.prototype.getHash = function () {
31909 return crypto.hash256(this.toBuffer())
31912 Transaction.prototype.getId = function () {
31913 var buffer = this.getHash()
31915 // Big-endian is used for TxHash
31916 Array.prototype.reverse.call(buffer)
31918 return buffer.toString('hex')
31921 Transaction.prototype.clone = function () {
31922 var newTx = new Transaction()
31923 newTx.version = this.version
31924 newTx.locktime = this.locktime
31926 newTx.ins = this.ins.map(function(txin) {
31930 script: txin.script,
31931 sequence: txin.sequence
31935 newTx.outs = this.outs.map(function(txout) {
31937 script: txout.script,
31945 Transaction.fromBuffer = function(buffer) {
31947 function readSlice(n) {
31949 return buffer.slice(offset - n, offset)
31951 function readUInt32() {
31952 var i = buffer.readUInt32LE(offset)
31956 function readUInt64() {
31957 var i = bufferutils.readUInt64LE(buffer, offset)
31961 function readVarInt() {
31962 var vi = bufferutils.readVarInt(buffer, offset)
31967 var tx = new Transaction()
31968 tx.version = readUInt32()
31970 var vinLen = readVarInt()
31971 for (var i =
0; i < vinLen; ++i) {
31972 var hash = readSlice(
32)
31973 var vout = readUInt32()
31974 var scriptLen = readVarInt()
31975 var script = readSlice(scriptLen)
31976 var sequence = readUInt32()
31981 script: Script.fromBuffer(script),
31986 var voutLen = readVarInt()
31987 for (i =
0; i < voutLen; ++i) {
31988 var value = readUInt64()
31989 var scriptLen = readVarInt()
31990 var script = readSlice(scriptLen)
31994 script: Script.fromBuffer(script)
31998 tx.locktime = readUInt32()
31999 assert.equal(offset, buffer.length, 'Transaction has unexpected data')
32004 Transaction.fromHex = function(hex) {
32005 return Transaction.fromBuffer(new Buffer(hex, 'hex'))
32009 * Signs a pubKeyHash output at some index with the given key
32011 Transaction.prototype.sign = function(index, privKey, hashType) {
32012 var prevOutScript = privKey.pub.getAddress().toOutputScript()
32013 var signature = this.signInput(index, prevOutScript, privKey, hashType)
32015 // FIXME: Assumed prior TX was pay-to-pubkey-hash
32016 var scriptSig = scripts.pubKeyHashInput(signature, privKey.pub)
32017 this.setInputScript(index, scriptSig)
32020 Transaction.prototype.signInput = function(index, prevOutScript, privKey, hashType) {
32021 hashType = hashType || Transaction.SIGHASH_ALL
32023 var hash = this.hashForSignature(prevOutScript, index, hashType)
32024 var signature = privKey.sign(hash)
32026 return signature.toScriptSignature(hashType)
32029 Transaction.prototype.setInputScript = function(index, script) {
32030 this.ins[index].script = script
32033 // FIXME: could be validateInput(index, prevTxOut, pub)
32034 Transaction.prototype.validateInput = function(index, prevOutScript, pubKey, buffer) {
32035 var parsed = ECSignature.parseScriptSignature(buffer)
32036 var hash = this.hashForSignature(prevOutScript, index, parsed.hashType)
32038 return pubKey.verify(hash, parsed.signature)
32041 module.exports = Transaction
32043 }).call(this,_dereq_("buffer").Buffer)
32044 },{"./address":
69,"./bufferutils":
71,"./crypto":
73,"./eckey":
75,"./ecsignature":
77,"./opcodes":
82,"./script":
83,"./scripts":
84,"assert":
4,"buffer":
8}],
86:[function(_dereq_,module,exports){
32045 (function (Buffer){
32046 var assert = _dereq_('assert')
32047 var networks = _dereq_('./networks')
32048 var rng = _dereq_('secure-random')
32050 var Address = _dereq_('./address')
32051 var HDNode = _dereq_('./hdnode')
32052 var Transaction = _dereq_('./transaction')
32054 function Wallet(seed, network) {
32055 network = network || networks.bitcoin
32057 // Stored in a closure to make accidental serialization less likely
32058 var masterkey = null
32060 var accountZero = null
32061 var internalAccount = null
32062 var externalAccount = null
32065 this.addresses = []
32066 this.changeAddresses = []
32068 // Transaction output data
32071 // Make a new master key
32072 this.newMasterKey = function(seed) {
32073 seed = seed || new Buffer(rng(
32))
32074 masterkey = HDNode.fromSeedBuffer(seed, network)
32076 // HD first-level child derivation method should be hardened
32077 // See https://bitcointalk.org/index.php?topic=
405179.msg4415254#msg4415254
32078 accountZero = masterkey.deriveHardened(
0)
32079 externalAccount = accountZero.derive(
0)
32080 internalAccount = accountZero.derive(
1)
32083 me.changeAddresses = []
32088 this.newMasterKey(seed)
32090 this.generateAddress = function() {
32091 var key = externalAccount.derive(this.addresses.length)
32092 this.addresses.push(key.getAddress().toString())
32093 return this.addresses[this.addresses.length -
1]
32096 this.generateChangeAddress = function() {
32097 var key = internalAccount.derive(this.changeAddresses.length)
32098 this.changeAddresses.push(key.getAddress().toString())
32099 return this.changeAddresses[this.changeAddresses.length -
1]
32102 this.getBalance = function() {
32103 return this.getUnspentOutputs().reduce(function(memo, output){
32104 return memo + output.value
32108 this.getUnspentOutputs = function() {
32111 for(var key in this.outputs){
32112 var output = this.outputs[key]
32113 if(!output.to) utxo.push(outputToUnspentOutput(output))
32119 this.setUnspentOutputs = function(utxo) {
32122 utxo.forEach(function(uo){
32123 validateUnspentOutput(uo)
32124 var o = unspentOutputToOutput(uo)
32125 outputs[o.from] = o
32128 this.outputs = outputs
32131 function outputToUnspentOutput(output){
32132 var hashAndIndex = output.from.split(":")
32135 hash: hashAndIndex[
0],
32136 outputIndex: parseInt(hashAndIndex[
1]),
32137 address: output.address,
32138 value: output.value,
32139 pending: output.pending
32143 function unspentOutputToOutput(o) {
32145 var key = hash + ":" + o.outputIndex
32148 address: o.address,
32154 function validateUnspentOutput(uo) {
32157 if (isNullOrUndefined(uo.hash)) {
32158 missingField = "hash"
32161 var requiredKeys = ['outputIndex', 'address', 'value']
32162 requiredKeys.forEach(function (key) {
32163 if (isNullOrUndefined(uo[key])){
32168 if (missingField) {
32170 'Invalid unspent output: key', missingField, 'is missing.',
32171 'A valid unspent output must contain'
32173 message.push(requiredKeys.join(', '))
32174 message.push("and hash")
32175 throw new Error(message.join(' '))
32179 function isNullOrUndefined(value) {
32180 return value == undefined
32183 this.processPendingTx = function(tx){
32184 processTx(tx, true)
32187 this.processConfirmedTx = function(tx){
32188 processTx(tx, false)
32191 function processTx(tx, isPending) {
32192 var txid = tx.getId()
32194 tx.outs.forEach(function(txOut, i) {
32198 address = Address.fromOutputScript(txOut.script, network).toString()
32200 if (!(e.message.match(/has no matching Address/))) throw e
32203 if (isMyAddress(address)) {
32204 var output = txid + ':' + i
32206 me.outputs[output] = {
32208 value: txOut.value,
32215 tx.ins.forEach(function(txIn, i) {
32216 // copy and convert to big-endian hex
32217 var txinId = new Buffer(txIn.hash)
32218 Array.prototype.reverse.call(txinId)
32219 txinId = txinId.toString('hex')
32221 var output = txinId + ':' + txIn.index
32223 if (!(output in me.outputs)) return
32226 me.outputs[output].to = txid + ':' + i
32227 me.outputs[output].pending = true
32229 delete me.outputs[output]
32234 this.createTx = function(to, value, fixedFee, changeAddress) {
32235 assert(value
> network.dustThreshold, value + ' must be above dust threshold (' + network.dustThreshold + ' Satoshis)')
32237 var utxos = getCandidateOutputs(value)
32239 var subTotal = value
32242 var tx = new Transaction()
32243 tx.addOutput(to, value)
32245 for (var i =
0; i < utxos.length; ++i) {
32246 var utxo = utxos[i]
32247 addresses.push(utxo.address)
32249 var outpoint = utxo.from.split(':')
32250 tx.addInput(outpoint[
0], parseInt(outpoint[
1]))
32252 var fee = fixedFee == undefined ? estimateFeePadChangeOutput(tx) : fixedFee
32254 accum += utxo.value
32255 subTotal = value + fee
32256 if (accum
>= subTotal) {
32257 var change = accum - subTotal
32259 if (change
> network.dustThreshold) {
32260 tx.addOutput(changeAddress || getChangeAddress(), change)
32267 assert(accum
>= subTotal, 'Not enough funds (incl. fee): ' + accum + ' < ' + subTotal)
32269 this.signWith(tx, addresses)
32273 function getCandidateOutputs() {
32276 for (var key in me.outputs) {
32277 var output = me.outputs[key]
32278 if (!output.pending) unspent.push(output)
32281 var sortByValueDesc = unspent.sort(function(o1, o2){
32282 return o2.value - o1.value
32285 return sortByValueDesc
32288 function estimateFeePadChangeOutput(tx) {
32289 var tmpTx = tx.clone()
32290 tmpTx.addOutput(getChangeAddress(), network.dustSoftThreshold ||
0)
32292 return network.estimateFee(tmpTx)
32295 function getChangeAddress() {
32296 if(me.changeAddresses.length ===
0) me.generateChangeAddress();
32297 return me.changeAddresses[me.changeAddresses.length -
1]
32300 this.signWith = function(tx, addresses) {
32301 assert.equal(tx.ins.length, addresses.length, 'Number of addresses must match number of transaction inputs')
32303 addresses.forEach(function(address, i) {
32304 var key = me.getPrivateKeyForAddress(address)
32312 this.getMasterKey = function() { return masterkey }
32313 this.getAccountZero = function() { return accountZero }
32314 this.getInternalAccount = function() { return internalAccount }
32315 this.getExternalAccount = function() { return externalAccount }
32317 this.getPrivateKey = function(index) {
32318 return externalAccount.derive(index).privKey
32321 this.getInternalPrivateKey = function(index) {
32322 return internalAccount.derive(index).privKey
32325 this.getPrivateKeyForAddress = function(address) {
32327 if((index = this.addresses.indexOf(address))
> -
1) {
32328 return this.getPrivateKey(index)
32329 } else if((index = this.changeAddresses.indexOf(address))
> -
1) {
32330 return this.getInternalPrivateKey(index)
32332 throw new Error('Unknown address. Make sure the address is from the keychain and has been generated.')
32336 function isReceiveAddress(address){
32337 return me.addresses.indexOf(address)
> -
1
32340 function isChangeAddress(address){
32341 return me.changeAddresses.indexOf(address)
> -
1
32344 function isMyAddress(address) {
32345 return isReceiveAddress(address) || isChangeAddress(address)
32349 module.exports = Wallet
32351 }).call(this,_dereq_("buffer").Buffer)
32352 },{"./address":
69,"./hdnode":
78,"./networks":
81,"./transaction":
85,"assert":
4,"buffer":
8,"secure-random":
68}]},{},[
79])
32357 // Select components from sjcl to suit the crypto operations bip39 requires.
32361 /** @fileOverview Javascript cryptography implementation.
32363 * Crush to remove comments, shorten variable names and
32364 * generally reduce transmission size.
32366 * @author Emily Stark
32367 * @author Mike Hamburg
32368 * @author Dan Boneh
32372 /*jslint indent:
2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
32373 /*global document, window, escape, unescape, module, require, Uint32Array */
32375 /** @namespace The Stanford Javascript Crypto Library, top-level namespace. */
32377 /** @namespace Symmetric ciphers. */
32380 /** @namespace Hash functions. Right now only SHA256 is implemented. */
32383 /** @namespace Key exchange functions. Right now only SRP is implemented. */
32386 /** @namespace Block cipher modes of operation. */
32389 /** @namespace Miscellaneous. HMAC and PBKDF2. */
32393 * @namespace Bit array encoders and decoders.
32396 * The members of this namespace are functions which translate between
32397 * SJCL's bitArrays and other objects (usually strings). Because it
32398 * isn't always clear which direction is encoding and which is decoding,
32399 * the method names are "fromBits" and "toBits".
32403 /** @namespace Exceptions. */
32405 /** @constructor Ciphertext is corrupt. */
32406 corrupt: function(message) {
32407 this.toString = function() { return "CORRUPT: "+this.message; };
32408 this.message = message;
32411 /** @constructor Invalid parameter. */
32412 invalid: function(message) {
32413 this.toString = function() { return "INVALID: "+this.message; };
32414 this.message = message;
32417 /** @constructor Bug or missing feature in SJCL. @constructor */
32418 bug: function(message) {
32419 this.toString = function() { return "BUG: "+this.message; };
32420 this.message = message;
32423 /** @constructor Something isn't ready. */
32424 notReady: function(message) {
32425 this.toString = function() { return "NOT READY: "+this.message; };
32426 this.message = message;
32431 if(typeof module !== 'undefined' && module.exports){
32432 module.exports = sjcl;
32434 if (typeof define === "function") {
32435 define([], function () {
32443 /** @fileOverview Arrays of bits, encoded as arrays of Numbers.
32445 * @author Emily Stark
32446 * @author Mike Hamburg
32447 * @author Dan Boneh
32450 /** @namespace Arrays of bits, encoded as arrays of Numbers.
32454 * These objects are the currency accepted by SJCL's crypto functions.
32458 * Most of our crypto primitives operate on arrays of
4-byte words internally,
32459 * but many of them can take arguments that are not a multiple of
4 bytes.
32460 * This library encodes arrays of bits (whose size need not be a multiple of
8
32461 * bits) as arrays of
32-bit words. The bits are packed, big-endian, into an
32462 * array of words,
32 bits at a time. Since the words are double-precision
32463 * floating point numbers, they fit some extra data. We use this (in a private,
32464 * possibly-changing manner) to encode the number of bits actually present
32465 * in the last word of the array.
32469 * Because bitwise ops clear this out-of-band data, these arrays can be passed
32470 * to ciphers like AES which want arrays of words.
32475 * Array slices in units of bits.
32476 * @param {bitArray} a The array to slice.
32477 * @param {Number} bstart The offset to the start of the slice, in bits.
32478 * @param {Number} bend The offset to the end of the slice, in bits. If this is undefined,
32479 * slice until the end of the array.
32480 * @return {bitArray} The requested slice.
32482 bitSlice: function (a, bstart, bend) {
32483 a = sjcl.bitArray._shiftRight(a.slice(bstart/
32),
32 - (bstart &
31)).slice(
1);
32484 return (bend === undefined) ? a : sjcl.bitArray.clamp(a, bend-bstart);
32488 * Extract a number packed into a bit array.
32489 * @param {bitArray} a The array to slice.
32490 * @param {Number} bstart The offset to the start of the slice, in bits.
32491 * @param {Number} length The length of the number to extract.
32492 * @return {Number} The requested slice.
32494 extract: function(a, bstart, blength) {
32495 // FIXME: this Math.floor is not necessary at all, but for some reason
32496 // seems to suppress a bug in the Chromium JIT.
32497 var x, sh = Math.floor((-bstart-blength) &
31);
32498 if ((bstart + blength -
1 ^ bstart) & -
32) {
32499 // it crosses a boundary
32500 x = (a[bstart/
32|
0] << (
32 - sh)) ^ (a[bstart/
32+
1|
0]
>>> sh);
32502 // within a single word
32503 x = a[bstart/
32|
0]
>>> sh;
32505 return x & ((
1<
<blength) -
1);
32509 * Concatenate two bit arrays.
32510 * @param {bitArray} a1 The first array.
32511 * @param {bitArray} a2 The second array.
32512 * @return {bitArray} The concatenation of a1 and a2.
32514 concat: function (a1, a2) {
32515 if (a1.length ===
0 || a2.length ===
0) {
32516 return a1.concat(a2);
32519 var last = a1[a1.length-
1], shift = sjcl.bitArray.getPartial(last);
32520 if (shift ===
32) {
32521 return a1.concat(a2);
32523 return sjcl.bitArray._shiftRight(a2, shift, last|
0, a1.slice(
0,a1.length-
1));
32528 * Find the length of an array of bits.
32529 * @param {bitArray} a The array.
32530 * @return {Number} The length of a, in bits.
32532 bitLength: function (a) {
32533 var l = a.length, x;
32534 if (l ===
0) { return
0; }
32536 return (l-
1) *
32 + sjcl.bitArray.getPartial(x);
32540 * Truncate an array.
32541 * @param {bitArray} a The array.
32542 * @param {Number} len The length to truncate to, in bits.
32543 * @return {bitArray} A new array, truncated to len bits.
32545 clamp: function (a, len) {
32546 if (a.length *
32 < len) { return a; }
32547 a = a.slice(
0, Math.ceil(len /
32));
32550 if (l
> 0 && len) {
32551 a[l-
1] = sjcl.bitArray.partial(len, a[l-
1] &
0x80000000 >> (len-
1),
1);
32557 * Make a partial word for a bit array.
32558 * @param {Number} len The number of bits in the word.
32559 * @param {Number} x The bits.
32560 * @param {Number} [
0] _end Pass
1 if x has already been shifted to the high side.
32561 * @return {Number} The partial word.
32563 partial: function (len, x, _end) {
32564 if (len ===
32) { return x; }
32565 return (_end ? x|
0 : x << (
32-len)) + len *
0x10000000000;
32569 * Get the number of bits used by a partial word.
32570 * @param {Number} x The partial word.
32571 * @return {Number} The number of bits used by the partial word.
32573 getPartial: function (x) {
32574 return Math.round(x/
0x10000000000) ||
32;
32578 * Compare two arrays for equality in a predictable amount of time.
32579 * @param {bitArray} a The first array.
32580 * @param {bitArray} b The second array.
32581 * @return {boolean} true if a == b; false otherwise.
32583 equal: function (a, b) {
32584 if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) {
32588 for (i=
0; i
<a.length; i++) {
32594 /** Shift an array right.
32595 * @param {bitArray} a The array to shift.
32596 * @param {Number} shift The number of bits to shift.
32597 * @param {Number} [carry=
0] A byte to carry in
32598 * @param {bitArray} [out=[]] An array to prepend to the output.
32601 _shiftRight: function (a, shift, carry, out) {
32602 var i, last2=
0, shift2;
32603 if (out === undefined) { out = []; }
32605 for (; shift
>=
32; shift -=
32) {
32610 return out.concat(a);
32613 for (i=
0; i
<a.length; i++) {
32614 out.push(carry | a[i]
>>>shift);
32615 carry = a[i] << (
32-shift);
32617 last2 = a.length ? a[a.length-
1] :
0;
32618 shift2 = sjcl.bitArray.getPartial(last2);
32619 out.push(sjcl.bitArray.partial(shift+shift2 &
31, (shift + shift2
> 32) ? carry : out.pop(),
1));
32623 /** xor a block of
4 words together.
32626 _xor4: function(x,y) {
32627 return [x[
0]^y[
0],x[
1]^y[
1],x[
2]^y[
2],x[
3]^y[
3]];
32630 /** byteswap a word array inplace.
32631 * (does not handle partial words)
32632 * @param {sjcl.bitArray} a word array
32633 * @return {sjcl.bitArray} byteswapped array
32635 byteswapM: function(a) {
32636 var i, v, m =
0xff00;
32637 for (i =
0; i < a.length; ++i) {
32639 a[i] = (v
>>> 24) | ((v
>>> 8) & m) | ((v & m) <<
8) | (v <<
24);
32646 //// codecString.js
32648 /** @fileOverview Bit array codec implementations.
32650 * @author Emily Stark
32651 * @author Mike Hamburg
32652 * @author Dan Boneh
32655 /** @namespace UTF-
8 strings */
32656 sjcl.codec.utf8String = {
32657 /** Convert from a bitArray to a UTF-
8 string. */
32658 fromBits: function (arr) {
32659 var out =
"", bl = sjcl.bitArray.bitLength(arr), i, tmp;
32660 for (i=
0; i
<bl/
8; i++) {
32664 out += String.fromCharCode(tmp
>>> 24);
32667 return decodeURIComponent(escape(out));
32670 /** Convert from a UTF-
8 string to a bitArray. */
32671 toBits: function (str) {
32672 str = unescape(encodeURIComponent(str));
32673 var out = [], i, tmp=
0;
32674 for (i=
0; i
<str.length; i++) {
32675 tmp = tmp <<
8 | str.charCodeAt(i);
32682 out.push(sjcl.bitArray.partial(
8*(i&
3), tmp));
32691 /** @fileOverview Bit array codec implementations.
32693 * @author Emily Stark
32694 * @author Mike Hamburg
32695 * @author Dan Boneh
32698 /** @namespace Hexadecimal */
32700 /** Convert from a bitArray to a hex string. */
32701 fromBits: function (arr) {
32703 for (i=
0; i
<arr.length; i++) {
32704 out += ((arr[i]|
0)+
0xF00000000000).toString(
16).substr(
4);
32706 return out.substr(
0, sjcl.bitArray.bitLength(arr)/
4);//.replace(/(.{
8})/g,
"$1 ");
32708 /** Convert from a hex string to a bitArray. */
32709 toBits: function (str) {
32710 var i, out=[], len;
32711 str = str.replace(/\s|
0x/g,
"");
32713 str = str +
"00000000";
32714 for (i=
0; i
<str.length; i+=
8) {
32715 out.push(parseInt(str.substr(i,
8),
16)^
0);
32717 return sjcl.bitArray.clamp(out, len*
4);
32724 /** @fileOverview Javascript SHA-
512 implementation.
32726 * This implementation was written for CryptoJS by Jeff Mott and adapted for
32727 * SJCL by Stefan Thomas.
32729 * CryptoJS (c)
2009–
2012 by Jeff Mott. All rights reserved.
32730 * Released with New BSD License
32732 * @author Emily Stark
32733 * @author Mike Hamburg
32734 * @author Dan Boneh
32735 * @author Jeff Mott
32736 * @author Stefan Thomas
32740 * Context for a SHA-
512 operation in progress.
32742 * @class Secure Hash Algorithm,
512 bits.
32744 sjcl.hash.sha512 = function (hash) {
32745 if (!this._key[
0]) { this._precompute(); }
32747 this._h = hash._h.slice(
0);
32748 this._buffer = hash._buffer.slice(
0);
32749 this._length = hash._length;
32756 * Hash a string or an array of words.
32758 * @param {bitArray|String} data the data to hash.
32759 * @return {bitArray} The hash value, an array of
16 big-endian words.
32761 sjcl.hash.sha512.hash = function (data) {
32762 return (new sjcl.hash.sha512()).update(data).finalize();
32765 sjcl.hash.sha512.prototype = {
32767 * The hash's block size, in bits.
32773 * Reset the hash state.
32776 reset:function () {
32777 this._h = this._init.slice(
0);
32784 * Input several words to the hash.
32785 * @param {bitArray|String} data the data to hash.
32788 update: function (data) {
32789 if (typeof data ===
"string") {
32790 data = sjcl.codec.utf8String.toBits(data);
32792 var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data),
32794 nl = this._length = ol + sjcl.bitArray.bitLength(data);
32795 for (i =
1024+ol & -
1024; i <= nl; i+=
1024) {
32796 this._block(b.splice(
0,
32));
32802 * Complete hashing and output the hash value.
32803 * @return {bitArray} The hash value, an array of
16 big-endian words.
32805 finalize:function () {
32806 var i, b = this._buffer, h = this._h;
32808 // Round out and push the buffer
32809 b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(
1,
1)]);
32811 // Round out the buffer to a multiple of
32 words, less the
4 length words.
32812 for (i = b.length +
4; i &
31; i++) {
32816 // append the length
32819 b.push(Math.floor(this._length /
0x100000000));
32820 b.push(this._length |
0);
32823 this._block(b.splice(
0,
32));
32831 * The SHA-
512 initialization vector, to be precomputed.
32837 * Least significant
24 bits of SHA512 initialization values.
32839 * Javascript only has
53 bits of precision, so we compute the
40 most
32840 * significant bits and add the remaining
24 bits as constants.
32844 _initr: [
0xbcc908,
0xcaa73b,
0x94f82b,
0x1d36f1,
0xe682d1,
0x3e6c1f,
0x41bd6b,
0x7e2179 ],
32848 [
0x6a09e667,
0xf3bcc908,
0xbb67ae85,
0x84caa73b,
0x3c6ef372,
0xfe94f82b,
0xa54ff53a,
0x5f1d36f1,
32849 0x510e527f,
0xade682d1,
0x9b05688c,
0x2b3e6c1f,
0x1f83d9ab,
0xfb41bd6b,
0x5be0cd19,
0x137e2179],
32853 * The SHA-
512 hash key, to be precomputed.
32859 * Least significant
24 bits of SHA512 key values.
32863 [
0x28ae22,
0xef65cd,
0x4d3b2f,
0x89dbbc,
0x48b538,
0x05d019,
0x194f9b,
0x6d8118,
32864 0x030242,
0x706fbe,
0xe4b28c,
0xffb4e2,
0x7b896f,
0x1696b1,
0xc71235,
0x692694,
32865 0xf14ad2,
0x4f25e3,
0x8cd5b5,
0xac9c65,
0x2b0275,
0xa6e483,
0x41fbd4,
0x1153b5,
32866 0x66dfab,
0xb43210,
0xfb213f,
0xef0ee4,
0xa88fc2,
0x0aa725,
0x03826f,
0x0e6e70,
32867 0xd22ffc,
0x26c926,
0xc42aed,
0x95b3df,
0xaf63de,
0x77b2a8,
0xedaee6,
0x82353b,
32868 0xf10364,
0x423001,
0xf89791,
0x54be30,
0xef5218,
0x65a910,
0x71202a,
0xbbd1b8,
32869 0xd2d0c8,
0x41ab53,
0x8eeb99,
0x9b48a8,
0xc95a63,
0x418acb,
0x63e373,
0xb2b8a3,
32870 0xefb2fc,
0x172f60,
0xf0ab72,
0x6439ec,
0x631e28,
0x82bde9,
0xc67915,
0x72532b,
32871 0x26619c,
0xc0c207,
0xe0eb1e,
0x6ed178,
0x176fba,
0xc898a6,
0xf90dae,
0x1c471b,
32872 0x047d84,
0xc72493,
0xc9bebc,
0x100d4c,
0x3e42b6,
0x657e2a,
0xd6faec,
0x475817],
32876 [
0x428a2f98,
0xd728ae22,
0x71374491,
0x23ef65cd,
0xb5c0fbcf,
0xec4d3b2f,
0xe9b5dba5,
0x8189dbbc,
32877 0x3956c25b,
0xf348b538,
0x59f111f1,
0xb605d019,
0x923f82a4,
0xaf194f9b,
0xab1c5ed5,
0xda6d8118,
32878 0xd807aa98,
0xa3030242,
0x12835b01,
0x45706fbe,
0x243185be,
0x4ee4b28c,
0x550c7dc3,
0xd5ffb4e2,
32879 0x72be5d74,
0xf27b896f,
0x80deb1fe,
0x3b1696b1,
0x9bdc06a7,
0x25c71235,
0xc19bf174,
0xcf692694,
32880 0xe49b69c1,
0x9ef14ad2,
0xefbe4786,
0x384f25e3,
0x0fc19dc6,
0x8b8cd5b5,
0x240ca1cc,
0x77ac9c65,
32881 0x2de92c6f,
0x592b0275,
0x4a7484aa,
0x6ea6e483,
0x5cb0a9dc,
0xbd41fbd4,
0x76f988da,
0x831153b5,
32882 0x983e5152,
0xee66dfab,
0xa831c66d,
0x2db43210,
0xb00327c8,
0x98fb213f,
0xbf597fc7,
0xbeef0ee4,
32883 0xc6e00bf3,
0x3da88fc2,
0xd5a79147,
0x930aa725,
0x06ca6351,
0xe003826f,
0x14292967,
0x0a0e6e70,
32884 0x27b70a85,
0x46d22ffc,
0x2e1b2138,
0x5c26c926,
0x4d2c6dfc,
0x5ac42aed,
0x53380d13,
0x9d95b3df,
32885 0x650a7354,
0x8baf63de,
0x766a0abb,
0x3c77b2a8,
0x81c2c92e,
0x47edaee6,
0x92722c85,
0x1482353b,
32886 0xa2bfe8a1,
0x4cf10364,
0xa81a664b,
0xbc423001,
0xc24b8b70,
0xd0f89791,
0xc76c51a3,
0x0654be30,
32887 0xd192e819,
0xd6ef5218,
0xd6990624,
0x5565a910,
0xf40e3585,
0x5771202a,
0x106aa070,
0x32bbd1b8,
32888 0x19a4c116,
0xb8d2d0c8,
0x1e376c08,
0x5141ab53,
0x2748774c,
0xdf8eeb99,
0x34b0bcb5,
0xe19b48a8,
32889 0x391c0cb3,
0xc5c95a63,
0x4ed8aa4a,
0xe3418acb,
0x5b9cca4f,
0x7763e373,
0x682e6ff3,
0xd6b2b8a3,
32890 0x748f82ee,
0x5defb2fc,
0x78a5636f,
0x43172f60,
0x84c87814,
0xa1f0ab72,
0x8cc70208,
0x1a6439ec,
32891 0x90befffa,
0x23631e28,
0xa4506ceb,
0xde82bde9,
0xbef9a3f7,
0xb2c67915,
0xc67178f2,
0xe372532b,
32892 0xca273ece,
0xea26619c,
0xd186b8c7,
0x21c0c207,
0xeada7dd6,
0xcde0eb1e,
0xf57d4f7f,
0xee6ed178,
32893 0x06f067aa,
0x72176fba,
0x0a637dc5,
0xa2c898a6,
0x113f9804,
0xbef90dae,
0x1b710b35,
0x131c471b,
32894 0x28db77f5,
0x23047d84,
0x32caab7b,
0x40c72493,
0x3c9ebe0a,
0x15c9bebc,
0x431d67c4,
0x9c100d4c,
32895 0x4cc5d4be,
0xcb3e42b6,
0x597f299c,
0xfc657e2a,
0x5fcb6fab,
0x3ad6faec,
0x6c44198c,
0x4a475817],
32899 * Function to precompute _init and _key.
32902 _precompute: function () {
32903 // XXX: This code is for precomputing the SHA256 constants, change for
32904 // SHA512 and re-enable.
32905 var i =
0, prime =
2, factor;
32907 function frac(x) { return (x-Math.floor(x)) *
0x100000000 |
0; }
32908 function frac2(x) { return (x-Math.floor(x)) *
0x10000000000 &
0xff; }
32910 outer: for (; i
<80; prime++) {
32911 for (factor=
2; factor*factor <= prime; factor++) {
32912 if (prime % factor ===
0) {
32919 this._init[i*
2] = frac(Math.pow(prime,
1/
2));
32920 this._init[i*
2+
1] = (frac2(Math.pow(prime,
1/
2)) <<
24) | this._initr[i];
32922 this._key[i*
2] = frac(Math.pow(prime,
1/
3));
32923 this._key[i*
2+
1] = (frac2(Math.pow(prime,
1/
3)) <<
24) | this._keyr[i];
32929 * Perform one cycle of SHA-
512.
32930 * @param {bitArray} words one block of words.
32933 _block:function (words) {
32935 w = words.slice(
0),
32938 h0h = h[
0], h0l = h[
1], h1h = h[
2], h1l = h[
3],
32939 h2h = h[
4], h2l = h[
5], h3h = h[
6], h3l = h[
7],
32940 h4h = h[
8], h4l = h[
9], h5h = h[
10], h5l = h[
11],
32941 h6h = h[
12], h6l = h[
13], h7h = h[
14], h7l = h[
15];
32943 // Working variables
32944 var ah = h0h, al = h0l, bh = h1h, bl = h1l,
32945 ch = h2h, cl = h2l, dh = h3h, dl = h3l,
32946 eh = h4h, el = h4l, fh = h5h, fl = h5l,
32947 gh = h6h, gl = h6l, hh = h7h, hl = h7l;
32949 for (i=
0; i
<80; i++) {
32950 // load up the input word for this round
32953 wrl = w[i *
2 +
1];
32956 var gamma0xh = w[(i-
15) *
2];
32957 var gamma0xl = w[(i-
15) *
2 +
1];
32959 ((gamma0xl <<
31) | (gamma0xh
>>> 1)) ^
32960 ((gamma0xl <<
24) | (gamma0xh
>>> 8)) ^
32963 ((gamma0xh <<
31) | (gamma0xl
>>> 1)) ^
32964 ((gamma0xh <<
24) | (gamma0xl
>>> 8)) ^
32965 ((gamma0xh <<
25) | (gamma0xl
>>> 7));
32968 var gamma1xh = w[(i-
2) *
2];
32969 var gamma1xl = w[(i-
2) *
2 +
1];
32971 ((gamma1xl <<
13) | (gamma1xh
>>> 19)) ^
32972 ((gamma1xh <<
3) | (gamma1xl
>>> 29)) ^
32975 ((gamma1xh <<
13) | (gamma1xl
>>> 19)) ^
32976 ((gamma1xl <<
3) | (gamma1xh
>>> 29)) ^
32977 ((gamma1xh <<
26) | (gamma1xl
>>> 6));
32980 var wr7h = w[(i-
7) *
2];
32981 var wr7l = w[(i-
7) *
2 +
1];
32983 var wr16h = w[(i-
16) *
2];
32984 var wr16l = w[(i-
16) *
2 +
1];
32986 // W(round) = gamma0 + W(round -
7) + gamma1 + W(round -
16)
32987 wrl = gamma0l + wr7l;
32988 wrh = gamma0h + wr7h + ((wrl
>>> 0) < (gamma0l
>>> 0) ?
1 :
0);
32990 wrh += gamma1h + ((wrl
>>> 0) < (gamma1l
>>> 0) ?
1 :
0);
32992 wrh += wr16h + ((wrl
>>> 0) < (wr16l
>>> 0) ?
1 :
0);
32996 w[i*
2 +
1] = wrl |=
0;
32999 var chh = (eh & fh) ^ (~eh & gh);
33000 var chl = (el & fl) ^ (~el & gl);
33003 var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
33004 var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
33007 var sigma0h = ((al <<
4) | (ah
>>> 28)) ^ ((ah <<
30) | (al
>>> 2)) ^ ((ah <<
25) | (al
>>> 7));
33008 var sigma0l = ((ah <<
4) | (al
>>> 28)) ^ ((al <<
30) | (ah
>>> 2)) ^ ((al <<
25) | (ah
>>> 7));
33011 var sigma1h = ((el <<
18) | (eh
>>> 14)) ^ ((el <<
14) | (eh
>>> 18)) ^ ((eh <<
23) | (el
>>> 9));
33012 var sigma1l = ((eh <<
18) | (el
>>> 14)) ^ ((eh <<
14) | (el
>>> 18)) ^ ((el <<
23) | (eh
>>> 9));
33016 var krl = k[i*
2+
1];
33018 // t1 = h + sigma1 + ch + K(round) + W(round)
33019 var t1l = hl + sigma1l;
33020 var t1h = hh + sigma1h + ((t1l
>>> 0) < (hl
>>> 0) ?
1 :
0);
33022 t1h += chh + ((t1l
>>> 0) < (chl
>>> 0) ?
1 :
0);
33024 t1h += krh + ((t1l
>>> 0) < (krl
>>> 0) ?
1 :
0);
33025 t1l = t1l + wrl|
0; // FF32..FF34 perf issue https://bugzilla.mozilla.org/show_bug.cgi?id=
1054972
33026 t1h += wrh + ((t1l
>>> 0) < (wrl
>>> 0) ?
1 :
0);
33028 // t2 = sigma0 + maj
33029 var t2l = sigma0l + majl;
33030 var t2h = sigma0h + majh + ((t2l
>>> 0) < (sigma0l
>>> 0) ?
1 :
0);
33032 // Update working variables
33039 el = (dl + t1l) |
0;
33040 eh = (dh + t1h + ((el
>>> 0) < (dl
>>> 0) ?
1 :
0)) |
0;
33047 al = (t1l + t2l) |
0;
33048 ah = (t1h + t2h + ((al
>>> 0) < (t1l
>>> 0) ?
1 :
0)) |
0;
33051 // Intermediate hash
33052 h0l = h[
1] = (h0l + al) |
0;
33053 h[
0] = (h0h + ah + ((h0l
>>> 0) < (al
>>> 0) ?
1 :
0)) |
0;
33054 h1l = h[
3] = (h1l + bl) |
0;
33055 h[
2] = (h1h + bh + ((h1l
>>> 0) < (bl
>>> 0) ?
1 :
0)) |
0;
33056 h2l = h[
5] = (h2l + cl) |
0;
33057 h[
4] = (h2h + ch + ((h2l
>>> 0) < (cl
>>> 0) ?
1 :
0)) |
0;
33058 h3l = h[
7] = (h3l + dl) |
0;
33059 h[
6] = (h3h + dh + ((h3l
>>> 0) < (dl
>>> 0) ?
1 :
0)) |
0;
33060 h4l = h[
9] = (h4l + el) |
0;
33061 h[
8] = (h4h + eh + ((h4l
>>> 0) < (el
>>> 0) ?
1 :
0)) |
0;
33062 h5l = h[
11] = (h5l + fl) |
0;
33063 h[
10] = (h5h + fh + ((h5l
>>> 0) < (fl
>>> 0) ?
1 :
0)) |
0;
33064 h6l = h[
13] = (h6l + gl) |
0;
33065 h[
12] = (h6h + gh + ((h6l
>>> 0) < (gl
>>> 0) ?
1 :
0)) |
0;
33066 h7l = h[
15] = (h7l + hl) |
0;
33067 h[
14] = (h7h + hh + ((h7l
>>> 0) < (hl
>>> 0) ?
1 :
0)) |
0;
33074 /** @fileOverview HMAC implementation.
33076 * @author Emily Stark
33077 * @author Mike Hamburg
33078 * @author Dan Boneh
33081 /** HMAC with the specified hash function.
33083 * @param {bitArray} key the key for HMAC.
33084 * @param {Object} [hash=sjcl.hash.sha256] The hash function to use.
33086 sjcl.misc.hmac = function (key, Hash) {
33087 this._hash = Hash = Hash || sjcl.hash.sha256;
33088 var exKey = [[],[]], i,
33089 bs = Hash.prototype.blockSize /
32;
33090 this._baseHash = [new Hash(), new Hash()];
33092 if (key.length
> bs) {
33093 key = Hash.hash(key);
33096 for (i=
0; i
<bs; i++) {
33097 exKey[
0][i] = key[i]^
0x36363636;
33098 exKey[
1][i] = key[i]^
0x5C5C5C5C;
33101 this._baseHash[
0].update(exKey[
0]);
33102 this._baseHash[
1].update(exKey[
1]);
33103 this._resultHash = new Hash(this._baseHash[
0]);
33106 /** HMAC with the specified hash function. Also called encrypt since it's a prf.
33107 * @param {bitArray|String} data The data to mac.
33109 sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (data) {
33110 if (!this._updated) {
33112 return this.digest(data);
33114 throw new sjcl.exception.invalid(
"encrypt on already updated hmac called!");
33118 sjcl.misc.hmac.prototype.reset = function () {
33119 this._resultHash = new this._hash(this._baseHash[
0]);
33120 this._updated = false;
33123 sjcl.misc.hmac.prototype.update = function (data) {
33124 this._updated = true;
33125 this._resultHash.update(data);
33128 sjcl.misc.hmac.prototype.digest = function () {
33129 var w = this._resultHash.finalize(), result = new (this._hash)(this._baseHash[
1]).update(w).finalize();
33140 /** @fileOverview Password-based key-derivation function, version
2.0.
33142 * @author Emily Stark
33143 * @author Mike Hamburg
33144 * @author Dan Boneh
33147 /** Password-Based Key-Derivation Function, version
2.0.
33149 * Generate keys from passwords using PBKDF2-HMAC-SHA256.
33151 * This is the method specified by RSA's PKCS #
5 standard.
33153 * @param {bitArray|String} password The password.
33154 * @param {bitArray|String} salt The salt. Should have lots of entropy.
33155 * @param {Number} [count=
1000] The number of iterations. Higher numbers make the function slower but more secure.
33156 * @param {Number} [length] The length of the derived key. Defaults to the
33157 output size of the hash function.
33158 * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family.
33159 * @return {bitArray} the derived key.
33161 sjcl.misc.pbkdf2 = function (password, salt, count, length, Prff) {
33162 count = count ||
1000;
33164 if (length <
0 || count <
0) {
33165 throw sjcl.exception.invalid(
"invalid params to pbkdf2");
33168 if (typeof password ===
"string") {
33169 password = sjcl.codec.utf8String.toBits(password);
33172 if (typeof salt ===
"string") {
33173 salt = sjcl.codec.utf8String.toBits(salt);
33176 Prff = Prff || sjcl.misc.hmac;
33178 var prf = new Prff(password),
33179 u, ui, i, j, k, out = [], b = sjcl.bitArray;
33181 for (k =
1;
32 * out.length < (length ||
1); k++) {
33182 u = ui = prf.encrypt(b.concat(salt,[k]));
33184 for (i=
1; i
<count; i++) {
33185 ui = prf.encrypt(ui);
33186 for (j=
0; j
<ui.length; j++) {
33191 out = out.concat(u);
33194 if (length) { out = b.clamp(out, length); }
33202 /** @fileOverview Javascript SHA-
256 implementation.
33204 * An older version of this implementation is available in the public
33205 * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
33206 * Stanford University
2008-
2010 and BSD-licensed for liability
33209 * Special thanks to Aldo Cortesi for pointing out several bugs in
33212 * @author Emily Stark
33213 * @author Mike Hamburg
33214 * @author Dan Boneh
33218 * Context for a SHA-
256 operation in progress.
33220 * @class Secure Hash Algorithm,
256 bits.
33222 sjcl.hash.sha256 = function (hash) {
33223 if (!this._key[
0]) { this._precompute(); }
33225 this._h = hash._h.slice(
0);
33226 this._buffer = hash._buffer.slice(
0);
33227 this._length = hash._length;
33234 * Hash a string or an array of words.
33236 * @param {bitArray|String} data the data to hash.
33237 * @return {bitArray} The hash value, an array of
16 big-endian words.
33239 sjcl.hash.sha256.hash = function (data) {
33240 return (new sjcl.hash.sha256()).update(data).finalize();
33243 sjcl.hash.sha256.prototype = {
33245 * The hash's block size, in bits.
33251 * Reset the hash state.
33254 reset:function () {
33255 this._h = this._init.slice(
0);
33262 * Input several words to the hash.
33263 * @param {bitArray|String} data the data to hash.
33266 update: function (data) {
33267 if (typeof data ===
"string") {
33268 data = sjcl.codec.utf8String.toBits(data);
33270 var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data),
33272 nl = this._length = ol + sjcl.bitArray.bitLength(data);
33273 for (i =
512+ol & -
512; i <= nl; i+=
512) {
33274 this._block(b.splice(
0,
16));
33280 * Complete hashing and output the hash value.
33281 * @return {bitArray} The hash value, an array of
8 big-endian words.
33283 finalize:function () {
33284 var i, b = this._buffer, h = this._h;
33286 // Round out and push the buffer
33287 b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(
1,
1)]);
33289 // Round out the buffer to a multiple of
16 words, less the
2 length words.
33290 for (i = b.length +
2; i &
15; i++) {
33294 // append the length
33295 b.push(Math.floor(this._length /
0x100000000));
33296 b.push(this._length |
0);
33299 this._block(b.splice(
0,
16));
33307 * The SHA-
256 initialization vector, to be precomputed.
33312 _init:[
0x6a09e667,
0xbb67ae85,
0x3c6ef372,
0xa54ff53a,
0x510e527f,
0x9b05688c,
0x1f83d9ab,
0x5be0cd19],
33316 * The SHA-
256 hash key, to be precomputed.
33322 [
0x428a2f98,
0x71374491,
0xb5c0fbcf,
0xe9b5dba5,
0x3956c25b,
0x59f111f1,
0x923f82a4,
0xab1c5ed5,
33323 0xd807aa98,
0x12835b01,
0x243185be,
0x550c7dc3,
0x72be5d74,
0x80deb1fe,
0x9bdc06a7,
0xc19bf174,
33324 0xe49b69c1,
0xefbe4786,
0x0fc19dc6,
0x240ca1cc,
0x2de92c6f,
0x4a7484aa,
0x5cb0a9dc,
0x76f988da,
33325 0x983e5152,
0xa831c66d,
0xb00327c8,
0xbf597fc7,
0xc6e00bf3,
0xd5a79147,
0x06ca6351,
0x14292967,
33326 0x27b70a85,
0x2e1b2138,
0x4d2c6dfc,
0x53380d13,
0x650a7354,
0x766a0abb,
0x81c2c92e,
0x92722c85,
33327 0xa2bfe8a1,
0xa81a664b,
0xc24b8b70,
0xc76c51a3,
0xd192e819,
0xd6990624,
0xf40e3585,
0x106aa070,
33328 0x19a4c116,
0x1e376c08,
0x2748774c,
0x34b0bcb5,
0x391c0cb3,
0x4ed8aa4a,
0x5b9cca4f,
0x682e6ff3,
33329 0x748f82ee,
0x78a5636f,
0x84c87814,
0x8cc70208,
0x90befffa,
0xa4506ceb,
0xbef9a3f7,
0xc67178f2],
33334 * Function to precompute _init and _key.
33337 _precompute: function () {
33338 var i =
0, prime =
2, factor;
33340 function frac(x) { return (x-Math.floor(x)) *
0x100000000 |
0; }
33342 outer: for (; i
<64; prime++) {
33343 for (factor=
2; factor*factor <= prime; factor++) {
33344 if (prime % factor ===
0) {
33351 this._init[i] = frac(Math.pow(prime,
1/
2));
33353 this._key[i] = frac(Math.pow(prime,
1/
3));
33359 * Perform one cycle of SHA-
256.
33360 * @param {bitArray} words one block of words.
33363 _block:function (words) {
33365 w = words.slice(
0),
33368 h0 = h[
0], h1 = h[
1], h2 = h[
2], h3 = h[
3],
33369 h4 = h[
4], h5 = h[
5], h6 = h[
6], h7 = h[
7];
33371 /* Rationale for placement of |
0 :
33372 * If a value can overflow is original
32 bits by a factor of more than a few
33373 * million (
2^
23 ish), there is a possibility that it might overflow the
33374 *
53-bit mantissa and lose precision.
33376 * To avoid this, we clamp back to
32 bits by |'ing with
0 on any value that
33377 * propagates around the loop, and on the hash state h[]. I don't believe
33378 * that the clamps on h4 and on h0 are strictly necessary, but it's close
33379 * (for h4 anyway), and better safe than sorry.
33381 * The clamps on h[] are necessary for the output to be correct even in the
33382 * common case and for short inputs.
33384 for (i=
0; i
<64; i++) {
33385 // load up the input word for this round
33389 a = w[(i+
1 ) &
15];
33390 b = w[(i+
14) &
15];
33391 tmp = w[i&
15] = ((a
>>>7 ^ a
>>>18 ^ a
>>>3 ^ a<
<25 ^ a<
<14) +
33392 (b
>>>17 ^ b
>>>19 ^ b
>>>10 ^ b<
<15 ^ b<
<13) +
33393 w[i&
15] + w[(i+
9) &
15]) |
0;
33396 tmp = (tmp + h7 + (h4
>>>6 ^ h4
>>>11 ^ h4
>>>25 ^ h4<
<26 ^ h4<
<21 ^ h4<
<7) + (h6 ^ h4&(h5^h6)) + k[i]); // |
0;
33399 h7 = h6; h6 = h5; h5 = h4;
33401 h3 = h2; h2 = h1; h1 = h0;
33403 h0 = (tmp + ((h1&h2) ^ (h3&(h1^h2))) + (h1
>>>2 ^ h1
>>>13 ^ h1
>>>22 ^ h1<
<30 ^ h1<
<19 ^ h1<
<10)) |
0;
33406 h[
0] = h[
0]+h0 |
0;
33407 h[
1] = h[
1]+h1 |
0;
33408 h[
2] = h[
2]+h2 |
0;
33409 h[
3] = h[
3]+h3 |
0;
33410 h[
4] = h[
4]+h4 |
0;
33411 h[
5] = h[
5]+h5 |
0;
33412 h[
6] = h[
6]+h6 |
0;
33413 h[
7] = h[
7]+h7 |
0;
33421 WORDLISTS["english"] = [
33422 "abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse",
33423 "access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act",
33424 "action","actor","actress","actual","adapt","add","addict","address","adjust","admit",
33425 "adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent",
33426 "agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert",
33427 "alien","all","alley","allow","almost","alone","alpha","already","also","alter",
33428 "always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger",
33429 "angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique",
33430 "anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic",
33431 "area","arena","argue","arm","armed","armor","army","around","arrange","arrest",
33432 "arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset",
33433 "assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction",
33434 "audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake",
33435 "aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge",
33436 "bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain",
33437 "barrel","base","basic","basket","battle","beach","bean","beauty","because","become",
33438 "beef","before","begin","behave","behind","believe","below","belt","bench","benefit",
33439 "best","betray","better","between","beyond","bicycle","bid","bike","bind","biology",
33440 "bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless",
33441 "blind","blood","blossom","blouse","blue","blur","blush","board","boat","body",
33442 "boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss",
33443 "bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread",
33444 "breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze",
33445 "broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb",
33446 "bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy",
33447 "butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call",
33448 "calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas",
33449 "canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry",
33450 "cart","case","cash","casino","castle","casual","cat","catalog","catch","category",
33451 "cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century",
33452 "cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase",
33453 "chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child",
33454 "chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle",
33455 "citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk",
33456 "clever","click","client","cliff","climb","clinic","clip","clock","clog","close",
33457 "cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut",
33458 "code","coffee","coil","coin","collect","color","column","combine","come","comfort",
33459 "comic","common","company","concert","conduct","confirm","congress","connect","consider","control",
33460 "convince","cook","cool","copper","copy","coral","core","corn","correct","cost",
33461 "cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle",
33462 "craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek",
33463 "crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial",
33464 "cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup",
33465 "cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad",
33466 "damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal",
33467 "debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense",
33468 "define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny",
33469 "depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk",
33470 "despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond",
33471 "diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur",
33472 "direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance",
33473 "divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain",
33474 "donate","donkey","donor","door","dose","double","dove","draft","dragon","drama",
33475 "drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop",
33476 "drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf",
33477 "dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo",
33478 "ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow",
33479 "elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody",
33480 "embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless",
33481 "endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough",
33482 "enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip",
33483 "era","erase","erode","erosion","error","erupt","escape","essay","essence","estate",
33484 "eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange",
33485 "excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit",
33486 "exotic","expand","expect","expire","explain","expose","express","extend","extra","eye",
33487 "eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame",
33488 "family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father",
33489 "fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female",
33490 "fence","festival","fetch","fever","few","fiber","fiction","field","figure","file",
33491 "film","filter","final","find","fine","finger","finish","fire","firm","first",
33492 "fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor",
33493 "flee","flight","flip","float","flock","floor","flower","fluid","flush","fly",
33494 "foam","focus","fog","foil","fold","follow","food","foot","force","forest",
33495 "forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile",
33496 "frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen",
33497 "fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy",
33498 "gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp",
33499 "gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture",
33500 "ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance",
33501 "glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue",
33502 "goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown",
33503 "grab","grace","grain","grant","grape","grass","gravity","great","green","grid",
33504 "grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt",
33505 "guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy",
33506 "harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health",
33507 "heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden",
33508 "high","hill","hint","hip","hire","history","hobby","hockey","hold","hole",
33509 "holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital",
33510 "host","hotel","hour","hover","hub","huge","human","humble","humor","hundred",
33511 "hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea",
33512 "identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune",
33513 "impact","impose","improve","impulse","inch","include","income","increase","index","indicate",
33514 "indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury",
33515 "inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install",
33516 "intact","interest","into","invest","invite","involve","iron","island","isolate","issue",
33517 "item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel",
33518 "job","join","joke","journey","joy","judge","juice","jump","jungle","junior",
33519 "junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney",
33520 "kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife",
33521 "knock","know","lab","label","labor","ladder","lady","lake","lamp","language",
33522 "laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit",
33523 "layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal",
33524 "legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level",
33525 "liar","liberty","library","license","life","lift","light","like","limb","limit",
33526 "link","lion","liquid","list","little","live","lizard","load","loan","lobster",
33527 "local","lock","logic","lonely","long","loop","lottery","loud","lounge","love",
33528 "loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad",
33529 "magic","magnet","maid","mail","main","major","make","mammal","man","manage",
33530 "mandate","mango","mansion","manual","maple","marble","march","margin","marine","market",
33531 "marriage","mask","mass","master","match","material","math","matrix","matter","maximum",
33532 "maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt",
33533 "member","memory","mention","menu","mercy","merge","merit","merry","mesh","message",
33534 "metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor",
33535 "minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile",
33536 "model","modify","mom","moment","monitor","monkey","monster","month","moon","moral",
33537 "more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie",
33538 "much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual",
33539 "myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature",
33540 "near","neck","need","negative","neglect","neither","nephew","nerve","nest","net",
33541 "network","neutral","never","news","next","nice","night","noble","noise","nominee",
33542 "noodle","normal","north","nose","notable","note","nothing","notice","novel","now",
33543 "nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe",
33544 "obtain","obvious","occur","ocean","october","odor","off","offer","office","often",
33545 "oil","okay","old","olive","olympic","omit","once","one","onion","online",
33546 "only","open","opera","opinion","oppose","option","orange","orbit","orchard","order",
33547 "ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output",
33548 "outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact",
33549 "paddle","page","pair","palace","palm","panda","panel","panic","panther","paper",
33550 "parade","parent","park","parrot","party","pass","patch","path","patient","patrol",
33551 "pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen",
33552 "penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo",
33553 "phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot",
33554 "pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate",
33555 "play","please","pledge","pluck","plug","plunge","poem","poet","point","polar",
33556 "pole","police","pond","pony","pool","popular","portion","position","possible","post",
33557 "potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare",
33558 "present","pretty","prevent","price","pride","primary","print","priority","prison","private",
33559 "prize","problem","process","produce","profit","program","project","promote","proof","property",
33560 "prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin",
33561 "punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle",
33562 "pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit",
33563 "raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp",
33564 "ranch","random","range","rapid","rare","rate","rather","raven","raw","razor",
33565 "ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle",
33566 "reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release",
33567 "relief","rely","remain","remember","remind","remove","render","renew","rent","reopen",
33568 "repair","repeat","replace","report","require","rescue","resemble","resist","resource","response",
33569 "result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib",
33570 "ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot",
33571 "ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket",
33572 "romance","roof","rookie","room","rose","rotate","rough","round","route","royal",
33573 "rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness",
33574 "safe","sail","salad","salmon","salon","salt","salute","same","sample","sand",
33575 "satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter",
33576 "scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script",
33577 "scrub","sea","search","season","seat","second","secret","section","security","seed",
33578 "seek","segment","select","sell","seminar","senior","sense","sentence","series","service",
33579 "session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell",
33580 "sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop",
33581 "short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side",
33582 "siege","sight","sign","silent","silk","silly","silver","similar","simple","since",
33583 "sing","siren","sister","situate","six","size","skate","sketch","ski","skill",
33584 "skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight",
33585 "slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth",
33586 "snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda",
33587 "soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry",
33588 "sort","soul","sound","soup","source","south","space","spare","spatial","spawn",
33589 "speak","special","speed","spell","spend","sphere","spice","spider","spike","spin",
33590 "spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring",
33591 "spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp",
33592 "stand","start","state","stay","steak","steel","stem","step","stereo","stick",
33593 "still","sting","stock","stomach","stone","stool","story","stove","strategy","street",
33594 "strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway",
33595 "success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny",
33596 "sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey",
33597 "suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim",
33598 "swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag",
33599 "tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi",
33600 "teach","team","tell","ten","tenant","tennis","tent","term","test","text",
33601 "thank","that","theme","then","theory","there","they","thing","this","thought",
33602 "three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber",
33603 "time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler",
33604 "toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool",
33605 "tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist",
33606 "toward","tower","town","toy","track","trade","traffic","tragic","train","transfer",
33607 "trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick",
33608 "trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust",
33609 "truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle",
33610 "twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella",
33611 "unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform",
33612 "unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade",
33613 "uphold","upon","upper","upset","urban","urge","usage","use","used","useful",
33614 "useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van",
33615 "vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue",
33616 "verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory",
33617 "video","view","village","vintage","violin","virtual","virus","visa","visit","visual",
33618 "vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage",
33619 "wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash",
33620 "wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather",
33621 "web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat",
33622 "wheel","when","where","whip","whisper","wide","width","wife","wild","will",
33623 "win","window","wine","wing","wink","winner","winter","wire","wisdom","wise",
33624 "wish","witness","wolf","woman","wonder","wood","wool","word","work","world",
33625 "worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year",
33626 "yellow","you","young","youth","zebra","zero","zone","zoo"]
33630 * Copyright (c)
2013 Pavol Rusnak
33632 * Permission is hereby granted, free of charge, to any person obtaining a copy of
33633 * this software and associated documentation files (the "Software"), to deal in
33634 * the Software without restriction, including without limitation the rights to
33635 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
33636 * of the Software, and to permit persons to whom the Software is furnished to do
33637 * so, subject to the following conditions:
33639 * The above copyright notice and this permission notice shall be included in all
33640 * copies or substantial portions of the Software.
33642 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33643 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33644 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33645 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
33646 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33647 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33651 * Javascript port from python by Ian Coleman
33653 * Requires code from sjcl
33654 * https://github.com/bitwiseshiftleft/sjcl
33657 var Mnemonic = function(language) {
33659 var PBKDF2_ROUNDS =
2048;
33665 var hmacSHA512 = function(key) {
33666 var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha512);
33667 this.encrypt = function() {
33668 return hasher.encrypt.apply(hasher, arguments);
33673 wordlist = WORDLISTS[language];
33674 if (wordlist.length != RADIX) {
33675 err = 'Wordlist should contain ' + RADIX + ' words, but it contains ' + wordlist.length + ' words.';
33680 self.generate = function(strength) {
33681 strength = strength ||
128;
33682 var r = strength %
32;
33684 throw 'Strength should be divisible by
32, but it is not (' + r + ').';
33686 var hasStrongCrypto = 'crypto' in window && window['crypto'] !== null;
33687 if (!hasStrongCrypto) {
33688 throw 'Mnemonic should be generated with strong randomness, but crypto.getRandomValues is unavailable';
33690 var buffer = new Uint8Array(strength /
8);
33691 var data = crypto.getRandomValues(buffer);
33692 return self.toMnemonic(data);
33695 self.toMnemonic = function(byteArray) {
33696 if (byteArray.length %
4 > 0) {
33697 throw 'Data length in bits should be divisible by
32, but it is not (' + byteArray.length + ' bytes = ' + byteArray.length*
8 + ' bits).'
33700 //h = hashlib.sha256(data).hexdigest()
33701 var data = byteArrayToWordArray(byteArray);
33702 var hash = sjcl.hash.sha256.hash(data);
33703 var h = sjcl.codec.hex.fromBits(hash);
33705 // b is a binary string, eg '
00111010101100...'
33706 //b = bin(int(binascii.hexlify(data),
16))[
2:].zfill(len(data) *
8) + \
33707 // bin(int(h,
16))[
2:].zfill(
256)[:len(data) *
8 /
32]
33709 // a = bin(int(binascii.hexlify(data),
16))[
2:].zfill(len(data) *
8)
33710 // c = bin(int(h,
16))[
2:].zfill(
256)
33711 // d = c[:len(data) *
8 /
32]
33712 var a = byteArrayToBinaryString(byteArray);
33713 var c = zfill(hexStringToBinaryString(h),
256);
33714 var d = c.substring(
0, byteArray.length *
8 /
32);
33715 // b = line1 + line2
33719 var blen = b.length /
11;
33720 for (var i=
0; i
<blen; i++) {
33721 var idx = parseInt(b.substring(i *
11, (i +
1) *
11),
2);
33722 result.push(wordlist[idx]);
33724 return result.join(' ');
33727 self.check = function(mnemonic) {
33728 var mnemonic = mnemonic.split(' ')
33729 if (mnemonic.length %
3 > 0) {
33732 // idx = map(lambda x: bin(self.wordlist.index(x))[
2:].zfill(
11), mnemonic)
33734 for (var i=
0; i
<mnemonic.length; i++) {
33735 var word = mnemonic[i];
33736 var wordIndex = wordlist.indexOf(word);
33737 if (wordIndex == -
1) {
33740 var binaryIndex = zfill(wordIndex.toString(
2),
11);
33741 idx.push(binaryIndex);
33743 var b = idx.join('');
33745 //d = b[:l /
33 *
32]
33747 var d = b.substring(
0, l /
33 *
32);
33748 var h = b.substring(l - l /
33, l);
33749 //nd = binascii.unhexlify(hex(int(d,
2))[
2:].rstrip('L').zfill(l /
33 *
8))
33750 var nd = binaryStringToWordArray(d);
33751 //nh = bin(int(hashlib.sha256(nd).hexdigest(),
16))[
2:].zfill(
256)[:l /
33]
33752 var ndHash = sjcl.hash.sha256.hash(nd);
33753 var ndHex = sjcl.codec.hex.fromBits(ndHash);
33754 var ndBstr = zfill(hexStringToBinaryString(ndHex),
256);
33755 var nh = ndBstr.substring(
0,l/
33);
33759 self.toSeed = function(mnemonic, passphrase) {
33760 passphrase = passphrase || '';
33761 mnemonic = self.normalizeString(mnemonic)
33762 passphrase = self.normalizeString(passphrase)
33763 passphrase =
"mnemonic" + passphrase;
33764 var mnemonicBits = sjcl.codec.utf8String.toBits(mnemonic);
33765 var passphraseBits = sjcl.codec.utf8String.toBits(passphrase);
33766 var result = sjcl.misc.pbkdf2(mnemonicBits, passphraseBits, PBKDF2_ROUNDS,
512, hmacSHA512);
33767 var hashHex = sjcl.codec.hex.fromBits(result);
33771 self.normalizeString = function(str) {
33772 if (typeof str.normalize ==
"function") {
33773 return str.normalize(
"NFKD");
33776 // TODO decide how to handle this in the future.
33777 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
33782 function byteArrayToWordArray(data) {
33784 for (var i=
0; i
<data.length/
4; i++) {
33786 v += data[i*
4 +
0] <<
8 *
3;
33787 v += data[i*
4 +
1] <<
8 *
2;
33788 v += data[i*
4 +
2] <<
8 *
1;
33789 v += data[i*
4 +
3] <<
8 *
0;
33795 function byteArrayToBinaryString(data) {
33797 for (var i=
0; i
<data.length; i++) {
33798 bin += zfill(data[i].toString(
2),
8);
33803 function hexStringToBinaryString(hexString) {
33805 for (var i=
0; i
<hexString.length; i++) {
33806 binaryString += zfill(parseInt(hexString[i],
16).toString(
2),
4);
33808 return binaryString;
33811 function binaryStringToWordArray(binary) {
33812 var aLen = binary.length /
32;
33814 for (var i=
0; i
<aLen; i++) {
33815 var valueStr = binary.substring(
0,
32);
33816 var value = parseInt(valueStr,
2);
33818 binary = binary.slice(
32);
33823 // Pad a numeric string on the left with zero digits until the given width
33825 // Note this differs to the python implementation because it does not
33826 // handle numbers starting with a sign.
33827 function zfill(source, length) {
33828 source = source.toString();
33829 while (source.length < length) {
33830 source = '
0' + source;
33842 var mnemonic = new Mnemonic("english");
33843 var bip32RootKey = null;
33844 var bip32ExtendedKey = null;
33845 var network = Bitcoin.networks.bitcoin;
33846 var addressRowTemplate = $("#address-row-template");
33848 var showIndex = true;
33849 var showAddress = true;
33850 var showPrivKey = true;
33852 var phraseChangeTimeoutEvent = null;
33855 DOM.network = $(".network");
33856 DOM.phraseNetwork = $("#network-phrase");
33857 DOM.bip44Network = $("#network-bip44");
33858 DOM.addressNetwork = $("#network-address-type");
33859 DOM.phrase = $(".phrase");
33860 DOM.passphrase = $(".passphrase");
33861 DOM.generate = $(".generate");
33862 DOM.rootKey = $(".root-key");
33863 DOM.extendedPrivKey = $(".extended-priv-key");
33864 DOM.extendedPubKey = $(".extended-pub-key");
33865 DOM.bip32tab = $("#bip32-tab");
33866 DOM.bip44tab = $("#bip44-tab");
33867 DOM.bip32panel = $("#bip32");
33868 DOM.bip44panel = $("#bip44");
33869 DOM.bip32path = $("#bip32-path");
33870 DOM.bip44path = $("#bip44-path");
33871 DOM.bip44purpose = $("#bip44 .purpose");
33872 DOM.bip44coin = $("#bip44 .coin");
33873 DOM.bip44account = $("#bip44 .account");
33874 DOM.bip44change = $("#bip44 .change");
33875 DOM.strength = $(".strength");
33876 DOM.addresses = $(".addresses");
33877 DOM.rowsToAdd = $(".rows-to-add");
33878 DOM.more = $(".more");
33879 DOM.feedback = $(".feedback");
33880 DOM.tab = $(".derivation-type a");
33881 DOM.indexToggle = $(".index-toggle");
33882 DOM.addressToggle = $(".address-toggle");
33883 DOM.privateKeyToggle = $(".private-key-toggle");
33885 var derivationPath = DOM.bip44path.val();
33889 DOM.network.on("change", networkChanged);
33890 DOM.phrase.on("input", delayedPhraseChanged);
33891 DOM.passphrase.on("input", delayedPhraseChanged);
33892 DOM.generate.on("click", generateClicked);
33893 DOM.more.on("click", showMore);
33894 DOM.bip32path.on("input", bip32Changed);
33895 DOM.bip44purpose.on("input", bip44Changed);
33896 DOM.bip44coin.on("input", bip44Changed);
33897 DOM.bip44account.on("input", bip44Changed);
33898 DOM.bip44change.on("input", bip44Changed);
33899 DOM.tab.on("click", tabClicked);
33900 DOM.indexToggle.on("click", toggleIndexes);
33901 DOM.addressToggle.on("click", toggleAddresses);
33902 DOM.privateKeyToggle.on("click", togglePrivateKeys);
33905 hideValidationError();
33910 function networkChanged(e) {
33911 var n = e.target.value;
33912 if (n == "bitcoin") {
33913 network = Bitcoin.networks.bitcoin;
33914 DOM.bip44coin.val(
0);
33915 setBip44DerivationPath();
33918 else if (n == "bitcoin-testnet") {
33919 network = Bitcoin.networks.testnet;
33920 DOM.bip44coin.val(
1);
33921 setBip44DerivationPath();
33924 else if (n == "litecoin") {
33925 network = Bitcoin.networks.litecoin;
33926 DOM.bip44coin.val(
2);
33927 setBip44DerivationPath();
33930 else if (n == "dogecoin") {
33931 network = Bitcoin.networks.dogecoin;
33932 //disableBip44Tab();
33934 DOM.phraseNetwork.val(n);
33935 DOM.bip44Network.val(n);
33936 if(e.target != DOM.addressNetwork.dom){
33937 DOM.addressNetwork.val(n);
33939 delayedPhraseChanged();
33942 function delayedPhraseChanged() {
33943 hideValidationError();
33945 if (phraseChangeTimeoutEvent != null) {
33946 clearTimeout(phraseChangeTimeoutEvent);
33948 phraseChangeTimeoutEvent = setTimeout(phraseChanged,
400);
33951 function phraseChanged() {
33953 hideValidationError();
33954 // Get the mnemonic phrase
33955 var phrase = DOM.phrase.val();
33956 var passphrase = DOM.passphrase.val();
33957 var errorText = findPhraseErrors(phrase);
33959 showValidationError(errorText);
33962 // Get the derivation path
33963 var errorText = findDerivationPathErrors();
33965 showValidationError(errorText);
33968 // Calculate and display
33969 calcBip32Seed(phrase, passphrase, derivationPath);
33970 displayBip32Info();
33974 function generateClicked() {
33977 setTimeout(function() {
33978 var phrase = generateRandomPhrase();
33986 function tabClicked(e) {
33987 var activePath = $(e.target.getAttribute("href") + " .path");
33988 derivationPath = activePath.val();
33989 derivationChanged();
33992 function derivationChanged() {
33993 delayedPhraseChanged();
33996 function bip32Changed() {
33997 derivationPath = DOM.bip32path.val();
33998 derivationChanged();
34001 function bip44Changed() {
34002 setBip44DerivationPath();
34003 derivationPath = DOM.bip44path.val();
34004 derivationChanged();
34007 function toggleIndexes() {
34008 showIndex = !showIndex;
34009 $("td.index span").toggleClass("invisible");
34012 function toggleAddresses() {
34013 showAddress = !showAddress;
34014 $("td.address span").toggleClass("invisible");
34017 function togglePrivateKeys() {
34018 showPrivKey = !showPrivKey;
34019 $("td.privkey span").toggleClass("invisible");
34024 function generateRandomPhrase() {
34025 if (!hasStrongRandom()) {
34026 var errorText = "This browser does not support strong randomness";
34027 showValidationError(errorText);
34030 var numWords = parseInt(DOM.strength.val());
34031 // Check strength is an integer
34032 if (isNaN(numWords)) {
34033 DOM.strength.val("
12");
34036 // Check strength is a multiple of
32, if not round it down
34037 if (numWords %
3 !=
0) {
34038 numWords = Math.floor(numWords /
3) *
3;
34039 DOM.strength.val(numWords);
34041 // Check strength is at least
32
34042 if (numWords ==
0) {
34044 DOM.strength.val(numWords);
34046 var strength = numWords /
3 *
32;
34047 var words = mnemonic.generate(strength);
34048 DOM.phrase.val(words);
34052 function calcBip32Seed(phrase, passphrase, path) {
34053 var seed = mnemonic.toSeed(phrase, passphrase);
34054 bip32RootKey = Bitcoin.HDNode.fromSeedHex(seed, network);
34055 bip32ExtendedKey = bip32RootKey;
34056 // Derive the key from the path
34057 var pathBits = path.split("/");
34058 for (var i=
0; i
<pathBits.length; i++) {
34059 var bit = pathBits[i];
34060 var index = parseInt(bit);
34061 if (isNaN(index)) {
34064 var hardened = bit[bit.length-
1] ==
"'";
34066 bip32ExtendedKey = bip32ExtendedKey.deriveHardened(index);
34069 bip32ExtendedKey = bip32ExtendedKey.derive(index);
34074 function showValidationError(errorText) {
34080 function hideValidationError() {
34086 function findPhraseErrors(phrase) {
34087 // TODO make this right
34088 // Preprocess the words
34089 phrase = mnemonic.normalizeString(phrase);
34090 var parts = phrase.split(
" ");
34092 for (var i=
0; i
<parts.length; i++) {
34093 var part = parts[i];
34094 if (part.length
> 0) {
34095 // TODO check that lowercasing is always valid to do
34096 proper.push(part.toLowerCase());
34099 // TODO some levenstein on the words
34100 var properPhrase = proper.join(' ');
34101 // Check the words are valid
34102 var isValid = mnemonic.check(properPhrase);
34104 return
"Invalid mnemonic";
34109 function findDerivationPathErrors(path) {
34114 function displayBip32Info() {
34116 var rootKey = bip32RootKey.toBase58();
34117 DOM.rootKey.val(rootKey);
34118 var extendedPrivKey = bip32ExtendedKey.toBase58();
34119 DOM.extendedPrivKey.val(extendedPrivKey);
34120 var extendedPubKey = bip32ExtendedKey.toBase58(false);
34121 DOM.extendedPubKey.val(extendedPubKey);
34122 // Display the addresses and privkeys
34123 clearAddressesList();
34124 displayAddresses(
0,
20);
34127 function displayAddresses(start, total) {
34128 for (var i=
0; i
<total; i++) {
34129 var index = i + start;
34130 new TableRow(index);
34134 function TableRow(index) {
34140 function calculateValues() {
34141 setTimeout(function() {
34142 var key = bip32ExtendedKey.derive(index);
34143 var address = key.getAddress().toString();
34144 var privkey = key.privKey.toWIF(network);
34145 addAddressToList(index, address, privkey);
34153 function showMore() {
34154 var start = DOM.addresses.children().length;
34155 var rowsToAdd = parseInt(DOM.rowsToAdd.val());
34156 if (isNaN(rowsToAdd)) {
34158 DOM.rowsToAdd.val(
"20");
34160 if (rowsToAdd
> 200) {
34161 var msg =
"Generating " + rowsToAdd +
" rows could take a while. ";
34162 msg +=
"Do you want to continue?";
34163 if (!confirm(msg)) {
34167 displayAddresses(start, rowsToAdd);
34170 function clearDisplay() {
34171 clearAddressesList();
34173 hideValidationError();
34176 function clearAddressesList() {
34177 DOM.addresses.empty();
34180 function clearKey() {
34181 DOM.rootKey.val(
"");
34182 DOM.extendedPrivKey.val(
"");
34183 DOM.extendedPubKey.val(
"");
34186 function addAddressToList(index, address, privkey) {
34187 var row = $(addressRowTemplate.html());
34189 var indexCell = row.find(
".index span");
34190 var addressCell = row.find(
".address span");
34191 var privkeyCell = row.find(
".privkey span");
34193 indexCell.text(index);
34194 addressCell.text(address);
34195 privkeyCell.text(privkey);
34198 indexCell.addClass(
"invisible");
34200 if (!showAddress) {
34201 addressCell.addClass(
"invisible");
34203 if (!showPrivKey) {
34204 privkeCell.addClass(
"invisible");
34206 DOM.addresses.append(row);
34209 function hasStrongRandom() {
34210 return 'crypto' in window && window['crypto'] !== null;
34213 function disableForms() {
34214 $(
"form").on(
"submit", function(e) {
34215 e.preventDefault();
34219 function setBip44DerivationPath() {
34220 var purpose = parseIntNoNaN(DOM.bip44purpose.val(),
44);
34221 var coin = parseIntNoNaN(DOM.bip44coin.val(),
0);
34222 var account = parseIntNoNaN(DOM.bip44account.val(),
0);
34223 var change = parseIntNoNaN(DOM.bip44change.val(),
0);
34225 path += purpose +
"'/";
34226 path += coin +
"'/";
34227 path += account +
"'/";
34229 DOM.bip44path.val(path);
34232 function parseIntNoNaN(val, defaultVal) {
34233 var v = parseInt(val);
34240 function showPending() {
34242 .text(
"Calculating...")
34246 function hidePending() {
34252 function enableBip44Tab() {
34253 // show bip44 tab (but don't select it)
34254 DOM.bip44tab.removeClass(
"hidden");
34255 DOM.bip44panel.removeClass(
"hidden");
34258 function disableBip44Tab() {
34260 DOM.bip44tab.addClass(
"hidden");
34261 DOM.bip44tab.removeClass(
"active");
34262 // hide bip44 panel
34263 DOM.bip44panel.addClass(
"hidden");
34264 DOM.bip44panel.removeClass(
"active");
34266 DOM.bip32tab.addClass(
"active");
34267 // show bip32 panel
34268 DOM.bip32panel.addClass(
"active");
34269 // set the derivation path
34270 var activePath = $(
"#bip32 .path");
34271 derivationPath = activePath.val();