summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/toastergui')
-rw-r--r--bitbake/lib/toaster/toastergui/__init__.py0
-rwxr-xr-xbitbake/lib/toaster/toastergui/static/css/bootstrap-responsive.min.css9
-rwxr-xr-xbitbake/lib/toaster/toastergui/static/css/bootstrap.min.css9
-rw-r--r--bitbake/lib/toaster/toastergui/static/css/default.css132
-rwxr-xr-xbitbake/lib/toaster/toastergui/static/css/font-awesome.min.css33
-rw-r--r--bitbake/lib/toaster/toastergui/static/css/jquery.treetable.css28
-rw-r--r--bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.default.css64
-rw-r--r--bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.toaster.css38
-rwxr-xr-xbitbake/lib/toaster/toastergui/static/css/prettify.css1
-rw-r--r--bitbake/lib/toaster/toastergui/static/css/screen.css28
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/FontAwesome.otfbin0 -> 48748 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.eotbin0 -> 25395 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.svg284
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.ttfbin0 -> 55096 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.woffbin0 -> 29380 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.eotbin0 -> 20290 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.svg229
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.ttfbin0 -> 41236 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.woffbin0 -> 23292 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/img/logo.pngbin0 -> 3020 bytes
-rwxr-xr-xbitbake/lib/toaster/toastergui/static/img/toaster.pngbin0 -> 51986 bytes
-rw-r--r--bitbake/lib/toaster/toastergui/static/jquery-treetable-license/GPL-LICENSE.txt278
-rw-r--r--bitbake/lib/toaster/toastergui/static/jquery-treetable-license/MIT-LICENSE.txt20
-rw-r--r--bitbake/lib/toaster/toastergui/static/jquery-treetable-license/README.md20
-rw-r--r--bitbake/lib/toaster/toastergui/static/jquery.treetable.theme.toaster.css66
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js7
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.js6
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.map1
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/jquery-ui.js15003
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/jquery.cookie.js117
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js620
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/main.js111
-rwxr-xr-xbitbake/lib/toaster/toastergui/static/js/prettify.js28
-rw-r--r--bitbake/lib/toaster/toastergui/templates/base.html74
-rwxr-xr-xbitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html28
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basebuildpage.html80
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_bottom.html85
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_top.html87
-rw-r--r--bitbake/lib/toaster/toastergui/templates/bfile.html24
-rw-r--r--bitbake/lib/toaster/toastergui/templates/bpackage.html108
-rw-r--r--bitbake/lib/toaster/toastergui/templates/build.html140
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builddashboard.html198
-rw-r--r--bitbake/lib/toaster/toastergui/templates/buildtime.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configuration.html73
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configvars.html130
-rw-r--r--bitbake/lib/toaster/toastergui/templates/cpuusage.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/dirinfo.html237
-rw-r--r--bitbake/lib/toaster/toastergui/templates/diskio.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/filtersnippet.html39
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layer.html34
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package.html36
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html99
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_built_detail.html65
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_detail_base.html145
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html110
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_detail.html44
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html50
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_tabs.html33
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipe.html273
-rwxr-xr-xbitbake/lib/toaster/toastergui/templates/recipes.html102
-rw-r--r--bitbake/lib/toaster/toastergui/templates/tablesort.html38
-rw-r--r--bitbake/lib/toaster/toastergui/templates/target.html163
-rw-r--r--bitbake/lib/toaster/toastergui/templates/task.html283
-rw-r--r--bitbake/lib/toaster/toastergui/templates/tasks.html133
-rw-r--r--bitbake/lib/toaster/toastergui/templatetags/__init__.py0
-rw-r--r--bitbake/lib/toaster/toastergui/templatetags/projecttags.py255
-rw-r--r--bitbake/lib/toaster/toastergui/urls.py69
-rw-r--r--bitbake/lib/toaster/toastergui/views.py1645
68 files changed, 22024 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/toastergui/__init__.py b/bitbake/lib/toaster/toastergui/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/__init__.py
diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap-responsive.min.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap-responsive.min.css
new file mode 100755
index 0000000000..0597860101
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
1/*!
2 * Bootstrap Responsive v2.3.0
3 *
4 * Copyright 2012 Twitter, Inc
5 * Licensed under the Apache License v2.0
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap.min.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap.min.css
new file mode 100755
index 0000000000..2b927f84ed
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap.min.css
@@ -0,0 +1,9 @@
1/*!
2 * Bootstrap v2.3.0
3 *
4 * Copyright 2012 Twitter, Inc
5 * Licensed under the Apache License v2.0
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:200px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:220px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:400px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
new file mode 100644
index 0000000000..2c283feccf
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -0,0 +1,132 @@
1/* Style the Yocto Project logo */
2.logo img { height: 30px; width: auto !important; }
3.logo { padding-top: 4px !important; padding-bottom:0px !important; }
4
5/* Style the breadcrumb */
6.breadcrumb { display: inline-block; background-color: transparent; }
7.section { margin: 20px 0; }
8
9/* Styles for the help information */
10.get-help { color: #CCCCCC; }
11.get-help:hover { color: #999999; cursor: pointer; }
12.get-help-blue { color: #3A87AD; }
13.get-help-blue:hover { color: #005580; cursor: pointer; }
14.manual { margin-top: 11px; }
15.heading-help { font-size: 14px; }
16
17/* Styles for the external link */
18.get-info { color: #0088CC; }
19.get-info:hover { color: #005580; cursor: pointer; text-decoration: none; }
20
21/* Styles for code and pre tags */
22code { background-color: transparent; border: none; color: #333333; }
23dd code, .alert code { white-space: pre-wrap; word-break: break-all; word-wrap: break-word; }
24.alert-warning code, .alert-warning pre { background-color: transparent; border: none; color: #C09853; margin-bottom: 0px; }
25.alert-error code { background-color: transparent; border: none; color: #B94A48; margin-bottom:0px; }
26.alert-error pre { background-color: transparent; border: none; color: #B94A48; word-break: normal; margin-bottom: 0px; }
27.alert-warning pre { word-break: normal; }
28.alert-info a { font-weight: bold; }
29.alert-info code { color: #3A87AD; }
30.tooltip code { background-color: transparent; color: #FFFFFF; font-weight: normal; border: none; font-size: 1em; }
31
32/* Style for definition lists */
33dd ul { list-style-type: none; margin: 0px; }
34dt, dd {line-height: 25px; }
35dd li { line-height: 25px; }
36dd p { line-height: 20px; }
37
38/* Style the filter modal dialogs */
39.modal { width: 800px; margin-left: -400px; }
40.modal-footer .btn { float: left; }
41
42/* Hover style for the clear search icon */
43.icon-remove-sign:hover { color: #999999; cursor: pointer; }
44
45/* Some extra space before headings when needed */
46.details { margin-top: 30px; }
47
48/* Required classes for the highlight behaviour in tables */
49.highlight { -webkit-animation: target-fade 10s 1; -moz-animation: target-fade 10s 1; animation: target-fade 10s 1; }
50@-webkit-keyframes target-fade { 0% { background-color: #D9EDF7; } 25% { background-color: #D9EDF7; } 100% { background-color: white; } }
51@-moz-keyframes target-fade { 0% { background-color: #D9EDF7; } 25% { background-color: #D9EDF7; } 100% { background-color: white; } }
52@keyframes target-fade { 0% { background-color: #D9EDF7; } 25% { background-color: #D9EDF7; } 100% { background-color: white; } }
53
54/* This makes tooltips work inside modal dialogs */
55.tooltip { z-index: 2000 !important; }
56
57/* Override default Twitter Boostrap styles for anchor tags inside tables */
58td a { color: #333333; }
59td a:hover { color: #000000; text-decoration: underline; }
60
61/* Override default Twitter Bootstrap styles for tr.error */
62.table tbody tr.error > td { background-color: #FFFFFF; } /* override default Bootstrap behaviour */
63.table-hover tbody tr.error:hover > td { background-color: #F5F5F5;} /* override default Bootstrap behaviour */
64
65/* Right justify Bootstrap table columns for size fields */
66.table .sizecol { text-align: right; }
67
68/* Set error, warning, success and muted styles */
69.error, .red, td.error a, tr.error a { color: #b94a48; }
70a.error:hover, a.error:focus, tr.error a:hover { color: #943A38; text-decoration: underline; }
71.warning, .yellow { color: #c09853;}
72a.warning { background-color: transparent; }
73a.warning:hover, a.warning:focus { color: #B38942; text-decoration: underline; }
74.success, .green { color: #468847;}
75.success:hover { color: #347132; text-decoration: underline; }
76td > .success:hover { text-decoration: underline; }
77.muted a { color:#999999; }
78.muted a:hover { color:#999999; }
79
80/* Sorting functionality styles for table headings */
81.sorted { color: #333333; font-weight: bold; }
82.sorted:hover { color: #000000; text-decoration: underline; }
83th > a, th > span { font-weight: normal; }
84
85/* Force long strings like commit hashes to wrap */
86.iscommit { white-space: pre-wrap; word-break: break-all; word-wrap: break-word;}
87
88/* Make the popovers scrollable if they are too long */
89.popover-content { max-height: 30em; overflow-y: scroll; }
90
91/* Styles for the directory structure table. We'll probably won't use those in production */
92.one { padding-left: 18px !important; }
93.two { padding-left: 36px !important; }
94.three { padding-left: 54px !important; }
95.content-directory a { color: #0088CC; }
96.content-directory a:hover { color: #005580; text-decoration: underline; }
97.symlink { color: #CCCCCC; }
98
99/* Other styles */
100.dropdown-menu { padding: 10px; }
101select { width: auto; }
102.page-header { color: #5A5A5A; }
103.top-air { margin-top: 40px;}
104.progress { margin-bottom: 0px; }
105.lead .badge { font-size: 18px; font-weight: normal; border-radius: 15px; padding: 9px; }
106.well > .lead, .alert .lead { margin-bottom: 0px; }
107.no-results { margin: 10px 0; }
108.task-name { margin-left: 7px; }
109.icon-hand-right {color: #CCCCCC; }
110.help-inline { margin: 5px; }
111.hero-unit { margin: 20px 0 30px; }
112.hero-unit > .close { font-size:40px; }
113.hero-actions { margin-top: 30px; }
114.dashboard-section { background-color: transparent; }
115
116/* make tables Chrome-happy (me, not so much) */
117#otable { table-layout: fixed; word-wrap: break-word; }
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
diff --git a/bitbake/lib/toaster/toastergui/static/css/font-awesome.min.css b/bitbake/lib/toaster/toastergui/static/css/font-awesome.min.css
new file mode 100755
index 0000000000..fa15fd528f
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/font-awesome.min.css
@@ -0,0 +1,33 @@
1/*!
2 * Font Awesome 3.0.2
3 * the iconic font designed for use with Twitter Bootstrap
4 * -------------------------------------------------------
5 * The full suite of pictographic icons, examples, and documentation
6 * can be found at: http://fortawesome.github.com/Font-Awesome/
7 *
8 * License
9 * -------------------------------------------------------
10 * - The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL
11 * - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
12 * http://opensource.org/licenses/mit-license.html
13 * - The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/
14 * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
15 * "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome"
16
17 * Contact
18 * -------------------------------------------------------
19 * Email: dave@davegandy.com
20 * Twitter: http://twitter.com/fortaweso_me
21 * Work: Lead Product Designer @ http://kyruus.com
22 */
23
24@font-face{
25 font-family:'FontAwesome';
26 src:url('../fonts/fontawesome-webfont.eot?v=3.0.1');
27 src:url('../fonts/fontawesome-webfont.eot?#iefix&v=3.0.1') format('embedded-opentype'),
28 url('../fonts/fontawesome-webfont.woff?v=3.0.1') format('woff'),
29 url('../fonts/fontawesome-webfont.ttf?v=3.0.1') format('truetype');
30 font-weight:normal;
31 font-style:normal }
32
33[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0 0;background-repeat:repeat;margin-top:0}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none}[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none}a [class^="icon-"],a [class*=" icon-"]{display:inline-block}.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em}.btn [class^="icon-"],.nav [class^="icon-"],.btn [class*=" icon-"],.nav [class*=" icon-"]{display:inline}.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em}.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block}.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em}li [class^="icon-"],.nav li [class^="icon-"],li [class*=" icon-"],.nav li [class*=" icon-"]{display:inline-block;width:1.25em;text-align:center}li [class^="icon-"].icon-large,.nav li [class^="icon-"].icon-large,li [class*=" icon-"].icon-large,.nav li [class*=" icon-"].icon-large{width:1.5625em}ul.icons{list-style-type:none;text-indent:-0.75em}ul.icons li [class^="icon-"],ul.icons li [class*=" icon-"]{width:.75em}.icon-muted{color:#eee}.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.pull-right{float:right}.pull-left{float:left}[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em}[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em}.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em}.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em}.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em}.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em}.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}@-moz-document url-prefix(){.icon-spin{height:.9em}.btn .icon-spin{height:auto}.icon-spin.icon-large{height:1.25em}.btn .icon-spin.icon-large{height:.75em}}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope-alt:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-reply:before{content:"\f112"}.icon-github-alt:before{content:"\f113"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}
diff --git a/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.css b/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.css
new file mode 100644
index 0000000000..4e95bfd3a8
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.css
@@ -0,0 +1,28 @@
1table.treetable span.indenter {
2 display: inline-block;
3 margin: 0;
4 padding: 0;
5 text-align: right;
6
7 /* Disable text selection of nodes (for better D&D UX) */
8 user-select: none;
9 -khtml-user-select: none;
10 -moz-user-select: none;
11 -o-user-select: none;
12 -webkit-user-select: none;
13
14 /* Force content-box box model for indenter (Bootstrap compatibility) */
15 -webkit-box-sizing: content-box;
16 -moz-box-sizing: content-box;
17 box-sizing: content-box;
18
19 width: 19px;
20}
21
22table.treetable span.indenter a {
23 background-position: left center;
24 background-repeat: no-repeat;
25 display: inline-block;
26 text-decoration: none;
27 width: 19px;
28}
diff --git a/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.default.css b/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.default.css
new file mode 100644
index 0000000000..48289baad1
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.default.css
@@ -0,0 +1,64 @@
1table.treetable {
2 border: 1px solid #888;
3 border-collapse: collapse;
4 font-size: .8em;
5 line-height: 1;
6 margin: .6em 0 1.8em 0;
7 width: 100%;
8}
9
10table.treetable caption {
11 font-size: .9em;
12 font-weight: bold;
13 margin-bottom: .2em;
14}
15
16table.treetable tbody tr td {
17 cursor: default;
18 padding: .3em 1em;
19}
20
21table.treetable span {
22 background-position: center left;
23 background-repeat: no-repeat;
24 padding: .2em 0 .2em 1.5em;
25}
26
27table.treetable span.file {
28 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC);
29}
30
31table.treetable span.folder {
32 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC);
33}
34
35table.treetable tr.collapsed span.indenter a {
36 background-image: url(data:image/png;base64,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);
37}
38
39table.treetable tr.expanded span.indenter a {
40 background-image: url(data:image/png;base64,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);
41}
42
43
44
45table.treetable tr.collapsed.selected span.indenter a {
46 background-image: url(data:image/png;base64,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);
47}
48
49table.treetable tr.expanded.selected span.indenter a {
50 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFtJREFUeNpi/P//PwMlgImBQsA44C6giQENDAwM//HgBmLCAF/AMBLjBUeixf///48L7/+PCvZjU4fPAAc0AxywqcMXCwegGJ1NckL6jx5wpKYDxqGXEkkCgAEAmrqBIejdgngAAAAASUVORK5CYII=);
51}
52
53table.treetable tr.accept {
54 background-color: #a3bce4;
55 color: #fff
56}
57
58table.treetable tr.collapsed.accept td span.indenter a {
59 background-image: url(data:image/x-png;base64,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);
60}
61
62table.treetable tr.expanded.accept td span.indenter a {
63 background-image: url(data:image/x-png;base64,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);
64}
diff --git a/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.toaster.css b/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.toaster.css
new file mode 100644
index 0000000000..d8552e5816
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/jquery.treetable.theme.toaster.css
@@ -0,0 +1,38 @@
1table.treetable span.file {
2 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC);
3}
4
5table.treetable span.folder {
6 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC);
7}
8
9table.treetable tr.collapsed span.indenter a {
10 background-image: url(data:image/png;base64,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);
11}
12
13table.treetable tr.expanded span.indenter a {
14 background-image: url(data:image/png;base64,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);
15}
16
17
18
19table.treetable tr.collapsed.selected span.indenter a {
20 background-image: url(data:image/png;base64,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);
21}
22
23table.treetable tr.expanded.selected span.indenter a {
24 background-image: url(data:image/png;base64,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);
25}
26
27table.treetable tr.accept {
28 background-color: #a3bce4;
29 color: #fff
30}
31
32table.treetable tr.collapsed.accept td span.indenter a {
33 background-image: url(data:image/x-png;base64,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);
34}
35
36table.treetable tr.expanded.accept td span.indenter a {
37 background-image: url(data:image/x-png;base64,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);
38}
diff --git a/bitbake/lib/toaster/toastergui/static/css/prettify.css b/bitbake/lib/toaster/toastergui/static/css/prettify.css
new file mode 100755
index 0000000000..d44b3a2282
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/prettify.css
@@ -0,0 +1 @@
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/css/screen.css b/bitbake/lib/toaster/toastergui/static/css/screen.css
new file mode 100644
index 0000000000..e233ef6ae2
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/screen.css
@@ -0,0 +1,28 @@
1body {
2 background: #ddd;
3 color: #000;
4 font-family: Helvetica, Arial, sans-serif;
5 line-height: 1.5;
6 margin: 0;
7 padding: 0;
8}
9
10#main {
11 background: #fff;
12 border-left: 20px solid #eee;
13 border-right: 20px solid #eee;
14 margin: 0 auto;
15 max-width: 800px;
16 padding: 20px;
17}
18
19pre.listing {
20 background: #eee;
21 border: 1px solid #ccc;
22 margin: .6em 0 .3em 0;
23 padding: .1em .3em;
24}
25
26pre.listing b {
27 color: #f00;
28}
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/FontAwesome.otf b/bitbake/lib/toaster/toastergui/static/fonts/FontAwesome.otf
new file mode 100644
index 0000000000..64049bf2e7
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/FontAwesome.otf
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.eot b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000..7d81019e4f
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.svg b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000000..ba0afe5ef6
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.svg
@@ -0,0 +1,284 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3<svg xmlns="http://www.w3.org/2000/svg">
4<metadata></metadata>
5<defs>
6<font id="fontawesomeregular" horiz-adv-x="1536" >
7<font-face units-per-em="1792" ascent="1536" descent="-256" />
8<missing-glyph horiz-adv-x="448" />
9<glyph unicode=" " horiz-adv-x="448" />
10<glyph unicode="&#x09;" horiz-adv-x="448" />
11<glyph unicode="&#xa0;" horiz-adv-x="448" />
12<glyph unicode="&#xa8;" horiz-adv-x="1792" />
13<glyph unicode="&#xa9;" horiz-adv-x="1792" />
14<glyph unicode="&#xae;" horiz-adv-x="1792" />
15<glyph unicode="&#xb4;" horiz-adv-x="1792" />
16<glyph unicode="&#xc6;" horiz-adv-x="1792" />
17<glyph unicode="&#x2000;" horiz-adv-x="768" />
18<glyph unicode="&#x2001;" />
19<glyph unicode="&#x2002;" horiz-adv-x="768" />
20<glyph unicode="&#x2003;" />
21<glyph unicode="&#x2004;" horiz-adv-x="512" />
22<glyph unicode="&#x2005;" horiz-adv-x="384" />
23<glyph unicode="&#x2006;" horiz-adv-x="256" />
24<glyph unicode="&#x2007;" horiz-adv-x="256" />
25<glyph unicode="&#x2008;" horiz-adv-x="192" />
26<glyph unicode="&#x2009;" horiz-adv-x="307" />
27<glyph unicode="&#x200a;" horiz-adv-x="85" />
28<glyph unicode="&#x202f;" horiz-adv-x="307" />
29<glyph unicode="&#x205f;" horiz-adv-x="384" />
30<glyph unicode="&#x2122;" horiz-adv-x="1792" />
31<glyph unicode="&#x221e;" horiz-adv-x="1792" />
32<glyph unicode="&#x2260;" horiz-adv-x="1792" />
33<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
34<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
35<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
36<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
37<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
38<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
39<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
40<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
41<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
42<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
43<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
44<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
45<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
46<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
47<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
48<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
49<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
50<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
51<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
52<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
53<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
54<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
55<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h299l-299 299v-299zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544q40 0 88 -20t76 -48l408 -408q28 -28 48 -76t20 -88z" />
56<glyph unicode="&#xf017;" d="M1088 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-384q-13 0 -22.5 9.5t-9.5 22.5v448q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-352h288q13 0 22.5 -9.5t9.5 -22.5zM1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5 t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5 t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
57<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
58<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1339 729q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39zM1632 512q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-1600q-14 0 -23 9t-9 23v576q0 14 9 23 t23 9h192q14 0 23 -9t9 -23v-352h1152v352q0 14 9 23t23 9h192z" />
59<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-9 -9 -23 -9t-23 9l-320 320q-9 9 -9 23q0 13 9.5 22.5t22.5 9.5h192v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352h192q14 0 23 -9t9 -23zM1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5 t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
60<glyph unicode="&#xf01b;" d="M1120 672q0 -13 -9.5 -22.5t-22.5 -9.5h-192v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q9 9 23 9t23 -9l320 -320q9 -9 9 -23zM1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5 t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
61<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
62<glyph unicode="&#xf01d;" d="M1152 640q0 -37 -33 -56l-512 -288q-14 -8 -31 -8t-32 9q-32 18 -32 55v576q0 37 32 55q31 20 63 1l512 -288q33 -19 33 -56zM1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5 t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
63<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q169 0 304 99.5t185 261.5q7 23 30 23h199 q16 0 25 -12q10 -13 7 -27q-39 -175 -147.5 -312t-266 -213t-336.5 -76q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
64<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
65<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
66<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M704 512q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -37 19 -67t51 -47l-69 -229q-5 -15 5 -28t26 -13h192q16 0 26 13t5 28l-69 229q32 17 51 47t19 67zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68 t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
67<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
68<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
69<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
70<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
71<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
72<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
73<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M672 1408v-1536h-64v1536h64zM1408 1408v-1536h-64v1536h64zM1568 1408v-1536h-64v1536h64zM576 1408v-1536h-64v1536h64zM1280 1408v-1536h-256v1536h256zM896 1408v-1536h-128v1536h128zM448 1408v-1536h-128v1536h128zM1792 1408v-1536h-128v1536h128zM256 1408v-1536 h-256v1536h256z" />
74<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
75<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
76<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
77<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
78<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
79<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
80<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
81<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
82<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
83<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
84<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
85<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
86<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
87<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
88<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
89<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
90<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
91<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
92<glyph unicode="&#xf03d;" horiz-adv-x="1920" d="M1900 1278q20 -8 20 -30v-1216q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-585 586v-307q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-307l585 586q16 15 35 7z" />
93<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
94<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
95<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
96<glyph unicode="&#xf042;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM256 640q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5v1024q-104 0 -198.5 -40.5 t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5z" />
97<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
98<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
99<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
100<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
101<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
102<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
103<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
104<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
105<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
106<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
107<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
108<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
109<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
110<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
111<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
112<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
113<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
114<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
115<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
116<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
117<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
118<glyph unicode="&#xf059;" d="M896 160v192q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-192q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1152 832q0 97 -58.5 172t-144.5 111.5t-181 36.5t-181 -36.5t-144.5 -111.5t-58.5 -172v-11v-13t1 -11.5t3 -11.5t5.5 -8t9 -7 t13.5 -2h192q14 0 23 9t9 23q0 12 11 27q19 31 50.5 50t66.5 19q39 0 83 -21.5t44 -57.5q0 -33 -26.5 -58t-63.5 -44t-74.5 -41.5t-64 -63.5t-26.5 -98v-11v-13t1 -11.5t3 -11.5t5.5 -8t9 -7t13.5 -2h192q17 0 24 10.5t8 24.5t13.5 33t37.5 32q60 33 70 39q62 44 98.5 108 t36.5 137zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
119<glyph unicode="&#xf05a;" d="M1024 160v64q0 14 -9 23t-23 9h-96v480q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h96v-384h-96q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 928v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
120<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
121<glyph unicode="&#xf05c;" d="M1125 448q0 -27 -18 -45l-102 -102q-18 -18 -45 -18t-45 18l-147 147l-147 -147q-18 -18 -45 -18t-45 18l-102 102q-18 18 -18 45t18 45l147 147l-147 147q-18 18 -18 45t18 45l102 102q18 18 45 18t45 -18l147 -147l147 147q18 18 45 18t45 -18l102 -102q18 -18 18 -45 t-18 -45l-147 -147l147 -147q18 -18 18 -45zM1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5 t40.5 198.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
122<glyph unicode="&#xf05d;" d="M1189 768q0 -27 -18 -45l-320 -320l-102 -102q-18 -18 -45 -18t-45 18l-102 102l-192 192q-18 18 -18 45t18 45l102 102q18 18 45 18t45 -18l147 -147l275 275q18 18 45 18t45 -18l102 -102q18 -18 18 -45zM1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5 t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
123<glyph unicode="&#xf05e;" d="M1280 640q0 139 -71 260l-701 -701q121 -71 260 -71q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM327 380l701 701q-121 71 -260 71q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5q0 -139 71 -260zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
124<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
125<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
126<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
127<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
128<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
129<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
130<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
131<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
132<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
133<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
134<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
135<glyph unicode="&#xf06b;" d="M928 180v716h-320v-716q0 -25 18.5 -38.5t45.5 -13.5h192q27 0 45.5 13.5t18.5 38.5zM472 1024h195l-126 161q-24 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-45 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -10 -22t-27 -10.5t-32 -2.5t-34.5 1.5t-24.5 1.5v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416q-5 0 -24.5 -1.5t-34.5 -1.5t-32 2.5t-27 10.5t-10 22v320q0 13 9.5 22.5t22.5 9.5h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 q108 0 168 -77l128 -165l128 165q60 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q13 0 22.5 -9.5t9.5 -22.5z" />
136<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
137<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
138<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
139<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
140<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
141<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1397 1324q0 -87 -149 -236l-240 -240l143 -746l1 -6q0 -14 -9 -23l-64 -64q-9 -9 -23 -9q-21 0 -29 18l-274 575l-245 -245q68 -238 68 -252t-9 -23l-64 -64q-9 -9 -23 -9q-18 0 -28 16l-155 280l-280 155q-17 9 -17 28q0 14 9 23l64 65q9 9 23 9t252 -68l245 245 l-575 274q-18 8 -18 29q0 14 9 23l64 64q9 9 23 9q4 0 6 -1l746 -143l240 240q149 149 236 149q32 0 52.5 -20.5t20.5 -52.5z" />
142<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
143<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
144<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
145<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
146<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
147<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
148<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
149<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
150<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
151<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
152<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
153<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
154<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
155<glyph unicode="&#xf081;" d="M1280 958q0 13 -9.5 22.5t-22.5 9.5q-5 0 -15 -4q20 34 20 55q0 13 -9.5 22.5t-22.5 9.5q-7 0 -17 -5q-60 -34 -97 -43q-65 63 -154 63q-98 0 -164.5 -72.5t-64.5 -169.5v-12q-107 14 -187.5 64t-156.5 139q-10 12 -28 12q-26 0 -41 -50.5t-15 -86.5q0 -62 29 -117 q-13 -2 -21.5 -11.5t-8.5 -22.5q0 -112 81 -185q-12 -8 -12 -25q0 -6 1 -9q15 -51 50.5 -91.5t84.5 -60.5q-77 -43 -165 -43q-8 0 -24 1.5t-23 1.5q-13 0 -22.5 -9.5t-9.5 -22.5q0 -17 14 -26q63 -47 150 -73.5t170 -26.5q130 0 248 58q166 79 256 232.5t88 339.5v12 q27 22 62.5 63t35.5 61zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
156<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-350q-2 0 -2 1v671h177q31 0 32 23l12 164q2 15 -8 25q-10 12 -24 12h-189v72q0 44 11.5 57t54.5 13q57 0 117 -13q13 -3 26 5q11 8 13 22l23 166q2 12 -5.5 22.5t-19.5 13.5 q-93 26 -197 26q-311 0 -311 -299v-85h-95q-13 0 -23 -10.5t-10 -24.5v-172q0 -8 5.5 -12t10 -4.5t17.5 -0.5h95v-671l10 -1h-330q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
157<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
158<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
159<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
160<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
161<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
162<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
163<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
164<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
165<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
166<glyph unicode="&#xf08c;" d="M512 160v640q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-640q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM503 1028q0 51 -36 87.5t-88 36.5q-51 0 -87 -36.5t-36 -87.5t36 -87.5t87 -36.5q52 0 88 36.5t36 87.5zM1280 160v435 q0 127 -73.5 192.5t-202.5 65.5q-90 0 -158 -45q-12 -8 -14 -12q0 36 -35 36h-176q-14 0 -29.5 -7.5t-15.5 -20.5v-644q0 -13 15.5 -22.5t29.5 -9.5h182q12 0 20.5 9.5t8.5 22.5v349q0 140 114 140q49 0 63.5 -22.5t14.5 -73.5v-393q0 -13 12 -22.5t26 -9.5h186 q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
167<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
168<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
169<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
170<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
171<glyph unicode="&#xf092;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -26t19 -63zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -52 41 -77v-3q-113 -37 -113 -139q0 -60 36 -98t84 -51t107 -13q224 0 224 187q0 48 -25.5 78t-62.5 42.5t-74 21.5t-62.5 23.5t-25.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q30 7 49 13zM771 350h137q-2 20 -2 90v372q0 59 2 76h-137q3 -26 3 -79v-377 q0 -55 -3 -82zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q4 0 11.5 -0.5t11.5 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
172<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1664 480v-576q0 -13 -9.5 -22.5t-22.5 -9.5h-1600q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352h1152v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1344 832q0 -26 -19 -45t-45 -19h-256v-448 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
173<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
174<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
175<glyph unicode="&#xf096;" horiz-adv-x="1664" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
176<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
177<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
178<glyph unicode="&#xf099;" horiz-adv-x="1920" d="M1875 1202q0 -10 -5 -18q-64 -104 -179 -190v-33q4 -227 -100 -457q-134 -297 -397.5 -464.5t-591.5 -167.5q-265 0 -500 122q-64 33 -87 50q-15 12 -15 27q0 13 9.5 22.5t22.5 9.5q14 0 44 -2.5t45 -2.5q204 0 375 106q-103 24 -181 96t-111 173q-2 8 -2 11q0 12 9 21.5 t22 9.5q5 0 14 -2t12 -2q-89 55 -142 147t-53 196q0 15 11.5 25.5t27.5 10.5q10 0 35 -11.5t30 -13.5q-92 110 -92 256q0 51 14.5 108t40.5 95q10 16 25 16q16 0 27 -12q76 -84 110 -115q123 -111 276 -177.5t317 -80.5q-4 21 -4 49q0 167 118.5 285.5t285.5 118.5 q163 0 282 -114q95 20 209 82q8 5 16 5q13 0 22.5 -9.5t9.5 -22.5q0 -24 -28 -73t-51 -76q7 2 30 10.5t43 16t24 7.5q13 0 22.5 -9.5t9.5 -22.5z" />
179<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M560 1125q-49 0 -62 -15.5t-13 -66.5v-88h217q16 0 27 -12q11 -13 10 -29l-14 -200q-2 -15 -12.5 -25.5t-25.5 -10.5h-202v-768q0 -16 -11 -27t-26 -11h-250q-16 0 -27 11t-11 27v768h-122q-16 0 -27 11.5t-11 27.5v200q0 16 11 27t27 11h122v103q0 177 88 263.5 t267 86.5q120 0 225 -30q14 -4 22 -16t6 -26l-27 -195q-2 -16 -16 -26q-14 -9 -30 -6q-76 16 -135 16z" />
180<glyph unicode="&#xf09b;" d="M1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5q0 -209 124.5 -378.5t323.5 -231.5v169q-54 -7 -69 -7q-110 0 -153 100q-15 38 -36 63q-5 6 -21 19t-28.5 24t-12.5 16q0 12 28 12q29 0 51.5 -14.5t38 -35 t31.5 -41.5t40.5 -35.5t56.5 -14.5q42 0 81 14q16 57 63 89q-166 16 -246 83.5t-80 224.5q0 118 73 198q-14 42 -14 84q0 58 27 109q57 0 101 -19.5t101 -60.5q76 18 169 18q80 0 153 -16q57 40 100.5 59t99.5 19q27 -51 27 -109q0 -43 -14 -83q73 -82 73 -199 q0 -157 -80 -225.5t-245 -83.5q69 -47 69 -131v-226q199 62 323.5 231.5t124.5 378.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
181<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M704 160q0 6 -15 57t-35 115.5t-20 65.5q32 16 51 47t19 67q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -36 19 -66.5t51 -47.5q0 -2 -20 -66t-35 -115t-15 -57q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1664 960v-256q0 -26 -19 -45t-45 -19 h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5z" />
182<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
183<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
184<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
185<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
186<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
187<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
188<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
189<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67 11.5t-64 38.5t-48 44t-50 55q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
190<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
191<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -46 -25 -91t-52 -72t-72 -66q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33 t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580q0 -142 -77.5 -230 t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19 t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
192<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
193<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
194<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
195<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
196<glyph unicode="&#xf0ac;" d="M1193 993q11 7 25 22v-1q0 -2 -9.5 -10t-11.5 -12q-1 1 -4 1zM1187 992q-1 1 -2.5 3t-1.5 3q3 -2 10 -5q-6 -4 -6 -1zM728 1175q-16 2 -26 5q1 0 6.5 -1t10.5 -2t9 -2zM773 1212q7 4 13.5 2.5t7.5 -7.5q-5 3 -21 5zM765 1206l-3 2q-2 3 -5.5 5t-4.5 2q2 -1 21 -3 q-6 -4 -8 -6zM663 1290v2q1 -2 3 -5.5t3 -5.5zM558 1250q0 -2 -1 -2l-1 2h2zM933 206v-1v1zM768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1240 162 l5 5q-7 10 -29 12q1 12 -14 26.5t-27 15.5q0 4 -10.5 11t-17.5 8q-9 2 -27 -9q-7 -3 -4 -5q-3 3 -12 11t-16 11q-2 1 -7.5 1t-8.5 2q-1 1 -6 4.5t-7 4.5t-6.5 3t-7.5 1.5t-7.5 -2.5t-8.5 -6t-4.5 -15.5t-2.5 -14.5q-8 6 -0.5 20t1.5 20q-7 7 -21 0.5t-21 -15.5 q-1 -1 -9.5 -5.5t-11.5 -7.5q-4 -6 -9 -17.5t-6 -13.5q0 2 -2.5 6.5t-2.5 6.5q-12 -2 -16 3q5 -16 8 -17l-4 2q-1 -6 3 -15t4 -11q1 -5 -1.5 -13t-2.5 -11q0 -2 5 -11q4 -19 -2 -32q0 -1 -3.5 -7t-6.5 -11l-2 -5l-2 1q-1 1 -2 0q-1 -6 -9 -13t-10 -11q-15 -23 -9 -38 q3 -8 10 -10q3 -1 3 2q1 -9 -11 -27q1 -1 4 -3q-17 0 -10 -14q202 36 352 181h-3zM680 347q16 3 30.5 -16t22.5 -23q41 -20 59 -11q0 -9 14 -28q3 -4 6.5 -11.5t5.5 -10.5q5 -7 19 -16t19 -16q6 3 9 9q13 -35 24 -34q5 0 8 8q0 -1 -0.5 -3t-1.5 -3q7 15 5 26l6 4q5 4 5 5 q-6 6 -9 -3q-30 -14 -48 22q-2 3 -4.5 8t-5 12t-1.5 11.5t6 4.5q11 0 12.5 1.5t-2.5 6t-4 7.5q-1 4 -1.5 12.5t-1.5 12.5l-5 6q-5 6 -11.5 13.5t-7.5 9.5q-4 -10 -16.5 -8.5t-18.5 9.5q1 -2 -0.5 -6.5t-1.5 -6.5q-14 0 -17 1q1 6 3 21t4 22q1 5 5.5 13.5t8 15.5t4.5 14 t-4.5 10.5t-18.5 2.5q-20 -1 -29 -22q-1 -3 -3 -11.5t-5 -12.5t-9 -7q-8 -3 -27 -2t-26 5q-14 8 -24 30.5t-11 41.5q0 10 3 27.5t3 27t-6 26.5q3 2 10 10.5t11 11.5q2 2 5 2h5t4 2t3 6q-1 1 -4 3q-3 3 -4 3q4 -3 19 -1t19 2q0 1 22 0q17 -13 24 2q0 1 -2.5 10.5t-0.5 14.5 q5 -29 32 -10q3 -4 16.5 -6t18.5 -5q3 -2 7 -5.5t6 -5t6 -0.5t9 7q11 -17 13 -25q11 -43 20 -48q8 -2 12.5 -2t5 10.5t0 15.5t-1.5 13l-2 37q-16 3 -20 12.5t1.5 20t16.5 19.5q1 1 16.5 8t21.5 12q24 19 17 39q9 -2 11 9l-5 3q-4 3 -8 5.5t-5 1.5q11 7 2 18q5 3 8 11.5 t9 11.5q9 -14 22 -3q8 9 2 18q5 8 22 11.5t20 9.5q5 -1 7 0t2 4.5v7.5t1 8.5t3 7.5q4 6 16 10.5t14 5.5l19 12q4 4 0 4q18 -2 32 11q13 12 -5 23q2 7 -4 10.5t-16 5.5q3 1 12 0.5t12 1.5q15 11 -7 17q-20 5 -47 -13q-3 -2 -13 -12t-17 -11q15 18 5 22q8 -1 22.5 9t15.5 11 q4 2 10.5 2.5t8.5 1.5q71 25 92 -1q8 11 11 15t9.5 9t15.5 8q21 7 23 9l1 23q-12 -1 -18 8t-7 22l-6 -8q0 6 -3.5 7.5t-7.5 0.5t-9.5 -2t-7.5 0q-9 2 -19.5 15.5t-14.5 16.5q9 0 9 5q-2 5 -10 8q1 6 -2 8t-9 0q-2 12 -1 13q-6 1 -11 11t-8 10q-2 0 -4.5 -2t-5 -5.5l-5 -7 t-3.5 -5.5l-2 -2q-12 6 -24 -10q-9 1 -17 -2q15 6 2 13q-11 5 -21 2q12 5 10 14t-12 16q1 0 4 -1t4 -1q-1 5 -9.5 9.5t-19.5 9t-14 6.5q-7 5 -36 10.5t-36 1.5q-5 -3 -6 -6t1.5 -8.5t3.5 -8.5q6 -23 5 -27q-1 -3 -8.5 -8t-5.5 -12q1 -4 11.5 -10t12.5 -12q5 -13 -4 -25 q-4 -5 -15 -11t-14 -10q-5 -5 -3.5 -11.5t0.5 -9.5q1 1 1 2.5t1 2.5q0 -13 11 -22q8 -6 -16 -18q-20 -11 -20 -4q1 8 -7.5 16t-10.5 12t-3.5 19t-9.5 21q-6 4 -19 4t-18 -5q0 10 -49 30q-17 8 -58 4q7 1 0 17q-8 16 -21 12q-8 25 -4 35q2 5 9 14t9 15q1 3 15.5 6t16.5 8 q1 4 -2.5 6.5t-9.5 4.5q53 -6 63 18q5 9 3 14q0 -1 2 -1t2 -1q12 3 7 17q19 8 26 8q5 -1 11 -6t10 -5q17 -3 21.5 10t-9.5 23q7 -4 7 6q-1 13 -7 19q-3 2 -6.5 2.5t-6.5 0t-7 0.5q-1 0 -8 2q-1 -1 -2 -1h-8q-4 -2 -4 -5v-1q-1 -3 4 -6l5 -1l3 -2q-1 0 -2.5 -2.5t-2.5 -2.5 q0 -3 3 -5q-2 -1 -14 -7.5t-17 -10.5q-1 -1 -4 -2.5t-4 -2.5q-2 -1 -4 2t-4 9t-4 11.5t-4.5 10t-5.5 4.5q-12 0 -18 -17q3 10 -13 17.5t-25 7.5q20 15 -9 30l-1 1q-30 -4 -45 -7q-2 -6 3 -12q-1 -7 6 -9q0 -1 0.5 -1t0.5 -1q0 1 -0.5 1t-0.5 1q3 -1 10.5 -1.5t9.5 -1.5 q3 -1 4.5 -2l7.5 -5t5.5 -6t-2.5 -5q-2 -1 -9 -4t-12.5 -5.5t-6.5 -3.5q-3 -5 0 -16t-2 -15q-5 5 -10 18.5t-8 17.5q8 -9 -30 -6l-8 1q-4 0 -15 -2t-16 -1q-7 0 -29 6q7 17 5 25q5 0 7 2l-6 3q-3 -1 -25 -9q2 -3 8 -9.5t9 -11.5q-22 6 -27 -2q0 -1 -9 0q-25 1 -24 -7 q1 -4 9 -12q0 -9 -1 -9q-27 22 -30 23q-172 -83 -276 -248q1 -2 2.5 -11t3.5 -8.5t11 4.5q9 -9 3 -21q2 2 36 -21q56 -40 22 -53v5.5t1 6.5q-9 -1 -19 5q-3 -6 0.5 -20t11.5 -14q-8 0 -10.5 -17t-2.5 -38.5t-1 -25.5l2 -1q-3 -13 6 -37.5t24 -20.5q-4 -18 5 -21q-1 -4 0 -8 t4.5 -8.5t6 -7l7.5 -7.5l6 -6q28 -11 41 -29q4 -6 10.5 -24.5t15.5 -25.5q-2 -6 10 -21.5t11 -25.5q-1 0 -2.5 -0.5t-2.5 -0.5q3 -8 16.5 -16t16.5 -14q2 -3 2.5 -10.5t3 -12t8.5 -2.5q3 24 -26 68q-16 27 -18 31q-3 5 -5.5 16.5t-4.5 15.5q27 -9 26 -13q-5 -10 26 -52 q2 -3 10 -10t11 -12q3 -4 9.5 -14.5t10.5 -15.5q-1 0 -3 -2l-3 -3q4 -2 9 -5t8 -4.5t7.5 -5t7.5 -7.5q16 -18 20 -33q1 -4 0.5 -15.5t1.5 -16.5q2 -6 6 -11t11.5 -10t11.5 -7t14.5 -6.5t11.5 -5.5q2 -1 18 -11t25 -14q10 -4 16.5 -4.5t16 2.5t15.5 4z" />
197<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
198<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
199<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
200<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM1792 512v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 512v-128h-256v128h256zM1792 992v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
201<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
202<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
203<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
204<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
205<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
206<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
207<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
208<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
209<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
210<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
211<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
212<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
213<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
214<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
215<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
216<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
217<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
218<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
219<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
220<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
221<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
222<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
223<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
224<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
225<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
226<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
227<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
228<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
229<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
230<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
231<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
232<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
233<glyph unicode="&#xf0e1;" horiz-adv-x="1379" d="M1014 961q171 0 268 -85.5t97 -254.5v-586q0 -14 -10.5 -24.5t-24.5 -10.5h-252q-14 0 -24.5 10.5t-10.5 24.5v529q0 71 -26.5 104t-95.5 33q-88 0 -123.5 -51.5t-35.5 -143.5v-471q0 -14 -10.5 -24.5t-25.5 -10.5h-246q-14 0 -24.5 10.5t-10.5 24.5v868q0 14 10.5 24.5 t24.5 10.5h239q13 0 21 -5t10.5 -18.5t3 -18t0.5 -22.5q93 87 246 87zM290 938q14 0 24.5 -10.5t10.5 -24.5v-868q0 -14 -10.5 -24.5t-24.5 -10.5h-246q-14 0 -24.5 10.5t-10.5 24.5v868q0 14 10.5 24.5t24.5 10.5h246zM167 1371q69 0 118 -49t49 -118t-49 -118t-118 -49 t-118 49t-49 118t49 118t118 49z" />
234<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-179 0 -336.5 76t-266 213t-147.5 312q-3 14 7 27q9 12 25 12h199q23 0 30 -23q50 -162 185 -261.5t304 -99.5q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5 t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
235<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
236<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
237<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
238<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
239<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
240<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
241<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
242<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
243<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
244<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
245<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
246<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
247<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
248<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
249<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
250<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
251<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
252<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
253<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h299l-299 299v-299zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544q40 0 88 -20t76 -48l408 -408q28 -28 48 -76t20 -88z" />
254<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
255<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
256<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
257<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
258<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1632 800q261 -58 287 -93l1 -3q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416 h-64v32h64h160h96q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64z" />
259<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-160q0 -45 2 -76t7.5 -56.5t14.5 -40t23 -26.5t33.5 -15.5t45 -7.5t58 -2.5t72.5 0.5zM1664 192v-192h-1152v192l128 192h-97q-211 0 -313 102.5t-102 314.5v287l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
260<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
261<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
262<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
263<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
264<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
265<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
266<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
267<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
268<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
269<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
270<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
271<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
272<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
273<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
274<glyph unicode="&#xf10c;" d="M1280 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
275<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
276<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
277<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
278<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
279<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
280<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
281<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
282<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
283</font>
284</defs></svg> \ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.ttf b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000000..d46172476a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.woff b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000..3c89ae09b8
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.eot b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000000..423bd5d3a2
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.svg b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000000..4469488747
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
1<?xml version="1.0" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3<svg xmlns="http://www.w3.org/2000/svg">
4<metadata></metadata>
5<defs>
6<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
7<font-face units-per-em="1200" ascent="960" descent="-240" />
8<missing-glyph horiz-adv-x="500" />
9<glyph />
10<glyph />
11<glyph unicode="&#xd;" />
12<glyph unicode=" " />
13<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
14<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
15<glyph unicode="&#xa0;" />
16<glyph unicode="&#x2000;" horiz-adv-x="652" />
17<glyph unicode="&#x2001;" horiz-adv-x="1304" />
18<glyph unicode="&#x2002;" horiz-adv-x="652" />
19<glyph unicode="&#x2003;" horiz-adv-x="1304" />
20<glyph unicode="&#x2004;" horiz-adv-x="434" />
21<glyph unicode="&#x2005;" horiz-adv-x="326" />
22<glyph unicode="&#x2006;" horiz-adv-x="217" />
23<glyph unicode="&#x2007;" horiz-adv-x="217" />
24<glyph unicode="&#x2008;" horiz-adv-x="163" />
25<glyph unicode="&#x2009;" horiz-adv-x="260" />
26<glyph unicode="&#x200a;" horiz-adv-x="72" />
27<glyph unicode="&#x202f;" horiz-adv-x="260" />
28<glyph unicode="&#x205f;" horiz-adv-x="326" />
29<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
30<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
31<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
32<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
33<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
34<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
35<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
36<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
37<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
38<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
39<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
40<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
41<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
42<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
43<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
44<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
45<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
46<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
47<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
48<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
49<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
50<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
51<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
52<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
53<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
54<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
55<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
56<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
57<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
58<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
59<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
60<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
61<glyph unicode="&#xe028;" d="M0 25v475l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
62<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
63<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
64<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
65<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
66<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
67<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
68<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
69<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
70<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
71<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
72<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
73<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
74<glyph unicode="&#xe041;" d="M1 700v475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
75<glyph unicode="&#xe042;" d="M2 700v475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
76<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
77<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
78<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
79<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
80<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
81<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v70h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
82<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
83<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
84<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
85<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
86<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
87<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
88<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
89<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
90<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
91<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
92<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
93<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
94<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
95<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
96<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
97<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
98<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
99<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l566 567l-136 137l-430 -431l-147 147z" />
100<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
101<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
102<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
103<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
104<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
105<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
106<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
107<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
108<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
109<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
110<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
111<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
112<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
113<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
114<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h600v200h-600v-200z" />
115<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141z" />
116<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
117<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM363 700h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26 q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-105 0 -172 -56t-67 -183zM500 300h200v100h-200v-100z" />
118<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
119<glyph unicode="&#xe087;" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200 v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" />
120<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
121<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
122<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
123<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
124<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
125<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
126<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
127<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
128<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
129<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
130<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
131<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100z M100 0h400v400h-400v-400zM200 900q-3 0 14 48t35 96l18 47l214 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
132<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
133<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
134<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
135<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
136<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
137<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64 q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
138<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
139<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
140<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
141<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
142<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
143<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
144<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
145<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
146<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
147<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
148<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
149<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
150<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
151<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM99 500v250v5q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351z M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
152<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37 t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
153<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
154<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 212l100 213h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
155<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
156<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
157<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM999 201v600h200v-600h-200z" />
158<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
159<glyph unicode="&#xe130;" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503l89 -100v-294l-340 -130 q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
160<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 500h300l-2 -194l402 294l-402 298v-197h-298v-201z" />
161<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l400 -294v194h302v201h-300v197z" />
162<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
163<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
164<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -34 5.5 -93t7.5 -87q0 -9 17 -44t16 -60q12 0 23 -5.5 t23 -15t20 -13.5q20 -10 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55.5t-20 -57.5q12 -21 22.5 -34.5t28 -27t36.5 -17.5q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q101 -2 221 111q31 30 47 48t34 49t21 62q-14 9 -37.5 9.5t-35.5 7.5q-14 7 -49 15t-52 19 q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q8 16 22 22q6 -1 26 -1.5t33.5 -4.5t19.5 -13q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5 t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23 q-19 -3 -37 0q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -46 0t-45 -3q-20 -6 -51.5 -25.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79zM518 915q3 12 16 30.5t16 25.5q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -18 8 -42.5t16.5 -44 t9.5 -23.5q-6 1 -39 5t-53.5 10t-36.5 16z" />
165<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
166<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
167<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
168<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
169<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
170<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5t52 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-16 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5q-37 0 -62.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
171<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60l517 511 q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
172<glyph unicode="&#xe143;" d="M79 784q0 131 99 229.5t230 98.5q144 0 242 -129q103 129 245 129q130 0 227 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100l-84.5 84.5t-68 74t-60 78t-33.5 70.5t-15 78z M250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-106 48.5q-73 0 -131 -83l-118 -171l-114 174q-51 80 -124 80q-59 0 -108.5 -49.5t-49.5 -118.5z" />
173<glyph unicode="&#xe144;" d="M57 353q0 -94 66 -160l141 -141q66 -66 159 -66q95 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141l19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
174<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
175<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
176<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5v-307l64 -14 q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5zM700 237 q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
177<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5 t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10 t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221z" />
178<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
179<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
180<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
181<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
182<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
183<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
184<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
185<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
186<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
187<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
188<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
189<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
190<glyph unicode="&#xe162;" d="M216 519q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40z" />
191<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
192<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
193<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
194<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
195<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
196<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
197<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 401h700v699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
198<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l248 -237v700h-699zM900 150h100v50h-100v-50z" />
199<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
200<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
201<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
202<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
203<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
204<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
205<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
206<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
207<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359z" />
208<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
209<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
210<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118q17 17 20 41.5 t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
211<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
212<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
213<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
214<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
215<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
216<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
217<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
218<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
219<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
220<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
221<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
222<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
223<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
224<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300 h200l-300 -300z" />
225<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
226<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
227<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
228</font>
229</defs></svg> \ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.ttf b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000000..a498ef4e7c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.woff b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000000..d83c539b82
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/img/logo.png b/bitbake/lib/toaster/toastergui/static/img/logo.png
new file mode 100644
index 0000000000..35ad733ed6
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/img/logo.png
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/img/toaster.png b/bitbake/lib/toaster/toastergui/static/img/toaster.png
new file mode 100755
index 0000000000..11bb5d51b1
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/img/toaster.png
Binary files differ
diff --git a/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/GPL-LICENSE.txt b/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/GPL-LICENSE.txt
new file mode 100644
index 0000000000..76927f581c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/GPL-LICENSE.txt
@@ -0,0 +1,278 @@
1 GNU GENERAL PUBLIC LICENSE
2 Version 2, June 1991
3
4 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 Everyone is permitted to copy and distribute verbatim copies
7 of this license document, but changing it is not allowed.
8
9 Preamble
10
11 The licenses for most software are designed to take away your
12freedom to share and change it. By contrast, the GNU General Public
13License is intended to guarantee your freedom to share and change free
14software--to make sure the software is free for all its users. This
15General Public License applies to most of the Free Software
16Foundation's software and to any other program whose authors commit to
17using it. (Some other Free Software Foundation software is covered by
18the GNU Lesser General Public License instead.) You can apply it to
19your programs, too.
20
21 When we speak of free software, we are referring to freedom, not
22price. Our General Public Licenses are designed to make sure that you
23have the freedom to distribute copies of free software (and charge for
24this service if you wish), that you receive source code or can get it
25if you want it, that you can change the software or use pieces of it
26in new free programs; and that you know you can do these things.
27
28 To protect your rights, we need to make restrictions that forbid
29anyone to deny you these rights or to ask you to surrender the rights.
30These restrictions translate to certain responsibilities for you if you
31distribute copies of the software, or if you modify it.
32
33 For example, if you distribute copies of such a program, whether
34gratis or for a fee, you must give the recipients all the rights that
35you have. You must make sure that they, too, receive or can get the
36source code. And you must show them these terms so they know their
37rights.
38
39 We protect your rights with two steps: (1) copyright the software, and
40(2) offer you this license which gives you legal permission to copy,
41distribute and/or modify the software.
42
43 Also, for each author's protection and ours, we want to make certain
44that everyone understands that there is no warranty for this free
45software. If the software is modified by someone else and passed on, we
46want its recipients to know that what they have is not the original, so
47that any problems introduced by others will not reflect on the original
48authors' reputations.
49
50 Finally, any free program is threatened constantly by software
51patents. We wish to avoid the danger that redistributors of a free
52program will individually obtain patent licenses, in effect making the
53program proprietary. To prevent this, we have made it clear that any
54patent must be licensed for everyone's free use or not licensed at all.
55
56 The precise terms and conditions for copying, distribution and
57modification follow.
58
59 GNU GENERAL PUBLIC LICENSE
60 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
62 0. This License applies to any program or other work which contains
63a notice placed by the copyright holder saying it may be distributed
64under the terms of this General Public License. The "Program", below,
65refers to any such program or work, and a "work based on the Program"
66means either the Program or any derivative work under copyright law:
67that is to say, a work containing the Program or a portion of it,
68either verbatim or with modifications and/or translated into another
69language. (Hereinafter, translation is included without limitation in
70the term "modification".) Each licensee is addressed as "you".
71
72Activities other than copying, distribution and modification are not
73covered by this License; they are outside its scope. The act of
74running the Program is not restricted, and the output from the Program
75is covered only if its contents constitute a work based on the
76Program (independent of having been made by running the Program).
77Whether that is true depends on what the Program does.
78
79 1. You may copy and distribute verbatim copies of the Program's
80source code as you receive it, in any medium, provided that you
81conspicuously and appropriately publish on each copy an appropriate
82copyright notice and disclaimer of warranty; keep intact all the
83notices that refer to this License and to the absence of any warranty;
84and give any other recipients of the Program a copy of this License
85along with the Program.
86
87You may charge a fee for the physical act of transferring a copy, and
88you may at your option offer warranty protection in exchange for a fee.
89
90 2. You may modify your copy or copies of the Program or any portion
91of it, thus forming a work based on the Program, and copy and
92distribute such modifications or work under the terms of Section 1
93above, provided that you also meet all of these conditions:
94
95 a) You must cause the modified files to carry prominent notices
96 stating that you changed the files and the date of any change.
97
98 b) You must cause any work that you distribute or publish, that in
99 whole or in part contains or is derived from the Program or any
100 part thereof, to be licensed as a whole at no charge to all third
101 parties under the terms of this License.
102
103 c) If the modified program normally reads commands interactively
104 when run, you must cause it, when started running for such
105 interactive use in the most ordinary way, to print or display an
106 announcement including an appropriate copyright notice and a
107 notice that there is no warranty (or else, saying that you provide
108 a warranty) and that users may redistribute the program under
109 these conditions, and telling the user how to view a copy of this
110 License. (Exception: if the Program itself is interactive but
111 does not normally print such an announcement, your work based on
112 the Program is not required to print an announcement.)
113
114These requirements apply to the modified work as a whole. If
115identifiable sections of that work are not derived from the Program,
116and can be reasonably considered independent and separate works in
117themselves, then this License, and its terms, do not apply to those
118sections when you distribute them as separate works. But when you
119distribute the same sections as part of a whole which is a work based
120on the Program, the distribution of the whole must be on the terms of
121this License, whose permissions for other licensees extend to the
122entire whole, and thus to each and every part regardless of who wrote it.
123
124Thus, it is not the intent of this section to claim rights or contest
125your rights to work written entirely by you; rather, the intent is to
126exercise the right to control the distribution of derivative or
127collective works based on the Program.
128
129In addition, mere aggregation of another work not based on the Program
130with the Program (or with a work based on the Program) on a volume of
131a storage or distribution medium does not bring the other work under
132the scope of this License.
133
134 3. You may copy and distribute the Program (or a work based on it,
135under Section 2) in object code or executable form under the terms of
136Sections 1 and 2 above provided that you also do one of the following:
137
138 a) Accompany it with the complete corresponding machine-readable
139 source code, which must be distributed under the terms of Sections
140 1 and 2 above on a medium customarily used for software interchange; or,
141
142 b) Accompany it with a written offer, valid for at least three
143 years, to give any third party, for a charge no more than your
144 cost of physically performing source distribution, a complete
145 machine-readable copy of the corresponding source code, to be
146 distributed under the terms of Sections 1 and 2 above on a medium
147 customarily used for software interchange; or,
148
149 c) Accompany it with the information you received as to the offer
150 to distribute corresponding source code. (This alternative is
151 allowed only for noncommercial distribution and only if you
152 received the program in object code or executable form with such
153 an offer, in accord with Subsection b above.)
154
155The source code for a work means the preferred form of the work for
156making modifications to it. For an executable work, complete source
157code means all the source code for all modules it contains, plus any
158associated interface definition files, plus the scripts used to
159control compilation and installation of the executable. However, as a
160special exception, the source code distributed need not include
161anything that is normally distributed (in either source or binary
162form) with the major components (compiler, kernel, and so on) of the
163operating system on which the executable runs, unless that component
164itself accompanies the executable.
165
166If distribution of executable or object code is made by offering
167access to copy from a designated place, then offering equivalent
168access to copy the source code from the same place counts as
169distribution of the source code, even though third parties are not
170compelled to copy the source along with the object code.
171
172 4. You may not copy, modify, sublicense, or distribute the Program
173except as expressly provided under this License. Any attempt
174otherwise to copy, modify, sublicense or distribute the Program is
175void, and will automatically terminate your rights under this License.
176However, parties who have received copies, or rights, from you under
177this License will not have their licenses terminated so long as such
178parties remain in full compliance.
179
180 5. You are not required to accept this License, since you have not
181signed it. However, nothing else grants you permission to modify or
182distribute the Program or its derivative works. These actions are
183prohibited by law if you do not accept this License. Therefore, by
184modifying or distributing the Program (or any work based on the
185Program), you indicate your acceptance of this License to do so, and
186all its terms and conditions for copying, distributing or modifying
187the Program or works based on it.
188
189 6. Each time you redistribute the Program (or any work based on the
190Program), the recipient automatically receives a license from the
191original licensor to copy, distribute or modify the Program subject to
192these terms and conditions. You may not impose any further
193restrictions on the recipients' exercise of the rights granted herein.
194You are not responsible for enforcing compliance by third parties to
195this License.
196
197 7. If, as a consequence of a court judgment or allegation of patent
198infringement or for any other reason (not limited to patent issues),
199conditions are imposed on you (whether by court order, agreement or
200otherwise) that contradict the conditions of this License, they do not
201excuse you from the conditions of this License. If you cannot
202distribute so as to satisfy simultaneously your obligations under this
203License and any other pertinent obligations, then as a consequence you
204may not distribute the Program at all. For example, if a patent
205license would not permit royalty-free redistribution of the Program by
206all those who receive copies directly or indirectly through you, then
207the only way you could satisfy both it and this License would be to
208refrain entirely from distribution of the Program.
209
210If any portion of this section is held invalid or unenforceable under
211any particular circumstance, the balance of the section is intended to
212apply and the section as a whole is intended to apply in other
213circumstances.
214
215It is not the purpose of this section to induce you to infringe any
216patents or other property right claims or to contest validity of any
217such claims; this section has the sole purpose of protecting the
218integrity of the free software distribution system, which is
219implemented by public license practices. Many people have made
220generous contributions to the wide range of software distributed
221through that system in reliance on consistent application of that
222system; it is up to the author/donor to decide if he or she is willing
223to distribute software through any other system and a licensee cannot
224impose that choice.
225
226This section is intended to make thoroughly clear what is believed to
227be a consequence of the rest of this License.
228
229 8. If the distribution and/or use of the Program is restricted in
230certain countries either by patents or by copyrighted interfaces, the
231original copyright holder who places the Program under this License
232may add an explicit geographical distribution limitation excluding
233those countries, so that distribution is permitted only in or among
234countries not thus excluded. In such case, this License incorporates
235the limitation as if written in the body of this License.
236
237 9. The Free Software Foundation may publish revised and/or new versions
238of the General Public License from time to time. Such new versions will
239be similar in spirit to the present version, but may differ in detail to
240address new problems or concerns.
241
242Each version is given a distinguishing version number. If the Program
243specifies a version number of this License which applies to it and "any
244later version", you have the option of following the terms and conditions
245either of that version or of any later version published by the Free
246Software Foundation. If the Program does not specify a version number of
247this License, you may choose any version ever published by the Free Software
248Foundation.
249
250 10. If you wish to incorporate parts of the Program into other free
251programs whose distribution conditions are different, write to the author
252to ask for permission. For software which is copyrighted by the Free
253Software Foundation, write to the Free Software Foundation; we sometimes
254make exceptions for this. Our decision will be guided by the two goals
255of preserving the free status of all derivatives of our free software and
256of promoting the sharing and reuse of software generally.
257
258 NO WARRANTY
259
260 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268REPAIR OR CORRECTION.
269
270 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/MIT-LICENSE.txt b/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/MIT-LICENSE.txt
new file mode 100644
index 0000000000..c2e824fb08
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
1Copyright (c) 2013 Ludo van den Boom, http://ludovandenboom.com
2
3Permission is hereby granted, free of charge, to any person obtaining
4a copy of this software and associated documentation files (the
5"Software"), to deal in the Software without restriction, including
6without limitation the rights to use, copy, modify, merge, publish,
7distribute, sublicense, and/or sell copies of the Software, and to
8permit persons to whom the Software is furnished to do so, subject to
9the following conditions:
10
11The above copyright notice and this permission notice shall be
12included in all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/README.md b/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/README.md
new file mode 100644
index 0000000000..ece7afb58c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/jquery-treetable-license/README.md
@@ -0,0 +1,20 @@
1# jQuery treetable
2
3jQuery treetable is a plugin for jQuery, the 'Write Less, Do More, JavaScript
4Library'. With this plugin you can display a tree in an HTML table, e.g. a
5directory structure or a nested list. Why not use a list, you say? Because lists
6are great for displaying a tree, and tables are not. Oh wait, but this plugin
7uses tables, doesn't it? Yes. Why do I use a table to display a list? Because I
8need multiple columns to display additional data besides the tree.
9
10Download the latest release from the jQuery Plugin Registry or grab the source
11code from Github. Please report issues through Github issues. This plugin is
12released under both the MIT and the GPLv2 license by Ludo van den Boom.
13
14## Documentation and Examples
15
16See index.html for technical documentation and examples. The most recent version
17of this document is also available online at
18http://ludo.cubicphuse.nl/jquery-treetable. An AJAX enabled example built with
19Ruby on Rails can be found at
20https://github.com/ludo/jquery-treetable-ajax-example.
diff --git a/bitbake/lib/toaster/toastergui/static/jquery.treetable.theme.toaster.css b/bitbake/lib/toaster/toastergui/static/jquery.treetable.theme.toaster.css
new file mode 100644
index 0000000000..5194b234d7
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/jquery.treetable.theme.toaster.css
@@ -0,0 +1,66 @@
1/*
2table.treetable {
3 border: 1px solid #888;
4 border-collapse: collapse;
5 font-size: .8em;
6 line-height: 1;
7 margin: .6em 0 1.8em 0;
8 width: 100%;
9}
10
11table.treetable caption {
12 font-size: .9em;
13 font-weight: bold;
14 margin-bottom: .2em;
15}
16
17table.treetable tbody tr td {
18 cursor: default;
19 padding: .3em 1em;
20}
21
22table.treetable span {
23 background-position: center left;
24 background-repeat: no-repeat;
25 padding: .2em 0 .2em 1.5em;
26}
27*/
28
29table.treetable span.file {
30 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADoSURBVBgZBcExblNBGAbA2ceegTRBuIKOgiihSZNTcC5LUHAihNJR0kGKCDcYJY6D3/77MdOinTvzAgCw8ysThIvn/VojIyMjIyPP+bS1sUQIV2s95pBDDvmbP/mdkft83tpYguZq5Jh/OeaYh+yzy8hTHvNlaxNNczm+la9OTlar1UdA/+C2A4trRCnD3jS8BB1obq2Gk6GU6QbQAS4BUaYSQAf4bhhKKTFdAzrAOwAxEUAH+KEM01SY3gM6wBsEAQB0gJ+maZoC3gI6iPYaAIBJsiRmHU0AALOeFC3aK2cWAACUXe7+AwO0lc9eTHYTAAAAAElFTkSuQmCC);
31}
32
33table.treetable span.folder {
34 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLxZO7ihRBFIa/6u0ZW7GHBUV0UQQTZzd3QdhMQxOfwMRXEANBMNQX0MzAzFAwEzHwARbNFDdwEd31Mj3X7a6uOr9BtzNjYjKBJ6nicP7v3KqcJFaxhBVtZUAK8OHlld2st7Xl3DJPVONP+zEUV4HqL5UDYHr5xvuQAjgl/Qs7TzvOOVAjxjlC+ePSwe6DfbVegLVuT4r14eTr6zvA8xSAoBLzx6pvj4l+DZIezuVkG9fY2H7YRQIMZIBwycmzH1/s3F8AapfIPNF3kQk7+kw9PWBy+IZOdg5Ug3mkAATy/t0usovzGeCUWTjCz0B+Sj0ekfdvkZ3abBv+U4GaCtJ1iEm6ANQJ6fEzrG/engcKw/wXQvEKxSEKQxRGKE7Izt+DSiwBJMUSm71rguMYhQKrBygOIRStf4TiFFRBvbRGKiQLWP29yRSHKBTtfdBmHs0BUpgvtgF4yRFR+NUKi0XZcYjCeCG2smkzLAHkbRBmP0/Uk26O5YnUActBp1GsAI+S5nRJJJal5K1aAMrq0d6Tm9uI6zjyf75dAe6tx/SsWeD//o2/Ab6IH3/h25pOAAAAAElFTkSuQmCC);
35}
36
37table.treetable tr.collapsed span.indenter a {
38 background-image: url(data:image/png;base64,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);
39}
40
41table.treetable tr.expanded span.indenter a {
42 background-image: url(data:image/png;base64,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);
43}
44
45
46
47table.treetable tr.collapsed.selected span.indenter a {
48 background-image: url(data:image/png;base64,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);
49}
50
51table.treetable tr.expanded.selected span.indenter a {
52 background-image: url(data:image/png;base64,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);
53}
54
55table.treetable tr.accept {
56 background-color: #a3bce4;
57 color: #fff
58}
59
60table.treetable tr.collapsed.accept td span.indenter a {
61 background-image: url(data:image/x-png;base64,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);
62}
63
64table.treetable tr.expanded.accept td span.indenter a {
65 background-image: url(data:image/x-png;base64,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);
66}
diff --git a/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js b/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
new file mode 100644
index 0000000000..1a6258efcb
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
@@ -0,0 +1,7 @@
1/*!
2 * Bootstrap v3.0.3 (http://getbootstrap.com)
3 * Copyright 2013 Twitter, Inc.
4 * Licensed under http://www.apache.org/licenses/LICENSE-2.0
5 */
6
7if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.js b/bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.js
new file mode 100644
index 0000000000..2be209dd22
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.js
@@ -0,0 +1,6 @@
1/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
2//@ sourceMappingURL=jquery-2.0.3.min.map
3*/
4(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)
5};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)
6},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window);
diff --git a/bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.map b/bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.map
new file mode 100644
index 0000000000..472d71bb0b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/jquery-2.0.3.min.map
@@ -0,0 +1 @@
{"version":3,"file":"jquery-2.0.3.min.js","sources":["jquery-2.0.3.js"],"names":["window","undefined","rootjQuery","readyList","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rquickExpr","rsingleTag","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","removeEventListener","ready","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","resolveWith","trigger","off","obj","type","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","e","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","parseXML","xml","tmp","DOMParser","parseFromString","getElementsByTagName","noop","globalEval","code","script","indirect","eval","text","head","appendChild","removeChild","camelCase","string","nodeName","toLowerCase","value","isArraylike","arr","results","Object","inArray","second","l","grep","inv","retVal","arg","guid","proxy","access","key","chainable","emptyGet","raw","bulk","now","Date","swap","old","style","Deferred","readyState","setTimeout","addEventListener","split","support","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rtrim","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","id","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","attachEvent","top","className","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","memory","fired","firing","firingStart","firingLength","firingIndex","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","createDocumentFragment","opt","checkOn","optSelected","reliableMarginRight","boxSizingReliable","pixelPosition","noCloneChecked","cloneNode","optDisabled","radioValue","checkClone","focusinBubbles","backgroundClip","clearCloneStyle","container","marginDiv","divReset","body","cssText","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","data_user","data_priv","rbrace","rmultiDash","Data","defineProperty","uid","accepts","owner","descriptor","unlock","defineProperties","set","prop","stored","camel","hasData","discard","acceptData","removeData","_data","_removeData","dataAttr","camelKey","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","removeAttr","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","option","one","max","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","hasAttribute","getter","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","event","global","types","handleObjIn","eventHandle","events","t","handleObj","special","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","bubbleType","ontype","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","props","fixHooks","keyHooks","original","which","charCode","keyCode","mouseHooks","eventDoc","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","originalEvent","fixHook","load","blur","click","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","stopImmediatePropagation","mouseenter","mouseleave","orig","related","relatedTarget","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","reverse","truncate","n","qualifier","rxhtmlTag","rtagName","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","thead","col","tr","td","optgroup","tbody","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","cleanData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","detach","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","srcElements","destElements","inPage","fixInput","cloneCopyEvent","selection","wrap","nodes","url","ajax","dataType","async","throws","content","refElements","dest","pdataOld","pdataCur","udataOld","udataCur","wrapAll","firstElementChild","wrapInner","unwrap","curCSS","iframe","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","display","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","getStyles","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","opacity","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","offsetHeight","actualDisplay","contentWindow","write","close","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","param","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","ct","finalDataType","firstDataType","conv2","current","conv","dataFilter","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhr","XMLHttpRequest","xhrSupported","xhrSuccessStatus",1223,"xhrId","xhrCallbacks","ActiveXObject","cors","open","username","xhrFields","onload","onerror","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","left","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":"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"} \ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/js/jquery-ui.js b/bitbake/lib/toaster/toastergui/static/js/jquery-ui.js
new file mode 100644
index 0000000000..7b727e7435
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/jquery-ui.js
@@ -0,0 +1,15003 @@
1/*! jQuery UI - v1.10.3 - 2013-05-03
2* http://jqueryui.com
3* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
4* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
5(function( $, undefined ) {
6
7var uuid = 0,
8 runiqueId = /^ui-id-\d+$/;
9
10// $.ui might exist from components with no dependencies, e.g., $.ui.position
11$.ui = $.ui || {};
12
13$.extend( $.ui, {
14 version: "1.10.3",
15
16 keyCode: {
17 BACKSPACE: 8,
18 COMMA: 188,
19 DELETE: 46,
20 DOWN: 40,
21 END: 35,
22 ENTER: 13,
23 ESCAPE: 27,
24 HOME: 36,
25 LEFT: 37,
26 NUMPAD_ADD: 107,
27 NUMPAD_DECIMAL: 110,
28 NUMPAD_DIVIDE: 111,
29 NUMPAD_ENTER: 108,
30 NUMPAD_MULTIPLY: 106,
31 NUMPAD_SUBTRACT: 109,
32 PAGE_DOWN: 34,
33 PAGE_UP: 33,
34 PERIOD: 190,
35 RIGHT: 39,
36 SPACE: 32,
37 TAB: 9,
38 UP: 38
39 }
40});
41
42// plugins
43$.fn.extend({
44 focus: (function( orig ) {
45 return function( delay, fn ) {
46 return typeof delay === "number" ?
47 this.each(function() {
48 var elem = this;
49 setTimeout(function() {
50 $( elem ).focus();
51 if ( fn ) {
52 fn.call( elem );
53 }
54 }, delay );
55 }) :
56 orig.apply( this, arguments );
57 };
58 })( $.fn.focus ),
59
60 scrollParent: function() {
61 var scrollParent;
62 if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
63 scrollParent = this.parents().filter(function() {
64 return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
65 }).eq(0);
66 } else {
67 scrollParent = this.parents().filter(function() {
68 return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
69 }).eq(0);
70 }
71
72 return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
73 },
74
75 zIndex: function( zIndex ) {
76 if ( zIndex !== undefined ) {
77 return this.css( "zIndex", zIndex );
78 }
79
80 if ( this.length ) {
81 var elem = $( this[ 0 ] ), position, value;
82 while ( elem.length && elem[ 0 ] !== document ) {
83 // Ignore z-index if position is set to a value where z-index is ignored by the browser
84 // This makes behavior of this function consistent across browsers
85 // WebKit always returns auto if the element is positioned
86 position = elem.css( "position" );
87 if ( position === "absolute" || position === "relative" || position === "fixed" ) {
88 // IE returns 0 when zIndex is not specified
89 // other browsers return a string
90 // we ignore the case of nested elements with an explicit value of 0
91 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
92 value = parseInt( elem.css( "zIndex" ), 10 );
93 if ( !isNaN( value ) && value !== 0 ) {
94 return value;
95 }
96 }
97 elem = elem.parent();
98 }
99 }
100
101 return 0;
102 },
103
104 uniqueId: function() {
105 return this.each(function() {
106 if ( !this.id ) {
107 this.id = "ui-id-" + (++uuid);
108 }
109 });
110 },
111
112 removeUniqueId: function() {
113 return this.each(function() {
114 if ( runiqueId.test( this.id ) ) {
115 $( this ).removeAttr( "id" );
116 }
117 });
118 }
119});
120
121// selectors
122function focusable( element, isTabIndexNotNaN ) {
123 var map, mapName, img,
124 nodeName = element.nodeName.toLowerCase();
125 if ( "area" === nodeName ) {
126 map = element.parentNode;
127 mapName = map.name;
128 if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
129 return false;
130 }
131 img = $( "img[usemap=#" + mapName + "]" )[0];
132 return !!img && visible( img );
133 }
134 return ( /input|select|textarea|button|object/.test( nodeName ) ?
135 !element.disabled :
136 "a" === nodeName ?
137 element.href || isTabIndexNotNaN :
138 isTabIndexNotNaN) &&
139 // the element and all of its ancestors must be visible
140 visible( element );
141}
142
143function visible( element ) {
144 return $.expr.filters.visible( element ) &&
145 !$( element ).parents().addBack().filter(function() {
146 return $.css( this, "visibility" ) === "hidden";
147 }).length;
148}
149
150$.extend( $.expr[ ":" ], {
151 data: $.expr.createPseudo ?
152 $.expr.createPseudo(function( dataName ) {
153 return function( elem ) {
154 return !!$.data( elem, dataName );
155 };
156 }) :
157 // support: jQuery <1.8
158 function( elem, i, match ) {
159 return !!$.data( elem, match[ 3 ] );
160 },
161
162 focusable: function( element ) {
163 return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
164 },
165
166 tabbable: function( element ) {
167 var tabIndex = $.attr( element, "tabindex" ),
168 isTabIndexNaN = isNaN( tabIndex );
169 return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
170 }
171});
172
173// support: jQuery <1.8
174if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
175 $.each( [ "Width", "Height" ], function( i, name ) {
176 var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
177 type = name.toLowerCase(),
178 orig = {
179 innerWidth: $.fn.innerWidth,
180 innerHeight: $.fn.innerHeight,
181 outerWidth: $.fn.outerWidth,
182 outerHeight: $.fn.outerHeight
183 };
184
185 function reduce( elem, size, border, margin ) {
186 $.each( side, function() {
187 size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
188 if ( border ) {
189 size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
190 }
191 if ( margin ) {
192 size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
193 }
194 });
195 return size;
196 }
197
198 $.fn[ "inner" + name ] = function( size ) {
199 if ( size === undefined ) {
200 return orig[ "inner" + name ].call( this );
201 }
202
203 return this.each(function() {
204 $( this ).css( type, reduce( this, size ) + "px" );
205 });
206 };
207
208 $.fn[ "outer" + name] = function( size, margin ) {
209 if ( typeof size !== "number" ) {
210 return orig[ "outer" + name ].call( this, size );
211 }
212
213 return this.each(function() {
214 $( this).css( type, reduce( this, size, true, margin ) + "px" );
215 });
216 };
217 });
218}
219
220// support: jQuery <1.8
221if ( !$.fn.addBack ) {
222 $.fn.addBack = function( selector ) {
223 return this.add( selector == null ?
224 this.prevObject : this.prevObject.filter( selector )
225 );
226 };
227}
228
229// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
230if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
231 $.fn.removeData = (function( removeData ) {
232 return function( key ) {
233 if ( arguments.length ) {
234 return removeData.call( this, $.camelCase( key ) );
235 } else {
236 return removeData.call( this );
237 }
238 };
239 })( $.fn.removeData );
240}
241
242
243
244
245
246// deprecated
247$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
248
249$.support.selectstart = "onselectstart" in document.createElement( "div" );
250$.fn.extend({
251 disableSelection: function() {
252 return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
253 ".ui-disableSelection", function( event ) {
254 event.preventDefault();
255 });
256 },
257
258 enableSelection: function() {
259 return this.unbind( ".ui-disableSelection" );
260 }
261});
262
263$.extend( $.ui, {
264 // $.ui.plugin is deprecated. Use $.widget() extensions instead.
265 plugin: {
266 add: function( module, option, set ) {
267 var i,
268 proto = $.ui[ module ].prototype;
269 for ( i in set ) {
270 proto.plugins[ i ] = proto.plugins[ i ] || [];
271 proto.plugins[ i ].push( [ option, set[ i ] ] );
272 }
273 },
274 call: function( instance, name, args ) {
275 var i,
276 set = instance.plugins[ name ];
277 if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
278 return;
279 }
280
281 for ( i = 0; i < set.length; i++ ) {
282 if ( instance.options[ set[ i ][ 0 ] ] ) {
283 set[ i ][ 1 ].apply( instance.element, args );
284 }
285 }
286 }
287 },
288
289 // only used by resizable
290 hasScroll: function( el, a ) {
291
292 //If overflow is hidden, the element might have extra content, but the user wants to hide it
293 if ( $( el ).css( "overflow" ) === "hidden") {
294 return false;
295 }
296
297 var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
298 has = false;
299
300 if ( el[ scroll ] > 0 ) {
301 return true;
302 }
303
304 // TODO: determine which cases actually cause this to happen
305 // if the element doesn't have the scroll set, see if it's possible to
306 // set the scroll
307 el[ scroll ] = 1;
308 has = ( el[ scroll ] > 0 );
309 el[ scroll ] = 0;
310 return has;
311 }
312});
313
314})( jQuery );
315
316(function( $, undefined ) {
317
318var uuid = 0,
319 slice = Array.prototype.slice,
320 _cleanData = $.cleanData;
321$.cleanData = function( elems ) {
322 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
323 try {
324 $( elem ).triggerHandler( "remove" );
325 // http://bugs.jquery.com/ticket/8235
326 } catch( e ) {}
327 }
328 _cleanData( elems );
329};
330
331$.widget = function( name, base, prototype ) {
332 var fullName, existingConstructor, constructor, basePrototype,
333 // proxiedPrototype allows the provided prototype to remain unmodified
334 // so that it can be used as a mixin for multiple widgets (#8876)
335 proxiedPrototype = {},
336 namespace = name.split( "." )[ 0 ];
337
338 name = name.split( "." )[ 1 ];
339 fullName = namespace + "-" + name;
340
341 if ( !prototype ) {
342 prototype = base;
343 base = $.Widget;
344 }
345
346 // create selector for plugin
347 $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
348 return !!$.data( elem, fullName );
349 };
350
351 $[ namespace ] = $[ namespace ] || {};
352 existingConstructor = $[ namespace ][ name ];
353 constructor = $[ namespace ][ name ] = function( options, element ) {
354 // allow instantiation without "new" keyword
355 if ( !this._createWidget ) {
356 return new constructor( options, element );
357 }
358
359 // allow instantiation without initializing for simple inheritance
360 // must use "new" keyword (the code above always passes args)
361 if ( arguments.length ) {
362 this._createWidget( options, element );
363 }
364 };
365 // extend with the existing constructor to carry over any static properties
366 $.extend( constructor, existingConstructor, {
367 version: prototype.version,
368 // copy the object used to create the prototype in case we need to
369 // redefine the widget later
370 _proto: $.extend( {}, prototype ),
371 // track widgets that inherit from this widget in case this widget is
372 // redefined after a widget inherits from it
373 _childConstructors: []
374 });
375
376 basePrototype = new base();
377 // we need to make the options hash a property directly on the new instance
378 // otherwise we'll modify the options hash on the prototype that we're
379 // inheriting from
380 basePrototype.options = $.widget.extend( {}, basePrototype.options );
381 $.each( prototype, function( prop, value ) {
382 if ( !$.isFunction( value ) ) {
383 proxiedPrototype[ prop ] = value;
384 return;
385 }
386 proxiedPrototype[ prop ] = (function() {
387 var _super = function() {
388 return base.prototype[ prop ].apply( this, arguments );
389 },
390 _superApply = function( args ) {
391 return base.prototype[ prop ].apply( this, args );
392 };
393 return function() {
394 var __super = this._super,
395 __superApply = this._superApply,
396 returnValue;
397
398 this._super = _super;
399 this._superApply = _superApply;
400
401 returnValue = value.apply( this, arguments );
402
403 this._super = __super;
404 this._superApply = __superApply;
405
406 return returnValue;
407 };
408 })();
409 });
410 constructor.prototype = $.widget.extend( basePrototype, {
411 // TODO: remove support for widgetEventPrefix
412 // always use the name + a colon as the prefix, e.g., draggable:start
413 // don't prefix for widgets that aren't DOM-based
414 widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
415 }, proxiedPrototype, {
416 constructor: constructor,
417 namespace: namespace,
418 widgetName: name,
419 widgetFullName: fullName
420 });
421
422 // If this widget is being redefined then we need to find all widgets that
423 // are inheriting from it and redefine all of them so that they inherit from
424 // the new version of this widget. We're essentially trying to replace one
425 // level in the prototype chain.
426 if ( existingConstructor ) {
427 $.each( existingConstructor._childConstructors, function( i, child ) {
428 var childPrototype = child.prototype;
429
430 // redefine the child widget using the same prototype that was
431 // originally used, but inherit from the new version of the base
432 $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
433 });
434 // remove the list of existing child constructors from the old constructor
435 // so the old child constructors can be garbage collected
436 delete existingConstructor._childConstructors;
437 } else {
438 base._childConstructors.push( constructor );
439 }
440
441 $.widget.bridge( name, constructor );
442};
443
444$.widget.extend = function( target ) {
445 var input = slice.call( arguments, 1 ),
446 inputIndex = 0,
447 inputLength = input.length,
448 key,
449 value;
450 for ( ; inputIndex < inputLength; inputIndex++ ) {
451 for ( key in input[ inputIndex ] ) {
452 value = input[ inputIndex ][ key ];
453 if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
454 // Clone objects
455 if ( $.isPlainObject( value ) ) {
456 target[ key ] = $.isPlainObject( target[ key ] ) ?
457 $.widget.extend( {}, target[ key ], value ) :
458 // Don't extend strings, arrays, etc. with objects
459 $.widget.extend( {}, value );
460 // Copy everything else by reference
461 } else {
462 target[ key ] = value;
463 }
464 }
465 }
466 }
467 return target;
468};
469
470$.widget.bridge = function( name, object ) {
471 var fullName = object.prototype.widgetFullName || name;
472 $.fn[ name ] = function( options ) {
473 var isMethodCall = typeof options === "string",
474 args = slice.call( arguments, 1 ),
475 returnValue = this;
476
477 // allow multiple hashes to be passed on init
478 options = !isMethodCall && args.length ?
479 $.widget.extend.apply( null, [ options ].concat(args) ) :
480 options;
481
482 if ( isMethodCall ) {
483 this.each(function() {
484 var methodValue,
485 instance = $.data( this, fullName );
486 if ( !instance ) {
487 return $.error( "cannot call methods on " + name + " prior to initialization; " +
488 "attempted to call method '" + options + "'" );
489 }
490 if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
491 return $.error( "no such method '" + options + "' for " + name + " widget instance" );
492 }
493 methodValue = instance[ options ].apply( instance, args );
494 if ( methodValue !== instance && methodValue !== undefined ) {
495 returnValue = methodValue && methodValue.jquery ?
496 returnValue.pushStack( methodValue.get() ) :
497 methodValue;
498 return false;
499 }
500 });
501 } else {
502 this.each(function() {
503 var instance = $.data( this, fullName );
504 if ( instance ) {
505 instance.option( options || {} )._init();
506 } else {
507 $.data( this, fullName, new object( options, this ) );
508 }
509 });
510 }
511
512 return returnValue;
513 };
514};
515
516$.Widget = function( /* options, element */ ) {};
517$.Widget._childConstructors = [];
518
519$.Widget.prototype = {
520 widgetName: "widget",
521 widgetEventPrefix: "",
522 defaultElement: "<div>",
523 options: {
524 disabled: false,
525
526 // callbacks
527 create: null
528 },
529 _createWidget: function( options, element ) {
530 element = $( element || this.defaultElement || this )[ 0 ];
531 this.element = $( element );
532 this.uuid = uuid++;
533 this.eventNamespace = "." + this.widgetName + this.uuid;
534 this.options = $.widget.extend( {},
535 this.options,
536 this._getCreateOptions(),
537 options );
538
539 this.bindings = $();
540 this.hoverable = $();
541 this.focusable = $();
542
543 if ( element !== this ) {
544 $.data( element, this.widgetFullName, this );
545 this._on( true, this.element, {
546 remove: function( event ) {
547 if ( event.target === element ) {
548 this.destroy();
549 }
550 }
551 });
552 this.document = $( element.style ?
553 // element within the document
554 element.ownerDocument :
555 // element is window or document
556 element.document || element );
557 this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
558 }
559
560 this._create();
561 this._trigger( "create", null, this._getCreateEventData() );
562 this._init();
563 },
564 _getCreateOptions: $.noop,
565 _getCreateEventData: $.noop,
566 _create: $.noop,
567 _init: $.noop,
568
569 destroy: function() {
570 this._destroy();
571 // we can probably remove the unbind calls in 2.0
572 // all event bindings should go through this._on()
573 this.element
574 .unbind( this.eventNamespace )
575 // 1.9 BC for #7810
576 // TODO remove dual storage
577 .removeData( this.widgetName )
578 .removeData( this.widgetFullName )
579 // support: jquery <1.6.3
580 // http://bugs.jquery.com/ticket/9413
581 .removeData( $.camelCase( this.widgetFullName ) );
582 this.widget()
583 .unbind( this.eventNamespace )
584 .removeAttr( "aria-disabled" )
585 .removeClass(
586 this.widgetFullName + "-disabled " +
587 "ui-state-disabled" );
588
589 // clean up events and states
590 this.bindings.unbind( this.eventNamespace );
591 this.hoverable.removeClass( "ui-state-hover" );
592 this.focusable.removeClass( "ui-state-focus" );
593 },
594 _destroy: $.noop,
595
596 widget: function() {
597 return this.element;
598 },
599
600 option: function( key, value ) {
601 var options = key,
602 parts,
603 curOption,
604 i;
605
606 if ( arguments.length === 0 ) {
607 // don't return a reference to the internal hash
608 return $.widget.extend( {}, this.options );
609 }
610
611 if ( typeof key === "string" ) {
612 // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
613 options = {};
614 parts = key.split( "." );
615 key = parts.shift();
616 if ( parts.length ) {
617 curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
618 for ( i = 0; i < parts.length - 1; i++ ) {
619 curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
620 curOption = curOption[ parts[ i ] ];
621 }
622 key = parts.pop();
623 if ( value === undefined ) {
624 return curOption[ key ] === undefined ? null : curOption[ key ];
625 }
626 curOption[ key ] = value;
627 } else {
628 if ( value === undefined ) {
629 return this.options[ key ] === undefined ? null : this.options[ key ];
630 }
631 options[ key ] = value;
632 }
633 }
634
635 this._setOptions( options );
636
637 return this;
638 },
639 _setOptions: function( options ) {
640 var key;
641
642 for ( key in options ) {
643 this._setOption( key, options[ key ] );
644 }
645
646 return this;
647 },
648 _setOption: function( key, value ) {
649 this.options[ key ] = value;
650
651 if ( key === "disabled" ) {
652 this.widget()
653 .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
654 .attr( "aria-disabled", value );
655 this.hoverable.removeClass( "ui-state-hover" );
656 this.focusable.removeClass( "ui-state-focus" );
657 }
658
659 return this;
660 },
661
662 enable: function() {
663 return this._setOption( "disabled", false );
664 },
665 disable: function() {
666 return this._setOption( "disabled", true );
667 },
668
669 _on: function( suppressDisabledCheck, element, handlers ) {
670 var delegateElement,
671 instance = this;
672
673 // no suppressDisabledCheck flag, shuffle arguments
674 if ( typeof suppressDisabledCheck !== "boolean" ) {
675 handlers = element;
676 element = suppressDisabledCheck;
677 suppressDisabledCheck = false;
678 }
679
680 // no element argument, shuffle and use this.element
681 if ( !handlers ) {
682 handlers = element;
683 element = this.element;
684 delegateElement = this.widget();
685 } else {
686 // accept selectors, DOM elements
687 element = delegateElement = $( element );
688 this.bindings = this.bindings.add( element );
689 }
690
691 $.each( handlers, function( event, handler ) {
692 function handlerProxy() {
693 // allow widgets to customize the disabled handling
694 // - disabled as an array instead of boolean
695 // - disabled class as method for disabling individual parts
696 if ( !suppressDisabledCheck &&
697 ( instance.options.disabled === true ||
698 $( this ).hasClass( "ui-state-disabled" ) ) ) {
699 return;
700 }
701 return ( typeof handler === "string" ? instance[ handler ] : handler )
702 .apply( instance, arguments );
703 }
704
705 // copy the guid so direct unbinding works
706 if ( typeof handler !== "string" ) {
707 handlerProxy.guid = handler.guid =
708 handler.guid || handlerProxy.guid || $.guid++;
709 }
710
711 var match = event.match( /^(\w+)\s*(.*)$/ ),
712 eventName = match[1] + instance.eventNamespace,
713 selector = match[2];
714 if ( selector ) {
715 delegateElement.delegate( selector, eventName, handlerProxy );
716 } else {
717 element.bind( eventName, handlerProxy );
718 }
719 });
720 },
721
722 _off: function( element, eventName ) {
723 eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
724 element.unbind( eventName ).undelegate( eventName );
725 },
726
727 _delay: function( handler, delay ) {
728 function handlerProxy() {
729 return ( typeof handler === "string" ? instance[ handler ] : handler )
730 .apply( instance, arguments );
731 }
732 var instance = this;
733 return setTimeout( handlerProxy, delay || 0 );
734 },
735
736 _hoverable: function( element ) {
737 this.hoverable = this.hoverable.add( element );
738 this._on( element, {
739 mouseenter: function( event ) {
740 $( event.currentTarget ).addClass( "ui-state-hover" );
741 },
742 mouseleave: function( event ) {
743 $( event.currentTarget ).removeClass( "ui-state-hover" );
744 }
745 });
746 },
747
748 _focusable: function( element ) {
749 this.focusable = this.focusable.add( element );
750 this._on( element, {
751 focusin: function( event ) {
752 $( event.currentTarget ).addClass( "ui-state-focus" );
753 },
754 focusout: function( event ) {
755 $( event.currentTarget ).removeClass( "ui-state-focus" );
756 }
757 });
758 },
759
760 _trigger: function( type, event, data ) {
761 var prop, orig,
762 callback = this.options[ type ];
763
764 data = data || {};
765 event = $.Event( event );
766 event.type = ( type === this.widgetEventPrefix ?
767 type :
768 this.widgetEventPrefix + type ).toLowerCase();
769 // the original event may come from any element
770 // so we need to reset the target on the new event
771 event.target = this.element[ 0 ];
772
773 // copy original event properties over to the new event
774 orig = event.originalEvent;
775 if ( orig ) {
776 for ( prop in orig ) {
777 if ( !( prop in event ) ) {
778 event[ prop ] = orig[ prop ];
779 }
780 }
781 }
782
783 this.element.trigger( event, data );
784 return !( $.isFunction( callback ) &&
785 callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
786 event.isDefaultPrevented() );
787 }
788};
789
790$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
791 $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
792 if ( typeof options === "string" ) {
793 options = { effect: options };
794 }
795 var hasOptions,
796 effectName = !options ?
797 method :
798 options === true || typeof options === "number" ?
799 defaultEffect :
800 options.effect || defaultEffect;
801 options = options || {};
802 if ( typeof options === "number" ) {
803 options = { duration: options };
804 }
805 hasOptions = !$.isEmptyObject( options );
806 options.complete = callback;
807 if ( options.delay ) {
808 element.delay( options.delay );
809 }
810 if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
811 element[ method ]( options );
812 } else if ( effectName !== method && element[ effectName ] ) {
813 element[ effectName ]( options.duration, options.easing, callback );
814 } else {
815 element.queue(function( next ) {
816 $( this )[ method ]();
817 if ( callback ) {
818 callback.call( element[ 0 ] );
819 }
820 next();
821 });
822 }
823 };
824});
825
826})( jQuery );
827
828(function( $, undefined ) {
829
830var mouseHandled = false;
831$( document ).mouseup( function() {
832 mouseHandled = false;
833});
834
835$.widget("ui.mouse", {
836 version: "1.10.3",
837 options: {
838 cancel: "input,textarea,button,select,option",
839 distance: 1,
840 delay: 0
841 },
842 _mouseInit: function() {
843 var that = this;
844
845 this.element
846 .bind("mousedown."+this.widgetName, function(event) {
847 return that._mouseDown(event);
848 })
849 .bind("click."+this.widgetName, function(event) {
850 if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
851 $.removeData(event.target, that.widgetName + ".preventClickEvent");
852 event.stopImmediatePropagation();
853 return false;
854 }
855 });
856
857 this.started = false;
858 },
859
860 // TODO: make sure destroying one instance of mouse doesn't mess with
861 // other instances of mouse
862 _mouseDestroy: function() {
863 this.element.unbind("."+this.widgetName);
864 if ( this._mouseMoveDelegate ) {
865 $(document)
866 .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
867 .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
868 }
869 },
870
871 _mouseDown: function(event) {
872 // don't let more than one widget handle mouseStart
873 if( mouseHandled ) { return; }
874
875 // we may have missed mouseup (out of window)
876 (this._mouseStarted && this._mouseUp(event));
877
878 this._mouseDownEvent = event;
879
880 var that = this,
881 btnIsLeft = (event.which === 1),
882 // event.target.nodeName works around a bug in IE 8 with
883 // disabled inputs (#7620)
884 elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
885 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
886 return true;
887 }
888
889 this.mouseDelayMet = !this.options.delay;
890 if (!this.mouseDelayMet) {
891 this._mouseDelayTimer = setTimeout(function() {
892 that.mouseDelayMet = true;
893 }, this.options.delay);
894 }
895
896 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
897 this._mouseStarted = (this._mouseStart(event) !== false);
898 if (!this._mouseStarted) {
899 event.preventDefault();
900 return true;
901 }
902 }
903
904 // Click event may never have fired (Gecko & Opera)
905 if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
906 $.removeData(event.target, this.widgetName + ".preventClickEvent");
907 }
908
909 // these delegates are required to keep context
910 this._mouseMoveDelegate = function(event) {
911 return that._mouseMove(event);
912 };
913 this._mouseUpDelegate = function(event) {
914 return that._mouseUp(event);
915 };
916 $(document)
917 .bind("mousemove."+this.widgetName, this._mouseMoveDelegate)
918 .bind("mouseup."+this.widgetName, this._mouseUpDelegate);
919
920 event.preventDefault();
921
922 mouseHandled = true;
923 return true;
924 },
925
926 _mouseMove: function(event) {
927 // IE mouseup check - mouseup happened when mouse was out of window
928 if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
929 return this._mouseUp(event);
930 }
931
932 if (this._mouseStarted) {
933 this._mouseDrag(event);
934 return event.preventDefault();
935 }
936
937 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
938 this._mouseStarted =
939 (this._mouseStart(this._mouseDownEvent, event) !== false);
940 (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
941 }
942
943 return !this._mouseStarted;
944 },
945
946 _mouseUp: function(event) {
947 $(document)
948 .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
949 .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
950
951 if (this._mouseStarted) {
952 this._mouseStarted = false;
953
954 if (event.target === this._mouseDownEvent.target) {
955 $.data(event.target, this.widgetName + ".preventClickEvent", true);
956 }
957
958 this._mouseStop(event);
959 }
960
961 return false;
962 },
963
964 _mouseDistanceMet: function(event) {
965 return (Math.max(
966 Math.abs(this._mouseDownEvent.pageX - event.pageX),
967 Math.abs(this._mouseDownEvent.pageY - event.pageY)
968 ) >= this.options.distance
969 );
970 },
971
972 _mouseDelayMet: function(/* event */) {
973 return this.mouseDelayMet;
974 },
975
976 // These are placeholder methods, to be overriden by extending plugin
977 _mouseStart: function(/* event */) {},
978 _mouseDrag: function(/* event */) {},
979 _mouseStop: function(/* event */) {},
980 _mouseCapture: function(/* event */) { return true; }
981});
982
983})(jQuery);
984
985(function( $, undefined ) {
986
987$.widget("ui.draggable", $.ui.mouse, {
988 version: "1.10.3",
989 widgetEventPrefix: "drag",
990 options: {
991 addClasses: true,
992 appendTo: "parent",
993 axis: false,
994 connectToSortable: false,
995 containment: false,
996 cursor: "auto",
997 cursorAt: false,
998 grid: false,
999 handle: false,
1000 helper: "original",
1001 iframeFix: false,
1002 opacity: false,
1003 refreshPositions: false,
1004 revert: false,
1005 revertDuration: 500,
1006 scope: "default",
1007 scroll: true,
1008 scrollSensitivity: 20,
1009 scrollSpeed: 20,
1010 snap: false,
1011 snapMode: "both",
1012 snapTolerance: 20,
1013 stack: false,
1014 zIndex: false,
1015
1016 // callbacks
1017 drag: null,
1018 start: null,
1019 stop: null
1020 },
1021 _create: function() {
1022
1023 if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
1024 this.element[0].style.position = "relative";
1025 }
1026 if (this.options.addClasses){
1027 this.element.addClass("ui-draggable");
1028 }
1029 if (this.options.disabled){
1030 this.element.addClass("ui-draggable-disabled");
1031 }
1032
1033 this._mouseInit();
1034
1035 },
1036
1037 _destroy: function() {
1038 this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
1039 this._mouseDestroy();
1040 },
1041
1042 _mouseCapture: function(event) {
1043
1044 var o = this.options;
1045
1046 // among others, prevent a drag on a resizable-handle
1047 if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
1048 return false;
1049 }
1050
1051 //Quit if we're not on a valid handle
1052 this.handle = this._getHandle(event);
1053 if (!this.handle) {
1054 return false;
1055 }
1056
1057 $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
1058 $("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
1059 .css({
1060 width: this.offsetWidth+"px", height: this.offsetHeight+"px",
1061 position: "absolute", opacity: "0.001", zIndex: 1000
1062 })
1063 .css($(this).offset())
1064 .appendTo("body");
1065 });
1066
1067 return true;
1068
1069 },
1070
1071 _mouseStart: function(event) {
1072
1073 var o = this.options;
1074
1075 //Create and append the visible helper
1076 this.helper = this._createHelper(event);
1077
1078 this.helper.addClass("ui-draggable-dragging");
1079
1080 //Cache the helper size
1081 this._cacheHelperProportions();
1082
1083 //If ddmanager is used for droppables, set the global draggable
1084 if($.ui.ddmanager) {
1085 $.ui.ddmanager.current = this;
1086 }
1087
1088 /*
1089 * - Position generation -
1090 * This block generates everything position related - it's the core of draggables.
1091 */
1092
1093 //Cache the margins of the original element
1094 this._cacheMargins();
1095
1096 //Store the helper's css position
1097 this.cssPosition = this.helper.css( "position" );
1098 this.scrollParent = this.helper.scrollParent();
1099 this.offsetParent = this.helper.offsetParent();
1100 this.offsetParentCssPosition = this.offsetParent.css( "position" );
1101
1102 //The element's absolute position on the page minus margins
1103 this.offset = this.positionAbs = this.element.offset();
1104 this.offset = {
1105 top: this.offset.top - this.margins.top,
1106 left: this.offset.left - this.margins.left
1107 };
1108
1109 //Reset scroll cache
1110 this.offset.scroll = false;
1111
1112 $.extend(this.offset, {
1113 click: { //Where the click happened, relative to the element
1114 left: event.pageX - this.offset.left,
1115 top: event.pageY - this.offset.top
1116 },
1117 parent: this._getParentOffset(),
1118 relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
1119 });
1120
1121 //Generate the original position
1122 this.originalPosition = this.position = this._generatePosition(event);
1123 this.originalPageX = event.pageX;
1124 this.originalPageY = event.pageY;
1125
1126 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
1127 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
1128
1129 //Set a containment if given in the options
1130 this._setContainment();
1131
1132 //Trigger event + callbacks
1133 if(this._trigger("start", event) === false) {
1134 this._clear();
1135 return false;
1136 }
1137
1138 //Recache the helper size
1139 this._cacheHelperProportions();
1140
1141 //Prepare the droppable offsets
1142 if ($.ui.ddmanager && !o.dropBehaviour) {
1143 $.ui.ddmanager.prepareOffsets(this, event);
1144 }
1145
1146
1147 this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
1148
1149 //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
1150 if ( $.ui.ddmanager ) {
1151 $.ui.ddmanager.dragStart(this, event);
1152 }
1153
1154 return true;
1155 },
1156
1157 _mouseDrag: function(event, noPropagation) {
1158 // reset any necessary cached properties (see #5009)
1159 if ( this.offsetParentCssPosition === "fixed" ) {
1160 this.offset.parent = this._getParentOffset();
1161 }
1162
1163 //Compute the helpers position
1164 this.position = this._generatePosition(event);
1165 this.positionAbs = this._convertPositionTo("absolute");
1166
1167 //Call plugins and callbacks and use the resulting position if something is returned
1168 if (!noPropagation) {
1169 var ui = this._uiHash();
1170 if(this._trigger("drag", event, ui) === false) {
1171 this._mouseUp({});
1172 return false;
1173 }
1174 this.position = ui.position;
1175 }
1176
1177 if(!this.options.axis || this.options.axis !== "y") {
1178 this.helper[0].style.left = this.position.left+"px";
1179 }
1180 if(!this.options.axis || this.options.axis !== "x") {
1181 this.helper[0].style.top = this.position.top+"px";
1182 }
1183 if($.ui.ddmanager) {
1184 $.ui.ddmanager.drag(this, event);
1185 }
1186
1187 return false;
1188 },
1189
1190 _mouseStop: function(event) {
1191
1192 //If we are using droppables, inform the manager about the drop
1193 var that = this,
1194 dropped = false;
1195 if ($.ui.ddmanager && !this.options.dropBehaviour) {
1196 dropped = $.ui.ddmanager.drop(this, event);
1197 }
1198
1199 //if a drop comes from outside (a sortable)
1200 if(this.dropped) {
1201 dropped = this.dropped;
1202 this.dropped = false;
1203 }
1204
1205 //if the original element is no longer in the DOM don't bother to continue (see #8269)
1206 if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) {
1207 return false;
1208 }
1209
1210 if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
1211 $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
1212 if(that._trigger("stop", event) !== false) {
1213 that._clear();
1214 }
1215 });
1216 } else {
1217 if(this._trigger("stop", event) !== false) {
1218 this._clear();
1219 }
1220 }
1221
1222 return false;
1223 },
1224
1225 _mouseUp: function(event) {
1226 //Remove frame helpers
1227 $("div.ui-draggable-iframeFix").each(function() {
1228 this.parentNode.removeChild(this);
1229 });
1230
1231 //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
1232 if( $.ui.ddmanager ) {
1233 $.ui.ddmanager.dragStop(this, event);
1234 }
1235
1236 return $.ui.mouse.prototype._mouseUp.call(this, event);
1237 },
1238
1239 cancel: function() {
1240
1241 if(this.helper.is(".ui-draggable-dragging")) {
1242 this._mouseUp({});
1243 } else {
1244 this._clear();
1245 }
1246
1247 return this;
1248
1249 },
1250
1251 _getHandle: function(event) {
1252 return this.options.handle ?
1253 !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
1254 true;
1255 },
1256
1257 _createHelper: function(event) {
1258
1259 var o = this.options,
1260 helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
1261
1262 if(!helper.parents("body").length) {
1263 helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
1264 }
1265
1266 if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
1267 helper.css("position", "absolute");
1268 }
1269
1270 return helper;
1271
1272 },
1273
1274 _adjustOffsetFromHelper: function(obj) {
1275 if (typeof obj === "string") {
1276 obj = obj.split(" ");
1277 }
1278 if ($.isArray(obj)) {
1279 obj = {left: +obj[0], top: +obj[1] || 0};
1280 }
1281 if ("left" in obj) {
1282 this.offset.click.left = obj.left + this.margins.left;
1283 }
1284 if ("right" in obj) {
1285 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
1286 }
1287 if ("top" in obj) {
1288 this.offset.click.top = obj.top + this.margins.top;
1289 }
1290 if ("bottom" in obj) {
1291 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
1292 }
1293 },
1294
1295 _getParentOffset: function() {
1296
1297 //Get the offsetParent and cache its position
1298 var po = this.offsetParent.offset();
1299
1300 // This is a special case where we need to modify a offset calculated on start, since the following happened:
1301 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
1302 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
1303 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
1304 if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
1305 po.left += this.scrollParent.scrollLeft();
1306 po.top += this.scrollParent.scrollTop();
1307 }
1308
1309 //This needs to be actually done for all browsers, since pageX/pageY includes this information
1310 //Ugly IE fix
1311 if((this.offsetParent[0] === document.body) ||
1312 (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
1313 po = { top: 0, left: 0 };
1314 }
1315
1316 return {
1317 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
1318 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
1319 };
1320
1321 },
1322
1323 _getRelativeOffset: function() {
1324
1325 if(this.cssPosition === "relative") {
1326 var p = this.element.position();
1327 return {
1328 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
1329 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
1330 };
1331 } else {
1332 return { top: 0, left: 0 };
1333 }
1334
1335 },
1336
1337 _cacheMargins: function() {
1338 this.margins = {
1339 left: (parseInt(this.element.css("marginLeft"),10) || 0),
1340 top: (parseInt(this.element.css("marginTop"),10) || 0),
1341 right: (parseInt(this.element.css("marginRight"),10) || 0),
1342 bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
1343 };
1344 },
1345
1346 _cacheHelperProportions: function() {
1347 this.helperProportions = {
1348 width: this.helper.outerWidth(),
1349 height: this.helper.outerHeight()
1350 };
1351 },
1352
1353 _setContainment: function() {
1354
1355 var over, c, ce,
1356 o = this.options;
1357
1358 if ( !o.containment ) {
1359 this.containment = null;
1360 return;
1361 }
1362
1363 if ( o.containment === "window" ) {
1364 this.containment = [
1365 $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
1366 $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
1367 $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
1368 $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
1369 ];
1370 return;
1371 }
1372
1373 if ( o.containment === "document") {
1374 this.containment = [
1375 0,
1376 0,
1377 $( document ).width() - this.helperProportions.width - this.margins.left,
1378 ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
1379 ];
1380 return;
1381 }
1382
1383 if ( o.containment.constructor === Array ) {
1384 this.containment = o.containment;
1385 return;
1386 }
1387
1388 if ( o.containment === "parent" ) {
1389 o.containment = this.helper[ 0 ].parentNode;
1390 }
1391
1392 c = $( o.containment );
1393 ce = c[ 0 ];
1394
1395 if( !ce ) {
1396 return;
1397 }
1398
1399 over = c.css( "overflow" ) !== "hidden";
1400
1401 this.containment = [
1402 ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
1403 ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) ,
1404 ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right,
1405 ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom
1406 ];
1407 this.relative_container = c;
1408 },
1409
1410 _convertPositionTo: function(d, pos) {
1411
1412 if(!pos) {
1413 pos = this.position;
1414 }
1415
1416 var mod = d === "absolute" ? 1 : -1,
1417 scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent;
1418
1419 //Cache the scroll
1420 if (!this.offset.scroll) {
1421 this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
1422 }
1423
1424 return {
1425 top: (
1426 pos.top + // The absolute mouse position
1427 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
1428 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
1429 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod )
1430 ),
1431 left: (
1432 pos.left + // The absolute mouse position
1433 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
1434 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
1435 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod )
1436 )
1437 };
1438
1439 },
1440
1441 _generatePosition: function(event) {
1442
1443 var containment, co, top, left,
1444 o = this.options,
1445 scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent,
1446 pageX = event.pageX,
1447 pageY = event.pageY;
1448
1449 //Cache the scroll
1450 if (!this.offset.scroll) {
1451 this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
1452 }
1453
1454 /*
1455 * - Position constraining -
1456 * Constrain the position to a mix of grid, containment.
1457 */
1458
1459 // If we are not dragging yet, we won't check for options
1460 if ( this.originalPosition ) {
1461 if ( this.containment ) {
1462 if ( this.relative_container ){
1463 co = this.relative_container.offset();
1464 containment = [
1465 this.containment[ 0 ] + co.left,
1466 this.containment[ 1 ] + co.top,
1467 this.containment[ 2 ] + co.left,
1468 this.containment[ 3 ] + co.top
1469 ];
1470 }
1471 else {
1472 containment = this.containment;
1473 }
1474
1475 if(event.pageX - this.offset.click.left < containment[0]) {
1476 pageX = containment[0] + this.offset.click.left;
1477 }
1478 if(event.pageY - this.offset.click.top < containment[1]) {
1479 pageY = containment[1] + this.offset.click.top;
1480 }
1481 if(event.pageX - this.offset.click.left > containment[2]) {
1482 pageX = containment[2] + this.offset.click.left;
1483 }
1484 if(event.pageY - this.offset.click.top > containment[3]) {
1485 pageY = containment[3] + this.offset.click.top;
1486 }
1487 }
1488
1489 if(o.grid) {
1490 //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
1491 top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
1492 pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
1493
1494 left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
1495 pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
1496 }
1497
1498 }
1499
1500 return {
1501 top: (
1502 pageY - // The absolute mouse position
1503 this.offset.click.top - // Click offset (relative to the element)
1504 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
1505 this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
1506 ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top )
1507 ),
1508 left: (
1509 pageX - // The absolute mouse position
1510 this.offset.click.left - // Click offset (relative to the element)
1511 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
1512 this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
1513 ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left )
1514 )
1515 };
1516
1517 },
1518
1519 _clear: function() {
1520 this.helper.removeClass("ui-draggable-dragging");
1521 if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
1522 this.helper.remove();
1523 }
1524 this.helper = null;
1525 this.cancelHelperRemoval = false;
1526 },
1527
1528 // From now on bulk stuff - mainly helpers
1529
1530 _trigger: function(type, event, ui) {
1531 ui = ui || this._uiHash();
1532 $.ui.plugin.call(this, type, [event, ui]);
1533 //The absolute position has to be recalculated after plugins
1534 if(type === "drag") {
1535 this.positionAbs = this._convertPositionTo("absolute");
1536 }
1537 return $.Widget.prototype._trigger.call(this, type, event, ui);
1538 },
1539
1540 plugins: {},
1541
1542 _uiHash: function() {
1543 return {
1544 helper: this.helper,
1545 position: this.position,
1546 originalPosition: this.originalPosition,
1547 offset: this.positionAbs
1548 };
1549 }
1550
1551});
1552
1553$.ui.plugin.add("draggable", "connectToSortable", {
1554 start: function(event, ui) {
1555
1556 var inst = $(this).data("ui-draggable"), o = inst.options,
1557 uiSortable = $.extend({}, ui, { item: inst.element });
1558 inst.sortables = [];
1559 $(o.connectToSortable).each(function() {
1560 var sortable = $.data(this, "ui-sortable");
1561 if (sortable && !sortable.options.disabled) {
1562 inst.sortables.push({
1563 instance: sortable,
1564 shouldRevert: sortable.options.revert
1565 });
1566 sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
1567 sortable._trigger("activate", event, uiSortable);
1568 }
1569 });
1570
1571 },
1572 stop: function(event, ui) {
1573
1574 //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
1575 var inst = $(this).data("ui-draggable"),
1576 uiSortable = $.extend({}, ui, { item: inst.element });
1577
1578 $.each(inst.sortables, function() {
1579 if(this.instance.isOver) {
1580
1581 this.instance.isOver = 0;
1582
1583 inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
1584 this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
1585
1586 //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid"
1587 if(this.shouldRevert) {
1588 this.instance.options.revert = this.shouldRevert;
1589 }
1590
1591 //Trigger the stop of the sortable
1592 this.instance._mouseStop(event);
1593
1594 this.instance.options.helper = this.instance.options._helper;
1595
1596 //If the helper has been the original item, restore properties in the sortable
1597 if(inst.options.helper === "original") {
1598 this.instance.currentItem.css({ top: "auto", left: "auto" });
1599 }
1600
1601 } else {
1602 this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
1603 this.instance._trigger("deactivate", event, uiSortable);
1604 }
1605
1606 });
1607
1608 },
1609 drag: function(event, ui) {
1610
1611 var inst = $(this).data("ui-draggable"), that = this;
1612
1613 $.each(inst.sortables, function() {
1614
1615 var innermostIntersecting = false,
1616 thisSortable = this;
1617
1618 //Copy over some variables to allow calling the sortable's native _intersectsWith
1619 this.instance.positionAbs = inst.positionAbs;
1620 this.instance.helperProportions = inst.helperProportions;
1621 this.instance.offset.click = inst.offset.click;
1622
1623 if(this.instance._intersectsWith(this.instance.containerCache)) {
1624 innermostIntersecting = true;
1625 $.each(inst.sortables, function () {
1626 this.instance.positionAbs = inst.positionAbs;
1627 this.instance.helperProportions = inst.helperProportions;
1628 this.instance.offset.click = inst.offset.click;
1629 if (this !== thisSortable &&
1630 this.instance._intersectsWith(this.instance.containerCache) &&
1631 $.contains(thisSortable.instance.element[0], this.instance.element[0])
1632 ) {
1633 innermostIntersecting = false;
1634 }
1635 return innermostIntersecting;
1636 });
1637 }
1638
1639
1640 if(innermostIntersecting) {
1641 //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
1642 if(!this.instance.isOver) {
1643
1644 this.instance.isOver = 1;
1645 //Now we fake the start of dragging for the sortable instance,
1646 //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
1647 //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
1648 this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true);
1649 this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
1650 this.instance.options.helper = function() { return ui.helper[0]; };
1651
1652 event.target = this.instance.currentItem[0];
1653 this.instance._mouseCapture(event, true);
1654 this.instance._mouseStart(event, true, true);
1655
1656 //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
1657 this.instance.offset.click.top = inst.offset.click.top;
1658 this.instance.offset.click.left = inst.offset.click.left;
1659 this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
1660 this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
1661
1662 inst._trigger("toSortable", event);
1663 inst.dropped = this.instance.element; //draggable revert needs that
1664 //hack so receive/update callbacks work (mostly)
1665 inst.currentItem = inst.element;
1666 this.instance.fromOutside = inst;
1667
1668 }
1669
1670 //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
1671 if(this.instance.currentItem) {
1672 this.instance._mouseDrag(event);
1673 }
1674
1675 } else {
1676
1677 //If it doesn't intersect with the sortable, and it intersected before,
1678 //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
1679 if(this.instance.isOver) {
1680
1681 this.instance.isOver = 0;
1682 this.instance.cancelHelperRemoval = true;
1683
1684 //Prevent reverting on this forced stop
1685 this.instance.options.revert = false;
1686
1687 // The out event needs to be triggered independently
1688 this.instance._trigger("out", event, this.instance._uiHash(this.instance));
1689
1690 this.instance._mouseStop(event, true);
1691 this.instance.options.helper = this.instance.options._helper;
1692
1693 //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
1694 this.instance.currentItem.remove();
1695 if(this.instance.placeholder) {
1696 this.instance.placeholder.remove();
1697 }
1698
1699 inst._trigger("fromSortable", event);
1700 inst.dropped = false; //draggable revert needs that
1701 }
1702
1703 }
1704
1705 });
1706
1707 }
1708});
1709
1710$.ui.plugin.add("draggable", "cursor", {
1711 start: function() {
1712 var t = $("body"), o = $(this).data("ui-draggable").options;
1713 if (t.css("cursor")) {
1714 o._cursor = t.css("cursor");
1715 }
1716 t.css("cursor", o.cursor);
1717 },
1718 stop: function() {
1719 var o = $(this).data("ui-draggable").options;
1720 if (o._cursor) {
1721 $("body").css("cursor", o._cursor);
1722 }
1723 }
1724});
1725
1726$.ui.plugin.add("draggable", "opacity", {
1727 start: function(event, ui) {
1728 var t = $(ui.helper), o = $(this).data("ui-draggable").options;
1729 if(t.css("opacity")) {
1730 o._opacity = t.css("opacity");
1731 }
1732 t.css("opacity", o.opacity);
1733 },
1734 stop: function(event, ui) {
1735 var o = $(this).data("ui-draggable").options;
1736 if(o._opacity) {
1737 $(ui.helper).css("opacity", o._opacity);
1738 }
1739 }
1740});
1741
1742$.ui.plugin.add("draggable", "scroll", {
1743 start: function() {
1744 var i = $(this).data("ui-draggable");
1745 if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
1746 i.overflowOffset = i.scrollParent.offset();
1747 }
1748 },
1749 drag: function( event ) {
1750
1751 var i = $(this).data("ui-draggable"), o = i.options, scrolled = false;
1752
1753 if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
1754
1755 if(!o.axis || o.axis !== "x") {
1756 if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
1757 i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
1758 } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
1759 i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
1760 }
1761 }
1762
1763 if(!o.axis || o.axis !== "y") {
1764 if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
1765 i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
1766 } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
1767 i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
1768 }
1769 }
1770
1771 } else {
1772
1773 if(!o.axis || o.axis !== "x") {
1774 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
1775 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
1776 } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
1777 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
1778 }
1779 }
1780
1781 if(!o.axis || o.axis !== "y") {
1782 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
1783 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
1784 } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
1785 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
1786 }
1787 }
1788
1789 }
1790
1791 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
1792 $.ui.ddmanager.prepareOffsets(i, event);
1793 }
1794
1795 }
1796});
1797
1798$.ui.plugin.add("draggable", "snap", {
1799 start: function() {
1800
1801 var i = $(this).data("ui-draggable"),
1802 o = i.options;
1803
1804 i.snapElements = [];
1805
1806 $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
1807 var $t = $(this),
1808 $o = $t.offset();
1809 if(this !== i.element[0]) {
1810 i.snapElements.push({
1811 item: this,
1812 width: $t.outerWidth(), height: $t.outerHeight(),
1813 top: $o.top, left: $o.left
1814 });
1815 }
1816 });
1817
1818 },
1819 drag: function(event, ui) {
1820
1821 var ts, bs, ls, rs, l, r, t, b, i, first,
1822 inst = $(this).data("ui-draggable"),
1823 o = inst.options,
1824 d = o.snapTolerance,
1825 x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
1826 y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
1827
1828 for (i = inst.snapElements.length - 1; i >= 0; i--){
1829
1830 l = inst.snapElements[i].left;
1831 r = l + inst.snapElements[i].width;
1832 t = inst.snapElements[i].top;
1833 b = t + inst.snapElements[i].height;
1834
1835 if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
1836 if(inst.snapElements[i].snapping) {
1837 (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
1838 }
1839 inst.snapElements[i].snapping = false;
1840 continue;
1841 }
1842
1843 if(o.snapMode !== "inner") {
1844 ts = Math.abs(t - y2) <= d;
1845 bs = Math.abs(b - y1) <= d;
1846 ls = Math.abs(l - x2) <= d;
1847 rs = Math.abs(r - x1) <= d;
1848 if(ts) {
1849 ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
1850 }
1851 if(bs) {
1852 ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
1853 }
1854 if(ls) {
1855 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
1856 }
1857 if(rs) {
1858 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
1859 }
1860 }
1861
1862 first = (ts || bs || ls || rs);
1863
1864 if(o.snapMode !== "outer") {
1865 ts = Math.abs(t - y1) <= d;
1866 bs = Math.abs(b - y2) <= d;
1867 ls = Math.abs(l - x1) <= d;
1868 rs = Math.abs(r - x2) <= d;
1869 if(ts) {
1870 ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
1871 }
1872 if(bs) {
1873 ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
1874 }
1875 if(ls) {
1876 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
1877 }
1878 if(rs) {
1879 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
1880 }
1881 }
1882
1883 if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
1884 (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
1885 }
1886 inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
1887
1888 }
1889
1890 }
1891});
1892
1893$.ui.plugin.add("draggable", "stack", {
1894 start: function() {
1895 var min,
1896 o = this.data("ui-draggable").options,
1897 group = $.makeArray($(o.stack)).sort(function(a,b) {
1898 return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
1899 });
1900
1901 if (!group.length) { return; }
1902
1903 min = parseInt($(group[0]).css("zIndex"), 10) || 0;
1904 $(group).each(function(i) {
1905 $(this).css("zIndex", min + i);
1906 });
1907 this.css("zIndex", (min + group.length));
1908 }
1909});
1910
1911$.ui.plugin.add("draggable", "zIndex", {
1912 start: function(event, ui) {
1913 var t = $(ui.helper), o = $(this).data("ui-draggable").options;
1914 if(t.css("zIndex")) {
1915 o._zIndex = t.css("zIndex");
1916 }
1917 t.css("zIndex", o.zIndex);
1918 },
1919 stop: function(event, ui) {
1920 var o = $(this).data("ui-draggable").options;
1921 if(o._zIndex) {
1922 $(ui.helper).css("zIndex", o._zIndex);
1923 }
1924 }
1925});
1926
1927})(jQuery);
1928
1929(function( $, undefined ) {
1930
1931function isOverAxis( x, reference, size ) {
1932 return ( x > reference ) && ( x < ( reference + size ) );
1933}
1934
1935$.widget("ui.droppable", {
1936 version: "1.10.3",
1937 widgetEventPrefix: "drop",
1938 options: {
1939 accept: "*",
1940 activeClass: false,
1941 addClasses: true,
1942 greedy: false,
1943 hoverClass: false,
1944 scope: "default",
1945 tolerance: "intersect",
1946
1947 // callbacks
1948 activate: null,
1949 deactivate: null,
1950 drop: null,
1951 out: null,
1952 over: null
1953 },
1954 _create: function() {
1955
1956 var o = this.options,
1957 accept = o.accept;
1958
1959 this.isover = false;
1960 this.isout = true;
1961
1962 this.accept = $.isFunction(accept) ? accept : function(d) {
1963 return d.is(accept);
1964 };
1965
1966 //Store the droppable's proportions
1967 this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
1968
1969 // Add the reference and positions to the manager
1970 $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
1971 $.ui.ddmanager.droppables[o.scope].push(this);
1972
1973 (o.addClasses && this.element.addClass("ui-droppable"));
1974
1975 },
1976
1977 _destroy: function() {
1978 var i = 0,
1979 drop = $.ui.ddmanager.droppables[this.options.scope];
1980
1981 for ( ; i < drop.length; i++ ) {
1982 if ( drop[i] === this ) {
1983 drop.splice(i, 1);
1984 }
1985 }
1986
1987 this.element.removeClass("ui-droppable ui-droppable-disabled");
1988 },
1989
1990 _setOption: function(key, value) {
1991
1992 if(key === "accept") {
1993 this.accept = $.isFunction(value) ? value : function(d) {
1994 return d.is(value);
1995 };
1996 }
1997 $.Widget.prototype._setOption.apply(this, arguments);
1998 },
1999
2000 _activate: function(event) {
2001 var draggable = $.ui.ddmanager.current;
2002 if(this.options.activeClass) {
2003 this.element.addClass(this.options.activeClass);
2004 }
2005 if(draggable){
2006 this._trigger("activate", event, this.ui(draggable));
2007 }
2008 },
2009
2010 _deactivate: function(event) {
2011 var draggable = $.ui.ddmanager.current;
2012 if(this.options.activeClass) {
2013 this.element.removeClass(this.options.activeClass);
2014 }
2015 if(draggable){
2016 this._trigger("deactivate", event, this.ui(draggable));
2017 }
2018 },
2019
2020 _over: function(event) {
2021
2022 var draggable = $.ui.ddmanager.current;
2023
2024 // Bail if draggable and droppable are same element
2025 if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
2026 return;
2027 }
2028
2029 if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2030 if(this.options.hoverClass) {
2031 this.element.addClass(this.options.hoverClass);
2032 }
2033 this._trigger("over", event, this.ui(draggable));
2034 }
2035
2036 },
2037
2038 _out: function(event) {
2039
2040 var draggable = $.ui.ddmanager.current;
2041
2042 // Bail if draggable and droppable are same element
2043 if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
2044 return;
2045 }
2046
2047 if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2048 if(this.options.hoverClass) {
2049 this.element.removeClass(this.options.hoverClass);
2050 }
2051 this._trigger("out", event, this.ui(draggable));
2052 }
2053
2054 },
2055
2056 _drop: function(event,custom) {
2057
2058 var draggable = custom || $.ui.ddmanager.current,
2059 childrenIntersection = false;
2060
2061 // Bail if draggable and droppable are same element
2062 if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
2063 return false;
2064 }
2065
2066 this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() {
2067 var inst = $.data(this, "ui-droppable");
2068 if(
2069 inst.options.greedy &&
2070 !inst.options.disabled &&
2071 inst.options.scope === draggable.options.scope &&
2072 inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) &&
2073 $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
2074 ) { childrenIntersection = true; return false; }
2075 });
2076 if(childrenIntersection) {
2077 return false;
2078 }
2079
2080 if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2081 if(this.options.activeClass) {
2082 this.element.removeClass(this.options.activeClass);
2083 }
2084 if(this.options.hoverClass) {
2085 this.element.removeClass(this.options.hoverClass);
2086 }
2087 this._trigger("drop", event, this.ui(draggable));
2088 return this.element;
2089 }
2090
2091 return false;
2092
2093 },
2094
2095 ui: function(c) {
2096 return {
2097 draggable: (c.currentItem || c.element),
2098 helper: c.helper,
2099 position: c.position,
2100 offset: c.positionAbs
2101 };
2102 }
2103
2104});
2105
2106$.ui.intersect = function(draggable, droppable, toleranceMode) {
2107
2108 if (!droppable.offset) {
2109 return false;
2110 }
2111
2112 var draggableLeft, draggableTop,
2113 x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
2114 y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height,
2115 l = droppable.offset.left, r = l + droppable.proportions.width,
2116 t = droppable.offset.top, b = t + droppable.proportions.height;
2117
2118 switch (toleranceMode) {
2119 case "fit":
2120 return (l <= x1 && x2 <= r && t <= y1 && y2 <= b);
2121 case "intersect":
2122 return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half
2123 x2 - (draggable.helperProportions.width / 2) < r && // Left Half
2124 t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half
2125 y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
2126 case "pointer":
2127 draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left);
2128 draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top);
2129 return isOverAxis( draggableTop, t, droppable.proportions.height ) && isOverAxis( draggableLeft, l, droppable.proportions.width );
2130 case "touch":
2131 return (
2132 (y1 >= t && y1 <= b) || // Top edge touching
2133 (y2 >= t && y2 <= b) || // Bottom edge touching
2134 (y1 < t && y2 > b) // Surrounded vertically
2135 ) && (
2136 (x1 >= l && x1 <= r) || // Left edge touching
2137 (x2 >= l && x2 <= r) || // Right edge touching
2138 (x1 < l && x2 > r) // Surrounded horizontally
2139 );
2140 default:
2141 return false;
2142 }
2143
2144};
2145
2146/*
2147 This manager tracks offsets of draggables and droppables
2148*/
2149$.ui.ddmanager = {
2150 current: null,
2151 droppables: { "default": [] },
2152 prepareOffsets: function(t, event) {
2153
2154 var i, j,
2155 m = $.ui.ddmanager.droppables[t.options.scope] || [],
2156 type = event ? event.type : null, // workaround for #2317
2157 list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack();
2158
2159 droppablesLoop: for (i = 0; i < m.length; i++) {
2160
2161 //No disabled and non-accepted
2162 if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) {
2163 continue;
2164 }
2165
2166 // Filter out elements in the current dragged item
2167 for (j=0; j < list.length; j++) {
2168 if(list[j] === m[i].element[0]) {
2169 m[i].proportions.height = 0;
2170 continue droppablesLoop;
2171 }
2172 }
2173
2174 m[i].visible = m[i].element.css("display") !== "none";
2175 if(!m[i].visible) {
2176 continue;
2177 }
2178
2179 //Activate the droppable if used directly from draggables
2180 if(type === "mousedown") {
2181 m[i]._activate.call(m[i], event);
2182 }
2183
2184 m[i].offset = m[i].element.offset();
2185 m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
2186
2187 }
2188
2189 },
2190 drop: function(draggable, event) {
2191
2192 var dropped = false;
2193 // Create a copy of the droppables in case the list changes during the drop (#9116)
2194 $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() {
2195
2196 if(!this.options) {
2197 return;
2198 }
2199 if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) {
2200 dropped = this._drop.call(this, event) || dropped;
2201 }
2202
2203 if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2204 this.isout = true;
2205 this.isover = false;
2206 this._deactivate.call(this, event);
2207 }
2208
2209 });
2210 return dropped;
2211
2212 },
2213 dragStart: function( draggable, event ) {
2214 //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
2215 draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
2216 if( !draggable.options.refreshPositions ) {
2217 $.ui.ddmanager.prepareOffsets( draggable, event );
2218 }
2219 });
2220 },
2221 drag: function(draggable, event) {
2222
2223 //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
2224 if(draggable.options.refreshPositions) {
2225 $.ui.ddmanager.prepareOffsets(draggable, event);
2226 }
2227
2228 //Run through all droppables and check their positions based on specific tolerance options
2229 $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
2230
2231 if(this.options.disabled || this.greedyChild || !this.visible) {
2232 return;
2233 }
2234
2235 var parentInstance, scope, parent,
2236 intersects = $.ui.intersect(draggable, this, this.options.tolerance),
2237 c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null);
2238 if(!c) {
2239 return;
2240 }
2241
2242 if (this.options.greedy) {
2243 // find droppable parents with same scope
2244 scope = this.options.scope;
2245 parent = this.element.parents(":data(ui-droppable)").filter(function () {
2246 return $.data(this, "ui-droppable").options.scope === scope;
2247 });
2248
2249 if (parent.length) {
2250 parentInstance = $.data(parent[0], "ui-droppable");
2251 parentInstance.greedyChild = (c === "isover");
2252 }
2253 }
2254
2255 // we just moved into a greedy child
2256 if (parentInstance && c === "isover") {
2257 parentInstance.isover = false;
2258 parentInstance.isout = true;
2259 parentInstance._out.call(parentInstance, event);
2260 }
2261
2262 this[c] = true;
2263 this[c === "isout" ? "isover" : "isout"] = false;
2264 this[c === "isover" ? "_over" : "_out"].call(this, event);
2265
2266 // we just moved out of a greedy child
2267 if (parentInstance && c === "isout") {
2268 parentInstance.isout = false;
2269 parentInstance.isover = true;
2270 parentInstance._over.call(parentInstance, event);
2271 }
2272 });
2273
2274 },
2275 dragStop: function( draggable, event ) {
2276 draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
2277 //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
2278 if( !draggable.options.refreshPositions ) {
2279 $.ui.ddmanager.prepareOffsets( draggable, event );
2280 }
2281 }
2282};
2283
2284})(jQuery);
2285
2286(function( $, undefined ) {
2287
2288function num(v) {
2289 return parseInt(v, 10) || 0;
2290}
2291
2292function isNumber(value) {
2293 return !isNaN(parseInt(value, 10));
2294}
2295
2296$.widget("ui.resizable", $.ui.mouse, {
2297 version: "1.10.3",
2298 widgetEventPrefix: "resize",
2299 options: {
2300 alsoResize: false,
2301 animate: false,
2302 animateDuration: "slow",
2303 animateEasing: "swing",
2304 aspectRatio: false,
2305 autoHide: false,
2306 containment: false,
2307 ghost: false,
2308 grid: false,
2309 handles: "e,s,se",
2310 helper: false,
2311 maxHeight: null,
2312 maxWidth: null,
2313 minHeight: 10,
2314 minWidth: 10,
2315 // See #7960
2316 zIndex: 90,
2317
2318 // callbacks
2319 resize: null,
2320 start: null,
2321 stop: null
2322 },
2323 _create: function() {
2324
2325 var n, i, handle, axis, hname,
2326 that = this,
2327 o = this.options;
2328 this.element.addClass("ui-resizable");
2329
2330 $.extend(this, {
2331 _aspectRatio: !!(o.aspectRatio),
2332 aspectRatio: o.aspectRatio,
2333 originalElement: this.element,
2334 _proportionallyResizeElements: [],
2335 _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
2336 });
2337
2338 //Wrap the element if it cannot hold child nodes
2339 if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
2340
2341 //Create a wrapper element and set the wrapper to the new current internal element
2342 this.element.wrap(
2343 $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
2344 position: this.element.css("position"),
2345 width: this.element.outerWidth(),
2346 height: this.element.outerHeight(),
2347 top: this.element.css("top"),
2348 left: this.element.css("left")
2349 })
2350 );
2351
2352 //Overwrite the original this.element
2353 this.element = this.element.parent().data(
2354 "ui-resizable", this.element.data("ui-resizable")
2355 );
2356
2357 this.elementIsWrapper = true;
2358
2359 //Move margins to the wrapper
2360 this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
2361 this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
2362
2363 //Prevent Safari textarea resize
2364 this.originalResizeStyle = this.originalElement.css("resize");
2365 this.originalElement.css("resize", "none");
2366
2367 //Push the actual element to our proportionallyResize internal array
2368 this._proportionallyResizeElements.push(this.originalElement.css({ position: "static", zoom: 1, display: "block" }));
2369
2370 // avoid IE jump (hard set the margin)
2371 this.originalElement.css({ margin: this.originalElement.css("margin") });
2372
2373 // fix handlers offset
2374 this._proportionallyResize();
2375
2376 }
2377
2378 this.handles = o.handles || (!$(".ui-resizable-handle", this.element).length ? "e,s,se" : { n: ".ui-resizable-n", e: ".ui-resizable-e", s: ".ui-resizable-s", w: ".ui-resizable-w", se: ".ui-resizable-se", sw: ".ui-resizable-sw", ne: ".ui-resizable-ne", nw: ".ui-resizable-nw" });
2379 if(this.handles.constructor === String) {
2380
2381 if ( this.handles === "all") {
2382 this.handles = "n,e,s,w,se,sw,ne,nw";
2383 }
2384
2385 n = this.handles.split(",");
2386 this.handles = {};
2387
2388 for(i = 0; i < n.length; i++) {
2389
2390 handle = $.trim(n[i]);
2391 hname = "ui-resizable-"+handle;
2392 axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
2393
2394 // Apply zIndex to all handles - see #7960
2395 axis.css({ zIndex: o.zIndex });
2396
2397 //TODO : What's going on here?
2398 if ("se" === handle) {
2399 axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
2400 }
2401
2402 //Insert into internal handles object and append to element
2403 this.handles[handle] = ".ui-resizable-"+handle;
2404 this.element.append(axis);
2405 }
2406
2407 }
2408
2409 this._renderAxis = function(target) {
2410
2411 var i, axis, padPos, padWrapper;
2412
2413 target = target || this.element;
2414
2415 for(i in this.handles) {
2416
2417 if(this.handles[i].constructor === String) {
2418 this.handles[i] = $(this.handles[i], this.element).show();
2419 }
2420
2421 //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
2422 if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
2423
2424 axis = $(this.handles[i], this.element);
2425
2426 //Checking the correct pad and border
2427 padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
2428
2429 //The padding type i have to apply...
2430 padPos = [ "padding",
2431 /ne|nw|n/.test(i) ? "Top" :
2432 /se|sw|s/.test(i) ? "Bottom" :
2433 /^e$/.test(i) ? "Right" : "Left" ].join("");
2434
2435 target.css(padPos, padWrapper);
2436
2437 this._proportionallyResize();
2438
2439 }
2440
2441 //TODO: What's that good for? There's not anything to be executed left
2442 if(!$(this.handles[i]).length) {
2443 continue;
2444 }
2445 }
2446 };
2447
2448 //TODO: make renderAxis a prototype function
2449 this._renderAxis(this.element);
2450
2451 this._handles = $(".ui-resizable-handle", this.element)
2452 .disableSelection();
2453
2454 //Matching axis name
2455 this._handles.mouseover(function() {
2456 if (!that.resizing) {
2457 if (this.className) {
2458 axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
2459 }
2460 //Axis, default = se
2461 that.axis = axis && axis[1] ? axis[1] : "se";
2462 }
2463 });
2464
2465 //If we want to auto hide the elements
2466 if (o.autoHide) {
2467 this._handles.hide();
2468 $(this.element)
2469 .addClass("ui-resizable-autohide")
2470 .mouseenter(function() {
2471 if (o.disabled) {
2472 return;
2473 }
2474 $(this).removeClass("ui-resizable-autohide");
2475 that._handles.show();
2476 })
2477 .mouseleave(function(){
2478 if (o.disabled) {
2479 return;
2480 }
2481 if (!that.resizing) {
2482 $(this).addClass("ui-resizable-autohide");
2483 that._handles.hide();
2484 }
2485 });
2486 }
2487
2488 //Initialize the mouse interaction
2489 this._mouseInit();
2490
2491 },
2492
2493 _destroy: function() {
2494
2495 this._mouseDestroy();
2496
2497 var wrapper,
2498 _destroy = function(exp) {
2499 $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
2500 .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove();
2501 };
2502
2503 //TODO: Unwrap at same DOM position
2504 if (this.elementIsWrapper) {
2505 _destroy(this.element);
2506 wrapper = this.element;
2507 this.originalElement.css({
2508 position: wrapper.css("position"),
2509 width: wrapper.outerWidth(),
2510 height: wrapper.outerHeight(),
2511 top: wrapper.css("top"),
2512 left: wrapper.css("left")
2513 }).insertAfter( wrapper );
2514 wrapper.remove();
2515 }
2516
2517 this.originalElement.css("resize", this.originalResizeStyle);
2518 _destroy(this.originalElement);
2519
2520 return this;
2521 },
2522
2523 _mouseCapture: function(event) {
2524 var i, handle,
2525 capture = false;
2526
2527 for (i in this.handles) {
2528 handle = $(this.handles[i])[0];
2529 if (handle === event.target || $.contains(handle, event.target)) {
2530 capture = true;
2531 }
2532 }
2533
2534 return !this.options.disabled && capture;
2535 },
2536
2537 _mouseStart: function(event) {
2538
2539 var curleft, curtop, cursor,
2540 o = this.options,
2541 iniPos = this.element.position(),
2542 el = this.element;
2543
2544 this.resizing = true;
2545
2546 // bugfix for http://dev.jquery.com/ticket/1749
2547 if ( (/absolute/).test( el.css("position") ) ) {
2548 el.css({ position: "absolute", top: el.css("top"), left: el.css("left") });
2549 } else if (el.is(".ui-draggable")) {
2550 el.css({ position: "absolute", top: iniPos.top, left: iniPos.left });
2551 }
2552
2553 this._renderProxy();
2554
2555 curleft = num(this.helper.css("left"));
2556 curtop = num(this.helper.css("top"));
2557
2558 if (o.containment) {
2559 curleft += $(o.containment).scrollLeft() || 0;
2560 curtop += $(o.containment).scrollTop() || 0;
2561 }
2562
2563 //Store needed variables
2564 this.offset = this.helper.offset();
2565 this.position = { left: curleft, top: curtop };
2566 this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
2567 this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
2568 this.originalPosition = { left: curleft, top: curtop };
2569 this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
2570 this.originalMousePosition = { left: event.pageX, top: event.pageY };
2571
2572 //Aspect Ratio
2573 this.aspectRatio = (typeof o.aspectRatio === "number") ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
2574
2575 cursor = $(".ui-resizable-" + this.axis).css("cursor");
2576 $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
2577
2578 el.addClass("ui-resizable-resizing");
2579 this._propagate("start", event);
2580 return true;
2581 },
2582
2583 _mouseDrag: function(event) {
2584
2585 //Increase performance, avoid regex
2586 var data,
2587 el = this.helper, props = {},
2588 smp = this.originalMousePosition,
2589 a = this.axis,
2590 prevTop = this.position.top,
2591 prevLeft = this.position.left,
2592 prevWidth = this.size.width,
2593 prevHeight = this.size.height,
2594 dx = (event.pageX-smp.left)||0,
2595 dy = (event.pageY-smp.top)||0,
2596 trigger = this._change[a];
2597
2598 if (!trigger) {
2599 return false;
2600 }
2601
2602 // Calculate the attrs that will be change
2603 data = trigger.apply(this, [event, dx, dy]);
2604
2605 // Put this in the mouseDrag handler since the user can start pressing shift while resizing
2606 this._updateVirtualBoundaries(event.shiftKey);
2607 if (this._aspectRatio || event.shiftKey) {
2608 data = this._updateRatio(data, event);
2609 }
2610
2611 data = this._respectSize(data, event);
2612
2613 this._updateCache(data);
2614
2615 // plugins callbacks need to be called first
2616 this._propagate("resize", event);
2617
2618 if (this.position.top !== prevTop) {
2619 props.top = this.position.top + "px";
2620 }
2621 if (this.position.left !== prevLeft) {
2622 props.left = this.position.left + "px";
2623 }
2624 if (this.size.width !== prevWidth) {
2625 props.width = this.size.width + "px";
2626 }
2627 if (this.size.height !== prevHeight) {
2628 props.height = this.size.height + "px";
2629 }
2630 el.css(props);
2631
2632 if (!this._helper && this._proportionallyResizeElements.length) {
2633 this._proportionallyResize();
2634 }
2635
2636 // Call the user callback if the element was resized
2637 if ( ! $.isEmptyObject(props) ) {
2638 this._trigger("resize", event, this.ui());
2639 }
2640
2641 return false;
2642 },
2643
2644 _mouseStop: function(event) {
2645
2646 this.resizing = false;
2647 var pr, ista, soffseth, soffsetw, s, left, top,
2648 o = this.options, that = this;
2649
2650 if(this._helper) {
2651
2652 pr = this._proportionallyResizeElements;
2653 ista = pr.length && (/textarea/i).test(pr[0].nodeName);
2654 soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height;
2655 soffsetw = ista ? 0 : that.sizeDiff.width;
2656
2657 s = { width: (that.helper.width() - soffsetw), height: (that.helper.height() - soffseth) };
2658 left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null;
2659 top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
2660
2661 if (!o.animate) {
2662 this.element.css($.extend(s, { top: top, left: left }));
2663 }
2664
2665 that.helper.height(that.size.height);
2666 that.helper.width(that.size.width);
2667
2668 if (this._helper && !o.animate) {
2669 this._proportionallyResize();
2670 }
2671 }
2672
2673 $("body").css("cursor", "auto");
2674
2675 this.element.removeClass("ui-resizable-resizing");
2676
2677 this._propagate("stop", event);
2678
2679 if (this._helper) {
2680 this.helper.remove();
2681 }
2682
2683 return false;
2684
2685 },
2686
2687 _updateVirtualBoundaries: function(forceAspectRatio) {
2688 var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
2689 o = this.options;
2690
2691 b = {
2692 minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
2693 maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
2694 minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
2695 maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
2696 };
2697
2698 if(this._aspectRatio || forceAspectRatio) {
2699 // We want to create an enclosing box whose aspect ration is the requested one
2700 // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
2701 pMinWidth = b.minHeight * this.aspectRatio;
2702 pMinHeight = b.minWidth / this.aspectRatio;
2703 pMaxWidth = b.maxHeight * this.aspectRatio;
2704 pMaxHeight = b.maxWidth / this.aspectRatio;
2705
2706 if(pMinWidth > b.minWidth) {
2707 b.minWidth = pMinWidth;
2708 }
2709 if(pMinHeight > b.minHeight) {
2710 b.minHeight = pMinHeight;
2711 }
2712 if(pMaxWidth < b.maxWidth) {
2713 b.maxWidth = pMaxWidth;
2714 }
2715 if(pMaxHeight < b.maxHeight) {
2716 b.maxHeight = pMaxHeight;
2717 }
2718 }
2719 this._vBoundaries = b;
2720 },
2721
2722 _updateCache: function(data) {
2723 this.offset = this.helper.offset();
2724 if (isNumber(data.left)) {
2725 this.position.left = data.left;
2726 }
2727 if (isNumber(data.top)) {
2728 this.position.top = data.top;
2729 }
2730 if (isNumber(data.height)) {
2731 this.size.height = data.height;
2732 }
2733 if (isNumber(data.width)) {
2734 this.size.width = data.width;
2735 }
2736 },
2737
2738 _updateRatio: function( data ) {
2739
2740 var cpos = this.position,
2741 csize = this.size,
2742 a = this.axis;
2743
2744 if (isNumber(data.height)) {
2745 data.width = (data.height * this.aspectRatio);
2746 } else if (isNumber(data.width)) {
2747 data.height = (data.width / this.aspectRatio);
2748 }
2749
2750 if (a === "sw") {
2751 data.left = cpos.left + (csize.width - data.width);
2752 data.top = null;
2753 }
2754 if (a === "nw") {
2755 data.top = cpos.top + (csize.height - data.height);
2756 data.left = cpos.left + (csize.width - data.width);
2757 }
2758
2759 return data;
2760 },
2761
2762 _respectSize: function( data ) {
2763
2764 var o = this._vBoundaries,
2765 a = this.axis,
2766 ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
2767 isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
2768 dw = this.originalPosition.left + this.originalSize.width,
2769 dh = this.position.top + this.size.height,
2770 cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
2771 if (isminw) {
2772 data.width = o.minWidth;
2773 }
2774 if (isminh) {
2775 data.height = o.minHeight;
2776 }
2777 if (ismaxw) {
2778 data.width = o.maxWidth;
2779 }
2780 if (ismaxh) {
2781 data.height = o.maxHeight;
2782 }
2783
2784 if (isminw && cw) {
2785 data.left = dw - o.minWidth;
2786 }
2787 if (ismaxw && cw) {
2788 data.left = dw - o.maxWidth;
2789 }
2790 if (isminh && ch) {
2791 data.top = dh - o.minHeight;
2792 }
2793 if (ismaxh && ch) {
2794 data.top = dh - o.maxHeight;
2795 }
2796
2797 // fixing jump error on top/left - bug #2330
2798 if (!data.width && !data.height && !data.left && data.top) {
2799 data.top = null;
2800 } else if (!data.width && !data.height && !data.top && data.left) {
2801 data.left = null;
2802 }
2803
2804 return data;
2805 },
2806
2807 _proportionallyResize: function() {
2808
2809 if (!this._proportionallyResizeElements.length) {
2810 return;
2811 }
2812
2813 var i, j, borders, paddings, prel,
2814 element = this.helper || this.element;
2815
2816 for ( i=0; i < this._proportionallyResizeElements.length; i++) {
2817
2818 prel = this._proportionallyResizeElements[i];
2819
2820 if (!this.borderDif) {
2821 this.borderDif = [];
2822 borders = [prel.css("borderTopWidth"), prel.css("borderRightWidth"), prel.css("borderBottomWidth"), prel.css("borderLeftWidth")];
2823 paddings = [prel.css("paddingTop"), prel.css("paddingRight"), prel.css("paddingBottom"), prel.css("paddingLeft")];
2824
2825 for ( j = 0; j < borders.length; j++ ) {
2826 this.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 );
2827 }
2828 }
2829
2830 prel.css({
2831 height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
2832 width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
2833 });
2834
2835 }
2836
2837 },
2838
2839 _renderProxy: function() {
2840
2841 var el = this.element, o = this.options;
2842 this.elementOffset = el.offset();
2843
2844 if(this._helper) {
2845
2846 this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
2847
2848 this.helper.addClass(this._helper).css({
2849 width: this.element.outerWidth() - 1,
2850 height: this.element.outerHeight() - 1,
2851 position: "absolute",
2852 left: this.elementOffset.left +"px",
2853 top: this.elementOffset.top +"px",
2854 zIndex: ++o.zIndex //TODO: Don't modify option
2855 });
2856
2857 this.helper
2858 .appendTo("body")
2859 .disableSelection();
2860
2861 } else {
2862 this.helper = this.element;
2863 }
2864
2865 },
2866
2867 _change: {
2868 e: function(event, dx) {
2869 return { width: this.originalSize.width + dx };
2870 },
2871 w: function(event, dx) {
2872 var cs = this.originalSize, sp = this.originalPosition;
2873 return { left: sp.left + dx, width: cs.width - dx };
2874 },
2875 n: function(event, dx, dy) {
2876 var cs = this.originalSize, sp = this.originalPosition;
2877 return { top: sp.top + dy, height: cs.height - dy };
2878 },
2879 s: function(event, dx, dy) {
2880 return { height: this.originalSize.height + dy };
2881 },
2882 se: function(event, dx, dy) {
2883 return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
2884 },
2885 sw: function(event, dx, dy) {
2886 return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
2887 },
2888 ne: function(event, dx, dy) {
2889 return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
2890 },
2891 nw: function(event, dx, dy) {
2892 return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
2893 }
2894 },
2895
2896 _propagate: function(n, event) {
2897 $.ui.plugin.call(this, n, [event, this.ui()]);
2898 (n !== "resize" && this._trigger(n, event, this.ui()));
2899 },
2900
2901 plugins: {},
2902
2903 ui: function() {
2904 return {
2905 originalElement: this.originalElement,
2906 element: this.element,
2907 helper: this.helper,
2908 position: this.position,
2909 size: this.size,
2910 originalSize: this.originalSize,
2911 originalPosition: this.originalPosition
2912 };
2913 }
2914
2915});
2916
2917/*
2918 * Resizable Extensions
2919 */
2920
2921$.ui.plugin.add("resizable", "animate", {
2922
2923 stop: function( event ) {
2924 var that = $(this).data("ui-resizable"),
2925 o = that.options,
2926 pr = that._proportionallyResizeElements,
2927 ista = pr.length && (/textarea/i).test(pr[0].nodeName),
2928 soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height,
2929 soffsetw = ista ? 0 : that.sizeDiff.width,
2930 style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
2931 left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null,
2932 top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
2933
2934 that.element.animate(
2935 $.extend(style, top && left ? { top: top, left: left } : {}), {
2936 duration: o.animateDuration,
2937 easing: o.animateEasing,
2938 step: function() {
2939
2940 var data = {
2941 width: parseInt(that.element.css("width"), 10),
2942 height: parseInt(that.element.css("height"), 10),
2943 top: parseInt(that.element.css("top"), 10),
2944 left: parseInt(that.element.css("left"), 10)
2945 };
2946
2947 if (pr && pr.length) {
2948 $(pr[0]).css({ width: data.width, height: data.height });
2949 }
2950
2951 // propagating resize, and updating values for each animation step
2952 that._updateCache(data);
2953 that._propagate("resize", event);
2954
2955 }
2956 }
2957 );
2958 }
2959
2960});
2961
2962$.ui.plugin.add("resizable", "containment", {
2963
2964 start: function() {
2965 var element, p, co, ch, cw, width, height,
2966 that = $(this).data("ui-resizable"),
2967 o = that.options,
2968 el = that.element,
2969 oc = o.containment,
2970 ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
2971
2972 if (!ce) {
2973 return;
2974 }
2975
2976 that.containerElement = $(ce);
2977
2978 if (/document/.test(oc) || oc === document) {
2979 that.containerOffset = { left: 0, top: 0 };
2980 that.containerPosition = { left: 0, top: 0 };
2981
2982 that.parentData = {
2983 element: $(document), left: 0, top: 0,
2984 width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
2985 };
2986 }
2987
2988 // i'm a node, so compute top, left, right, bottom
2989 else {
2990 element = $(ce);
2991 p = [];
2992 $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
2993
2994 that.containerOffset = element.offset();
2995 that.containerPosition = element.position();
2996 that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
2997
2998 co = that.containerOffset;
2999 ch = that.containerSize.height;
3000 cw = that.containerSize.width;
3001 width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw );
3002 height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
3003
3004 that.parentData = {
3005 element: ce, left: co.left, top: co.top, width: width, height: height
3006 };
3007 }
3008 },
3009
3010 resize: function( event ) {
3011 var woset, hoset, isParent, isOffsetRelative,
3012 that = $(this).data("ui-resizable"),
3013 o = that.options,
3014 co = that.containerOffset, cp = that.position,
3015 pRatio = that._aspectRatio || event.shiftKey,
3016 cop = { top:0, left:0 }, ce = that.containerElement;
3017
3018 if (ce[0] !== document && (/static/).test(ce.css("position"))) {
3019 cop = co;
3020 }
3021
3022 if (cp.left < (that._helper ? co.left : 0)) {
3023 that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
3024 if (pRatio) {
3025 that.size.height = that.size.width / that.aspectRatio;
3026 }
3027 that.position.left = o.helper ? co.left : 0;
3028 }
3029
3030 if (cp.top < (that._helper ? co.top : 0)) {
3031 that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
3032 if (pRatio) {
3033 that.size.width = that.size.height * that.aspectRatio;
3034 }
3035 that.position.top = that._helper ? co.top : 0;
3036 }
3037
3038 that.offset.left = that.parentData.left+that.position.left;
3039 that.offset.top = that.parentData.top+that.position.top;
3040
3041 woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width );
3042 hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
3043
3044 isParent = that.containerElement.get(0) === that.element.parent().get(0);
3045 isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position"));
3046
3047 if(isParent && isOffsetRelative) {
3048 woset -= that.parentData.left;
3049 }
3050
3051 if (woset + that.size.width >= that.parentData.width) {
3052 that.size.width = that.parentData.width - woset;
3053 if (pRatio) {
3054 that.size.height = that.size.width / that.aspectRatio;
3055 }
3056 }
3057
3058 if (hoset + that.size.height >= that.parentData.height) {
3059 that.size.height = that.parentData.height - hoset;
3060 if (pRatio) {
3061 that.size.width = that.size.height * that.aspectRatio;
3062 }
3063 }
3064 },
3065
3066 stop: function(){
3067 var that = $(this).data("ui-resizable"),
3068 o = that.options,
3069 co = that.containerOffset,
3070 cop = that.containerPosition,
3071 ce = that.containerElement,
3072 helper = $(that.helper),
3073 ho = helper.offset(),
3074 w = helper.outerWidth() - that.sizeDiff.width,
3075 h = helper.outerHeight() - that.sizeDiff.height;
3076
3077 if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) {
3078 $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
3079 }
3080
3081 if (that._helper && !o.animate && (/static/).test(ce.css("position"))) {
3082 $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
3083 }
3084
3085 }
3086});
3087
3088$.ui.plugin.add("resizable", "alsoResize", {
3089
3090 start: function () {
3091 var that = $(this).data("ui-resizable"),
3092 o = that.options,
3093 _store = function (exp) {
3094 $(exp).each(function() {
3095 var el = $(this);
3096 el.data("ui-resizable-alsoresize", {
3097 width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
3098 left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
3099 });
3100 });
3101 };
3102
3103 if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) {
3104 if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
3105 else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
3106 }else{
3107 _store(o.alsoResize);
3108 }
3109 },
3110
3111 resize: function (event, ui) {
3112 var that = $(this).data("ui-resizable"),
3113 o = that.options,
3114 os = that.originalSize,
3115 op = that.originalPosition,
3116 delta = {
3117 height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
3118 top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
3119 },
3120
3121 _alsoResize = function (exp, c) {
3122 $(exp).each(function() {
3123 var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
3124 css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ["width", "height"] : ["width", "height", "top", "left"];
3125
3126 $.each(css, function (i, prop) {
3127 var sum = (start[prop]||0) + (delta[prop]||0);
3128 if (sum && sum >= 0) {
3129 style[prop] = sum || null;
3130 }
3131 });
3132
3133 el.css(style);
3134 });
3135 };
3136
3137 if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) {
3138 $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
3139 }else{
3140 _alsoResize(o.alsoResize);
3141 }
3142 },
3143
3144 stop: function () {
3145 $(this).removeData("resizable-alsoresize");
3146 }
3147});
3148
3149$.ui.plugin.add("resizable", "ghost", {
3150
3151 start: function() {
3152
3153 var that = $(this).data("ui-resizable"), o = that.options, cs = that.size;
3154
3155 that.ghost = that.originalElement.clone();
3156 that.ghost
3157 .css({ opacity: 0.25, display: "block", position: "relative", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
3158 .addClass("ui-resizable-ghost")
3159 .addClass(typeof o.ghost === "string" ? o.ghost : "");
3160
3161 that.ghost.appendTo(that.helper);
3162
3163 },
3164
3165 resize: function(){
3166 var that = $(this).data("ui-resizable");
3167 if (that.ghost) {
3168 that.ghost.css({ position: "relative", height: that.size.height, width: that.size.width });
3169 }
3170 },
3171
3172 stop: function() {
3173 var that = $(this).data("ui-resizable");
3174 if (that.ghost && that.helper) {
3175 that.helper.get(0).removeChild(that.ghost.get(0));
3176 }
3177 }
3178
3179});
3180
3181$.ui.plugin.add("resizable", "grid", {
3182
3183 resize: function() {
3184 var that = $(this).data("ui-resizable"),
3185 o = that.options,
3186 cs = that.size,
3187 os = that.originalSize,
3188 op = that.originalPosition,
3189 a = that.axis,
3190 grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid,
3191 gridX = (grid[0]||1),
3192 gridY = (grid[1]||1),
3193 ox = Math.round((cs.width - os.width) / gridX) * gridX,
3194 oy = Math.round((cs.height - os.height) / gridY) * gridY,
3195 newWidth = os.width + ox,
3196 newHeight = os.height + oy,
3197 isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
3198 isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
3199 isMinWidth = o.minWidth && (o.minWidth > newWidth),
3200 isMinHeight = o.minHeight && (o.minHeight > newHeight);
3201
3202 o.grid = grid;
3203
3204 if (isMinWidth) {
3205 newWidth = newWidth + gridX;
3206 }
3207 if (isMinHeight) {
3208 newHeight = newHeight + gridY;
3209 }
3210 if (isMaxWidth) {
3211 newWidth = newWidth - gridX;
3212 }
3213 if (isMaxHeight) {
3214 newHeight = newHeight - gridY;
3215 }
3216
3217 if (/^(se|s|e)$/.test(a)) {
3218 that.size.width = newWidth;
3219 that.size.height = newHeight;
3220 } else if (/^(ne)$/.test(a)) {
3221 that.size.width = newWidth;
3222 that.size.height = newHeight;
3223 that.position.top = op.top - oy;
3224 } else if (/^(sw)$/.test(a)) {
3225 that.size.width = newWidth;
3226 that.size.height = newHeight;
3227 that.position.left = op.left - ox;
3228 } else {
3229 that.size.width = newWidth;
3230 that.size.height = newHeight;
3231 that.position.top = op.top - oy;
3232 that.position.left = op.left - ox;
3233 }
3234 }
3235
3236});
3237
3238})(jQuery);
3239
3240(function( $, undefined ) {
3241
3242$.widget("ui.selectable", $.ui.mouse, {
3243 version: "1.10.3",
3244 options: {
3245 appendTo: "body",
3246 autoRefresh: true,
3247 distance: 0,
3248 filter: "*",
3249 tolerance: "touch",
3250
3251 // callbacks
3252 selected: null,
3253 selecting: null,
3254 start: null,
3255 stop: null,
3256 unselected: null,
3257 unselecting: null
3258 },
3259 _create: function() {
3260 var selectees,
3261 that = this;
3262
3263 this.element.addClass("ui-selectable");
3264
3265 this.dragged = false;
3266
3267 // cache selectee children based on filter
3268 this.refresh = function() {
3269 selectees = $(that.options.filter, that.element[0]);
3270 selectees.addClass("ui-selectee");
3271 selectees.each(function() {
3272 var $this = $(this),
3273 pos = $this.offset();
3274 $.data(this, "selectable-item", {
3275 element: this,
3276 $element: $this,
3277 left: pos.left,
3278 top: pos.top,
3279 right: pos.left + $this.outerWidth(),
3280 bottom: pos.top + $this.outerHeight(),
3281 startselected: false,
3282 selected: $this.hasClass("ui-selected"),
3283 selecting: $this.hasClass("ui-selecting"),
3284 unselecting: $this.hasClass("ui-unselecting")
3285 });
3286 });
3287 };
3288 this.refresh();
3289
3290 this.selectees = selectees.addClass("ui-selectee");
3291
3292 this._mouseInit();
3293
3294 this.helper = $("<div class='ui-selectable-helper'></div>");
3295 },
3296
3297 _destroy: function() {
3298 this.selectees
3299 .removeClass("ui-selectee")
3300 .removeData("selectable-item");
3301 this.element
3302 .removeClass("ui-selectable ui-selectable-disabled");
3303 this._mouseDestroy();
3304 },
3305
3306 _mouseStart: function(event) {
3307 var that = this,
3308 options = this.options;
3309
3310 this.opos = [event.pageX, event.pageY];
3311
3312 if (this.options.disabled) {
3313 return;
3314 }
3315
3316 this.selectees = $(options.filter, this.element[0]);
3317
3318 this._trigger("start", event);
3319
3320 $(options.appendTo).append(this.helper);
3321 // position helper (lasso)
3322 this.helper.css({
3323 "left": event.pageX,
3324 "top": event.pageY,
3325 "width": 0,
3326 "height": 0
3327 });
3328
3329 if (options.autoRefresh) {
3330 this.refresh();
3331 }
3332
3333 this.selectees.filter(".ui-selected").each(function() {
3334 var selectee = $.data(this, "selectable-item");
3335 selectee.startselected = true;
3336 if (!event.metaKey && !event.ctrlKey) {
3337 selectee.$element.removeClass("ui-selected");
3338 selectee.selected = false;
3339 selectee.$element.addClass("ui-unselecting");
3340 selectee.unselecting = true;
3341 // selectable UNSELECTING callback
3342 that._trigger("unselecting", event, {
3343 unselecting: selectee.element
3344 });
3345 }
3346 });
3347
3348 $(event.target).parents().addBack().each(function() {
3349 var doSelect,
3350 selectee = $.data(this, "selectable-item");
3351 if (selectee) {
3352 doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
3353 selectee.$element
3354 .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
3355 .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
3356 selectee.unselecting = !doSelect;
3357 selectee.selecting = doSelect;
3358 selectee.selected = doSelect;
3359 // selectable (UN)SELECTING callback
3360 if (doSelect) {
3361 that._trigger("selecting", event, {
3362 selecting: selectee.element
3363 });
3364 } else {
3365 that._trigger("unselecting", event, {
3366 unselecting: selectee.element
3367 });
3368 }
3369 return false;
3370 }
3371 });
3372
3373 },
3374
3375 _mouseDrag: function(event) {
3376
3377 this.dragged = true;
3378
3379 if (this.options.disabled) {
3380 return;
3381 }
3382
3383 var tmp,
3384 that = this,
3385 options = this.options,
3386 x1 = this.opos[0],
3387 y1 = this.opos[1],
3388 x2 = event.pageX,
3389 y2 = event.pageY;
3390
3391 if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
3392 if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
3393 this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
3394
3395 this.selectees.each(function() {
3396 var selectee = $.data(this, "selectable-item"),
3397 hit = false;
3398
3399 //prevent helper from being selected if appendTo: selectable
3400 if (!selectee || selectee.element === that.element[0]) {
3401 return;
3402 }
3403
3404 if (options.tolerance === "touch") {
3405 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
3406 } else if (options.tolerance === "fit") {
3407 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
3408 }
3409
3410 if (hit) {
3411 // SELECT
3412 if (selectee.selected) {
3413 selectee.$element.removeClass("ui-selected");
3414 selectee.selected = false;
3415 }
3416 if (selectee.unselecting) {
3417 selectee.$element.removeClass("ui-unselecting");
3418 selectee.unselecting = false;
3419 }
3420 if (!selectee.selecting) {
3421 selectee.$element.addClass("ui-selecting");
3422 selectee.selecting = true;
3423 // selectable SELECTING callback
3424 that._trigger("selecting", event, {
3425 selecting: selectee.element
3426 });
3427 }
3428 } else {
3429 // UNSELECT
3430 if (selectee.selecting) {
3431 if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
3432 selectee.$element.removeClass("ui-selecting");
3433 selectee.selecting = false;
3434 selectee.$element.addClass("ui-selected");
3435 selectee.selected = true;
3436 } else {
3437 selectee.$element.removeClass("ui-selecting");
3438 selectee.selecting = false;
3439 if (selectee.startselected) {
3440 selectee.$element.addClass("ui-unselecting");
3441 selectee.unselecting = true;
3442 }
3443 // selectable UNSELECTING callback
3444 that._trigger("unselecting", event, {
3445 unselecting: selectee.element
3446 });
3447 }
3448 }
3449 if (selectee.selected) {
3450 if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
3451 selectee.$element.removeClass("ui-selected");
3452 selectee.selected = false;
3453
3454 selectee.$element.addClass("ui-unselecting");
3455 selectee.unselecting = true;
3456 // selectable UNSELECTING callback
3457 that._trigger("unselecting", event, {
3458 unselecting: selectee.element
3459 });
3460 }
3461 }
3462 }
3463 });
3464
3465 return false;
3466 },
3467
3468 _mouseStop: function(event) {
3469 var that = this;
3470
3471 this.dragged = false;
3472
3473 $(".ui-unselecting", this.element[0]).each(function() {
3474 var selectee = $.data(this, "selectable-item");
3475 selectee.$element.removeClass("ui-unselecting");
3476 selectee.unselecting = false;
3477 selectee.startselected = false;
3478 that._trigger("unselected", event, {
3479 unselected: selectee.element
3480 });
3481 });
3482 $(".ui-selecting", this.element[0]).each(function() {
3483 var selectee = $.data(this, "selectable-item");
3484 selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
3485 selectee.selecting = false;
3486 selectee.selected = true;
3487 selectee.startselected = true;
3488 that._trigger("selected", event, {
3489 selected: selectee.element
3490 });
3491 });
3492 this._trigger("stop", event);
3493
3494 this.helper.remove();
3495
3496 return false;
3497 }
3498
3499});
3500
3501})(jQuery);
3502
3503(function( $, undefined ) {
3504
3505/*jshint loopfunc: true */
3506
3507function isOverAxis( x, reference, size ) {
3508 return ( x > reference ) && ( x < ( reference + size ) );
3509}
3510
3511function isFloating(item) {
3512 return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
3513}
3514
3515$.widget("ui.sortable", $.ui.mouse, {
3516 version: "1.10.3",
3517 widgetEventPrefix: "sort",
3518 ready: false,
3519 options: {
3520 appendTo: "parent",
3521 axis: false,
3522 connectWith: false,
3523 containment: false,
3524 cursor: "auto",
3525 cursorAt: false,
3526 dropOnEmpty: true,
3527 forcePlaceholderSize: false,
3528 forceHelperSize: false,
3529 grid: false,
3530 handle: false,
3531 helper: "original",
3532 items: "> *",
3533 opacity: false,
3534 placeholder: false,
3535 revert: false,
3536 scroll: true,
3537 scrollSensitivity: 20,
3538 scrollSpeed: 20,
3539 scope: "default",
3540 tolerance: "intersect",
3541 zIndex: 1000,
3542
3543 // callbacks
3544 activate: null,
3545 beforeStop: null,
3546 change: null,
3547 deactivate: null,
3548 out: null,
3549 over: null,
3550 receive: null,
3551 remove: null,
3552 sort: null,
3553 start: null,
3554 stop: null,
3555 update: null
3556 },
3557 _create: function() {
3558
3559 var o = this.options;
3560 this.containerCache = {};
3561 this.element.addClass("ui-sortable");
3562
3563 //Get the items
3564 this.refresh();
3565
3566 //Let's determine if the items are being displayed horizontally
3567 this.floating = this.items.length ? o.axis === "x" || isFloating(this.items[0].item) : false;
3568
3569 //Let's determine the parent's offset
3570 this.offset = this.element.offset();
3571
3572 //Initialize mouse events for interaction
3573 this._mouseInit();
3574
3575 //We're ready to go
3576 this.ready = true;
3577
3578 },
3579
3580 _destroy: function() {
3581 this.element
3582 .removeClass("ui-sortable ui-sortable-disabled");
3583 this._mouseDestroy();
3584
3585 for ( var i = this.items.length - 1; i >= 0; i-- ) {
3586 this.items[i].item.removeData(this.widgetName + "-item");
3587 }
3588
3589 return this;
3590 },
3591
3592 _setOption: function(key, value){
3593 if ( key === "disabled" ) {
3594 this.options[ key ] = value;
3595
3596 this.widget().toggleClass( "ui-sortable-disabled", !!value );
3597 } else {
3598 // Don't call widget base _setOption for disable as it adds ui-state-disabled class
3599 $.Widget.prototype._setOption.apply(this, arguments);
3600 }
3601 },
3602
3603 _mouseCapture: function(event, overrideHandle) {
3604 var currentItem = null,
3605 validHandle = false,
3606 that = this;
3607
3608 if (this.reverting) {
3609 return false;
3610 }
3611
3612 if(this.options.disabled || this.options.type === "static") {
3613 return false;
3614 }
3615
3616 //We have to refresh the items data once first
3617 this._refreshItems(event);
3618
3619 //Find out if the clicked node (or one of its parents) is a actual item in this.items
3620 $(event.target).parents().each(function() {
3621 if($.data(this, that.widgetName + "-item") === that) {
3622 currentItem = $(this);
3623 return false;
3624 }
3625 });
3626 if($.data(event.target, that.widgetName + "-item") === that) {
3627 currentItem = $(event.target);
3628 }
3629
3630 if(!currentItem) {
3631 return false;
3632 }
3633 if(this.options.handle && !overrideHandle) {
3634 $(this.options.handle, currentItem).find("*").addBack().each(function() {
3635 if(this === event.target) {
3636 validHandle = true;
3637 }
3638 });
3639 if(!validHandle) {
3640 return false;
3641 }
3642 }
3643
3644 this.currentItem = currentItem;
3645 this._removeCurrentsFromItems();
3646 return true;
3647
3648 },
3649
3650 _mouseStart: function(event, overrideHandle, noActivation) {
3651
3652 var i, body,
3653 o = this.options;
3654
3655 this.currentContainer = this;
3656
3657 //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
3658 this.refreshPositions();
3659
3660 //Create and append the visible helper
3661 this.helper = this._createHelper(event);
3662
3663 //Cache the helper size
3664 this._cacheHelperProportions();
3665
3666 /*
3667 * - Position generation -
3668 * This block generates everything position related - it's the core of draggables.
3669 */
3670
3671 //Cache the margins of the original element
3672 this._cacheMargins();
3673
3674 //Get the next scrolling parent
3675 this.scrollParent = this.helper.scrollParent();
3676
3677 //The element's absolute position on the page minus margins
3678 this.offset = this.currentItem.offset();
3679 this.offset = {
3680 top: this.offset.top - this.margins.top,
3681 left: this.offset.left - this.margins.left
3682 };
3683
3684 $.extend(this.offset, {
3685 click: { //Where the click happened, relative to the element
3686 left: event.pageX - this.offset.left,
3687 top: event.pageY - this.offset.top
3688 },
3689 parent: this._getParentOffset(),
3690 relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
3691 });
3692
3693 // Only after we got the offset, we can change the helper's position to absolute
3694 // TODO: Still need to figure out a way to make relative sorting possible
3695 this.helper.css("position", "absolute");
3696 this.cssPosition = this.helper.css("position");
3697
3698 //Generate the original position
3699 this.originalPosition = this._generatePosition(event);
3700 this.originalPageX = event.pageX;
3701 this.originalPageY = event.pageY;
3702
3703 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
3704 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
3705
3706 //Cache the former DOM position
3707 this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
3708
3709 //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
3710 if(this.helper[0] !== this.currentItem[0]) {
3711 this.currentItem.hide();
3712 }
3713
3714 //Create the placeholder
3715 this._createPlaceholder();
3716
3717 //Set a containment if given in the options
3718 if(o.containment) {
3719 this._setContainment();
3720 }
3721
3722 if( o.cursor && o.cursor !== "auto" ) { // cursor option
3723 body = this.document.find( "body" );
3724
3725 // support: IE
3726 this.storedCursor = body.css( "cursor" );
3727 body.css( "cursor", o.cursor );
3728
3729 this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
3730 }
3731
3732 if(o.opacity) { // opacity option
3733 if (this.helper.css("opacity")) {
3734 this._storedOpacity = this.helper.css("opacity");
3735 }
3736 this.helper.css("opacity", o.opacity);
3737 }
3738
3739 if(o.zIndex) { // zIndex option
3740 if (this.helper.css("zIndex")) {
3741 this._storedZIndex = this.helper.css("zIndex");
3742 }
3743 this.helper.css("zIndex", o.zIndex);
3744 }
3745
3746 //Prepare scrolling
3747 if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
3748 this.overflowOffset = this.scrollParent.offset();
3749 }
3750
3751 //Call callbacks
3752 this._trigger("start", event, this._uiHash());
3753
3754 //Recache the helper size
3755 if(!this._preserveHelperProportions) {
3756 this._cacheHelperProportions();
3757 }
3758
3759
3760 //Post "activate" events to possible containers
3761 if( !noActivation ) {
3762 for ( i = this.containers.length - 1; i >= 0; i-- ) {
3763 this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
3764 }
3765 }
3766
3767 //Prepare possible droppables
3768 if($.ui.ddmanager) {
3769 $.ui.ddmanager.current = this;
3770 }
3771
3772 if ($.ui.ddmanager && !o.dropBehaviour) {
3773 $.ui.ddmanager.prepareOffsets(this, event);
3774 }
3775
3776 this.dragging = true;
3777
3778 this.helper.addClass("ui-sortable-helper");
3779 this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
3780 return true;
3781
3782 },
3783
3784 _mouseDrag: function(event) {
3785 var i, item, itemElement, intersection,
3786 o = this.options,
3787 scrolled = false;
3788
3789 //Compute the helpers position
3790 this.position = this._generatePosition(event);
3791 this.positionAbs = this._convertPositionTo("absolute");
3792
3793 if (!this.lastPositionAbs) {
3794 this.lastPositionAbs = this.positionAbs;
3795 }
3796
3797 //Do scrolling
3798 if(this.options.scroll) {
3799 if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
3800
3801 if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
3802 this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
3803 } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
3804 this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
3805 }
3806
3807 if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
3808 this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
3809 } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
3810 this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
3811 }
3812
3813 } else {
3814
3815 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
3816 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
3817 } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
3818 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
3819 }
3820
3821 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
3822 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
3823 } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
3824 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
3825 }
3826
3827 }
3828
3829 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
3830 $.ui.ddmanager.prepareOffsets(this, event);
3831 }
3832 }
3833
3834 //Regenerate the absolute position used for position checks
3835 this.positionAbs = this._convertPositionTo("absolute");
3836
3837 //Set the helper position
3838 if(!this.options.axis || this.options.axis !== "y") {
3839 this.helper[0].style.left = this.position.left+"px";
3840 }
3841 if(!this.options.axis || this.options.axis !== "x") {
3842 this.helper[0].style.top = this.position.top+"px";
3843 }
3844
3845 //Rearrange
3846 for (i = this.items.length - 1; i >= 0; i--) {
3847
3848 //Cache variables and intersection, continue if no intersection
3849 item = this.items[i];
3850 itemElement = item.item[0];
3851 intersection = this._intersectsWithPointer(item);
3852 if (!intersection) {
3853 continue;
3854 }
3855
3856 // Only put the placeholder inside the current Container, skip all
3857 // items form other containers. This works because when moving
3858 // an item from one container to another the
3859 // currentContainer is switched before the placeholder is moved.
3860 //
3861 // Without this moving items in "sub-sortables" can cause the placeholder to jitter
3862 // beetween the outer and inner container.
3863 if (item.instance !== this.currentContainer) {
3864 continue;
3865 }
3866
3867 // cannot intersect with itself
3868 // no useless actions that have been done before
3869 // no action if the item moved is the parent of the item checked
3870 if (itemElement !== this.currentItem[0] &&
3871 this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
3872 !$.contains(this.placeholder[0], itemElement) &&
3873 (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
3874 ) {
3875
3876 this.direction = intersection === 1 ? "down" : "up";
3877
3878 if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
3879 this._rearrange(event, item);
3880 } else {
3881 break;
3882 }
3883
3884 this._trigger("change", event, this._uiHash());
3885 break;
3886 }
3887 }
3888
3889 //Post events to containers
3890 this._contactContainers(event);
3891
3892 //Interconnect with droppables
3893 if($.ui.ddmanager) {
3894 $.ui.ddmanager.drag(this, event);
3895 }
3896
3897 //Call callbacks
3898 this._trigger("sort", event, this._uiHash());
3899
3900 this.lastPositionAbs = this.positionAbs;
3901 return false;
3902
3903 },
3904
3905 _mouseStop: function(event, noPropagation) {
3906
3907 if(!event) {
3908 return;
3909 }
3910
3911 //If we are using droppables, inform the manager about the drop
3912 if ($.ui.ddmanager && !this.options.dropBehaviour) {
3913 $.ui.ddmanager.drop(this, event);
3914 }
3915
3916 if(this.options.revert) {
3917 var that = this,
3918 cur = this.placeholder.offset(),
3919 axis = this.options.axis,
3920 animation = {};
3921
3922 if ( !axis || axis === "x" ) {
3923 animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);
3924 }
3925 if ( !axis || axis === "y" ) {
3926 animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);
3927 }
3928 this.reverting = true;
3929 $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
3930 that._clear(event);
3931 });
3932 } else {
3933 this._clear(event, noPropagation);
3934 }
3935
3936 return false;
3937
3938 },
3939
3940 cancel: function() {
3941
3942 if(this.dragging) {
3943
3944 this._mouseUp({ target: null });
3945
3946 if(this.options.helper === "original") {
3947 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
3948 } else {
3949 this.currentItem.show();
3950 }
3951
3952 //Post deactivating events to containers
3953 for (var i = this.containers.length - 1; i >= 0; i--){
3954 this.containers[i]._trigger("deactivate", null, this._uiHash(this));
3955 if(this.containers[i].containerCache.over) {
3956 this.containers[i]._trigger("out", null, this._uiHash(this));
3957 this.containers[i].containerCache.over = 0;
3958 }
3959 }
3960
3961 }
3962
3963 if (this.placeholder) {
3964 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
3965 if(this.placeholder[0].parentNode) {
3966 this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
3967 }
3968 if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
3969 this.helper.remove();
3970 }
3971
3972 $.extend(this, {
3973 helper: null,
3974 dragging: false,
3975 reverting: false,
3976 _noFinalSort: null
3977 });
3978
3979 if(this.domPosition.prev) {
3980 $(this.domPosition.prev).after(this.currentItem);
3981 } else {
3982 $(this.domPosition.parent).prepend(this.currentItem);
3983 }
3984 }
3985
3986 return this;
3987
3988 },
3989
3990 serialize: function(o) {
3991
3992 var items = this._getItemsAsjQuery(o && o.connected),
3993 str = [];
3994 o = o || {};
3995
3996 $(items).each(function() {
3997 var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
3998 if (res) {
3999 str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
4000 }
4001 });
4002
4003 if(!str.length && o.key) {
4004 str.push(o.key + "=");
4005 }
4006
4007 return str.join("&");
4008
4009 },
4010
4011 toArray: function(o) {
4012
4013 var items = this._getItemsAsjQuery(o && o.connected),
4014 ret = [];
4015
4016 o = o || {};
4017
4018 items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
4019 return ret;
4020
4021 },
4022
4023 /* Be careful with the following core functions */
4024 _intersectsWith: function(item) {
4025
4026 var x1 = this.positionAbs.left,
4027 x2 = x1 + this.helperProportions.width,
4028 y1 = this.positionAbs.top,
4029 y2 = y1 + this.helperProportions.height,
4030 l = item.left,
4031 r = l + item.width,
4032 t = item.top,
4033 b = t + item.height,
4034 dyClick = this.offset.click.top,
4035 dxClick = this.offset.click.left,
4036 isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
4037 isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
4038 isOverElement = isOverElementHeight && isOverElementWidth;
4039
4040 if ( this.options.tolerance === "pointer" ||
4041 this.options.forcePointerForContainers ||
4042 (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
4043 ) {
4044 return isOverElement;
4045 } else {
4046
4047 return (l < x1 + (this.helperProportions.width / 2) && // Right Half
4048 x2 - (this.helperProportions.width / 2) < r && // Left Half
4049 t < y1 + (this.helperProportions.height / 2) && // Bottom Half
4050 y2 - (this.helperProportions.height / 2) < b ); // Top Half
4051
4052 }
4053 },
4054
4055 _intersectsWithPointer: function(item) {
4056
4057 var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
4058 isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
4059 isOverElement = isOverElementHeight && isOverElementWidth,
4060 verticalDirection = this._getDragVerticalDirection(),
4061 horizontalDirection = this._getDragHorizontalDirection();
4062
4063 if (!isOverElement) {
4064 return false;
4065 }
4066
4067 return this.floating ?
4068 ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
4069 : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
4070
4071 },
4072
4073 _intersectsWithSides: function(item) {
4074
4075 var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
4076 isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
4077 verticalDirection = this._getDragVerticalDirection(),
4078 horizontalDirection = this._getDragHorizontalDirection();
4079
4080 if (this.floating && horizontalDirection) {
4081 return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
4082 } else {
4083 return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
4084 }
4085
4086 },
4087
4088 _getDragVerticalDirection: function() {
4089 var delta = this.positionAbs.top - this.lastPositionAbs.top;
4090 return delta !== 0 && (delta > 0 ? "down" : "up");
4091 },
4092
4093 _getDragHorizontalDirection: function() {
4094 var delta = this.positionAbs.left - this.lastPositionAbs.left;
4095 return delta !== 0 && (delta > 0 ? "right" : "left");
4096 },
4097
4098 refresh: function(event) {
4099 this._refreshItems(event);
4100 this.refreshPositions();
4101 return this;
4102 },
4103
4104 _connectWith: function() {
4105 var options = this.options;
4106 return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
4107 },
4108
4109 _getItemsAsjQuery: function(connected) {
4110
4111 var i, j, cur, inst,
4112 items = [],
4113 queries = [],
4114 connectWith = this._connectWith();
4115
4116 if(connectWith && connected) {
4117 for (i = connectWith.length - 1; i >= 0; i--){
4118 cur = $(connectWith[i]);
4119 for ( j = cur.length - 1; j >= 0; j--){
4120 inst = $.data(cur[j], this.widgetFullName);
4121 if(inst && inst !== this && !inst.options.disabled) {
4122 queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
4123 }
4124 }
4125 }
4126 }
4127
4128 queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
4129
4130 for (i = queries.length - 1; i >= 0; i--){
4131 queries[i][0].each(function() {
4132 items.push(this);
4133 });
4134 }
4135
4136 return $(items);
4137
4138 },
4139
4140 _removeCurrentsFromItems: function() {
4141
4142 var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
4143
4144 this.items = $.grep(this.items, function (item) {
4145 for (var j=0; j < list.length; j++) {
4146 if(list[j] === item.item[0]) {
4147 return false;
4148 }
4149 }
4150 return true;
4151 });
4152
4153 },
4154
4155 _refreshItems: function(event) {
4156
4157 this.items = [];
4158 this.containers = [this];
4159
4160 var i, j, cur, inst, targetData, _queries, item, queriesLength,
4161 items = this.items,
4162 queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
4163 connectWith = this._connectWith();
4164
4165 if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
4166 for (i = connectWith.length - 1; i >= 0; i--){
4167 cur = $(connectWith[i]);
4168 for (j = cur.length - 1; j >= 0; j--){
4169 inst = $.data(cur[j], this.widgetFullName);
4170 if(inst && inst !== this && !inst.options.disabled) {
4171 queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
4172 this.containers.push(inst);
4173 }
4174 }
4175 }
4176 }
4177
4178 for (i = queries.length - 1; i >= 0; i--) {
4179 targetData = queries[i][1];
4180 _queries = queries[i][0];
4181
4182 for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
4183 item = $(_queries[j]);
4184
4185 item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
4186
4187 items.push({
4188 item: item,
4189 instance: targetData,
4190 width: 0, height: 0,
4191 left: 0, top: 0
4192 });
4193 }
4194 }
4195
4196 },
4197
4198 refreshPositions: function(fast) {
4199
4200 //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
4201 if(this.offsetParent && this.helper) {
4202 this.offset.parent = this._getParentOffset();
4203 }
4204
4205 var i, item, t, p;
4206
4207 for (i = this.items.length - 1; i >= 0; i--){
4208 item = this.items[i];
4209
4210 //We ignore calculating positions of all connected containers when we're not over them
4211 if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
4212 continue;
4213 }
4214
4215 t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
4216
4217 if (!fast) {
4218 item.width = t.outerWidth();
4219 item.height = t.outerHeight();
4220 }
4221
4222 p = t.offset();
4223 item.left = p.left;
4224 item.top = p.top;
4225 }
4226
4227 if(this.options.custom && this.options.custom.refreshContainers) {
4228 this.options.custom.refreshContainers.call(this);
4229 } else {
4230 for (i = this.containers.length - 1; i >= 0; i--){
4231 p = this.containers[i].element.offset();
4232 this.containers[i].containerCache.left = p.left;
4233 this.containers[i].containerCache.top = p.top;
4234 this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
4235 this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
4236 }
4237 }
4238
4239 return this;
4240 },
4241
4242 _createPlaceholder: function(that) {
4243 that = that || this;
4244 var className,
4245 o = that.options;
4246
4247 if(!o.placeholder || o.placeholder.constructor === String) {
4248 className = o.placeholder;
4249 o.placeholder = {
4250 element: function() {
4251
4252 var nodeName = that.currentItem[0].nodeName.toLowerCase(),
4253 element = $( "<" + nodeName + ">", that.document[0] )
4254 .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
4255 .removeClass("ui-sortable-helper");
4256
4257 if ( nodeName === "tr" ) {
4258 that.currentItem.children().each(function() {
4259 $( "<td>&#160;</td>", that.document[0] )
4260 .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
4261 .appendTo( element );
4262 });
4263 } else if ( nodeName === "img" ) {
4264 element.attr( "src", that.currentItem.attr( "src" ) );
4265 }
4266
4267 if ( !className ) {
4268 element.css( "visibility", "hidden" );
4269 }
4270
4271 return element;
4272 },
4273 update: function(container, p) {
4274
4275 // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
4276 // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
4277 if(className && !o.forcePlaceholderSize) {
4278 return;
4279 }
4280
4281 //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
4282 if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
4283 if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
4284 }
4285 };
4286 }
4287
4288 //Create the placeholder
4289 that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
4290
4291 //Append it after the actual current item
4292 that.currentItem.after(that.placeholder);
4293
4294 //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
4295 o.placeholder.update(that, that.placeholder);
4296
4297 },
4298
4299 _contactContainers: function(event) {
4300 var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,
4301 innermostContainer = null,
4302 innermostIndex = null;
4303
4304 // get innermost container that intersects with item
4305 for (i = this.containers.length - 1; i >= 0; i--) {
4306
4307 // never consider a container that's located within the item itself
4308 if($.contains(this.currentItem[0], this.containers[i].element[0])) {
4309 continue;
4310 }
4311
4312 if(this._intersectsWith(this.containers[i].containerCache)) {
4313
4314 // if we've already found a container and it's more "inner" than this, then continue
4315 if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
4316 continue;
4317 }
4318
4319 innermostContainer = this.containers[i];
4320 innermostIndex = i;
4321
4322 } else {
4323 // container doesn't intersect. trigger "out" event if necessary
4324 if(this.containers[i].containerCache.over) {
4325 this.containers[i]._trigger("out", event, this._uiHash(this));
4326 this.containers[i].containerCache.over = 0;
4327 }
4328 }
4329
4330 }
4331
4332 // if no intersecting containers found, return
4333 if(!innermostContainer) {
4334 return;
4335 }
4336
4337 // move the item into the container if it's not there already
4338 if(this.containers.length === 1) {
4339 if (!this.containers[innermostIndex].containerCache.over) {
4340 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
4341 this.containers[innermostIndex].containerCache.over = 1;
4342 }
4343 } else {
4344
4345 //When entering a new container, we will find the item with the least distance and append our item near it
4346 dist = 10000;
4347 itemWithLeastDistance = null;
4348 floating = innermostContainer.floating || isFloating(this.currentItem);
4349 posProperty = floating ? "left" : "top";
4350 sizeProperty = floating ? "width" : "height";
4351 base = this.positionAbs[posProperty] + this.offset.click[posProperty];
4352 for (j = this.items.length - 1; j >= 0; j--) {
4353 if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
4354 continue;
4355 }
4356 if(this.items[j].item[0] === this.currentItem[0]) {
4357 continue;
4358 }
4359 if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {
4360 continue;
4361 }
4362 cur = this.items[j].item.offset()[posProperty];
4363 nearBottom = false;
4364 if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
4365 nearBottom = true;
4366 cur += this.items[j][sizeProperty];
4367 }
4368
4369 if(Math.abs(cur - base) < dist) {
4370 dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
4371 this.direction = nearBottom ? "up": "down";
4372 }
4373 }
4374
4375 //Check if dropOnEmpty is enabled
4376 if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
4377 return;
4378 }
4379
4380 if(this.currentContainer === this.containers[innermostIndex]) {
4381 return;
4382 }
4383
4384 itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
4385 this._trigger("change", event, this._uiHash());
4386 this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
4387 this.currentContainer = this.containers[innermostIndex];
4388
4389 //Update the placeholder
4390 this.options.placeholder.update(this.currentContainer, this.placeholder);
4391
4392 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
4393 this.containers[innermostIndex].containerCache.over = 1;
4394 }
4395
4396
4397 },
4398
4399 _createHelper: function(event) {
4400
4401 var o = this.options,
4402 helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
4403
4404 //Add the helper to the DOM if that didn't happen already
4405 if(!helper.parents("body").length) {
4406 $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
4407 }
4408
4409 if(helper[0] === this.currentItem[0]) {
4410 this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
4411 }
4412
4413 if(!helper[0].style.width || o.forceHelperSize) {
4414 helper.width(this.currentItem.width());
4415 }
4416 if(!helper[0].style.height || o.forceHelperSize) {
4417 helper.height(this.currentItem.height());
4418 }
4419
4420 return helper;
4421
4422 },
4423
4424 _adjustOffsetFromHelper: function(obj) {
4425 if (typeof obj === "string") {
4426 obj = obj.split(" ");
4427 }
4428 if ($.isArray(obj)) {
4429 obj = {left: +obj[0], top: +obj[1] || 0};
4430 }
4431 if ("left" in obj) {
4432 this.offset.click.left = obj.left + this.margins.left;
4433 }
4434 if ("right" in obj) {
4435 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
4436 }
4437 if ("top" in obj) {
4438 this.offset.click.top = obj.top + this.margins.top;
4439 }
4440 if ("bottom" in obj) {
4441 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
4442 }
4443 },
4444
4445 _getParentOffset: function() {
4446
4447
4448 //Get the offsetParent and cache its position
4449 this.offsetParent = this.helper.offsetParent();
4450 var po = this.offsetParent.offset();
4451
4452 // This is a special case where we need to modify a offset calculated on start, since the following happened:
4453 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
4454 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
4455 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
4456 if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
4457 po.left += this.scrollParent.scrollLeft();
4458 po.top += this.scrollParent.scrollTop();
4459 }
4460
4461 // This needs to be actually done for all browsers, since pageX/pageY includes this information
4462 // with an ugly IE fix
4463 if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
4464 po = { top: 0, left: 0 };
4465 }
4466
4467 return {
4468 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
4469 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
4470 };
4471
4472 },
4473
4474 _getRelativeOffset: function() {
4475
4476 if(this.cssPosition === "relative") {
4477 var p = this.currentItem.position();
4478 return {
4479 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
4480 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
4481 };
4482 } else {
4483 return { top: 0, left: 0 };
4484 }
4485
4486 },
4487
4488 _cacheMargins: function() {
4489 this.margins = {
4490 left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
4491 top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
4492 };
4493 },
4494
4495 _cacheHelperProportions: function() {
4496 this.helperProportions = {
4497 width: this.helper.outerWidth(),
4498 height: this.helper.outerHeight()
4499 };
4500 },
4501
4502 _setContainment: function() {
4503
4504 var ce, co, over,
4505 o = this.options;
4506 if(o.containment === "parent") {
4507 o.containment = this.helper[0].parentNode;
4508 }
4509 if(o.containment === "document" || o.containment === "window") {
4510 this.containment = [
4511 0 - this.offset.relative.left - this.offset.parent.left,
4512 0 - this.offset.relative.top - this.offset.parent.top,
4513 $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,
4514 ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
4515 ];
4516 }
4517
4518 if(!(/^(document|window|parent)$/).test(o.containment)) {
4519 ce = $(o.containment)[0];
4520 co = $(o.containment).offset();
4521 over = ($(ce).css("overflow") !== "hidden");
4522
4523 this.containment = [
4524 co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
4525 co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
4526 co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
4527 co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
4528 ];
4529 }
4530
4531 },
4532
4533 _convertPositionTo: function(d, pos) {
4534
4535 if(!pos) {
4536 pos = this.position;
4537 }
4538 var mod = d === "absolute" ? 1 : -1,
4539 scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
4540 scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
4541
4542 return {
4543 top: (
4544 pos.top + // The absolute mouse position
4545 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
4546 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
4547 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
4548 ),
4549 left: (
4550 pos.left + // The absolute mouse position
4551 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
4552 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
4553 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
4554 )
4555 };
4556
4557 },
4558
4559 _generatePosition: function(event) {
4560
4561 var top, left,
4562 o = this.options,
4563 pageX = event.pageX,
4564 pageY = event.pageY,
4565 scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
4566
4567 // This is another very weird special case that only happens for relative elements:
4568 // 1. If the css position is relative
4569 // 2. and the scroll parent is the document or similar to the offset parent
4570 // we have to refresh the relative offset during the scroll so there are no jumps
4571 if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {
4572 this.offset.relative = this._getRelativeOffset();
4573 }
4574
4575 /*
4576 * - Position constraining -
4577 * Constrain the position to a mix of grid, containment.
4578 */
4579
4580 if(this.originalPosition) { //If we are not dragging yet, we won't check for options
4581
4582 if(this.containment) {
4583 if(event.pageX - this.offset.click.left < this.containment[0]) {
4584 pageX = this.containment[0] + this.offset.click.left;
4585 }
4586 if(event.pageY - this.offset.click.top < this.containment[1]) {
4587 pageY = this.containment[1] + this.offset.click.top;
4588 }
4589 if(event.pageX - this.offset.click.left > this.containment[2]) {
4590 pageX = this.containment[2] + this.offset.click.left;
4591 }
4592 if(event.pageY - this.offset.click.top > this.containment[3]) {
4593 pageY = this.containment[3] + this.offset.click.top;
4594 }
4595 }
4596
4597 if(o.grid) {
4598 top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
4599 pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
4600
4601 left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
4602 pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
4603 }
4604
4605 }
4606
4607 return {
4608 top: (
4609 pageY - // The absolute mouse position
4610 this.offset.click.top - // Click offset (relative to the element)
4611 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
4612 this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
4613 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
4614 ),
4615 left: (
4616 pageX - // The absolute mouse position
4617 this.offset.click.left - // Click offset (relative to the element)
4618 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
4619 this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
4620 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
4621 )
4622 };
4623
4624 },
4625
4626 _rearrange: function(event, i, a, hardRefresh) {
4627
4628 a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
4629
4630 //Various things done here to improve the performance:
4631 // 1. we create a setTimeout, that calls refreshPositions
4632 // 2. on the instance, we have a counter variable, that get's higher after every append
4633 // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
4634 // 4. this lets only the last addition to the timeout stack through
4635 this.counter = this.counter ? ++this.counter : 1;
4636 var counter = this.counter;
4637
4638 this._delay(function() {
4639 if(counter === this.counter) {
4640 this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
4641 }
4642 });
4643
4644 },
4645
4646 _clear: function(event, noPropagation) {
4647
4648 this.reverting = false;
4649 // We delay all events that have to be triggered to after the point where the placeholder has been removed and
4650 // everything else normalized again
4651 var i,
4652 delayedTriggers = [];
4653
4654 // We first have to update the dom position of the actual currentItem
4655 // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
4656 if(!this._noFinalSort && this.currentItem.parent().length) {
4657 this.placeholder.before(this.currentItem);
4658 }
4659 this._noFinalSort = null;
4660
4661 if(this.helper[0] === this.currentItem[0]) {
4662 for(i in this._storedCSS) {
4663 if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
4664 this._storedCSS[i] = "";
4665 }
4666 }
4667 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
4668 } else {
4669 this.currentItem.show();
4670 }
4671
4672 if(this.fromOutside && !noPropagation) {
4673 delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
4674 }
4675 if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
4676 delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
4677 }
4678
4679 // Check if the items Container has Changed and trigger appropriate
4680 // events.
4681 if (this !== this.currentContainer) {
4682 if(!noPropagation) {
4683 delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
4684 delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
4685 delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
4686 }
4687 }
4688
4689
4690 //Post events to containers
4691 for (i = this.containers.length - 1; i >= 0; i--){
4692 if(!noPropagation) {
4693 delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
4694 }
4695 if(this.containers[i].containerCache.over) {
4696 delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
4697 this.containers[i].containerCache.over = 0;
4698 }
4699 }
4700
4701 //Do what was originally in plugins
4702 if ( this.storedCursor ) {
4703 this.document.find( "body" ).css( "cursor", this.storedCursor );
4704 this.storedStylesheet.remove();
4705 }
4706 if(this._storedOpacity) {
4707 this.helper.css("opacity", this._storedOpacity);
4708 }
4709 if(this._storedZIndex) {
4710 this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
4711 }
4712
4713 this.dragging = false;
4714 if(this.cancelHelperRemoval) {
4715 if(!noPropagation) {
4716 this._trigger("beforeStop", event, this._uiHash());
4717 for (i=0; i < delayedTriggers.length; i++) {
4718 delayedTriggers[i].call(this, event);
4719 } //Trigger all delayed events
4720 this._trigger("stop", event, this._uiHash());
4721 }
4722
4723 this.fromOutside = false;
4724 return false;
4725 }
4726
4727 if(!noPropagation) {
4728 this._trigger("beforeStop", event, this._uiHash());
4729 }
4730
4731 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
4732 this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
4733
4734 if(this.helper[0] !== this.currentItem[0]) {
4735 this.helper.remove();
4736 }
4737 this.helper = null;
4738
4739 if(!noPropagation) {
4740 for (i=0; i < delayedTriggers.length; i++) {
4741 delayedTriggers[i].call(this, event);
4742 } //Trigger all delayed events
4743 this._trigger("stop", event, this._uiHash());
4744 }
4745
4746 this.fromOutside = false;
4747 return true;
4748
4749 },
4750
4751 _trigger: function() {
4752 if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
4753 this.cancel();
4754 }
4755 },
4756
4757 _uiHash: function(_inst) {
4758 var inst = _inst || this;
4759 return {
4760 helper: inst.helper,
4761 placeholder: inst.placeholder || $([]),
4762 position: inst.position,
4763 originalPosition: inst.originalPosition,
4764 offset: inst.positionAbs,
4765 item: inst.currentItem,
4766 sender: _inst ? _inst.element : null
4767 };
4768 }
4769
4770});
4771
4772})(jQuery);
4773
4774(function($, undefined) {
4775
4776var dataSpace = "ui-effects-";
4777
4778$.effects = {
4779 effect: {}
4780};
4781
4782/*!
4783 * jQuery Color Animations v2.1.2
4784 * https://github.com/jquery/jquery-color
4785 *
4786 * Copyright 2013 jQuery Foundation and other contributors
4787 * Released under the MIT license.
4788 * http://jquery.org/license
4789 *
4790 * Date: Wed Jan 16 08:47:09 2013 -0600
4791 */
4792(function( jQuery, undefined ) {
4793
4794 var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
4795
4796 // plusequals test for += 100 -= 100
4797 rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
4798 // a set of RE's that can match strings and generate color tuples.
4799 stringParsers = [{
4800 re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
4801 parse: function( execResult ) {
4802 return [
4803 execResult[ 1 ],
4804 execResult[ 2 ],
4805 execResult[ 3 ],
4806 execResult[ 4 ]
4807 ];
4808 }
4809 }, {
4810 re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
4811 parse: function( execResult ) {
4812 return [
4813 execResult[ 1 ] * 2.55,
4814 execResult[ 2 ] * 2.55,
4815 execResult[ 3 ] * 2.55,
4816 execResult[ 4 ]
4817 ];
4818 }
4819 }, {
4820 // this regex ignores A-F because it's compared against an already lowercased string
4821 re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
4822 parse: function( execResult ) {
4823 return [
4824 parseInt( execResult[ 1 ], 16 ),
4825 parseInt( execResult[ 2 ], 16 ),
4826 parseInt( execResult[ 3 ], 16 )
4827 ];
4828 }
4829 }, {
4830 // this regex ignores A-F because it's compared against an already lowercased string
4831 re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
4832 parse: function( execResult ) {
4833 return [
4834 parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
4835 parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
4836 parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
4837 ];
4838 }
4839 }, {
4840 re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
4841 space: "hsla",
4842 parse: function( execResult ) {
4843 return [
4844 execResult[ 1 ],
4845 execResult[ 2 ] / 100,
4846 execResult[ 3 ] / 100,
4847 execResult[ 4 ]
4848 ];
4849 }
4850 }],
4851
4852 // jQuery.Color( )
4853 color = jQuery.Color = function( color, green, blue, alpha ) {
4854 return new jQuery.Color.fn.parse( color, green, blue, alpha );
4855 },
4856 spaces = {
4857 rgba: {
4858 props: {
4859 red: {
4860 idx: 0,
4861 type: "byte"
4862 },
4863 green: {
4864 idx: 1,
4865 type: "byte"
4866 },
4867 blue: {
4868 idx: 2,
4869 type: "byte"
4870 }
4871 }
4872 },
4873
4874 hsla: {
4875 props: {
4876 hue: {
4877 idx: 0,
4878 type: "degrees"
4879 },
4880 saturation: {
4881 idx: 1,
4882 type: "percent"
4883 },
4884 lightness: {
4885 idx: 2,
4886 type: "percent"
4887 }
4888 }
4889 }
4890 },
4891 propTypes = {
4892 "byte": {
4893 floor: true,
4894 max: 255
4895 },
4896 "percent": {
4897 max: 1
4898 },
4899 "degrees": {
4900 mod: 360,
4901 floor: true
4902 }
4903 },
4904 support = color.support = {},
4905
4906 // element for support tests
4907 supportElem = jQuery( "<p>" )[ 0 ],
4908
4909 // colors = jQuery.Color.names
4910 colors,
4911
4912 // local aliases of functions called often
4913 each = jQuery.each;
4914
4915// determine rgba support immediately
4916supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
4917support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
4918
4919// define cache name and alpha properties
4920// for rgba and hsla spaces
4921each( spaces, function( spaceName, space ) {
4922 space.cache = "_" + spaceName;
4923 space.props.alpha = {
4924 idx: 3,
4925 type: "percent",
4926 def: 1
4927 };
4928});
4929
4930function clamp( value, prop, allowEmpty ) {
4931 var type = propTypes[ prop.type ] || {};
4932
4933 if ( value == null ) {
4934 return (allowEmpty || !prop.def) ? null : prop.def;
4935 }
4936
4937 // ~~ is an short way of doing floor for positive numbers
4938 value = type.floor ? ~~value : parseFloat( value );
4939
4940 // IE will pass in empty strings as value for alpha,
4941 // which will hit this case
4942 if ( isNaN( value ) ) {
4943 return prop.def;
4944 }
4945
4946 if ( type.mod ) {
4947 // we add mod before modding to make sure that negatives values
4948 // get converted properly: -10 -> 350
4949 return (value + type.mod) % type.mod;
4950 }
4951
4952 // for now all property types without mod have min and max
4953 return 0 > value ? 0 : type.max < value ? type.max : value;
4954}
4955
4956function stringParse( string ) {
4957 var inst = color(),
4958 rgba = inst._rgba = [];
4959
4960 string = string.toLowerCase();
4961
4962 each( stringParsers, function( i, parser ) {
4963 var parsed,
4964 match = parser.re.exec( string ),
4965 values = match && parser.parse( match ),
4966 spaceName = parser.space || "rgba";
4967
4968 if ( values ) {
4969 parsed = inst[ spaceName ]( values );
4970
4971 // if this was an rgba parse the assignment might happen twice
4972 // oh well....
4973 inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
4974 rgba = inst._rgba = parsed._rgba;
4975
4976 // exit each( stringParsers ) here because we matched
4977 return false;
4978 }
4979 });
4980
4981 // Found a stringParser that handled it
4982 if ( rgba.length ) {
4983
4984 // if this came from a parsed string, force "transparent" when alpha is 0
4985 // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
4986 if ( rgba.join() === "0,0,0,0" ) {
4987 jQuery.extend( rgba, colors.transparent );
4988 }
4989 return inst;
4990 }
4991
4992 // named colors
4993 return colors[ string ];
4994}
4995
4996color.fn = jQuery.extend( color.prototype, {
4997 parse: function( red, green, blue, alpha ) {
4998 if ( red === undefined ) {
4999 this._rgba = [ null, null, null, null ];
5000 return this;
5001 }
5002 if ( red.jquery || red.nodeType ) {
5003 red = jQuery( red ).css( green );
5004 green = undefined;
5005 }
5006
5007 var inst = this,
5008 type = jQuery.type( red ),
5009 rgba = this._rgba = [];
5010
5011 // more than 1 argument specified - assume ( red, green, blue, alpha )
5012 if ( green !== undefined ) {
5013 red = [ red, green, blue, alpha ];
5014 type = "array";
5015 }
5016
5017 if ( type === "string" ) {
5018 return this.parse( stringParse( red ) || colors._default );
5019 }
5020
5021 if ( type === "array" ) {
5022 each( spaces.rgba.props, function( key, prop ) {
5023 rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
5024 });
5025 return this;
5026 }
5027
5028 if ( type === "object" ) {
5029 if ( red instanceof color ) {
5030 each( spaces, function( spaceName, space ) {
5031 if ( red[ space.cache ] ) {
5032 inst[ space.cache ] = red[ space.cache ].slice();
5033 }
5034 });
5035 } else {
5036 each( spaces, function( spaceName, space ) {
5037 var cache = space.cache;
5038 each( space.props, function( key, prop ) {
5039
5040 // if the cache doesn't exist, and we know how to convert
5041 if ( !inst[ cache ] && space.to ) {
5042
5043 // if the value was null, we don't need to copy it
5044 // if the key was alpha, we don't need to copy it either
5045 if ( key === "alpha" || red[ key ] == null ) {
5046 return;
5047 }
5048 inst[ cache ] = space.to( inst._rgba );
5049 }
5050
5051 // this is the only case where we allow nulls for ALL properties.
5052 // call clamp with alwaysAllowEmpty
5053 inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
5054 });
5055
5056 // everything defined but alpha?
5057 if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
5058 // use the default of 1
5059 inst[ cache ][ 3 ] = 1;
5060 if ( space.from ) {
5061 inst._rgba = space.from( inst[ cache ] );
5062 }
5063 }
5064 });
5065 }
5066 return this;
5067 }
5068 },
5069 is: function( compare ) {
5070 var is = color( compare ),
5071 same = true,
5072 inst = this;
5073
5074 each( spaces, function( _, space ) {
5075 var localCache,
5076 isCache = is[ space.cache ];
5077 if (isCache) {
5078 localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
5079 each( space.props, function( _, prop ) {
5080 if ( isCache[ prop.idx ] != null ) {
5081 same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
5082 return same;
5083 }
5084 });
5085 }
5086 return same;
5087 });
5088 return same;
5089 },
5090 _space: function() {
5091 var used = [],
5092 inst = this;
5093 each( spaces, function( spaceName, space ) {
5094 if ( inst[ space.cache ] ) {
5095 used.push( spaceName );
5096 }
5097 });
5098 return used.pop();
5099 },
5100 transition: function( other, distance ) {
5101 var end = color( other ),
5102 spaceName = end._space(),
5103 space = spaces[ spaceName ],
5104 startColor = this.alpha() === 0 ? color( "transparent" ) : this,
5105 start = startColor[ space.cache ] || space.to( startColor._rgba ),
5106 result = start.slice();
5107
5108 end = end[ space.cache ];
5109 each( space.props, function( key, prop ) {
5110 var index = prop.idx,
5111 startValue = start[ index ],
5112 endValue = end[ index ],
5113 type = propTypes[ prop.type ] || {};
5114
5115 // if null, don't override start value
5116 if ( endValue === null ) {
5117 return;
5118 }
5119 // if null - use end
5120 if ( startValue === null ) {
5121 result[ index ] = endValue;
5122 } else {
5123 if ( type.mod ) {
5124 if ( endValue - startValue > type.mod / 2 ) {
5125 startValue += type.mod;
5126 } else if ( startValue - endValue > type.mod / 2 ) {
5127 startValue -= type.mod;
5128 }
5129 }
5130 result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
5131 }
5132 });
5133 return this[ spaceName ]( result );
5134 },
5135 blend: function( opaque ) {
5136 // if we are already opaque - return ourself
5137 if ( this._rgba[ 3 ] === 1 ) {
5138 return this;
5139 }
5140
5141 var rgb = this._rgba.slice(),
5142 a = rgb.pop(),
5143 blend = color( opaque )._rgba;
5144
5145 return color( jQuery.map( rgb, function( v, i ) {
5146 return ( 1 - a ) * blend[ i ] + a * v;
5147 }));
5148 },
5149 toRgbaString: function() {
5150 var prefix = "rgba(",
5151 rgba = jQuery.map( this._rgba, function( v, i ) {
5152 return v == null ? ( i > 2 ? 1 : 0 ) : v;
5153 });
5154
5155 if ( rgba[ 3 ] === 1 ) {
5156 rgba.pop();
5157 prefix = "rgb(";
5158 }
5159
5160 return prefix + rgba.join() + ")";
5161 },
5162 toHslaString: function() {
5163 var prefix = "hsla(",
5164 hsla = jQuery.map( this.hsla(), function( v, i ) {
5165 if ( v == null ) {
5166 v = i > 2 ? 1 : 0;
5167 }
5168
5169 // catch 1 and 2
5170 if ( i && i < 3 ) {
5171 v = Math.round( v * 100 ) + "%";
5172 }
5173 return v;
5174 });
5175
5176 if ( hsla[ 3 ] === 1 ) {
5177 hsla.pop();
5178 prefix = "hsl(";
5179 }
5180 return prefix + hsla.join() + ")";
5181 },
5182 toHexString: function( includeAlpha ) {
5183 var rgba = this._rgba.slice(),
5184 alpha = rgba.pop();
5185
5186 if ( includeAlpha ) {
5187 rgba.push( ~~( alpha * 255 ) );
5188 }
5189
5190 return "#" + jQuery.map( rgba, function( v ) {
5191
5192 // default to 0 when nulls exist
5193 v = ( v || 0 ).toString( 16 );
5194 return v.length === 1 ? "0" + v : v;
5195 }).join("");
5196 },
5197 toString: function() {
5198 return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
5199 }
5200});
5201color.fn.parse.prototype = color.fn;
5202
5203// hsla conversions adapted from:
5204// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
5205
5206function hue2rgb( p, q, h ) {
5207 h = ( h + 1 ) % 1;
5208 if ( h * 6 < 1 ) {
5209 return p + (q - p) * h * 6;
5210 }
5211 if ( h * 2 < 1) {
5212 return q;
5213 }
5214 if ( h * 3 < 2 ) {
5215 return p + (q - p) * ((2/3) - h) * 6;
5216 }
5217 return p;
5218}
5219
5220spaces.hsla.to = function ( rgba ) {
5221 if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
5222 return [ null, null, null, rgba[ 3 ] ];
5223 }
5224 var r = rgba[ 0 ] / 255,
5225 g = rgba[ 1 ] / 255,
5226 b = rgba[ 2 ] / 255,
5227 a = rgba[ 3 ],
5228 max = Math.max( r, g, b ),
5229 min = Math.min( r, g, b ),
5230 diff = max - min,
5231 add = max + min,
5232 l = add * 0.5,
5233 h, s;
5234
5235 if ( min === max ) {
5236 h = 0;
5237 } else if ( r === max ) {
5238 h = ( 60 * ( g - b ) / diff ) + 360;
5239 } else if ( g === max ) {
5240 h = ( 60 * ( b - r ) / diff ) + 120;
5241 } else {
5242 h = ( 60 * ( r - g ) / diff ) + 240;
5243 }
5244
5245 // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
5246 // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
5247 if ( diff === 0 ) {
5248 s = 0;
5249 } else if ( l <= 0.5 ) {
5250 s = diff / add;
5251 } else {
5252 s = diff / ( 2 - add );
5253 }
5254 return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
5255};
5256
5257spaces.hsla.from = function ( hsla ) {
5258 if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
5259 return [ null, null, null, hsla[ 3 ] ];
5260 }
5261 var h = hsla[ 0 ] / 360,
5262 s = hsla[ 1 ],
5263 l = hsla[ 2 ],
5264 a = hsla[ 3 ],
5265 q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
5266 p = 2 * l - q;
5267
5268 return [
5269 Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
5270 Math.round( hue2rgb( p, q, h ) * 255 ),
5271 Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
5272 a
5273 ];
5274};
5275
5276
5277each( spaces, function( spaceName, space ) {
5278 var props = space.props,
5279 cache = space.cache,
5280 to = space.to,
5281 from = space.from;
5282
5283 // makes rgba() and hsla()
5284 color.fn[ spaceName ] = function( value ) {
5285
5286 // generate a cache for this space if it doesn't exist
5287 if ( to && !this[ cache ] ) {
5288 this[ cache ] = to( this._rgba );
5289 }
5290 if ( value === undefined ) {
5291 return this[ cache ].slice();
5292 }
5293
5294 var ret,
5295 type = jQuery.type( value ),
5296 arr = ( type === "array" || type === "object" ) ? value : arguments,
5297 local = this[ cache ].slice();
5298
5299 each( props, function( key, prop ) {
5300 var val = arr[ type === "object" ? key : prop.idx ];
5301 if ( val == null ) {
5302 val = local[ prop.idx ];
5303 }
5304 local[ prop.idx ] = clamp( val, prop );
5305 });
5306
5307 if ( from ) {
5308 ret = color( from( local ) );
5309 ret[ cache ] = local;
5310 return ret;
5311 } else {
5312 return color( local );
5313 }
5314 };
5315
5316 // makes red() green() blue() alpha() hue() saturation() lightness()
5317 each( props, function( key, prop ) {
5318 // alpha is included in more than one space
5319 if ( color.fn[ key ] ) {
5320 return;
5321 }
5322 color.fn[ key ] = function( value ) {
5323 var vtype = jQuery.type( value ),
5324 fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
5325 local = this[ fn ](),
5326 cur = local[ prop.idx ],
5327 match;
5328
5329 if ( vtype === "undefined" ) {
5330 return cur;
5331 }
5332
5333 if ( vtype === "function" ) {
5334 value = value.call( this, cur );
5335 vtype = jQuery.type( value );
5336 }
5337 if ( value == null && prop.empty ) {
5338 return this;
5339 }
5340 if ( vtype === "string" ) {
5341 match = rplusequals.exec( value );
5342 if ( match ) {
5343 value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
5344 }
5345 }
5346 local[ prop.idx ] = value;
5347 return this[ fn ]( local );
5348 };
5349 });
5350});
5351
5352// add cssHook and .fx.step function for each named hook.
5353// accept a space separated string of properties
5354color.hook = function( hook ) {
5355 var hooks = hook.split( " " );
5356 each( hooks, function( i, hook ) {
5357 jQuery.cssHooks[ hook ] = {
5358 set: function( elem, value ) {
5359 var parsed, curElem,
5360 backgroundColor = "";
5361
5362 if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
5363 value = color( parsed || value );
5364 if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
5365 curElem = hook === "backgroundColor" ? elem.parentNode : elem;
5366 while (
5367 (backgroundColor === "" || backgroundColor === "transparent") &&
5368 curElem && curElem.style
5369 ) {
5370 try {
5371 backgroundColor = jQuery.css( curElem, "backgroundColor" );
5372 curElem = curElem.parentNode;
5373 } catch ( e ) {
5374 }
5375 }
5376
5377 value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
5378 backgroundColor :
5379 "_default" );
5380 }
5381
5382 value = value.toRgbaString();
5383 }
5384 try {
5385 elem.style[ hook ] = value;
5386 } catch( e ) {
5387 // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
5388 }
5389 }
5390 };
5391 jQuery.fx.step[ hook ] = function( fx ) {
5392 if ( !fx.colorInit ) {
5393 fx.start = color( fx.elem, hook );
5394 fx.end = color( fx.end );
5395 fx.colorInit = true;
5396 }
5397 jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
5398 };
5399 });
5400
5401};
5402
5403color.hook( stepHooks );
5404
5405jQuery.cssHooks.borderColor = {
5406 expand: function( value ) {
5407 var expanded = {};
5408
5409 each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
5410 expanded[ "border" + part + "Color" ] = value;
5411 });
5412 return expanded;
5413 }
5414};
5415
5416// Basic color names only.
5417// Usage of any of the other color names requires adding yourself or including
5418// jquery.color.svg-names.js.
5419colors = jQuery.Color.names = {
5420 // 4.1. Basic color keywords
5421 aqua: "#00ffff",
5422 black: "#000000",
5423 blue: "#0000ff",
5424 fuchsia: "#ff00ff",
5425 gray: "#808080",
5426 green: "#008000",
5427 lime: "#00ff00",
5428 maroon: "#800000",
5429 navy: "#000080",
5430 olive: "#808000",
5431 purple: "#800080",
5432 red: "#ff0000",
5433 silver: "#c0c0c0",
5434 teal: "#008080",
5435 white: "#ffffff",
5436 yellow: "#ffff00",
5437
5438 // 4.2.3. "transparent" color keyword
5439 transparent: [ null, null, null, 0 ],
5440
5441 _default: "#ffffff"
5442};
5443
5444})( jQuery );
5445
5446
5447/******************************************************************************/
5448/****************************** CLASS ANIMATIONS ******************************/
5449/******************************************************************************/
5450(function() {
5451
5452var classAnimationActions = [ "add", "remove", "toggle" ],
5453 shorthandStyles = {
5454 border: 1,
5455 borderBottom: 1,
5456 borderColor: 1,
5457 borderLeft: 1,
5458 borderRight: 1,
5459 borderTop: 1,
5460 borderWidth: 1,
5461 margin: 1,
5462 padding: 1
5463 };
5464
5465$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
5466 $.fx.step[ prop ] = function( fx ) {
5467 if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
5468 jQuery.style( fx.elem, prop, fx.end );
5469 fx.setAttr = true;
5470 }
5471 };
5472});
5473
5474function getElementStyles( elem ) {
5475 var key, len,
5476 style = elem.ownerDocument.defaultView ?
5477 elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
5478 elem.currentStyle,
5479 styles = {};
5480
5481 if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
5482 len = style.length;
5483 while ( len-- ) {
5484 key = style[ len ];
5485 if ( typeof style[ key ] === "string" ) {
5486 styles[ $.camelCase( key ) ] = style[ key ];
5487 }
5488 }
5489 // support: Opera, IE <9
5490 } else {
5491 for ( key in style ) {
5492 if ( typeof style[ key ] === "string" ) {
5493 styles[ key ] = style[ key ];
5494 }
5495 }
5496 }
5497
5498 return styles;
5499}
5500
5501
5502function styleDifference( oldStyle, newStyle ) {
5503 var diff = {},
5504 name, value;
5505
5506 for ( name in newStyle ) {
5507 value = newStyle[ name ];
5508 if ( oldStyle[ name ] !== value ) {
5509 if ( !shorthandStyles[ name ] ) {
5510 if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
5511 diff[ name ] = value;
5512 }
5513 }
5514 }
5515 }
5516
5517 return diff;
5518}
5519
5520// support: jQuery <1.8
5521if ( !$.fn.addBack ) {
5522 $.fn.addBack = function( selector ) {
5523 return this.add( selector == null ?
5524 this.prevObject : this.prevObject.filter( selector )
5525 );
5526 };
5527}
5528
5529$.effects.animateClass = function( value, duration, easing, callback ) {
5530 var o = $.speed( duration, easing, callback );
5531
5532 return this.queue( function() {
5533 var animated = $( this ),
5534 baseClass = animated.attr( "class" ) || "",
5535 applyClassChange,
5536 allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
5537
5538 // map the animated objects to store the original styles.
5539 allAnimations = allAnimations.map(function() {
5540 var el = $( this );
5541 return {
5542 el: el,
5543 start: getElementStyles( this )
5544 };
5545 });
5546
5547 // apply class change
5548 applyClassChange = function() {
5549 $.each( classAnimationActions, function(i, action) {
5550 if ( value[ action ] ) {
5551 animated[ action + "Class" ]( value[ action ] );
5552 }
5553 });
5554 };
5555 applyClassChange();
5556
5557 // map all animated objects again - calculate new styles and diff
5558 allAnimations = allAnimations.map(function() {
5559 this.end = getElementStyles( this.el[ 0 ] );
5560 this.diff = styleDifference( this.start, this.end );
5561 return this;
5562 });
5563
5564 // apply original class
5565 animated.attr( "class", baseClass );
5566
5567 // map all animated objects again - this time collecting a promise
5568 allAnimations = allAnimations.map(function() {
5569 var styleInfo = this,
5570 dfd = $.Deferred(),
5571 opts = $.extend({}, o, {
5572 queue: false,
5573 complete: function() {
5574 dfd.resolve( styleInfo );
5575 }
5576 });
5577
5578 this.el.animate( this.diff, opts );
5579 return dfd.promise();
5580 });
5581
5582 // once all animations have completed:
5583 $.when.apply( $, allAnimations.get() ).done(function() {
5584
5585 // set the final class
5586 applyClassChange();
5587
5588 // for each animated element,
5589 // clear all css properties that were animated
5590 $.each( arguments, function() {
5591 var el = this.el;
5592 $.each( this.diff, function(key) {
5593 el.css( key, "" );
5594 });
5595 });
5596
5597 // this is guarnteed to be there if you use jQuery.speed()
5598 // it also handles dequeuing the next anim...
5599 o.complete.call( animated[ 0 ] );
5600 });
5601 });
5602};
5603
5604$.fn.extend({
5605 addClass: (function( orig ) {
5606 return function( classNames, speed, easing, callback ) {
5607 return speed ?
5608 $.effects.animateClass.call( this,
5609 { add: classNames }, speed, easing, callback ) :
5610 orig.apply( this, arguments );
5611 };
5612 })( $.fn.addClass ),
5613
5614 removeClass: (function( orig ) {
5615 return function( classNames, speed, easing, callback ) {
5616 return arguments.length > 1 ?
5617 $.effects.animateClass.call( this,
5618 { remove: classNames }, speed, easing, callback ) :
5619 orig.apply( this, arguments );
5620 };
5621 })( $.fn.removeClass ),
5622
5623 toggleClass: (function( orig ) {
5624 return function( classNames, force, speed, easing, callback ) {
5625 if ( typeof force === "boolean" || force === undefined ) {
5626 if ( !speed ) {
5627 // without speed parameter
5628 return orig.apply( this, arguments );
5629 } else {
5630 return $.effects.animateClass.call( this,
5631 (force ? { add: classNames } : { remove: classNames }),
5632 speed, easing, callback );
5633 }
5634 } else {
5635 // without force parameter
5636 return $.effects.animateClass.call( this,
5637 { toggle: classNames }, force, speed, easing );
5638 }
5639 };
5640 })( $.fn.toggleClass ),
5641
5642 switchClass: function( remove, add, speed, easing, callback) {
5643 return $.effects.animateClass.call( this, {
5644 add: add,
5645 remove: remove
5646 }, speed, easing, callback );
5647 }
5648});
5649
5650})();
5651
5652/******************************************************************************/
5653/*********************************** EFFECTS **********************************/
5654/******************************************************************************/
5655
5656(function() {
5657
5658$.extend( $.effects, {
5659 version: "1.10.3",
5660
5661 // Saves a set of properties in a data storage
5662 save: function( element, set ) {
5663 for( var i=0; i < set.length; i++ ) {
5664 if ( set[ i ] !== null ) {
5665 element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
5666 }
5667 }
5668 },
5669
5670 // Restores a set of previously saved properties from a data storage
5671 restore: function( element, set ) {
5672 var val, i;
5673 for( i=0; i < set.length; i++ ) {
5674 if ( set[ i ] !== null ) {
5675 val = element.data( dataSpace + set[ i ] );
5676 // support: jQuery 1.6.2
5677 // http://bugs.jquery.com/ticket/9917
5678 // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
5679 // We can't differentiate between "" and 0 here, so we just assume
5680 // empty string since it's likely to be a more common value...
5681 if ( val === undefined ) {
5682 val = "";
5683 }
5684 element.css( set[ i ], val );
5685 }
5686 }
5687 },
5688
5689 setMode: function( el, mode ) {
5690 if (mode === "toggle") {
5691 mode = el.is( ":hidden" ) ? "show" : "hide";
5692 }
5693 return mode;
5694 },
5695
5696 // Translates a [top,left] array into a baseline value
5697 // this should be a little more flexible in the future to handle a string & hash
5698 getBaseline: function( origin, original ) {
5699 var y, x;
5700 switch ( origin[ 0 ] ) {
5701 case "top": y = 0; break;
5702 case "middle": y = 0.5; break;
5703 case "bottom": y = 1; break;
5704 default: y = origin[ 0 ] / original.height;
5705 }
5706 switch ( origin[ 1 ] ) {
5707 case "left": x = 0; break;
5708 case "center": x = 0.5; break;
5709 case "right": x = 1; break;
5710 default: x = origin[ 1 ] / original.width;
5711 }
5712 return {
5713 x: x,
5714 y: y
5715 };
5716 },
5717
5718 // Wraps the element around a wrapper that copies position properties
5719 createWrapper: function( element ) {
5720
5721 // if the element is already wrapped, return it
5722 if ( element.parent().is( ".ui-effects-wrapper" )) {
5723 return element.parent();
5724 }
5725
5726 // wrap the element
5727 var props = {
5728 width: element.outerWidth(true),
5729 height: element.outerHeight(true),
5730 "float": element.css( "float" )
5731 },
5732 wrapper = $( "<div></div>" )
5733 .addClass( "ui-effects-wrapper" )
5734 .css({
5735 fontSize: "100%",
5736 background: "transparent",
5737 border: "none",
5738 margin: 0,
5739 padding: 0
5740 }),
5741 // Store the size in case width/height are defined in % - Fixes #5245
5742 size = {
5743 width: element.width(),
5744 height: element.height()
5745 },
5746 active = document.activeElement;
5747
5748 // support: Firefox
5749 // Firefox incorrectly exposes anonymous content
5750 // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
5751 try {
5752 active.id;
5753 } catch( e ) {
5754 active = document.body;
5755 }
5756
5757 element.wrap( wrapper );
5758
5759 // Fixes #7595 - Elements lose focus when wrapped.
5760 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
5761 $( active ).focus();
5762 }
5763
5764 wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
5765
5766 // transfer positioning properties to the wrapper
5767 if ( element.css( "position" ) === "static" ) {
5768 wrapper.css({ position: "relative" });
5769 element.css({ position: "relative" });
5770 } else {
5771 $.extend( props, {
5772 position: element.css( "position" ),
5773 zIndex: element.css( "z-index" )
5774 });
5775 $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
5776 props[ pos ] = element.css( pos );
5777 if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
5778 props[ pos ] = "auto";
5779 }
5780 });
5781 element.css({
5782 position: "relative",
5783 top: 0,
5784 left: 0,
5785 right: "auto",
5786 bottom: "auto"
5787 });
5788 }
5789 element.css(size);
5790
5791 return wrapper.css( props ).show();
5792 },
5793
5794 removeWrapper: function( element ) {
5795 var active = document.activeElement;
5796
5797 if ( element.parent().is( ".ui-effects-wrapper" ) ) {
5798 element.parent().replaceWith( element );
5799
5800 // Fixes #7595 - Elements lose focus when wrapped.
5801 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
5802 $( active ).focus();
5803 }
5804 }
5805
5806
5807 return element;
5808 },
5809
5810 setTransition: function( element, list, factor, value ) {
5811 value = value || {};
5812 $.each( list, function( i, x ) {
5813 var unit = element.cssUnit( x );
5814 if ( unit[ 0 ] > 0 ) {
5815 value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
5816 }
5817 });
5818 return value;
5819 }
5820});
5821
5822// return an effect options object for the given parameters:
5823function _normalizeArguments( effect, options, speed, callback ) {
5824
5825 // allow passing all options as the first parameter
5826 if ( $.isPlainObject( effect ) ) {
5827 options = effect;
5828 effect = effect.effect;
5829 }
5830
5831 // convert to an object
5832 effect = { effect: effect };
5833
5834 // catch (effect, null, ...)
5835 if ( options == null ) {
5836 options = {};
5837 }
5838
5839 // catch (effect, callback)
5840 if ( $.isFunction( options ) ) {
5841 callback = options;
5842 speed = null;
5843 options = {};
5844 }
5845
5846 // catch (effect, speed, ?)
5847 if ( typeof options === "number" || $.fx.speeds[ options ] ) {
5848 callback = speed;
5849 speed = options;
5850 options = {};
5851 }
5852
5853 // catch (effect, options, callback)
5854 if ( $.isFunction( speed ) ) {
5855 callback = speed;
5856 speed = null;
5857 }
5858
5859 // add options to effect
5860 if ( options ) {
5861 $.extend( effect, options );
5862 }
5863
5864 speed = speed || options.duration;
5865 effect.duration = $.fx.off ? 0 :
5866 typeof speed === "number" ? speed :
5867 speed in $.fx.speeds ? $.fx.speeds[ speed ] :
5868 $.fx.speeds._default;
5869
5870 effect.complete = callback || options.complete;
5871
5872 return effect;
5873}
5874
5875function standardAnimationOption( option ) {
5876 // Valid standard speeds (nothing, number, named speed)
5877 if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
5878 return true;
5879 }
5880
5881 // Invalid strings - treat as "normal" speed
5882 if ( typeof option === "string" && !$.effects.effect[ option ] ) {
5883 return true;
5884 }
5885
5886 // Complete callback
5887 if ( $.isFunction( option ) ) {
5888 return true;
5889 }
5890
5891 // Options hash (but not naming an effect)
5892 if ( typeof option === "object" && !option.effect ) {
5893 return true;
5894 }
5895
5896 // Didn't match any standard API
5897 return false;
5898}
5899
5900$.fn.extend({
5901 effect: function( /* effect, options, speed, callback */ ) {
5902 var args = _normalizeArguments.apply( this, arguments ),
5903 mode = args.mode,
5904 queue = args.queue,
5905 effectMethod = $.effects.effect[ args.effect ];
5906
5907 if ( $.fx.off || !effectMethod ) {
5908 // delegate to the original method (e.g., .show()) if possible
5909 if ( mode ) {
5910 return this[ mode ]( args.duration, args.complete );
5911 } else {
5912 return this.each( function() {
5913 if ( args.complete ) {
5914 args.complete.call( this );
5915 }
5916 });
5917 }
5918 }
5919
5920 function run( next ) {
5921 var elem = $( this ),
5922 complete = args.complete,
5923 mode = args.mode;
5924
5925 function done() {
5926 if ( $.isFunction( complete ) ) {
5927 complete.call( elem[0] );
5928 }
5929 if ( $.isFunction( next ) ) {
5930 next();
5931 }
5932 }
5933
5934 // If the element already has the correct final state, delegate to
5935 // the core methods so the internal tracking of "olddisplay" works.
5936 if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
5937 elem[ mode ]();
5938 done();
5939 } else {
5940 effectMethod.call( elem[0], args, done );
5941 }
5942 }
5943
5944 return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
5945 },
5946
5947 show: (function( orig ) {
5948 return function( option ) {
5949 if ( standardAnimationOption( option ) ) {
5950 return orig.apply( this, arguments );
5951 } else {
5952 var args = _normalizeArguments.apply( this, arguments );
5953 args.mode = "show";
5954 return this.effect.call( this, args );
5955 }
5956 };
5957 })( $.fn.show ),
5958
5959 hide: (function( orig ) {
5960 return function( option ) {
5961 if ( standardAnimationOption( option ) ) {
5962 return orig.apply( this, arguments );
5963 } else {
5964 var args = _normalizeArguments.apply( this, arguments );
5965 args.mode = "hide";
5966 return this.effect.call( this, args );
5967 }
5968 };
5969 })( $.fn.hide ),
5970
5971 toggle: (function( orig ) {
5972 return function( option ) {
5973 if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
5974 return orig.apply( this, arguments );
5975 } else {
5976 var args = _normalizeArguments.apply( this, arguments );
5977 args.mode = "toggle";
5978 return this.effect.call( this, args );
5979 }
5980 };
5981 })( $.fn.toggle ),
5982
5983 // helper functions
5984 cssUnit: function(key) {
5985 var style = this.css( key ),
5986 val = [];
5987
5988 $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
5989 if ( style.indexOf( unit ) > 0 ) {
5990 val = [ parseFloat( style ), unit ];
5991 }
5992 });
5993 return val;
5994 }
5995});
5996
5997})();
5998
5999/******************************************************************************/
6000/*********************************** EASING ***********************************/
6001/******************************************************************************/
6002
6003(function() {
6004
6005// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
6006
6007var baseEasings = {};
6008
6009$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
6010 baseEasings[ name ] = function( p ) {
6011 return Math.pow( p, i + 2 );
6012 };
6013});
6014
6015$.extend( baseEasings, {
6016 Sine: function ( p ) {
6017 return 1 - Math.cos( p * Math.PI / 2 );
6018 },
6019 Circ: function ( p ) {
6020 return 1 - Math.sqrt( 1 - p * p );
6021 },
6022 Elastic: function( p ) {
6023 return p === 0 || p === 1 ? p :
6024 -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
6025 },
6026 Back: function( p ) {
6027 return p * p * ( 3 * p - 2 );
6028 },
6029 Bounce: function ( p ) {
6030 var pow2,
6031 bounce = 4;
6032
6033 while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
6034 return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
6035 }
6036});
6037
6038$.each( baseEasings, function( name, easeIn ) {
6039 $.easing[ "easeIn" + name ] = easeIn;
6040 $.easing[ "easeOut" + name ] = function( p ) {
6041 return 1 - easeIn( 1 - p );
6042 };
6043 $.easing[ "easeInOut" + name ] = function( p ) {
6044 return p < 0.5 ?
6045 easeIn( p * 2 ) / 2 :
6046 1 - easeIn( p * -2 + 2 ) / 2;
6047 };
6048});
6049
6050})();
6051
6052})(jQuery);
6053
6054(function( $, undefined ) {
6055
6056var uid = 0,
6057 hideProps = {},
6058 showProps = {};
6059
6060hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
6061 hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
6062showProps.height = showProps.paddingTop = showProps.paddingBottom =
6063 showProps.borderTopWidth = showProps.borderBottomWidth = "show";
6064
6065$.widget( "ui.accordion", {
6066 version: "1.10.3",
6067 options: {
6068 active: 0,
6069 animate: {},
6070 collapsible: false,
6071 event: "click",
6072 header: "> li > :first-child,> :not(li):even",
6073 heightStyle: "auto",
6074 icons: {
6075 activeHeader: "ui-icon-triangle-1-s",
6076 header: "ui-icon-triangle-1-e"
6077 },
6078
6079 // callbacks
6080 activate: null,
6081 beforeActivate: null
6082 },
6083
6084 _create: function() {
6085 var options = this.options;
6086 this.prevShow = this.prevHide = $();
6087 this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
6088 // ARIA
6089 .attr( "role", "tablist" );
6090
6091 // don't allow collapsible: false and active: false / null
6092 if ( !options.collapsible && (options.active === false || options.active == null) ) {
6093 options.active = 0;
6094 }
6095
6096 this._processPanels();
6097 // handle negative values
6098 if ( options.active < 0 ) {
6099 options.active += this.headers.length;
6100 }
6101 this._refresh();
6102 },
6103
6104 _getCreateEventData: function() {
6105 return {
6106 header: this.active,
6107 panel: !this.active.length ? $() : this.active.next(),
6108 content: !this.active.length ? $() : this.active.next()
6109 };
6110 },
6111
6112 _createIcons: function() {
6113 var icons = this.options.icons;
6114 if ( icons ) {
6115 $( "<span>" )
6116 .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
6117 .prependTo( this.headers );
6118 this.active.children( ".ui-accordion-header-icon" )
6119 .removeClass( icons.header )
6120 .addClass( icons.activeHeader );
6121 this.headers.addClass( "ui-accordion-icons" );
6122 }
6123 },
6124
6125 _destroyIcons: function() {
6126 this.headers
6127 .removeClass( "ui-accordion-icons" )
6128 .children( ".ui-accordion-header-icon" )
6129 .remove();
6130 },
6131
6132 _destroy: function() {
6133 var contents;
6134
6135 // clean up main element
6136 this.element
6137 .removeClass( "ui-accordion ui-widget ui-helper-reset" )
6138 .removeAttr( "role" );
6139
6140 // clean up headers
6141 this.headers
6142 .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
6143 .removeAttr( "role" )
6144 .removeAttr( "aria-selected" )
6145 .removeAttr( "aria-controls" )
6146 .removeAttr( "tabIndex" )
6147 .each(function() {
6148 if ( /^ui-accordion/.test( this.id ) ) {
6149 this.removeAttribute( "id" );
6150 }
6151 });
6152 this._destroyIcons();
6153
6154 // clean up content panels
6155 contents = this.headers.next()
6156 .css( "display", "" )
6157 .removeAttr( "role" )
6158 .removeAttr( "aria-expanded" )
6159 .removeAttr( "aria-hidden" )
6160 .removeAttr( "aria-labelledby" )
6161 .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
6162 .each(function() {
6163 if ( /^ui-accordion/.test( this.id ) ) {
6164 this.removeAttribute( "id" );
6165 }
6166 });
6167 if ( this.options.heightStyle !== "content" ) {
6168 contents.css( "height", "" );
6169 }
6170 },
6171
6172 _setOption: function( key, value ) {
6173 if ( key === "active" ) {
6174 // _activate() will handle invalid values and update this.options
6175 this._activate( value );
6176 return;
6177 }
6178
6179 if ( key === "event" ) {
6180 if ( this.options.event ) {
6181 this._off( this.headers, this.options.event );
6182 }
6183 this._setupEvents( value );
6184 }
6185
6186 this._super( key, value );
6187
6188 // setting collapsible: false while collapsed; open first panel
6189 if ( key === "collapsible" && !value && this.options.active === false ) {
6190 this._activate( 0 );
6191 }
6192
6193 if ( key === "icons" ) {
6194 this._destroyIcons();
6195 if ( value ) {
6196 this._createIcons();
6197 }
6198 }
6199
6200 // #5332 - opacity doesn't cascade to positioned elements in IE
6201 // so we need to add the disabled class to the headers and panels
6202 if ( key === "disabled" ) {
6203 this.headers.add( this.headers.next() )
6204 .toggleClass( "ui-state-disabled", !!value );
6205 }
6206 },
6207
6208 _keydown: function( event ) {
6209 /*jshint maxcomplexity:15*/
6210 if ( event.altKey || event.ctrlKey ) {
6211 return;
6212 }
6213
6214 var keyCode = $.ui.keyCode,
6215 length = this.headers.length,
6216 currentIndex = this.headers.index( event.target ),
6217 toFocus = false;
6218
6219 switch ( event.keyCode ) {
6220 case keyCode.RIGHT:
6221 case keyCode.DOWN:
6222 toFocus = this.headers[ ( currentIndex + 1 ) % length ];
6223 break;
6224 case keyCode.LEFT:
6225 case keyCode.UP:
6226 toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
6227 break;
6228 case keyCode.SPACE:
6229 case keyCode.ENTER:
6230 this._eventHandler( event );
6231 break;
6232 case keyCode.HOME:
6233 toFocus = this.headers[ 0 ];
6234 break;
6235 case keyCode.END:
6236 toFocus = this.headers[ length - 1 ];
6237 break;
6238 }
6239
6240 if ( toFocus ) {
6241 $( event.target ).attr( "tabIndex", -1 );
6242 $( toFocus ).attr( "tabIndex", 0 );
6243 toFocus.focus();
6244 event.preventDefault();
6245 }
6246 },
6247
6248 _panelKeyDown : function( event ) {
6249 if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
6250 $( event.currentTarget ).prev().focus();
6251 }
6252 },
6253
6254 refresh: function() {
6255 var options = this.options;
6256 this._processPanels();
6257
6258 // was collapsed or no panel
6259 if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
6260 options.active = false;
6261 this.active = $();
6262 // active false only when collapsible is true
6263 } else if ( options.active === false ) {
6264 this._activate( 0 );
6265 // was active, but active panel is gone
6266 } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
6267 // all remaining panel are disabled
6268 if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
6269 options.active = false;
6270 this.active = $();
6271 // activate previous panel
6272 } else {
6273 this._activate( Math.max( 0, options.active - 1 ) );
6274 }
6275 // was active, active panel still exists
6276 } else {
6277 // make sure active index is correct
6278 options.active = this.headers.index( this.active );
6279 }
6280
6281 this._destroyIcons();
6282
6283 this._refresh();
6284 },
6285
6286 _processPanels: function() {
6287 this.headers = this.element.find( this.options.header )
6288 .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
6289
6290 this.headers.next()
6291 .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
6292 .filter(":not(.ui-accordion-content-active)")
6293 .hide();
6294 },
6295
6296 _refresh: function() {
6297 var maxHeight,
6298 options = this.options,
6299 heightStyle = options.heightStyle,
6300 parent = this.element.parent(),
6301 accordionId = this.accordionId = "ui-accordion-" +
6302 (this.element.attr( "id" ) || ++uid);
6303
6304 this.active = this._findActive( options.active )
6305 .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
6306 .removeClass( "ui-corner-all" );
6307 this.active.next()
6308 .addClass( "ui-accordion-content-active" )
6309 .show();
6310
6311 this.headers
6312 .attr( "role", "tab" )
6313 .each(function( i ) {
6314 var header = $( this ),
6315 headerId = header.attr( "id" ),
6316 panel = header.next(),
6317 panelId = panel.attr( "id" );
6318 if ( !headerId ) {
6319 headerId = accordionId + "-header-" + i;
6320 header.attr( "id", headerId );
6321 }
6322 if ( !panelId ) {
6323 panelId = accordionId + "-panel-" + i;
6324 panel.attr( "id", panelId );
6325 }
6326 header.attr( "aria-controls", panelId );
6327 panel.attr( "aria-labelledby", headerId );
6328 })
6329 .next()
6330 .attr( "role", "tabpanel" );
6331
6332 this.headers
6333 .not( this.active )
6334 .attr({
6335 "aria-selected": "false",
6336 tabIndex: -1
6337 })
6338 .next()
6339 .attr({
6340 "aria-expanded": "false",
6341 "aria-hidden": "true"
6342 })
6343 .hide();
6344
6345 // make sure at least one header is in the tab order
6346 if ( !this.active.length ) {
6347 this.headers.eq( 0 ).attr( "tabIndex", 0 );
6348 } else {
6349 this.active.attr({
6350 "aria-selected": "true",
6351 tabIndex: 0
6352 })
6353 .next()
6354 .attr({
6355 "aria-expanded": "true",
6356 "aria-hidden": "false"
6357 });
6358 }
6359
6360 this._createIcons();
6361
6362 this._setupEvents( options.event );
6363
6364 if ( heightStyle === "fill" ) {
6365 maxHeight = parent.height();
6366 this.element.siblings( ":visible" ).each(function() {
6367 var elem = $( this ),
6368 position = elem.css( "position" );
6369
6370 if ( position === "absolute" || position === "fixed" ) {
6371 return;
6372 }
6373 maxHeight -= elem.outerHeight( true );
6374 });
6375
6376 this.headers.each(function() {
6377 maxHeight -= $( this ).outerHeight( true );
6378 });
6379
6380 this.headers.next()
6381 .each(function() {
6382 $( this ).height( Math.max( 0, maxHeight -
6383 $( this ).innerHeight() + $( this ).height() ) );
6384 })
6385 .css( "overflow", "auto" );
6386 } else if ( heightStyle === "auto" ) {
6387 maxHeight = 0;
6388 this.headers.next()
6389 .each(function() {
6390 maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
6391 })
6392 .height( maxHeight );
6393 }
6394 },
6395
6396 _activate: function( index ) {
6397 var active = this._findActive( index )[ 0 ];
6398
6399 // trying to activate the already active panel
6400 if ( active === this.active[ 0 ] ) {
6401 return;
6402 }
6403
6404 // trying to collapse, simulate a click on the currently active header
6405 active = active || this.active[ 0 ];
6406
6407 this._eventHandler({
6408 target: active,
6409 currentTarget: active,
6410 preventDefault: $.noop
6411 });
6412 },
6413
6414 _findActive: function( selector ) {
6415 return typeof selector === "number" ? this.headers.eq( selector ) : $();
6416 },
6417
6418 _setupEvents: function( event ) {
6419 var events = {
6420 keydown: "_keydown"
6421 };
6422 if ( event ) {
6423 $.each( event.split(" "), function( index, eventName ) {
6424 events[ eventName ] = "_eventHandler";
6425 });
6426 }
6427
6428 this._off( this.headers.add( this.headers.next() ) );
6429 this._on( this.headers, events );
6430 this._on( this.headers.next(), { keydown: "_panelKeyDown" });
6431 this._hoverable( this.headers );
6432 this._focusable( this.headers );
6433 },
6434
6435 _eventHandler: function( event ) {
6436 var options = this.options,
6437 active = this.active,
6438 clicked = $( event.currentTarget ),
6439 clickedIsActive = clicked[ 0 ] === active[ 0 ],
6440 collapsing = clickedIsActive && options.collapsible,
6441 toShow = collapsing ? $() : clicked.next(),
6442 toHide = active.next(),
6443 eventData = {
6444 oldHeader: active,
6445 oldPanel: toHide,
6446 newHeader: collapsing ? $() : clicked,
6447 newPanel: toShow
6448 };
6449
6450 event.preventDefault();
6451
6452 if (
6453 // click on active header, but not collapsible
6454 ( clickedIsActive && !options.collapsible ) ||
6455 // allow canceling activation
6456 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
6457 return;
6458 }
6459
6460 options.active = collapsing ? false : this.headers.index( clicked );
6461
6462 // when the call to ._toggle() comes after the class changes
6463 // it causes a very odd bug in IE 8 (see #6720)
6464 this.active = clickedIsActive ? $() : clicked;
6465 this._toggle( eventData );
6466
6467 // switch classes
6468 // corner classes on the previously active header stay after the animation
6469 active.removeClass( "ui-accordion-header-active ui-state-active" );
6470 if ( options.icons ) {
6471 active.children( ".ui-accordion-header-icon" )
6472 .removeClass( options.icons.activeHeader )
6473 .addClass( options.icons.header );
6474 }
6475
6476 if ( !clickedIsActive ) {
6477 clicked
6478 .removeClass( "ui-corner-all" )
6479 .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
6480 if ( options.icons ) {
6481 clicked.children( ".ui-accordion-header-icon" )
6482 .removeClass( options.icons.header )
6483 .addClass( options.icons.activeHeader );
6484 }
6485
6486 clicked
6487 .next()
6488 .addClass( "ui-accordion-content-active" );
6489 }
6490 },
6491
6492 _toggle: function( data ) {
6493 var toShow = data.newPanel,
6494 toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
6495
6496 // handle activating a panel during the animation for another activation
6497 this.prevShow.add( this.prevHide ).stop( true, true );
6498 this.prevShow = toShow;
6499 this.prevHide = toHide;
6500
6501 if ( this.options.animate ) {
6502 this._animate( toShow, toHide, data );
6503 } else {
6504 toHide.hide();
6505 toShow.show();
6506 this._toggleComplete( data );
6507 }
6508
6509 toHide.attr({
6510 "aria-expanded": "false",
6511 "aria-hidden": "true"
6512 });
6513 toHide.prev().attr( "aria-selected", "false" );
6514 // if we're switching panels, remove the old header from the tab order
6515 // if we're opening from collapsed state, remove the previous header from the tab order
6516 // if we're collapsing, then keep the collapsing header in the tab order
6517 if ( toShow.length && toHide.length ) {
6518 toHide.prev().attr( "tabIndex", -1 );
6519 } else if ( toShow.length ) {
6520 this.headers.filter(function() {
6521 return $( this ).attr( "tabIndex" ) === 0;
6522 })
6523 .attr( "tabIndex", -1 );
6524 }
6525
6526 toShow
6527 .attr({
6528 "aria-expanded": "true",
6529 "aria-hidden": "false"
6530 })
6531 .prev()
6532 .attr({
6533 "aria-selected": "true",
6534 tabIndex: 0
6535 });
6536 },
6537
6538 _animate: function( toShow, toHide, data ) {
6539 var total, easing, duration,
6540 that = this,
6541 adjust = 0,
6542 down = toShow.length &&
6543 ( !toHide.length || ( toShow.index() < toHide.index() ) ),
6544 animate = this.options.animate || {},
6545 options = down && animate.down || animate,
6546 complete = function() {
6547 that._toggleComplete( data );
6548 };
6549
6550 if ( typeof options === "number" ) {
6551 duration = options;
6552 }
6553 if ( typeof options === "string" ) {
6554 easing = options;
6555 }
6556 // fall back from options to animation in case of partial down settings
6557 easing = easing || options.easing || animate.easing;
6558 duration = duration || options.duration || animate.duration;
6559
6560 if ( !toHide.length ) {
6561 return toShow.animate( showProps, duration, easing, complete );
6562 }
6563 if ( !toShow.length ) {
6564 return toHide.animate( hideProps, duration, easing, complete );
6565 }
6566
6567 total = toShow.show().outerHeight();
6568 toHide.animate( hideProps, {
6569 duration: duration,
6570 easing: easing,
6571 step: function( now, fx ) {
6572 fx.now = Math.round( now );
6573 }
6574 });
6575 toShow
6576 .hide()
6577 .animate( showProps, {
6578 duration: duration,
6579 easing: easing,
6580 complete: complete,
6581 step: function( now, fx ) {
6582 fx.now = Math.round( now );
6583 if ( fx.prop !== "height" ) {
6584 adjust += fx.now;
6585 } else if ( that.options.heightStyle !== "content" ) {
6586 fx.now = Math.round( total - toHide.outerHeight() - adjust );
6587 adjust = 0;
6588 }
6589 }
6590 });
6591 },
6592
6593 _toggleComplete: function( data ) {
6594 var toHide = data.oldPanel;
6595
6596 toHide
6597 .removeClass( "ui-accordion-content-active" )
6598 .prev()
6599 .removeClass( "ui-corner-top" )
6600 .addClass( "ui-corner-all" );
6601
6602 // Work around for rendering bug in IE (#5421)
6603 if ( toHide.length ) {
6604 toHide.parent()[0].className = toHide.parent()[0].className;
6605 }
6606
6607 this._trigger( "activate", null, data );
6608 }
6609});
6610
6611})( jQuery );
6612
6613(function( $, undefined ) {
6614
6615// used to prevent race conditions with remote data sources
6616var requestIndex = 0;
6617
6618$.widget( "ui.autocomplete", {
6619 version: "1.10.3",
6620 defaultElement: "<input>",
6621 options: {
6622 appendTo: null,
6623 autoFocus: false,
6624 delay: 300,
6625 minLength: 1,
6626 position: {
6627 my: "left top",
6628 at: "left bottom",
6629 collision: "none"
6630 },
6631 source: null,
6632
6633 // callbacks
6634 change: null,
6635 close: null,
6636 focus: null,
6637 open: null,
6638 response: null,
6639 search: null,
6640 select: null
6641 },
6642
6643 pending: 0,
6644
6645 _create: function() {
6646 // Some browsers only repeat keydown events, not keypress events,
6647 // so we use the suppressKeyPress flag to determine if we've already
6648 // handled the keydown event. #7269
6649 // Unfortunately the code for & in keypress is the same as the up arrow,
6650 // so we use the suppressKeyPressRepeat flag to avoid handling keypress
6651 // events when we know the keydown event was used to modify the
6652 // search term. #7799
6653 var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
6654 nodeName = this.element[0].nodeName.toLowerCase(),
6655 isTextarea = nodeName === "textarea",
6656 isInput = nodeName === "input";
6657
6658 this.isMultiLine =
6659 // Textareas are always multi-line
6660 isTextarea ? true :
6661 // Inputs are always single-line, even if inside a contentEditable element
6662 // IE also treats inputs as contentEditable
6663 isInput ? false :
6664 // All other element types are determined by whether or not they're contentEditable
6665 this.element.prop( "isContentEditable" );
6666
6667 this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
6668 this.isNewMenu = true;
6669
6670 this.element
6671 .addClass( "ui-autocomplete-input" )
6672 .attr( "autocomplete", "off" );
6673
6674 this._on( this.element, {
6675 keydown: function( event ) {
6676 /*jshint maxcomplexity:15*/
6677 if ( this.element.prop( "readOnly" ) ) {
6678 suppressKeyPress = true;
6679 suppressInput = true;
6680 suppressKeyPressRepeat = true;
6681 return;
6682 }
6683
6684 suppressKeyPress = false;
6685 suppressInput = false;
6686 suppressKeyPressRepeat = false;
6687 var keyCode = $.ui.keyCode;
6688 switch( event.keyCode ) {
6689 case keyCode.PAGE_UP:
6690 suppressKeyPress = true;
6691 this._move( "previousPage", event );
6692 break;
6693 case keyCode.PAGE_DOWN:
6694 suppressKeyPress = true;
6695 this._move( "nextPage", event );
6696 break;
6697 case keyCode.UP:
6698 suppressKeyPress = true;
6699 this._keyEvent( "previous", event );
6700 break;
6701 case keyCode.DOWN:
6702 suppressKeyPress = true;
6703 this._keyEvent( "next", event );
6704 break;
6705 case keyCode.ENTER:
6706 case keyCode.NUMPAD_ENTER:
6707 // when menu is open and has focus
6708 if ( this.menu.active ) {
6709 // #6055 - Opera still allows the keypress to occur
6710 // which causes forms to submit
6711 suppressKeyPress = true;
6712 event.preventDefault();
6713 this.menu.select( event );
6714 }
6715 break;
6716 case keyCode.TAB:
6717 if ( this.menu.active ) {
6718 this.menu.select( event );
6719 }
6720 break;
6721 case keyCode.ESCAPE:
6722 if ( this.menu.element.is( ":visible" ) ) {
6723 this._value( this.term );
6724 this.close( event );
6725 // Different browsers have different default behavior for escape
6726 // Single press can mean undo or clear
6727 // Double press in IE means clear the whole form
6728 event.preventDefault();
6729 }
6730 break;
6731 default:
6732 suppressKeyPressRepeat = true;
6733 // search timeout should be triggered before the input value is changed
6734 this._searchTimeout( event );
6735 break;
6736 }
6737 },
6738 keypress: function( event ) {
6739 if ( suppressKeyPress ) {
6740 suppressKeyPress = false;
6741 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
6742 event.preventDefault();
6743 }
6744 return;
6745 }
6746 if ( suppressKeyPressRepeat ) {
6747 return;
6748 }
6749
6750 // replicate some key handlers to allow them to repeat in Firefox and Opera
6751 var keyCode = $.ui.keyCode;
6752 switch( event.keyCode ) {
6753 case keyCode.PAGE_UP:
6754 this._move( "previousPage", event );
6755 break;
6756 case keyCode.PAGE_DOWN:
6757 this._move( "nextPage", event );
6758 break;
6759 case keyCode.UP:
6760 this._keyEvent( "previous", event );
6761 break;
6762 case keyCode.DOWN:
6763 this._keyEvent( "next", event );
6764 break;
6765 }
6766 },
6767 input: function( event ) {
6768 if ( suppressInput ) {
6769 suppressInput = false;
6770 event.preventDefault();
6771 return;
6772 }
6773 this._searchTimeout( event );
6774 },
6775 focus: function() {
6776 this.selectedItem = null;
6777 this.previous = this._value();
6778 },
6779 blur: function( event ) {
6780 if ( this.cancelBlur ) {
6781 delete this.cancelBlur;
6782 return;
6783 }
6784
6785 clearTimeout( this.searching );
6786 this.close( event );
6787 this._change( event );
6788 }
6789 });
6790
6791 this._initSource();
6792 this.menu = $( "<ul>" )
6793 .addClass( "ui-autocomplete ui-front" )
6794 .appendTo( this._appendTo() )
6795 .menu({
6796 // disable ARIA support, the live region takes care of that
6797 role: null
6798 })
6799 .hide()
6800 .data( "ui-menu" );
6801
6802 this._on( this.menu.element, {
6803 mousedown: function( event ) {
6804 // prevent moving focus out of the text field
6805 event.preventDefault();
6806
6807 // IE doesn't prevent moving focus even with event.preventDefault()
6808 // so we set a flag to know when we should ignore the blur event
6809 this.cancelBlur = true;
6810 this._delay(function() {
6811 delete this.cancelBlur;
6812 });
6813
6814 // clicking on the scrollbar causes focus to shift to the body
6815 // but we can't detect a mouseup or a click immediately afterward
6816 // so we have to track the next mousedown and close the menu if
6817 // the user clicks somewhere outside of the autocomplete
6818 var menuElement = this.menu.element[ 0 ];
6819 if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
6820 this._delay(function() {
6821 var that = this;
6822 this.document.one( "mousedown", function( event ) {
6823 if ( event.target !== that.element[ 0 ] &&
6824 event.target !== menuElement &&
6825 !$.contains( menuElement, event.target ) ) {
6826 that.close();
6827 }
6828 });
6829 });
6830 }
6831 },
6832 menufocus: function( event, ui ) {
6833 // support: Firefox
6834 // Prevent accidental activation of menu items in Firefox (#7024 #9118)
6835 if ( this.isNewMenu ) {
6836 this.isNewMenu = false;
6837 if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
6838 this.menu.blur();
6839
6840 this.document.one( "mousemove", function() {
6841 $( event.target ).trigger( event.originalEvent );
6842 });
6843
6844 return;
6845 }
6846 }
6847
6848 var item = ui.item.data( "ui-autocomplete-item" );
6849 if ( false !== this._trigger( "focus", event, { item: item } ) ) {
6850 // use value to match what will end up in the input, if it was a key event
6851 if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
6852 this._value( item.value );
6853 }
6854 } else {
6855 // Normally the input is populated with the item's value as the
6856 // menu is navigated, causing screen readers to notice a change and
6857 // announce the item. Since the focus event was canceled, this doesn't
6858 // happen, so we update the live region so that screen readers can
6859 // still notice the change and announce it.
6860 this.liveRegion.text( item.value );
6861 }
6862 },
6863 menuselect: function( event, ui ) {
6864 var item = ui.item.data( "ui-autocomplete-item" ),
6865 previous = this.previous;
6866
6867 // only trigger when focus was lost (click on menu)
6868 if ( this.element[0] !== this.document[0].activeElement ) {
6869 this.element.focus();
6870 this.previous = previous;
6871 // #6109 - IE triggers two focus events and the second
6872 // is asynchronous, so we need to reset the previous
6873 // term synchronously and asynchronously :-(
6874 this._delay(function() {
6875 this.previous = previous;
6876 this.selectedItem = item;
6877 });
6878 }
6879
6880 if ( false !== this._trigger( "select", event, { item: item } ) ) {
6881 this._value( item.value );
6882 }
6883 // reset the term after the select event
6884 // this allows custom select handling to work properly
6885 this.term = this._value();
6886
6887 this.close( event );
6888 this.selectedItem = item;
6889 }
6890 });
6891
6892 this.liveRegion = $( "<span>", {
6893 role: "status",
6894 "aria-live": "polite"
6895 })
6896 .addClass( "ui-helper-hidden-accessible" )
6897 .insertBefore( this.element );
6898
6899 // turning off autocomplete prevents the browser from remembering the
6900 // value when navigating through history, so we re-enable autocomplete
6901 // if the page is unloaded before the widget is destroyed. #7790
6902 this._on( this.window, {
6903 beforeunload: function() {
6904 this.element.removeAttr( "autocomplete" );
6905 }
6906 });
6907 },
6908
6909 _destroy: function() {
6910 clearTimeout( this.searching );
6911 this.element
6912 .removeClass( "ui-autocomplete-input" )
6913 .removeAttr( "autocomplete" );
6914 this.menu.element.remove();
6915 this.liveRegion.remove();
6916 },
6917
6918 _setOption: function( key, value ) {
6919 this._super( key, value );
6920 if ( key === "source" ) {
6921 this._initSource();
6922 }
6923 if ( key === "appendTo" ) {
6924 this.menu.element.appendTo( this._appendTo() );
6925 }
6926 if ( key === "disabled" && value && this.xhr ) {
6927 this.xhr.abort();
6928 }
6929 },
6930
6931 _appendTo: function() {
6932 var element = this.options.appendTo;
6933
6934 if ( element ) {
6935 element = element.jquery || element.nodeType ?
6936 $( element ) :
6937 this.document.find( element ).eq( 0 );
6938 }
6939
6940 if ( !element ) {
6941 element = this.element.closest( ".ui-front" );
6942 }
6943
6944 if ( !element.length ) {
6945 element = this.document[0].body;
6946 }
6947
6948 return element;
6949 },
6950
6951 _initSource: function() {
6952 var array, url,
6953 that = this;
6954 if ( $.isArray(this.options.source) ) {
6955 array = this.options.source;
6956 this.source = function( request, response ) {
6957 response( $.ui.autocomplete.filter( array, request.term ) );
6958 };
6959 } else if ( typeof this.options.source === "string" ) {
6960 url = this.options.source;
6961 this.source = function( request, response ) {
6962 if ( that.xhr ) {
6963 that.xhr.abort();
6964 }
6965 that.xhr = $.ajax({
6966 url: url,
6967 data: request,
6968 dataType: "json",
6969 success: function( data ) {
6970 response( data );
6971 },
6972 error: function() {
6973 response( [] );
6974 }
6975 });
6976 };
6977 } else {
6978 this.source = this.options.source;
6979 }
6980 },
6981
6982 _searchTimeout: function( event ) {
6983 clearTimeout( this.searching );
6984 this.searching = this._delay(function() {
6985 // only search if the value has changed
6986 if ( this.term !== this._value() ) {
6987 this.selectedItem = null;
6988 this.search( null, event );
6989 }
6990 }, this.options.delay );
6991 },
6992
6993 search: function( value, event ) {
6994 value = value != null ? value : this._value();
6995
6996 // always save the actual value, not the one passed as an argument
6997 this.term = this._value();
6998
6999 if ( value.length < this.options.minLength ) {
7000 return this.close( event );
7001 }
7002
7003 if ( this._trigger( "search", event ) === false ) {
7004 return;
7005 }
7006
7007 return this._search( value );
7008 },
7009
7010 _search: function( value ) {
7011 this.pending++;
7012 this.element.addClass( "ui-autocomplete-loading" );
7013 this.cancelSearch = false;
7014
7015 this.source( { term: value }, this._response() );
7016 },
7017
7018 _response: function() {
7019 var that = this,
7020 index = ++requestIndex;
7021
7022 return function( content ) {
7023 if ( index === requestIndex ) {
7024 that.__response( content );
7025 }
7026
7027 that.pending--;
7028 if ( !that.pending ) {
7029 that.element.removeClass( "ui-autocomplete-loading" );
7030 }
7031 };
7032 },
7033
7034 __response: function( content ) {
7035 if ( content ) {
7036 content = this._normalize( content );
7037 }
7038 this._trigger( "response", null, { content: content } );
7039 if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
7040 this._suggest( content );
7041 this._trigger( "open" );
7042 } else {
7043 // use ._close() instead of .close() so we don't cancel future searches
7044 this._close();
7045 }
7046 },
7047
7048 close: function( event ) {
7049 this.cancelSearch = true;
7050 this._close( event );
7051 },
7052
7053 _close: function( event ) {
7054 if ( this.menu.element.is( ":visible" ) ) {
7055 this.menu.element.hide();
7056 this.menu.blur();
7057 this.isNewMenu = true;
7058 this._trigger( "close", event );
7059 }
7060 },
7061
7062 _change: function( event ) {
7063 if ( this.previous !== this._value() ) {
7064 this._trigger( "change", event, { item: this.selectedItem } );
7065 }
7066 },
7067
7068 _normalize: function( items ) {
7069 // assume all items have the right format when the first item is complete
7070 if ( items.length && items[0].label && items[0].value ) {
7071 return items;
7072 }
7073 return $.map( items, function( item ) {
7074 if ( typeof item === "string" ) {
7075 return {
7076 label: item,
7077 value: item
7078 };
7079 }
7080 return $.extend({
7081 label: item.label || item.value,
7082 value: item.value || item.label
7083 }, item );
7084 });
7085 },
7086
7087 _suggest: function( items ) {
7088 var ul = this.menu.element.empty();
7089 this._renderMenu( ul, items );
7090 this.isNewMenu = true;
7091 this.menu.refresh();
7092
7093 // size and position menu
7094 ul.show();
7095 this._resizeMenu();
7096 ul.position( $.extend({
7097 of: this.element
7098 }, this.options.position ));
7099
7100 if ( this.options.autoFocus ) {
7101 this.menu.next();
7102 }
7103 },
7104
7105 _resizeMenu: function() {
7106 var ul = this.menu.element;
7107 ul.outerWidth( Math.max(
7108 // Firefox wraps long text (possibly a rounding bug)
7109 // so we add 1px to avoid the wrapping (#7513)
7110 ul.width( "" ).outerWidth() + 1,
7111 this.element.outerWidth()
7112 ) );
7113 },
7114
7115 _renderMenu: function( ul, items ) {
7116 var that = this;
7117 $.each( items, function( index, item ) {
7118 that._renderItemData( ul, item );
7119 });
7120 },
7121
7122 _renderItemData: function( ul, item ) {
7123 return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
7124 },
7125
7126 _renderItem: function( ul, item ) {
7127 return $( "<li>" )
7128 .append( $( "<a>" ).text( item.label ) )
7129 .appendTo( ul );
7130 },
7131
7132 _move: function( direction, event ) {
7133 if ( !this.menu.element.is( ":visible" ) ) {
7134 this.search( null, event );
7135 return;
7136 }
7137 if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
7138 this.menu.isLastItem() && /^next/.test( direction ) ) {
7139 this._value( this.term );
7140 this.menu.blur();
7141 return;
7142 }
7143 this.menu[ direction ]( event );
7144 },
7145
7146 widget: function() {
7147 return this.menu.element;
7148 },
7149
7150 _value: function() {
7151 return this.valueMethod.apply( this.element, arguments );
7152 },
7153
7154 _keyEvent: function( keyEvent, event ) {
7155 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
7156 this._move( keyEvent, event );
7157
7158 // prevents moving cursor to beginning/end of the text field in some browsers
7159 event.preventDefault();
7160 }
7161 }
7162});
7163
7164$.extend( $.ui.autocomplete, {
7165 escapeRegex: function( value ) {
7166 return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
7167 },
7168 filter: function(array, term) {
7169 var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
7170 return $.grep( array, function(value) {
7171 return matcher.test( value.label || value.value || value );
7172 });
7173 }
7174});
7175
7176
7177// live region extension, adding a `messages` option
7178// NOTE: This is an experimental API. We are still investigating
7179// a full solution for string manipulation and internationalization.
7180$.widget( "ui.autocomplete", $.ui.autocomplete, {
7181 options: {
7182 messages: {
7183 noResults: "No search results.",
7184 results: function( amount ) {
7185 return amount + ( amount > 1 ? " results are" : " result is" ) +
7186 " available, use up and down arrow keys to navigate.";
7187 }
7188 }
7189 },
7190
7191 __response: function( content ) {
7192 var message;
7193 this._superApply( arguments );
7194 if ( this.options.disabled || this.cancelSearch ) {
7195 return;
7196 }
7197 if ( content && content.length ) {
7198 message = this.options.messages.results( content.length );
7199 } else {
7200 message = this.options.messages.noResults;
7201 }
7202 this.liveRegion.text( message );
7203 }
7204});
7205
7206}( jQuery ));
7207
7208(function( $, undefined ) {
7209
7210var lastActive, startXPos, startYPos, clickDragged,
7211 baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
7212 stateClasses = "ui-state-hover ui-state-active ",
7213 typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
7214 formResetHandler = function() {
7215 var form = $( this );
7216 setTimeout(function() {
7217 form.find( ":ui-button" ).button( "refresh" );
7218 }, 1 );
7219 },
7220 radioGroup = function( radio ) {
7221 var name = radio.name,
7222 form = radio.form,
7223 radios = $( [] );
7224 if ( name ) {
7225 name = name.replace( /'/g, "\\'" );
7226 if ( form ) {
7227 radios = $( form ).find( "[name='" + name + "']" );
7228 } else {
7229 radios = $( "[name='" + name + "']", radio.ownerDocument )
7230 .filter(function() {
7231 return !this.form;
7232 });
7233 }
7234 }
7235 return radios;
7236 };
7237
7238$.widget( "ui.button", {
7239 version: "1.10.3",
7240 defaultElement: "<button>",
7241 options: {
7242 disabled: null,
7243 text: true,
7244 label: null,
7245 icons: {
7246 primary: null,
7247 secondary: null
7248 }
7249 },
7250 _create: function() {
7251 this.element.closest( "form" )
7252 .unbind( "reset" + this.eventNamespace )
7253 .bind( "reset" + this.eventNamespace, formResetHandler );
7254
7255 if ( typeof this.options.disabled !== "boolean" ) {
7256 this.options.disabled = !!this.element.prop( "disabled" );
7257 } else {
7258 this.element.prop( "disabled", this.options.disabled );
7259 }
7260
7261 this._determineButtonType();
7262 this.hasTitle = !!this.buttonElement.attr( "title" );
7263
7264 var that = this,
7265 options = this.options,
7266 toggleButton = this.type === "checkbox" || this.type === "radio",
7267 activeClass = !toggleButton ? "ui-state-active" : "",
7268 focusClass = "ui-state-focus";
7269
7270 if ( options.label === null ) {
7271 options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
7272 }
7273
7274 this._hoverable( this.buttonElement );
7275
7276 this.buttonElement
7277 .addClass( baseClasses )
7278 .attr( "role", "button" )
7279 .bind( "mouseenter" + this.eventNamespace, function() {
7280 if ( options.disabled ) {
7281 return;
7282 }
7283 if ( this === lastActive ) {
7284 $( this ).addClass( "ui-state-active" );
7285 }
7286 })
7287 .bind( "mouseleave" + this.eventNamespace, function() {
7288 if ( options.disabled ) {
7289 return;
7290 }
7291 $( this ).removeClass( activeClass );
7292 })
7293 .bind( "click" + this.eventNamespace, function( event ) {
7294 if ( options.disabled ) {
7295 event.preventDefault();
7296 event.stopImmediatePropagation();
7297 }
7298 });
7299
7300 this.element
7301 .bind( "focus" + this.eventNamespace, function() {
7302 // no need to check disabled, focus won't be triggered anyway
7303 that.buttonElement.addClass( focusClass );
7304 })
7305 .bind( "blur" + this.eventNamespace, function() {
7306 that.buttonElement.removeClass( focusClass );
7307 });
7308
7309 if ( toggleButton ) {
7310 this.element.bind( "change" + this.eventNamespace, function() {
7311 if ( clickDragged ) {
7312 return;
7313 }
7314 that.refresh();
7315 });
7316 // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
7317 // prevents issue where button state changes but checkbox/radio checked state
7318 // does not in Firefox (see ticket #6970)
7319 this.buttonElement
7320 .bind( "mousedown" + this.eventNamespace, function( event ) {
7321 if ( options.disabled ) {
7322 return;
7323 }
7324 clickDragged = false;
7325 startXPos = event.pageX;
7326 startYPos = event.pageY;
7327 })
7328 .bind( "mouseup" + this.eventNamespace, function( event ) {
7329 if ( options.disabled ) {
7330 return;
7331 }
7332 if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
7333 clickDragged = true;
7334 }
7335 });
7336 }
7337
7338 if ( this.type === "checkbox" ) {
7339 this.buttonElement.bind( "click" + this.eventNamespace, function() {
7340 if ( options.disabled || clickDragged ) {
7341 return false;
7342 }
7343 });
7344 } else if ( this.type === "radio" ) {
7345 this.buttonElement.bind( "click" + this.eventNamespace, function() {
7346 if ( options.disabled || clickDragged ) {
7347 return false;
7348 }
7349 $( this ).addClass( "ui-state-active" );
7350 that.buttonElement.attr( "aria-pressed", "true" );
7351
7352 var radio = that.element[ 0 ];
7353 radioGroup( radio )
7354 .not( radio )
7355 .map(function() {
7356 return $( this ).button( "widget" )[ 0 ];
7357 })
7358 .removeClass( "ui-state-active" )
7359 .attr( "aria-pressed", "false" );
7360 });
7361 } else {
7362 this.buttonElement
7363 .bind( "mousedown" + this.eventNamespace, function() {
7364 if ( options.disabled ) {
7365 return false;
7366 }
7367 $( this ).addClass( "ui-state-active" );
7368 lastActive = this;
7369 that.document.one( "mouseup", function() {
7370 lastActive = null;
7371 });
7372 })
7373 .bind( "mouseup" + this.eventNamespace, function() {
7374 if ( options.disabled ) {
7375 return false;
7376 }
7377 $( this ).removeClass( "ui-state-active" );
7378 })
7379 .bind( "keydown" + this.eventNamespace, function(event) {
7380 if ( options.disabled ) {
7381 return false;
7382 }
7383 if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
7384 $( this ).addClass( "ui-state-active" );
7385 }
7386 })
7387 // see #8559, we bind to blur here in case the button element loses
7388 // focus between keydown and keyup, it would be left in an "active" state
7389 .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
7390 $( this ).removeClass( "ui-state-active" );
7391 });
7392
7393 if ( this.buttonElement.is("a") ) {
7394 this.buttonElement.keyup(function(event) {
7395 if ( event.keyCode === $.ui.keyCode.SPACE ) {
7396 // TODO pass through original event correctly (just as 2nd argument doesn't work)
7397 $( this ).click();
7398 }
7399 });
7400 }
7401 }
7402
7403 // TODO: pull out $.Widget's handling for the disabled option into
7404 // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
7405 // be overridden by individual plugins
7406 this._setOption( "disabled", options.disabled );
7407 this._resetButton();
7408 },
7409
7410 _determineButtonType: function() {
7411 var ancestor, labelSelector, checked;
7412
7413 if ( this.element.is("[type=checkbox]") ) {
7414 this.type = "checkbox";
7415 } else if ( this.element.is("[type=radio]") ) {
7416 this.type = "radio";
7417 } else if ( this.element.is("input") ) {
7418 this.type = "input";
7419 } else {
7420 this.type = "button";
7421 }
7422
7423 if ( this.type === "checkbox" || this.type === "radio" ) {
7424 // we don't search against the document in case the element
7425 // is disconnected from the DOM
7426 ancestor = this.element.parents().last();
7427 labelSelector = "label[for='" + this.element.attr("id") + "']";
7428 this.buttonElement = ancestor.find( labelSelector );
7429 if ( !this.buttonElement.length ) {
7430 ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
7431 this.buttonElement = ancestor.filter( labelSelector );
7432 if ( !this.buttonElement.length ) {
7433 this.buttonElement = ancestor.find( labelSelector );
7434 }
7435 }
7436 this.element.addClass( "ui-helper-hidden-accessible" );
7437
7438 checked = this.element.is( ":checked" );
7439 if ( checked ) {
7440 this.buttonElement.addClass( "ui-state-active" );
7441 }
7442 this.buttonElement.prop( "aria-pressed", checked );
7443 } else {
7444 this.buttonElement = this.element;
7445 }
7446 },
7447
7448 widget: function() {
7449 return this.buttonElement;
7450 },
7451
7452 _destroy: function() {
7453 this.element
7454 .removeClass( "ui-helper-hidden-accessible" );
7455 this.buttonElement
7456 .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
7457 .removeAttr( "role" )
7458 .removeAttr( "aria-pressed" )
7459 .html( this.buttonElement.find(".ui-button-text").html() );
7460
7461 if ( !this.hasTitle ) {
7462 this.buttonElement.removeAttr( "title" );
7463 }
7464 },
7465
7466 _setOption: function( key, value ) {
7467 this._super( key, value );
7468 if ( key === "disabled" ) {
7469 if ( value ) {
7470 this.element.prop( "disabled", true );
7471 } else {
7472 this.element.prop( "disabled", false );
7473 }
7474 return;
7475 }
7476 this._resetButton();
7477 },
7478
7479 refresh: function() {
7480 //See #8237 & #8828
7481 var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
7482
7483 if ( isDisabled !== this.options.disabled ) {
7484 this._setOption( "disabled", isDisabled );
7485 }
7486 if ( this.type === "radio" ) {
7487 radioGroup( this.element[0] ).each(function() {
7488 if ( $( this ).is( ":checked" ) ) {
7489 $( this ).button( "widget" )
7490 .addClass( "ui-state-active" )
7491 .attr( "aria-pressed", "true" );
7492 } else {
7493 $( this ).button( "widget" )
7494 .removeClass( "ui-state-active" )
7495 .attr( "aria-pressed", "false" );
7496 }
7497 });
7498 } else if ( this.type === "checkbox" ) {
7499 if ( this.element.is( ":checked" ) ) {
7500 this.buttonElement
7501 .addClass( "ui-state-active" )
7502 .attr( "aria-pressed", "true" );
7503 } else {
7504 this.buttonElement
7505 .removeClass( "ui-state-active" )
7506 .attr( "aria-pressed", "false" );
7507 }
7508 }
7509 },
7510
7511 _resetButton: function() {
7512 if ( this.type === "input" ) {
7513 if ( this.options.label ) {
7514 this.element.val( this.options.label );
7515 }
7516 return;
7517 }
7518 var buttonElement = this.buttonElement.removeClass( typeClasses ),
7519 buttonText = $( "<span></span>", this.document[0] )
7520 .addClass( "ui-button-text" )
7521 .html( this.options.label )
7522 .appendTo( buttonElement.empty() )
7523 .text(),
7524 icons = this.options.icons,
7525 multipleIcons = icons.primary && icons.secondary,
7526 buttonClasses = [];
7527
7528 if ( icons.primary || icons.secondary ) {
7529 if ( this.options.text ) {
7530 buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
7531 }
7532
7533 if ( icons.primary ) {
7534 buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
7535 }
7536
7537 if ( icons.secondary ) {
7538 buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
7539 }
7540
7541 if ( !this.options.text ) {
7542 buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
7543
7544 if ( !this.hasTitle ) {
7545 buttonElement.attr( "title", $.trim( buttonText ) );
7546 }
7547 }
7548 } else {
7549 buttonClasses.push( "ui-button-text-only" );
7550 }
7551 buttonElement.addClass( buttonClasses.join( " " ) );
7552 }
7553});
7554
7555$.widget( "ui.buttonset", {
7556 version: "1.10.3",
7557 options: {
7558 items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
7559 },
7560
7561 _create: function() {
7562 this.element.addClass( "ui-buttonset" );
7563 },
7564
7565 _init: function() {
7566 this.refresh();
7567 },
7568
7569 _setOption: function( key, value ) {
7570 if ( key === "disabled" ) {
7571 this.buttons.button( "option", key, value );
7572 }
7573
7574 this._super( key, value );
7575 },
7576
7577 refresh: function() {
7578 var rtl = this.element.css( "direction" ) === "rtl";
7579
7580 this.buttons = this.element.find( this.options.items )
7581 .filter( ":ui-button" )
7582 .button( "refresh" )
7583 .end()
7584 .not( ":ui-button" )
7585 .button()
7586 .end()
7587 .map(function() {
7588 return $( this ).button( "widget" )[ 0 ];
7589 })
7590 .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
7591 .filter( ":first" )
7592 .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
7593 .end()
7594 .filter( ":last" )
7595 .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
7596 .end()
7597 .end();
7598 },
7599
7600 _destroy: function() {
7601 this.element.removeClass( "ui-buttonset" );
7602 this.buttons
7603 .map(function() {
7604 return $( this ).button( "widget" )[ 0 ];
7605 })
7606 .removeClass( "ui-corner-left ui-corner-right" )
7607 .end()
7608 .button( "destroy" );
7609 }
7610});
7611
7612}( jQuery ) );
7613
7614(function( $, undefined ) {
7615
7616$.extend($.ui, { datepicker: { version: "1.10.3" } });
7617
7618var PROP_NAME = "datepicker",
7619 instActive;
7620
7621/* Date picker manager.
7622 Use the singleton instance of this class, $.datepicker, to interact with the date picker.
7623 Settings for (groups of) date pickers are maintained in an instance object,
7624 allowing multiple different settings on the same page. */
7625
7626function Datepicker() {
7627 this._curInst = null; // The current instance in use
7628 this._keyEvent = false; // If the last event was a key event
7629 this._disabledInputs = []; // List of date picker inputs that have been disabled
7630 this._datepickerShowing = false; // True if the popup picker is showing , false if not
7631 this._inDialog = false; // True if showing within a "dialog", false if not
7632 this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
7633 this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
7634 this._appendClass = "ui-datepicker-append"; // The name of the append marker class
7635 this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
7636 this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
7637 this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
7638 this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
7639 this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
7640 this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
7641 this.regional = []; // Available regional settings, indexed by language code
7642 this.regional[""] = { // Default regional settings
7643 closeText: "Done", // Display text for close link
7644 prevText: "Prev", // Display text for previous month link
7645 nextText: "Next", // Display text for next month link
7646 currentText: "Today", // Display text for current month link
7647 monthNames: ["January","February","March","April","May","June",
7648 "July","August","September","October","November","December"], // Names of months for drop-down and formatting
7649 monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
7650 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
7651 dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
7652 dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
7653 weekHeader: "Wk", // Column header for week of the year
7654 dateFormat: "mm/dd/yy", // See format options on parseDate
7655 firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
7656 isRTL: false, // True if right-to-left language, false if left-to-right
7657 showMonthAfterYear: false, // True if the year select precedes month, false for month then year
7658 yearSuffix: "" // Additional text to append to the year in the month headers
7659 };
7660 this._defaults = { // Global defaults for all the date picker instances
7661 showOn: "focus", // "focus" for popup on focus,
7662 // "button" for trigger button, or "both" for either
7663 showAnim: "fadeIn", // Name of jQuery animation for popup
7664 showOptions: {}, // Options for enhanced animations
7665 defaultDate: null, // Used when field is blank: actual date,
7666 // +/-number for offset from today, null for today
7667 appendText: "", // Display text following the input box, e.g. showing the format
7668 buttonText: "...", // Text for trigger button
7669 buttonImage: "", // URL for trigger button image
7670 buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
7671 hideIfNoPrevNext: false, // True to hide next/previous month links
7672 // if not applicable, false to just disable them
7673 navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
7674 gotoCurrent: false, // True if today link goes back to current selection instead
7675 changeMonth: false, // True if month can be selected directly, false if only prev/next
7676 changeYear: false, // True if year can be selected directly, false if only prev/next
7677 yearRange: "c-10:c+10", // Range of years to display in drop-down,
7678 // either relative to today's year (-nn:+nn), relative to currently displayed year
7679 // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
7680 showOtherMonths: false, // True to show dates in other months, false to leave blank
7681 selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
7682 showWeek: false, // True to show week of the year, false to not show it
7683 calculateWeek: this.iso8601Week, // How to calculate the week of the year,
7684 // takes a Date and returns the number of the week for it
7685 shortYearCutoff: "+10", // Short year values < this are in the current century,
7686 // > this are in the previous century,
7687 // string value starting with "+" for current year + value
7688 minDate: null, // The earliest selectable date, or null for no limit
7689 maxDate: null, // The latest selectable date, or null for no limit
7690 duration: "fast", // Duration of display/closure
7691 beforeShowDay: null, // Function that takes a date and returns an array with
7692 // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
7693 // [2] = cell title (optional), e.g. $.datepicker.noWeekends
7694 beforeShow: null, // Function that takes an input field and
7695 // returns a set of custom settings for the date picker
7696 onSelect: null, // Define a callback function when a date is selected
7697 onChangeMonthYear: null, // Define a callback function when the month or year is changed
7698 onClose: null, // Define a callback function when the datepicker is closed
7699 numberOfMonths: 1, // Number of months to show at a time
7700 showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
7701 stepMonths: 1, // Number of months to step back/forward
7702 stepBigMonths: 12, // Number of months to step back/forward for the big links
7703 altField: "", // Selector for an alternate field to store selected dates into
7704 altFormat: "", // The date format to use for the alternate field
7705 constrainInput: true, // The input is constrained by the current date format
7706 showButtonPanel: false, // True to show button panel, false to not show it
7707 autoSize: false, // True to size the input for the date format, false to leave as is
7708 disabled: false // The initial disabled state
7709 };
7710 $.extend(this._defaults, this.regional[""]);
7711 this.dpDiv = bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
7712}
7713
7714$.extend(Datepicker.prototype, {
7715 /* Class name added to elements to indicate already configured with a date picker. */
7716 markerClassName: "hasDatepicker",
7717
7718 //Keep track of the maximum number of rows displayed (see #7043)
7719 maxRows: 4,
7720
7721 // TODO rename to "widget" when switching to widget factory
7722 _widgetDatepicker: function() {
7723 return this.dpDiv;
7724 },
7725
7726 /* Override the default settings for all instances of the date picker.
7727 * @param settings object - the new settings to use as defaults (anonymous object)
7728 * @return the manager object
7729 */
7730 setDefaults: function(settings) {
7731 extendRemove(this._defaults, settings || {});
7732 return this;
7733 },
7734
7735 /* Attach the date picker to a jQuery selection.
7736 * @param target element - the target input field or division or span
7737 * @param settings object - the new settings to use for this date picker instance (anonymous)
7738 */
7739 _attachDatepicker: function(target, settings) {
7740 var nodeName, inline, inst;
7741 nodeName = target.nodeName.toLowerCase();
7742 inline = (nodeName === "div" || nodeName === "span");
7743 if (!target.id) {
7744 this.uuid += 1;
7745 target.id = "dp" + this.uuid;
7746 }
7747 inst = this._newInst($(target), inline);
7748 inst.settings = $.extend({}, settings || {});
7749 if (nodeName === "input") {
7750 this._connectDatepicker(target, inst);
7751 } else if (inline) {
7752 this._inlineDatepicker(target, inst);
7753 }
7754 },
7755
7756 /* Create a new instance object. */
7757 _newInst: function(target, inline) {
7758 var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
7759 return {id: id, input: target, // associated target
7760 selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
7761 drawMonth: 0, drawYear: 0, // month being drawn
7762 inline: inline, // is datepicker inline or not
7763 dpDiv: (!inline ? this.dpDiv : // presentation div
7764 bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
7765 },
7766
7767 /* Attach the date picker to an input field. */
7768 _connectDatepicker: function(target, inst) {
7769 var input = $(target);
7770 inst.append = $([]);
7771 inst.trigger = $([]);
7772 if (input.hasClass(this.markerClassName)) {
7773 return;
7774 }
7775 this._attachments(input, inst);
7776 input.addClass(this.markerClassName).keydown(this._doKeyDown).
7777 keypress(this._doKeyPress).keyup(this._doKeyUp);
7778 this._autoSize(inst);
7779 $.data(target, PROP_NAME, inst);
7780 //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
7781 if( inst.settings.disabled ) {
7782 this._disableDatepicker( target );
7783 }
7784 },
7785
7786 /* Make attachments based on settings. */
7787 _attachments: function(input, inst) {
7788 var showOn, buttonText, buttonImage,
7789 appendText = this._get(inst, "appendText"),
7790 isRTL = this._get(inst, "isRTL");
7791
7792 if (inst.append) {
7793 inst.append.remove();
7794 }
7795 if (appendText) {
7796 inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
7797 input[isRTL ? "before" : "after"](inst.append);
7798 }
7799
7800 input.unbind("focus", this._showDatepicker);
7801
7802 if (inst.trigger) {
7803 inst.trigger.remove();
7804 }
7805
7806 showOn = this._get(inst, "showOn");
7807 if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
7808 input.focus(this._showDatepicker);
7809 }
7810 if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
7811 buttonText = this._get(inst, "buttonText");
7812 buttonImage = this._get(inst, "buttonImage");
7813 inst.trigger = $(this._get(inst, "buttonImageOnly") ?
7814 $("<img/>").addClass(this._triggerClass).
7815 attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
7816 $("<button type='button'></button>").addClass(this._triggerClass).
7817 html(!buttonImage ? buttonText : $("<img/>").attr(
7818 { src:buttonImage, alt:buttonText, title:buttonText })));
7819 input[isRTL ? "before" : "after"](inst.trigger);
7820 inst.trigger.click(function() {
7821 if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
7822 $.datepicker._hideDatepicker();
7823 } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
7824 $.datepicker._hideDatepicker();
7825 $.datepicker._showDatepicker(input[0]);
7826 } else {
7827 $.datepicker._showDatepicker(input[0]);
7828 }
7829 return false;
7830 });
7831 }
7832 },
7833
7834 /* Apply the maximum length for the date format. */
7835 _autoSize: function(inst) {
7836 if (this._get(inst, "autoSize") && !inst.inline) {
7837 var findMax, max, maxI, i,
7838 date = new Date(2009, 12 - 1, 20), // Ensure double digits
7839 dateFormat = this._get(inst, "dateFormat");
7840
7841 if (dateFormat.match(/[DM]/)) {
7842 findMax = function(names) {
7843 max = 0;
7844 maxI = 0;
7845 for (i = 0; i < names.length; i++) {
7846 if (names[i].length > max) {
7847 max = names[i].length;
7848 maxI = i;
7849 }
7850 }
7851 return maxI;
7852 };
7853 date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
7854 "monthNames" : "monthNamesShort"))));
7855 date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
7856 "dayNames" : "dayNamesShort"))) + 20 - date.getDay());
7857 }
7858 inst.input.attr("size", this._formatDate(inst, date).length);
7859 }
7860 },
7861
7862 /* Attach an inline date picker to a div. */
7863 _inlineDatepicker: function(target, inst) {
7864 var divSpan = $(target);
7865 if (divSpan.hasClass(this.markerClassName)) {
7866 return;
7867 }
7868 divSpan.addClass(this.markerClassName).append(inst.dpDiv);
7869 $.data(target, PROP_NAME, inst);
7870 this._setDate(inst, this._getDefaultDate(inst), true);
7871 this._updateDatepicker(inst);
7872 this._updateAlternate(inst);
7873 //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
7874 if( inst.settings.disabled ) {
7875 this._disableDatepicker( target );
7876 }
7877 // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
7878 // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
7879 inst.dpDiv.css( "display", "block" );
7880 },
7881
7882 /* Pop-up the date picker in a "dialog" box.
7883 * @param input element - ignored
7884 * @param date string or Date - the initial date to display
7885 * @param onSelect function - the function to call when a date is selected
7886 * @param settings object - update the dialog date picker instance's settings (anonymous object)
7887 * @param pos int[2] - coordinates for the dialog's position within the screen or
7888 * event - with x/y coordinates or
7889 * leave empty for default (screen centre)
7890 * @return the manager object
7891 */
7892 _dialogDatepicker: function(input, date, onSelect, settings, pos) {
7893 var id, browserWidth, browserHeight, scrollX, scrollY,
7894 inst = this._dialogInst; // internal instance
7895
7896 if (!inst) {
7897 this.uuid += 1;
7898 id = "dp" + this.uuid;
7899 this._dialogInput = $("<input type='text' id='" + id +
7900 "' style='position: absolute; top: -100px; width: 0px;'/>");
7901 this._dialogInput.keydown(this._doKeyDown);
7902 $("body").append(this._dialogInput);
7903 inst = this._dialogInst = this._newInst(this._dialogInput, false);
7904 inst.settings = {};
7905 $.data(this._dialogInput[0], PROP_NAME, inst);
7906 }
7907 extendRemove(inst.settings, settings || {});
7908 date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
7909 this._dialogInput.val(date);
7910
7911 this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
7912 if (!this._pos) {
7913 browserWidth = document.documentElement.clientWidth;
7914 browserHeight = document.documentElement.clientHeight;
7915 scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
7916 scrollY = document.documentElement.scrollTop || document.body.scrollTop;
7917 this._pos = // should use actual width/height below
7918 [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
7919 }
7920
7921 // move input on screen for focus, but hidden behind dialog
7922 this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
7923 inst.settings.onSelect = onSelect;
7924 this._inDialog = true;
7925 this.dpDiv.addClass(this._dialogClass);
7926 this._showDatepicker(this._dialogInput[0]);
7927 if ($.blockUI) {
7928 $.blockUI(this.dpDiv);
7929 }
7930 $.data(this._dialogInput[0], PROP_NAME, inst);
7931 return this;
7932 },
7933
7934 /* Detach a datepicker from its control.
7935 * @param target element - the target input field or division or span
7936 */
7937 _destroyDatepicker: function(target) {
7938 var nodeName,
7939 $target = $(target),
7940 inst = $.data(target, PROP_NAME);
7941
7942 if (!$target.hasClass(this.markerClassName)) {
7943 return;
7944 }
7945
7946 nodeName = target.nodeName.toLowerCase();
7947 $.removeData(target, PROP_NAME);
7948 if (nodeName === "input") {
7949 inst.append.remove();
7950 inst.trigger.remove();
7951 $target.removeClass(this.markerClassName).
7952 unbind("focus", this._showDatepicker).
7953 unbind("keydown", this._doKeyDown).
7954 unbind("keypress", this._doKeyPress).
7955 unbind("keyup", this._doKeyUp);
7956 } else if (nodeName === "div" || nodeName === "span") {
7957 $target.removeClass(this.markerClassName).empty();
7958 }
7959 },
7960
7961 /* Enable the date picker to a jQuery selection.
7962 * @param target element - the target input field or division or span
7963 */
7964 _enableDatepicker: function(target) {
7965 var nodeName, inline,
7966 $target = $(target),
7967 inst = $.data(target, PROP_NAME);
7968
7969 if (!$target.hasClass(this.markerClassName)) {
7970 return;
7971 }
7972
7973 nodeName = target.nodeName.toLowerCase();
7974 if (nodeName === "input") {
7975 target.disabled = false;
7976 inst.trigger.filter("button").
7977 each(function() { this.disabled = false; }).end().
7978 filter("img").css({opacity: "1.0", cursor: ""});
7979 } else if (nodeName === "div" || nodeName === "span") {
7980 inline = $target.children("." + this._inlineClass);
7981 inline.children().removeClass("ui-state-disabled");
7982 inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
7983 prop("disabled", false);
7984 }
7985 this._disabledInputs = $.map(this._disabledInputs,
7986 function(value) { return (value === target ? null : value); }); // delete entry
7987 },
7988
7989 /* Disable the date picker to a jQuery selection.
7990 * @param target element - the target input field or division or span
7991 */
7992 _disableDatepicker: function(target) {
7993 var nodeName, inline,
7994 $target = $(target),
7995 inst = $.data(target, PROP_NAME);
7996
7997 if (!$target.hasClass(this.markerClassName)) {
7998 return;
7999 }
8000
8001 nodeName = target.nodeName.toLowerCase();
8002 if (nodeName === "input") {
8003 target.disabled = true;
8004 inst.trigger.filter("button").
8005 each(function() { this.disabled = true; }).end().
8006 filter("img").css({opacity: "0.5", cursor: "default"});
8007 } else if (nodeName === "div" || nodeName === "span") {
8008 inline = $target.children("." + this._inlineClass);
8009 inline.children().addClass("ui-state-disabled");
8010 inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
8011 prop("disabled", true);
8012 }
8013 this._disabledInputs = $.map(this._disabledInputs,
8014 function(value) { return (value === target ? null : value); }); // delete entry
8015 this._disabledInputs[this._disabledInputs.length] = target;
8016 },
8017
8018 /* Is the first field in a jQuery collection disabled as a datepicker?
8019 * @param target element - the target input field or division or span
8020 * @return boolean - true if disabled, false if enabled
8021 */
8022 _isDisabledDatepicker: function(target) {
8023 if (!target) {
8024 return false;
8025 }
8026 for (var i = 0; i < this._disabledInputs.length; i++) {
8027 if (this._disabledInputs[i] === target) {
8028 return true;
8029 }
8030 }
8031 return false;
8032 },
8033
8034 /* Retrieve the instance data for the target control.
8035 * @param target element - the target input field or division or span
8036 * @return object - the associated instance data
8037 * @throws error if a jQuery problem getting data
8038 */
8039 _getInst: function(target) {
8040 try {
8041 return $.data(target, PROP_NAME);
8042 }
8043 catch (err) {
8044 throw "Missing instance data for this datepicker";
8045 }
8046 },
8047
8048 /* Update or retrieve the settings for a date picker attached to an input field or division.
8049 * @param target element - the target input field or division or span
8050 * @param name object - the new settings to update or
8051 * string - the name of the setting to change or retrieve,
8052 * when retrieving also "all" for all instance settings or
8053 * "defaults" for all global defaults
8054 * @param value any - the new value for the setting
8055 * (omit if above is an object or to retrieve a value)
8056 */
8057 _optionDatepicker: function(target, name, value) {
8058 var settings, date, minDate, maxDate,
8059 inst = this._getInst(target);
8060
8061 if (arguments.length === 2 && typeof name === "string") {
8062 return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
8063 (inst ? (name === "all" ? $.extend({}, inst.settings) :
8064 this._get(inst, name)) : null));
8065 }
8066
8067 settings = name || {};
8068 if (typeof name === "string") {
8069 settings = {};
8070 settings[name] = value;
8071 }
8072
8073 if (inst) {
8074 if (this._curInst === inst) {
8075 this._hideDatepicker();
8076 }
8077
8078 date = this._getDateDatepicker(target, true);
8079 minDate = this._getMinMaxDate(inst, "min");
8080 maxDate = this._getMinMaxDate(inst, "max");
8081 extendRemove(inst.settings, settings);
8082 // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
8083 if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
8084 inst.settings.minDate = this._formatDate(inst, minDate);
8085 }
8086 if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
8087 inst.settings.maxDate = this._formatDate(inst, maxDate);
8088 }
8089 if ( "disabled" in settings ) {
8090 if ( settings.disabled ) {
8091 this._disableDatepicker(target);
8092 } else {
8093 this._enableDatepicker(target);
8094 }
8095 }
8096 this._attachments($(target), inst);
8097 this._autoSize(inst);
8098 this._setDate(inst, date);
8099 this._updateAlternate(inst);
8100 this._updateDatepicker(inst);
8101 }
8102 },
8103
8104 // change method deprecated
8105 _changeDatepicker: function(target, name, value) {
8106 this._optionDatepicker(target, name, value);
8107 },
8108
8109 /* Redraw the date picker attached to an input field or division.
8110 * @param target element - the target input field or division or span
8111 */
8112 _refreshDatepicker: function(target) {
8113 var inst = this._getInst(target);
8114 if (inst) {
8115 this._updateDatepicker(inst);
8116 }
8117 },
8118
8119 /* Set the dates for a jQuery selection.
8120 * @param target element - the target input field or division or span
8121 * @param date Date - the new date
8122 */
8123 _setDateDatepicker: function(target, date) {
8124 var inst = this._getInst(target);
8125 if (inst) {
8126 this._setDate(inst, date);
8127 this._updateDatepicker(inst);
8128 this._updateAlternate(inst);
8129 }
8130 },
8131
8132 /* Get the date(s) for the first entry in a jQuery selection.
8133 * @param target element - the target input field or division or span
8134 * @param noDefault boolean - true if no default date is to be used
8135 * @return Date - the current date
8136 */
8137 _getDateDatepicker: function(target, noDefault) {
8138 var inst = this._getInst(target);
8139 if (inst && !inst.inline) {
8140 this._setDateFromField(inst, noDefault);
8141 }
8142 return (inst ? this._getDate(inst) : null);
8143 },
8144
8145 /* Handle keystrokes. */
8146 _doKeyDown: function(event) {
8147 var onSelect, dateStr, sel,
8148 inst = $.datepicker._getInst(event.target),
8149 handled = true,
8150 isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
8151
8152 inst._keyEvent = true;
8153 if ($.datepicker._datepickerShowing) {
8154 switch (event.keyCode) {
8155 case 9: $.datepicker._hideDatepicker();
8156 handled = false;
8157 break; // hide on tab out
8158 case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
8159 $.datepicker._currentClass + ")", inst.dpDiv);
8160 if (sel[0]) {
8161 $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
8162 }
8163
8164 onSelect = $.datepicker._get(inst, "onSelect");
8165 if (onSelect) {
8166 dateStr = $.datepicker._formatDate(inst);
8167
8168 // trigger custom callback
8169 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
8170 } else {
8171 $.datepicker._hideDatepicker();
8172 }
8173
8174 return false; // don't submit the form
8175 case 27: $.datepicker._hideDatepicker();
8176 break; // hide on escape
8177 case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8178 -$.datepicker._get(inst, "stepBigMonths") :
8179 -$.datepicker._get(inst, "stepMonths")), "M");
8180 break; // previous month/year on page up/+ ctrl
8181 case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8182 +$.datepicker._get(inst, "stepBigMonths") :
8183 +$.datepicker._get(inst, "stepMonths")), "M");
8184 break; // next month/year on page down/+ ctrl
8185 case 35: if (event.ctrlKey || event.metaKey) {
8186 $.datepicker._clearDate(event.target);
8187 }
8188 handled = event.ctrlKey || event.metaKey;
8189 break; // clear on ctrl or command +end
8190 case 36: if (event.ctrlKey || event.metaKey) {
8191 $.datepicker._gotoToday(event.target);
8192 }
8193 handled = event.ctrlKey || event.metaKey;
8194 break; // current on ctrl or command +home
8195 case 37: if (event.ctrlKey || event.metaKey) {
8196 $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
8197 }
8198 handled = event.ctrlKey || event.metaKey;
8199 // -1 day on ctrl or command +left
8200 if (event.originalEvent.altKey) {
8201 $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8202 -$.datepicker._get(inst, "stepBigMonths") :
8203 -$.datepicker._get(inst, "stepMonths")), "M");
8204 }
8205 // next month/year on alt +left on Mac
8206 break;
8207 case 38: if (event.ctrlKey || event.metaKey) {
8208 $.datepicker._adjustDate(event.target, -7, "D");
8209 }
8210 handled = event.ctrlKey || event.metaKey;
8211 break; // -1 week on ctrl or command +up
8212 case 39: if (event.ctrlKey || event.metaKey) {
8213 $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
8214 }
8215 handled = event.ctrlKey || event.metaKey;
8216 // +1 day on ctrl or command +right
8217 if (event.originalEvent.altKey) {
8218 $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8219 +$.datepicker._get(inst, "stepBigMonths") :
8220 +$.datepicker._get(inst, "stepMonths")), "M");
8221 }
8222 // next month/year on alt +right
8223 break;
8224 case 40: if (event.ctrlKey || event.metaKey) {
8225 $.datepicker._adjustDate(event.target, +7, "D");
8226 }
8227 handled = event.ctrlKey || event.metaKey;
8228 break; // +1 week on ctrl or command +down
8229 default: handled = false;
8230 }
8231 } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
8232 $.datepicker._showDatepicker(this);
8233 } else {
8234 handled = false;
8235 }
8236
8237 if (handled) {
8238 event.preventDefault();
8239 event.stopPropagation();
8240 }
8241 },
8242
8243 /* Filter entered characters - based on date format. */
8244 _doKeyPress: function(event) {
8245 var chars, chr,
8246 inst = $.datepicker._getInst(event.target);
8247
8248 if ($.datepicker._get(inst, "constrainInput")) {
8249 chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
8250 chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
8251 return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
8252 }
8253 },
8254
8255 /* Synchronise manual entry and field/alternate field. */
8256 _doKeyUp: function(event) {
8257 var date,
8258 inst = $.datepicker._getInst(event.target);
8259
8260 if (inst.input.val() !== inst.lastVal) {
8261 try {
8262 date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
8263 (inst.input ? inst.input.val() : null),
8264 $.datepicker._getFormatConfig(inst));
8265
8266 if (date) { // only if valid
8267 $.datepicker._setDateFromField(inst);
8268 $.datepicker._updateAlternate(inst);
8269 $.datepicker._updateDatepicker(inst);
8270 }
8271 }
8272 catch (err) {
8273 }
8274 }
8275 return true;
8276 },
8277
8278 /* Pop-up the date picker for a given input field.
8279 * If false returned from beforeShow event handler do not show.
8280 * @param input element - the input field attached to the date picker or
8281 * event - if triggered by focus
8282 */
8283 _showDatepicker: function(input) {
8284 input = input.target || input;
8285 if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
8286 input = $("input", input.parentNode)[0];
8287 }
8288
8289 if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
8290 return;
8291 }
8292
8293 var inst, beforeShow, beforeShowSettings, isFixed,
8294 offset, showAnim, duration;
8295
8296 inst = $.datepicker._getInst(input);
8297 if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
8298 $.datepicker._curInst.dpDiv.stop(true, true);
8299 if ( inst && $.datepicker._datepickerShowing ) {
8300 $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
8301 }
8302 }
8303
8304 beforeShow = $.datepicker._get(inst, "beforeShow");
8305 beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
8306 if(beforeShowSettings === false){
8307 return;
8308 }
8309 extendRemove(inst.settings, beforeShowSettings);
8310
8311 inst.lastVal = null;
8312 $.datepicker._lastInput = input;
8313 $.datepicker._setDateFromField(inst);
8314
8315 if ($.datepicker._inDialog) { // hide cursor
8316 input.value = "";
8317 }
8318 if (!$.datepicker._pos) { // position below input
8319 $.datepicker._pos = $.datepicker._findPos(input);
8320 $.datepicker._pos[1] += input.offsetHeight; // add the height
8321 }
8322
8323 isFixed = false;
8324 $(input).parents().each(function() {
8325 isFixed |= $(this).css("position") === "fixed";
8326 return !isFixed;
8327 });
8328
8329 offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
8330 $.datepicker._pos = null;
8331 //to avoid flashes on Firefox
8332 inst.dpDiv.empty();
8333 // determine sizing offscreen
8334 inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
8335 $.datepicker._updateDatepicker(inst);
8336 // fix width for dynamic number of date pickers
8337 // and adjust position before showing
8338 offset = $.datepicker._checkOffset(inst, offset, isFixed);
8339 inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
8340 "static" : (isFixed ? "fixed" : "absolute")), display: "none",
8341 left: offset.left + "px", top: offset.top + "px"});
8342
8343 if (!inst.inline) {
8344 showAnim = $.datepicker._get(inst, "showAnim");
8345 duration = $.datepicker._get(inst, "duration");
8346 inst.dpDiv.zIndex($(input).zIndex()+1);
8347 $.datepicker._datepickerShowing = true;
8348
8349 if ( $.effects && $.effects.effect[ showAnim ] ) {
8350 inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
8351 } else {
8352 inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
8353 }
8354
8355 if ( $.datepicker._shouldFocusInput( inst ) ) {
8356 inst.input.focus();
8357 }
8358
8359 $.datepicker._curInst = inst;
8360 }
8361 },
8362
8363 /* Generate the date picker content. */
8364 _updateDatepicker: function(inst) {
8365 this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
8366 instActive = inst; // for delegate hover events
8367 inst.dpDiv.empty().append(this._generateHTML(inst));
8368 this._attachHandlers(inst);
8369 inst.dpDiv.find("." + this._dayOverClass + " a").mouseover();
8370
8371 var origyearshtml,
8372 numMonths = this._getNumberOfMonths(inst),
8373 cols = numMonths[1],
8374 width = 17;
8375
8376 inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
8377 if (cols > 1) {
8378 inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
8379 }
8380 inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
8381 "Class"]("ui-datepicker-multi");
8382 inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
8383 "Class"]("ui-datepicker-rtl");
8384
8385 if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
8386 inst.input.focus();
8387 }
8388
8389 // deffered render of the years select (to avoid flashes on Firefox)
8390 if( inst.yearshtml ){
8391 origyearshtml = inst.yearshtml;
8392 setTimeout(function(){
8393 //assure that inst.yearshtml didn't change.
8394 if( origyearshtml === inst.yearshtml && inst.yearshtml ){
8395 inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
8396 }
8397 origyearshtml = inst.yearshtml = null;
8398 }, 0);
8399 }
8400 },
8401
8402 // #6694 - don't focus the input if it's already focused
8403 // this breaks the change event in IE
8404 // Support: IE and jQuery <1.9
8405 _shouldFocusInput: function( inst ) {
8406 return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
8407 },
8408
8409 /* Check positioning to remain on screen. */
8410 _checkOffset: function(inst, offset, isFixed) {
8411 var dpWidth = inst.dpDiv.outerWidth(),
8412 dpHeight = inst.dpDiv.outerHeight(),
8413 inputWidth = inst.input ? inst.input.outerWidth() : 0,
8414 inputHeight = inst.input ? inst.input.outerHeight() : 0,
8415 viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
8416 viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
8417
8418 offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
8419 offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
8420 offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
8421
8422 // now check if datepicker is showing outside window viewport - move to a better place if so.
8423 offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
8424 Math.abs(offset.left + dpWidth - viewWidth) : 0);
8425 offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
8426 Math.abs(dpHeight + inputHeight) : 0);
8427
8428 return offset;
8429 },
8430
8431 /* Find an object's position on the screen. */
8432 _findPos: function(obj) {
8433 var position,
8434 inst = this._getInst(obj),
8435 isRTL = this._get(inst, "isRTL");
8436
8437 while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
8438 obj = obj[isRTL ? "previousSibling" : "nextSibling"];
8439 }
8440
8441 position = $(obj).offset();
8442 return [position.left, position.top];
8443 },
8444
8445 /* Hide the date picker from view.
8446 * @param input element - the input field attached to the date picker
8447 */
8448 _hideDatepicker: function(input) {
8449 var showAnim, duration, postProcess, onClose,
8450 inst = this._curInst;
8451
8452 if (!inst || (input && inst !== $.data(input, PROP_NAME))) {
8453 return;
8454 }
8455
8456 if (this._datepickerShowing) {
8457 showAnim = this._get(inst, "showAnim");
8458 duration = this._get(inst, "duration");
8459 postProcess = function() {
8460 $.datepicker._tidyDialog(inst);
8461 };
8462
8463 // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
8464 if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
8465 inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
8466 } else {
8467 inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
8468 (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
8469 }
8470
8471 if (!showAnim) {
8472 postProcess();
8473 }
8474 this._datepickerShowing = false;
8475
8476 onClose = this._get(inst, "onClose");
8477 if (onClose) {
8478 onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
8479 }
8480
8481 this._lastInput = null;
8482 if (this._inDialog) {
8483 this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
8484 if ($.blockUI) {
8485 $.unblockUI();
8486 $("body").append(this.dpDiv);
8487 }
8488 }
8489 this._inDialog = false;
8490 }
8491 },
8492
8493 /* Tidy up after a dialog display. */
8494 _tidyDialog: function(inst) {
8495 inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
8496 },
8497
8498 /* Close date picker if clicked elsewhere. */
8499 _checkExternalClick: function(event) {
8500 if (!$.datepicker._curInst) {
8501 return;
8502 }
8503
8504 var $target = $(event.target),
8505 inst = $.datepicker._getInst($target[0]);
8506
8507 if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
8508 $target.parents("#" + $.datepicker._mainDivId).length === 0 &&
8509 !$target.hasClass($.datepicker.markerClassName) &&
8510 !$target.closest("." + $.datepicker._triggerClass).length &&
8511 $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
8512 ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
8513 $.datepicker._hideDatepicker();
8514 }
8515 },
8516
8517 /* Adjust one of the date sub-fields. */
8518 _adjustDate: function(id, offset, period) {
8519 var target = $(id),
8520 inst = this._getInst(target[0]);
8521
8522 if (this._isDisabledDatepicker(target[0])) {
8523 return;
8524 }
8525 this._adjustInstDate(inst, offset +
8526 (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
8527 period);
8528 this._updateDatepicker(inst);
8529 },
8530
8531 /* Action for current link. */
8532 _gotoToday: function(id) {
8533 var date,
8534 target = $(id),
8535 inst = this._getInst(target[0]);
8536
8537 if (this._get(inst, "gotoCurrent") && inst.currentDay) {
8538 inst.selectedDay = inst.currentDay;
8539 inst.drawMonth = inst.selectedMonth = inst.currentMonth;
8540 inst.drawYear = inst.selectedYear = inst.currentYear;
8541 } else {
8542 date = new Date();
8543 inst.selectedDay = date.getDate();
8544 inst.drawMonth = inst.selectedMonth = date.getMonth();
8545 inst.drawYear = inst.selectedYear = date.getFullYear();
8546 }
8547 this._notifyChange(inst);
8548 this._adjustDate(target);
8549 },
8550
8551 /* Action for selecting a new month/year. */
8552 _selectMonthYear: function(id, select, period) {
8553 var target = $(id),
8554 inst = this._getInst(target[0]);
8555
8556 inst["selected" + (period === "M" ? "Month" : "Year")] =
8557 inst["draw" + (period === "M" ? "Month" : "Year")] =
8558 parseInt(select.options[select.selectedIndex].value,10);
8559
8560 this._notifyChange(inst);
8561 this._adjustDate(target);
8562 },
8563
8564 /* Action for selecting a day. */
8565 _selectDay: function(id, month, year, td) {
8566 var inst,
8567 target = $(id);
8568
8569 if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
8570 return;
8571 }
8572
8573 inst = this._getInst(target[0]);
8574 inst.selectedDay = inst.currentDay = $("a", td).html();
8575 inst.selectedMonth = inst.currentMonth = month;
8576 inst.selectedYear = inst.currentYear = year;
8577 this._selectDate(id, this._formatDate(inst,
8578 inst.currentDay, inst.currentMonth, inst.currentYear));
8579 },
8580
8581 /* Erase the input field and hide the date picker. */
8582 _clearDate: function(id) {
8583 var target = $(id);
8584 this._selectDate(target, "");
8585 },
8586
8587 /* Update the input field with the selected date. */
8588 _selectDate: function(id, dateStr) {
8589 var onSelect,
8590 target = $(id),
8591 inst = this._getInst(target[0]);
8592
8593 dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
8594 if (inst.input) {
8595 inst.input.val(dateStr);
8596 }
8597 this._updateAlternate(inst);
8598
8599 onSelect = this._get(inst, "onSelect");
8600 if (onSelect) {
8601 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
8602 } else if (inst.input) {
8603 inst.input.trigger("change"); // fire the change event
8604 }
8605
8606 if (inst.inline){
8607 this._updateDatepicker(inst);
8608 } else {
8609 this._hideDatepicker();
8610 this._lastInput = inst.input[0];
8611 if (typeof(inst.input[0]) !== "object") {
8612 inst.input.focus(); // restore focus
8613 }
8614 this._lastInput = null;
8615 }
8616 },
8617
8618 /* Update any alternate field to synchronise with the main field. */
8619 _updateAlternate: function(inst) {
8620 var altFormat, date, dateStr,
8621 altField = this._get(inst, "altField");
8622
8623 if (altField) { // update alternate field too
8624 altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
8625 date = this._getDate(inst);
8626 dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
8627 $(altField).each(function() { $(this).val(dateStr); });
8628 }
8629 },
8630
8631 /* Set as beforeShowDay function to prevent selection of weekends.
8632 * @param date Date - the date to customise
8633 * @return [boolean, string] - is this date selectable?, what is its CSS class?
8634 */
8635 noWeekends: function(date) {
8636 var day = date.getDay();
8637 return [(day > 0 && day < 6), ""];
8638 },
8639
8640 /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
8641 * @param date Date - the date to get the week for
8642 * @return number - the number of the week within the year that contains this date
8643 */
8644 iso8601Week: function(date) {
8645 var time,
8646 checkDate = new Date(date.getTime());
8647
8648 // Find Thursday of this week starting on Monday
8649 checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
8650
8651 time = checkDate.getTime();
8652 checkDate.setMonth(0); // Compare with Jan 1
8653 checkDate.setDate(1);
8654 return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
8655 },
8656
8657 /* Parse a string value into a date object.
8658 * See formatDate below for the possible formats.
8659 *
8660 * @param format string - the expected format of the date
8661 * @param value string - the date in the above format
8662 * @param settings Object - attributes include:
8663 * shortYearCutoff number - the cutoff year for determining the century (optional)
8664 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
8665 * dayNames string[7] - names of the days from Sunday (optional)
8666 * monthNamesShort string[12] - abbreviated names of the months (optional)
8667 * monthNames string[12] - names of the months (optional)
8668 * @return Date - the extracted date value or null if value is blank
8669 */
8670 parseDate: function (format, value, settings) {
8671 if (format == null || value == null) {
8672 throw "Invalid arguments";
8673 }
8674
8675 value = (typeof value === "object" ? value.toString() : value + "");
8676 if (value === "") {
8677 return null;
8678 }
8679
8680 var iFormat, dim, extra,
8681 iValue = 0,
8682 shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
8683 shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
8684 new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
8685 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
8686 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
8687 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
8688 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
8689 year = -1,
8690 month = -1,
8691 day = -1,
8692 doy = -1,
8693 literal = false,
8694 date,
8695 // Check whether a format character is doubled
8696 lookAhead = function(match) {
8697 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
8698 if (matches) {
8699 iFormat++;
8700 }
8701 return matches;
8702 },
8703 // Extract a number from the string value
8704 getNumber = function(match) {
8705 var isDoubled = lookAhead(match),
8706 size = (match === "@" ? 14 : (match === "!" ? 20 :
8707 (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
8708 digits = new RegExp("^\\d{1," + size + "}"),
8709 num = value.substring(iValue).match(digits);
8710 if (!num) {
8711 throw "Missing number at position " + iValue;
8712 }
8713 iValue += num[0].length;
8714 return parseInt(num[0], 10);
8715 },
8716 // Extract a name from the string value and convert to an index
8717 getName = function(match, shortNames, longNames) {
8718 var index = -1,
8719 names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
8720 return [ [k, v] ];
8721 }).sort(function (a, b) {
8722 return -(a[1].length - b[1].length);
8723 });
8724
8725 $.each(names, function (i, pair) {
8726 var name = pair[1];
8727 if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
8728 index = pair[0];
8729 iValue += name.length;
8730 return false;
8731 }
8732 });
8733 if (index !== -1) {
8734 return index + 1;
8735 } else {
8736 throw "Unknown name at position " + iValue;
8737 }
8738 },
8739 // Confirm that a literal character matches the string value
8740 checkLiteral = function() {
8741 if (value.charAt(iValue) !== format.charAt(iFormat)) {
8742 throw "Unexpected literal at position " + iValue;
8743 }
8744 iValue++;
8745 };
8746
8747 for (iFormat = 0; iFormat < format.length; iFormat++) {
8748 if (literal) {
8749 if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
8750 literal = false;
8751 } else {
8752 checkLiteral();
8753 }
8754 } else {
8755 switch (format.charAt(iFormat)) {
8756 case "d":
8757 day = getNumber("d");
8758 break;
8759 case "D":
8760 getName("D", dayNamesShort, dayNames);
8761 break;
8762 case "o":
8763 doy = getNumber("o");
8764 break;
8765 case "m":
8766 month = getNumber("m");
8767 break;
8768 case "M":
8769 month = getName("M", monthNamesShort, monthNames);
8770 break;
8771 case "y":
8772 year = getNumber("y");
8773 break;
8774 case "@":
8775 date = new Date(getNumber("@"));
8776 year = date.getFullYear();
8777 month = date.getMonth() + 1;
8778 day = date.getDate();
8779 break;
8780 case "!":
8781 date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
8782 year = date.getFullYear();
8783 month = date.getMonth() + 1;
8784 day = date.getDate();
8785 break;
8786 case "'":
8787 if (lookAhead("'")){
8788 checkLiteral();
8789 } else {
8790 literal = true;
8791 }
8792 break;
8793 default:
8794 checkLiteral();
8795 }
8796 }
8797 }
8798
8799 if (iValue < value.length){
8800 extra = value.substr(iValue);
8801 if (!/^\s+/.test(extra)) {
8802 throw "Extra/unparsed characters found in date: " + extra;
8803 }
8804 }
8805
8806 if (year === -1) {
8807 year = new Date().getFullYear();
8808 } else if (year < 100) {
8809 year += new Date().getFullYear() - new Date().getFullYear() % 100 +
8810 (year <= shortYearCutoff ? 0 : -100);
8811 }
8812
8813 if (doy > -1) {
8814 month = 1;
8815 day = doy;
8816 do {
8817 dim = this._getDaysInMonth(year, month - 1);
8818 if (day <= dim) {
8819 break;
8820 }
8821 month++;
8822 day -= dim;
8823 } while (true);
8824 }
8825
8826 date = this._daylightSavingAdjust(new Date(year, month - 1, day));
8827 if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
8828 throw "Invalid date"; // E.g. 31/02/00
8829 }
8830 return date;
8831 },
8832
8833 /* Standard date formats. */
8834 ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
8835 COOKIE: "D, dd M yy",
8836 ISO_8601: "yy-mm-dd",
8837 RFC_822: "D, d M y",
8838 RFC_850: "DD, dd-M-y",
8839 RFC_1036: "D, d M y",
8840 RFC_1123: "D, d M yy",
8841 RFC_2822: "D, d M yy",
8842 RSS: "D, d M y", // RFC 822
8843 TICKS: "!",
8844 TIMESTAMP: "@",
8845 W3C: "yy-mm-dd", // ISO 8601
8846
8847 _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
8848 Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
8849
8850 /* Format a date object into a string value.
8851 * The format can be combinations of the following:
8852 * d - day of month (no leading zero)
8853 * dd - day of month (two digit)
8854 * o - day of year (no leading zeros)
8855 * oo - day of year (three digit)
8856 * D - day name short
8857 * DD - day name long
8858 * m - month of year (no leading zero)
8859 * mm - month of year (two digit)
8860 * M - month name short
8861 * MM - month name long
8862 * y - year (two digit)
8863 * yy - year (four digit)
8864 * @ - Unix timestamp (ms since 01/01/1970)
8865 * ! - Windows ticks (100ns since 01/01/0001)
8866 * "..." - literal text
8867 * '' - single quote
8868 *
8869 * @param format string - the desired format of the date
8870 * @param date Date - the date value to format
8871 * @param settings Object - attributes include:
8872 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
8873 * dayNames string[7] - names of the days from Sunday (optional)
8874 * monthNamesShort string[12] - abbreviated names of the months (optional)
8875 * monthNames string[12] - names of the months (optional)
8876 * @return string - the date in the above format
8877 */
8878 formatDate: function (format, date, settings) {
8879 if (!date) {
8880 return "";
8881 }
8882
8883 var iFormat,
8884 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
8885 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
8886 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
8887 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
8888 // Check whether a format character is doubled
8889 lookAhead = function(match) {
8890 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
8891 if (matches) {
8892 iFormat++;
8893 }
8894 return matches;
8895 },
8896 // Format a number, with leading zero if necessary
8897 formatNumber = function(match, value, len) {
8898 var num = "" + value;
8899 if (lookAhead(match)) {
8900 while (num.length < len) {
8901 num = "0" + num;
8902 }
8903 }
8904 return num;
8905 },
8906 // Format a name, short or long as requested
8907 formatName = function(match, value, shortNames, longNames) {
8908 return (lookAhead(match) ? longNames[value] : shortNames[value]);
8909 },
8910 output = "",
8911 literal = false;
8912
8913 if (date) {
8914 for (iFormat = 0; iFormat < format.length; iFormat++) {
8915 if (literal) {
8916 if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
8917 literal = false;
8918 } else {
8919 output += format.charAt(iFormat);
8920 }
8921 } else {
8922 switch (format.charAt(iFormat)) {
8923 case "d":
8924 output += formatNumber("d", date.getDate(), 2);
8925 break;
8926 case "D":
8927 output += formatName("D", date.getDay(), dayNamesShort, dayNames);
8928 break;
8929 case "o":
8930 output += formatNumber("o",
8931 Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
8932 break;
8933 case "m":
8934 output += formatNumber("m", date.getMonth() + 1, 2);
8935 break;
8936 case "M":
8937 output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
8938 break;
8939 case "y":
8940 output += (lookAhead("y") ? date.getFullYear() :
8941 (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
8942 break;
8943 case "@":
8944 output += date.getTime();
8945 break;
8946 case "!":
8947 output += date.getTime() * 10000 + this._ticksTo1970;
8948 break;
8949 case "'":
8950 if (lookAhead("'")) {
8951 output += "'";
8952 } else {
8953 literal = true;
8954 }
8955 break;
8956 default:
8957 output += format.charAt(iFormat);
8958 }
8959 }
8960 }
8961 }
8962 return output;
8963 },
8964
8965 /* Extract all possible characters from the date format. */
8966 _possibleChars: function (format) {
8967 var iFormat,
8968 chars = "",
8969 literal = false,
8970 // Check whether a format character is doubled
8971 lookAhead = function(match) {
8972 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
8973 if (matches) {
8974 iFormat++;
8975 }
8976 return matches;
8977 };
8978
8979 for (iFormat = 0; iFormat < format.length; iFormat++) {
8980 if (literal) {
8981 if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
8982 literal = false;
8983 } else {
8984 chars += format.charAt(iFormat);
8985 }
8986 } else {
8987 switch (format.charAt(iFormat)) {
8988 case "d": case "m": case "y": case "@":
8989 chars += "0123456789";
8990 break;
8991 case "D": case "M":
8992 return null; // Accept anything
8993 case "'":
8994 if (lookAhead("'")) {
8995 chars += "'";
8996 } else {
8997 literal = true;
8998 }
8999 break;
9000 default:
9001 chars += format.charAt(iFormat);
9002 }
9003 }
9004 }
9005 return chars;
9006 },
9007
9008 /* Get a setting value, defaulting if necessary. */
9009 _get: function(inst, name) {
9010 return inst.settings[name] !== undefined ?
9011 inst.settings[name] : this._defaults[name];
9012 },
9013
9014 /* Parse existing date and initialise date picker. */
9015 _setDateFromField: function(inst, noDefault) {
9016 if (inst.input.val() === inst.lastVal) {
9017 return;
9018 }
9019
9020 var dateFormat = this._get(inst, "dateFormat"),
9021 dates = inst.lastVal = inst.input ? inst.input.val() : null,
9022 defaultDate = this._getDefaultDate(inst),
9023 date = defaultDate,
9024 settings = this._getFormatConfig(inst);
9025
9026 try {
9027 date = this.parseDate(dateFormat, dates, settings) || defaultDate;
9028 } catch (event) {
9029 dates = (noDefault ? "" : dates);
9030 }
9031 inst.selectedDay = date.getDate();
9032 inst.drawMonth = inst.selectedMonth = date.getMonth();
9033 inst.drawYear = inst.selectedYear = date.getFullYear();
9034 inst.currentDay = (dates ? date.getDate() : 0);
9035 inst.currentMonth = (dates ? date.getMonth() : 0);
9036 inst.currentYear = (dates ? date.getFullYear() : 0);
9037 this._adjustInstDate(inst);
9038 },
9039
9040 /* Retrieve the default date shown on opening. */
9041 _getDefaultDate: function(inst) {
9042 return this._restrictMinMax(inst,
9043 this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
9044 },
9045
9046 /* A date may be specified as an exact value or a relative one. */
9047 _determineDate: function(inst, date, defaultDate) {
9048 var offsetNumeric = function(offset) {
9049 var date = new Date();
9050 date.setDate(date.getDate() + offset);
9051 return date;
9052 },
9053 offsetString = function(offset) {
9054 try {
9055 return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
9056 offset, $.datepicker._getFormatConfig(inst));
9057 }
9058 catch (e) {
9059 // Ignore
9060 }
9061
9062 var date = (offset.toLowerCase().match(/^c/) ?
9063 $.datepicker._getDate(inst) : null) || new Date(),
9064 year = date.getFullYear(),
9065 month = date.getMonth(),
9066 day = date.getDate(),
9067 pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
9068 matches = pattern.exec(offset);
9069
9070 while (matches) {
9071 switch (matches[2] || "d") {
9072 case "d" : case "D" :
9073 day += parseInt(matches[1],10); break;
9074 case "w" : case "W" :
9075 day += parseInt(matches[1],10) * 7; break;
9076 case "m" : case "M" :
9077 month += parseInt(matches[1],10);
9078 day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
9079 break;
9080 case "y": case "Y" :
9081 year += parseInt(matches[1],10);
9082 day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
9083 break;
9084 }
9085 matches = pattern.exec(offset);
9086 }
9087 return new Date(year, month, day);
9088 },
9089 newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
9090 (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
9091
9092 newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
9093 if (newDate) {
9094 newDate.setHours(0);
9095 newDate.setMinutes(0);
9096 newDate.setSeconds(0);
9097 newDate.setMilliseconds(0);
9098 }
9099 return this._daylightSavingAdjust(newDate);
9100 },
9101
9102 /* Handle switch to/from daylight saving.
9103 * Hours may be non-zero on daylight saving cut-over:
9104 * > 12 when midnight changeover, but then cannot generate
9105 * midnight datetime, so jump to 1AM, otherwise reset.
9106 * @param date (Date) the date to check
9107 * @return (Date) the corrected date
9108 */
9109 _daylightSavingAdjust: function(date) {
9110 if (!date) {
9111 return null;
9112 }
9113 date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
9114 return date;
9115 },
9116
9117 /* Set the date(s) directly. */
9118 _setDate: function(inst, date, noChange) {
9119 var clear = !date,
9120 origMonth = inst.selectedMonth,
9121 origYear = inst.selectedYear,
9122 newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
9123
9124 inst.selectedDay = inst.currentDay = newDate.getDate();
9125 inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
9126 inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
9127 if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
9128 this._notifyChange(inst);
9129 }
9130 this._adjustInstDate(inst);
9131 if (inst.input) {
9132 inst.input.val(clear ? "" : this._formatDate(inst));
9133 }
9134 },
9135
9136 /* Retrieve the date(s) directly. */
9137 _getDate: function(inst) {
9138 var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
9139 this._daylightSavingAdjust(new Date(
9140 inst.currentYear, inst.currentMonth, inst.currentDay)));
9141 return startDate;
9142 },
9143
9144 /* Attach the onxxx handlers. These are declared statically so
9145 * they work with static code transformers like Caja.
9146 */
9147 _attachHandlers: function(inst) {
9148 var stepMonths = this._get(inst, "stepMonths"),
9149 id = "#" + inst.id.replace( /\\\\/g, "\\" );
9150 inst.dpDiv.find("[data-handler]").map(function () {
9151 var handler = {
9152 prev: function () {
9153 $.datepicker._adjustDate(id, -stepMonths, "M");
9154 },
9155 next: function () {
9156 $.datepicker._adjustDate(id, +stepMonths, "M");
9157 },
9158 hide: function () {
9159 $.datepicker._hideDatepicker();
9160 },
9161 today: function () {
9162 $.datepicker._gotoToday(id);
9163 },
9164 selectDay: function () {
9165 $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
9166 return false;
9167 },
9168 selectMonth: function () {
9169 $.datepicker._selectMonthYear(id, this, "M");
9170 return false;
9171 },
9172 selectYear: function () {
9173 $.datepicker._selectMonthYear(id, this, "Y");
9174 return false;
9175 }
9176 };
9177 $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
9178 });
9179 },
9180
9181 /* Generate the HTML for the current state of the date picker. */
9182 _generateHTML: function(inst) {
9183 var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
9184 controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
9185 monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
9186 selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
9187 cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
9188 printDate, dRow, tbody, daySettings, otherMonth, unselectable,
9189 tempDate = new Date(),
9190 today = this._daylightSavingAdjust(
9191 new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
9192 isRTL = this._get(inst, "isRTL"),
9193 showButtonPanel = this._get(inst, "showButtonPanel"),
9194 hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
9195 navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
9196 numMonths = this._getNumberOfMonths(inst),
9197 showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
9198 stepMonths = this._get(inst, "stepMonths"),
9199 isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
9200 currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
9201 new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
9202 minDate = this._getMinMaxDate(inst, "min"),
9203 maxDate = this._getMinMaxDate(inst, "max"),
9204 drawMonth = inst.drawMonth - showCurrentAtPos,
9205 drawYear = inst.drawYear;
9206
9207 if (drawMonth < 0) {
9208 drawMonth += 12;
9209 drawYear--;
9210 }
9211 if (maxDate) {
9212 maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
9213 maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
9214 maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
9215 while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
9216 drawMonth--;
9217 if (drawMonth < 0) {
9218 drawMonth = 11;
9219 drawYear--;
9220 }
9221 }
9222 }
9223 inst.drawMonth = drawMonth;
9224 inst.drawYear = drawYear;
9225
9226 prevText = this._get(inst, "prevText");
9227 prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
9228 this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
9229 this._getFormatConfig(inst)));
9230
9231 prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
9232 "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
9233 " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
9234 (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
9235
9236 nextText = this._get(inst, "nextText");
9237 nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
9238 this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
9239 this._getFormatConfig(inst)));
9240
9241 next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
9242 "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
9243 " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
9244 (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
9245
9246 currentText = this._get(inst, "currentText");
9247 gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
9248 currentText = (!navigationAsDateFormat ? currentText :
9249 this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
9250
9251 controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
9252 this._get(inst, "closeText") + "</button>" : "");
9253
9254 buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
9255 (this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
9256 ">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
9257
9258 firstDay = parseInt(this._get(inst, "firstDay"),10);
9259 firstDay = (isNaN(firstDay) ? 0 : firstDay);
9260
9261 showWeek = this._get(inst, "showWeek");
9262 dayNames = this._get(inst, "dayNames");
9263 dayNamesMin = this._get(inst, "dayNamesMin");
9264 monthNames = this._get(inst, "monthNames");
9265 monthNamesShort = this._get(inst, "monthNamesShort");
9266 beforeShowDay = this._get(inst, "beforeShowDay");
9267 showOtherMonths = this._get(inst, "showOtherMonths");
9268 selectOtherMonths = this._get(inst, "selectOtherMonths");
9269 defaultDate = this._getDefaultDate(inst);
9270 html = "";
9271 dow;
9272 for (row = 0; row < numMonths[0]; row++) {
9273 group = "";
9274 this.maxRows = 4;
9275 for (col = 0; col < numMonths[1]; col++) {
9276 selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
9277 cornerClass = " ui-corner-all";
9278 calender = "";
9279 if (isMultiMonth) {
9280 calender += "<div class='ui-datepicker-group";
9281 if (numMonths[1] > 1) {
9282 switch (col) {
9283 case 0: calender += " ui-datepicker-group-first";
9284 cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
9285 case numMonths[1]-1: calender += " ui-datepicker-group-last";
9286 cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
9287 default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
9288 }
9289 }
9290 calender += "'>";
9291 }
9292 calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
9293 (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
9294 (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
9295 this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
9296 row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
9297 "</div><table class='ui-datepicker-calendar'><thead>" +
9298 "<tr>";
9299 thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
9300 for (dow = 0; dow < 7; dow++) { // days of the week
9301 day = (dow + firstDay) % 7;
9302 thead += "<th" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
9303 "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
9304 }
9305 calender += thead + "</tr></thead><tbody>";
9306 daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
9307 if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
9308 inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
9309 }
9310 leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
9311 curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
9312 numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
9313 this.maxRows = numRows;
9314 printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
9315 for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
9316 calender += "<tr>";
9317 tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
9318 this._get(inst, "calculateWeek")(printDate) + "</td>");
9319 for (dow = 0; dow < 7; dow++) { // create date picker days
9320 daySettings = (beforeShowDay ?
9321 beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
9322 otherMonth = (printDate.getMonth() !== drawMonth);
9323 unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
9324 (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
9325 tbody += "<td class='" +
9326 ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
9327 (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
9328 ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
9329 (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
9330 // or defaultDate is current printedDate and defaultDate is selectedDate
9331 " " + this._dayOverClass : "") + // highlight selected day
9332 (unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") + // highlight unselectable days
9333 (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
9334 (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
9335 (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
9336 ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
9337 (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
9338 (otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
9339 (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
9340 (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
9341 (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
9342 (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
9343 "' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
9344 printDate.setDate(printDate.getDate() + 1);
9345 printDate = this._daylightSavingAdjust(printDate);
9346 }
9347 calender += tbody + "</tr>";
9348 }
9349 drawMonth++;
9350 if (drawMonth > 11) {
9351 drawMonth = 0;
9352 drawYear++;
9353 }
9354 calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
9355 ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
9356 group += calender;
9357 }
9358 html += group;
9359 }
9360 html += buttonPanel;
9361 inst._keyEvent = false;
9362 return html;
9363 },
9364
9365 /* Generate the month and year header. */
9366 _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
9367 secondary, monthNames, monthNamesShort) {
9368
9369 var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
9370 changeMonth = this._get(inst, "changeMonth"),
9371 changeYear = this._get(inst, "changeYear"),
9372 showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
9373 html = "<div class='ui-datepicker-title'>",
9374 monthHtml = "";
9375
9376 // month selection
9377 if (secondary || !changeMonth) {
9378 monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
9379 } else {
9380 inMinYear = (minDate && minDate.getFullYear() === drawYear);
9381 inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
9382 monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
9383 for ( month = 0; month < 12; month++) {
9384 if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
9385 monthHtml += "<option value='" + month + "'" +
9386 (month === drawMonth ? " selected='selected'" : "") +
9387 ">" + monthNamesShort[month] + "</option>";
9388 }
9389 }
9390 monthHtml += "</select>";
9391 }
9392
9393 if (!showMonthAfterYear) {
9394 html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
9395 }
9396
9397 // year selection
9398 if ( !inst.yearshtml ) {
9399 inst.yearshtml = "";
9400 if (secondary || !changeYear) {
9401 html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
9402 } else {
9403 // determine range of years to display
9404 years = this._get(inst, "yearRange").split(":");
9405 thisYear = new Date().getFullYear();
9406 determineYear = function(value) {
9407 var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
9408 (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
9409 parseInt(value, 10)));
9410 return (isNaN(year) ? thisYear : year);
9411 };
9412 year = determineYear(years[0]);
9413 endYear = Math.max(year, determineYear(years[1] || ""));
9414 year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
9415 endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
9416 inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
9417 for (; year <= endYear; year++) {
9418 inst.yearshtml += "<option value='" + year + "'" +
9419 (year === drawYear ? " selected='selected'" : "") +
9420 ">" + year + "</option>";
9421 }
9422 inst.yearshtml += "</select>";
9423
9424 html += inst.yearshtml;
9425 inst.yearshtml = null;
9426 }
9427 }
9428
9429 html += this._get(inst, "yearSuffix");
9430 if (showMonthAfterYear) {
9431 html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
9432 }
9433 html += "</div>"; // Close datepicker_header
9434 return html;
9435 },
9436
9437 /* Adjust one of the date sub-fields. */
9438 _adjustInstDate: function(inst, offset, period) {
9439 var year = inst.drawYear + (period === "Y" ? offset : 0),
9440 month = inst.drawMonth + (period === "M" ? offset : 0),
9441 day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
9442 date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
9443
9444 inst.selectedDay = date.getDate();
9445 inst.drawMonth = inst.selectedMonth = date.getMonth();
9446 inst.drawYear = inst.selectedYear = date.getFullYear();
9447 if (period === "M" || period === "Y") {
9448 this._notifyChange(inst);
9449 }
9450 },
9451
9452 /* Ensure a date is within any min/max bounds. */
9453 _restrictMinMax: function(inst, date) {
9454 var minDate = this._getMinMaxDate(inst, "min"),
9455 maxDate = this._getMinMaxDate(inst, "max"),
9456 newDate = (minDate && date < minDate ? minDate : date);
9457 return (maxDate && newDate > maxDate ? maxDate : newDate);
9458 },
9459
9460 /* Notify change of month/year. */
9461 _notifyChange: function(inst) {
9462 var onChange = this._get(inst, "onChangeMonthYear");
9463 if (onChange) {
9464 onChange.apply((inst.input ? inst.input[0] : null),
9465 [inst.selectedYear, inst.selectedMonth + 1, inst]);
9466 }
9467 },
9468
9469 /* Determine the number of months to show. */
9470 _getNumberOfMonths: function(inst) {
9471 var numMonths = this._get(inst, "numberOfMonths");
9472 return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
9473 },
9474
9475 /* Determine the current maximum date - ensure no time components are set. */
9476 _getMinMaxDate: function(inst, minMax) {
9477 return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
9478 },
9479
9480 /* Find the number of days in a given month. */
9481 _getDaysInMonth: function(year, month) {
9482 return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
9483 },
9484
9485 /* Find the day of the week of the first of a month. */
9486 _getFirstDayOfMonth: function(year, month) {
9487 return new Date(year, month, 1).getDay();
9488 },
9489
9490 /* Determines if we should allow a "next/prev" month display change. */
9491 _canAdjustMonth: function(inst, offset, curYear, curMonth) {
9492 var numMonths = this._getNumberOfMonths(inst),
9493 date = this._daylightSavingAdjust(new Date(curYear,
9494 curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
9495
9496 if (offset < 0) {
9497 date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
9498 }
9499 return this._isInRange(inst, date);
9500 },
9501
9502 /* Is the given date in the accepted range? */
9503 _isInRange: function(inst, date) {
9504 var yearSplit, currentYear,
9505 minDate = this._getMinMaxDate(inst, "min"),
9506 maxDate = this._getMinMaxDate(inst, "max"),
9507 minYear = null,
9508 maxYear = null,
9509 years = this._get(inst, "yearRange");
9510 if (years){
9511 yearSplit = years.split(":");
9512 currentYear = new Date().getFullYear();
9513 minYear = parseInt(yearSplit[0], 10);
9514 maxYear = parseInt(yearSplit[1], 10);
9515 if ( yearSplit[0].match(/[+\-].*/) ) {
9516 minYear += currentYear;
9517 }
9518 if ( yearSplit[1].match(/[+\-].*/) ) {
9519 maxYear += currentYear;
9520 }
9521 }
9522
9523 return ((!minDate || date.getTime() >= minDate.getTime()) &&
9524 (!maxDate || date.getTime() <= maxDate.getTime()) &&
9525 (!minYear || date.getFullYear() >= minYear) &&
9526 (!maxYear || date.getFullYear() <= maxYear));
9527 },
9528
9529 /* Provide the configuration settings for formatting/parsing. */
9530 _getFormatConfig: function(inst) {
9531 var shortYearCutoff = this._get(inst, "shortYearCutoff");
9532 shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
9533 new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
9534 return {shortYearCutoff: shortYearCutoff,
9535 dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
9536 monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
9537 },
9538
9539 /* Format the given date for display. */
9540 _formatDate: function(inst, day, month, year) {
9541 if (!day) {
9542 inst.currentDay = inst.selectedDay;
9543 inst.currentMonth = inst.selectedMonth;
9544 inst.currentYear = inst.selectedYear;
9545 }
9546 var date = (day ? (typeof day === "object" ? day :
9547 this._daylightSavingAdjust(new Date(year, month, day))) :
9548 this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
9549 return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
9550 }
9551});
9552
9553/*
9554 * Bind hover events for datepicker elements.
9555 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
9556 * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
9557 */
9558function bindHover(dpDiv) {
9559 var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
9560 return dpDiv.delegate(selector, "mouseout", function() {
9561 $(this).removeClass("ui-state-hover");
9562 if (this.className.indexOf("ui-datepicker-prev") !== -1) {
9563 $(this).removeClass("ui-datepicker-prev-hover");
9564 }
9565 if (this.className.indexOf("ui-datepicker-next") !== -1) {
9566 $(this).removeClass("ui-datepicker-next-hover");
9567 }
9568 })
9569 .delegate(selector, "mouseover", function(){
9570 if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
9571 $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
9572 $(this).addClass("ui-state-hover");
9573 if (this.className.indexOf("ui-datepicker-prev") !== -1) {
9574 $(this).addClass("ui-datepicker-prev-hover");
9575 }
9576 if (this.className.indexOf("ui-datepicker-next") !== -1) {
9577 $(this).addClass("ui-datepicker-next-hover");
9578 }
9579 }
9580 });
9581}
9582
9583/* jQuery extend now ignores nulls! */
9584function extendRemove(target, props) {
9585 $.extend(target, props);
9586 for (var name in props) {
9587 if (props[name] == null) {
9588 target[name] = props[name];
9589 }
9590 }
9591 return target;
9592}
9593
9594/* Invoke the datepicker functionality.
9595 @param options string - a command, optionally followed by additional parameters or
9596 Object - settings for attaching new datepicker functionality
9597 @return jQuery object */
9598$.fn.datepicker = function(options){
9599
9600 /* Verify an empty collection wasn't passed - Fixes #6976 */
9601 if ( !this.length ) {
9602 return this;
9603 }
9604
9605 /* Initialise the date picker. */
9606 if (!$.datepicker.initialized) {
9607 $(document).mousedown($.datepicker._checkExternalClick);
9608 $.datepicker.initialized = true;
9609 }
9610
9611 /* Append datepicker main container to body if not exist. */
9612 if ($("#"+$.datepicker._mainDivId).length === 0) {
9613 $("body").append($.datepicker.dpDiv);
9614 }
9615
9616 var otherArgs = Array.prototype.slice.call(arguments, 1);
9617 if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
9618 return $.datepicker["_" + options + "Datepicker"].
9619 apply($.datepicker, [this[0]].concat(otherArgs));
9620 }
9621 if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
9622 return $.datepicker["_" + options + "Datepicker"].
9623 apply($.datepicker, [this[0]].concat(otherArgs));
9624 }
9625 return this.each(function() {
9626 typeof options === "string" ?
9627 $.datepicker["_" + options + "Datepicker"].
9628 apply($.datepicker, [this].concat(otherArgs)) :
9629 $.datepicker._attachDatepicker(this, options);
9630 });
9631};
9632
9633$.datepicker = new Datepicker(); // singleton instance
9634$.datepicker.initialized = false;
9635$.datepicker.uuid = new Date().getTime();
9636$.datepicker.version = "1.10.3";
9637
9638})(jQuery);
9639
9640(function( $, undefined ) {
9641
9642var sizeRelatedOptions = {
9643 buttons: true,
9644 height: true,
9645 maxHeight: true,
9646 maxWidth: true,
9647 minHeight: true,
9648 minWidth: true,
9649 width: true
9650 },
9651 resizableRelatedOptions = {
9652 maxHeight: true,
9653 maxWidth: true,
9654 minHeight: true,
9655 minWidth: true
9656 };
9657
9658$.widget( "ui.dialog", {
9659 version: "1.10.3",
9660 options: {
9661 appendTo: "body",
9662 autoOpen: true,
9663 buttons: [],
9664 closeOnEscape: true,
9665 closeText: "close",
9666 dialogClass: "",
9667 draggable: true,
9668 hide: null,
9669 height: "auto",
9670 maxHeight: null,
9671 maxWidth: null,
9672 minHeight: 150,
9673 minWidth: 150,
9674 modal: false,
9675 position: {
9676 my: "center",
9677 at: "center",
9678 of: window,
9679 collision: "fit",
9680 // Ensure the titlebar is always visible
9681 using: function( pos ) {
9682 var topOffset = $( this ).css( pos ).offset().top;
9683 if ( topOffset < 0 ) {
9684 $( this ).css( "top", pos.top - topOffset );
9685 }
9686 }
9687 },
9688 resizable: true,
9689 show: null,
9690 title: null,
9691 width: 300,
9692
9693 // callbacks
9694 beforeClose: null,
9695 close: null,
9696 drag: null,
9697 dragStart: null,
9698 dragStop: null,
9699 focus: null,
9700 open: null,
9701 resize: null,
9702 resizeStart: null,
9703 resizeStop: null
9704 },
9705
9706 _create: function() {
9707 this.originalCss = {
9708 display: this.element[0].style.display,
9709 width: this.element[0].style.width,
9710 minHeight: this.element[0].style.minHeight,
9711 maxHeight: this.element[0].style.maxHeight,
9712 height: this.element[0].style.height
9713 };
9714 this.originalPosition = {
9715 parent: this.element.parent(),
9716 index: this.element.parent().children().index( this.element )
9717 };
9718 this.originalTitle = this.element.attr("title");
9719 this.options.title = this.options.title || this.originalTitle;
9720
9721 this._createWrapper();
9722
9723 this.element
9724 .show()
9725 .removeAttr("title")
9726 .addClass("ui-dialog-content ui-widget-content")
9727 .appendTo( this.uiDialog );
9728
9729 this._createTitlebar();
9730 this._createButtonPane();
9731
9732 if ( this.options.draggable && $.fn.draggable ) {
9733 this._makeDraggable();
9734 }
9735 if ( this.options.resizable && $.fn.resizable ) {
9736 this._makeResizable();
9737 }
9738
9739 this._isOpen = false;
9740 },
9741
9742 _init: function() {
9743 if ( this.options.autoOpen ) {
9744 this.open();
9745 }
9746 },
9747
9748 _appendTo: function() {
9749 var element = this.options.appendTo;
9750 if ( element && (element.jquery || element.nodeType) ) {
9751 return $( element );
9752 }
9753 return this.document.find( element || "body" ).eq( 0 );
9754 },
9755
9756 _destroy: function() {
9757 var next,
9758 originalPosition = this.originalPosition;
9759
9760 this._destroyOverlay();
9761
9762 this.element
9763 .removeUniqueId()
9764 .removeClass("ui-dialog-content ui-widget-content")
9765 .css( this.originalCss )
9766 // Without detaching first, the following becomes really slow
9767 .detach();
9768
9769 this.uiDialog.stop( true, true ).remove();
9770
9771 if ( this.originalTitle ) {
9772 this.element.attr( "title", this.originalTitle );
9773 }
9774
9775 next = originalPosition.parent.children().eq( originalPosition.index );
9776 // Don't try to place the dialog next to itself (#8613)
9777 if ( next.length && next[0] !== this.element[0] ) {
9778 next.before( this.element );
9779 } else {
9780 originalPosition.parent.append( this.element );
9781 }
9782 },
9783
9784 widget: function() {
9785 return this.uiDialog;
9786 },
9787
9788 disable: $.noop,
9789 enable: $.noop,
9790
9791 close: function( event ) {
9792 var that = this;
9793
9794 if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
9795 return;
9796 }
9797
9798 this._isOpen = false;
9799 this._destroyOverlay();
9800
9801 if ( !this.opener.filter(":focusable").focus().length ) {
9802 // Hiding a focused element doesn't trigger blur in WebKit
9803 // so in case we have nothing to focus on, explicitly blur the active element
9804 // https://bugs.webkit.org/show_bug.cgi?id=47182
9805 $( this.document[0].activeElement ).blur();
9806 }
9807
9808 this._hide( this.uiDialog, this.options.hide, function() {
9809 that._trigger( "close", event );
9810 });
9811 },
9812
9813 isOpen: function() {
9814 return this._isOpen;
9815 },
9816
9817 moveToTop: function() {
9818 this._moveToTop();
9819 },
9820
9821 _moveToTop: function( event, silent ) {
9822 var moved = !!this.uiDialog.nextAll(":visible").insertBefore( this.uiDialog ).length;
9823 if ( moved && !silent ) {
9824 this._trigger( "focus", event );
9825 }
9826 return moved;
9827 },
9828
9829 open: function() {
9830 var that = this;
9831 if ( this._isOpen ) {
9832 if ( this._moveToTop() ) {
9833 this._focusTabbable();
9834 }
9835 return;
9836 }
9837
9838 this._isOpen = true;
9839 this.opener = $( this.document[0].activeElement );
9840
9841 this._size();
9842 this._position();
9843 this._createOverlay();
9844 this._moveToTop( null, true );
9845 this._show( this.uiDialog, this.options.show, function() {
9846 that._focusTabbable();
9847 that._trigger("focus");
9848 });
9849
9850 this._trigger("open");
9851 },
9852
9853 _focusTabbable: function() {
9854 // Set focus to the first match:
9855 // 1. First element inside the dialog matching [autofocus]
9856 // 2. Tabbable element inside the content element
9857 // 3. Tabbable element inside the buttonpane
9858 // 4. The close button
9859 // 5. The dialog itself
9860 var hasFocus = this.element.find("[autofocus]");
9861 if ( !hasFocus.length ) {
9862 hasFocus = this.element.find(":tabbable");
9863 }
9864 if ( !hasFocus.length ) {
9865 hasFocus = this.uiDialogButtonPane.find(":tabbable");
9866 }
9867 if ( !hasFocus.length ) {
9868 hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
9869 }
9870 if ( !hasFocus.length ) {
9871 hasFocus = this.uiDialog;
9872 }
9873 hasFocus.eq( 0 ).focus();
9874 },
9875
9876 _keepFocus: function( event ) {
9877 function checkFocus() {
9878 var activeElement = this.document[0].activeElement,
9879 isActive = this.uiDialog[0] === activeElement ||
9880 $.contains( this.uiDialog[0], activeElement );
9881 if ( !isActive ) {
9882 this._focusTabbable();
9883 }
9884 }
9885 event.preventDefault();
9886 checkFocus.call( this );
9887 // support: IE
9888 // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
9889 // so we check again later
9890 this._delay( checkFocus );
9891 },
9892
9893 _createWrapper: function() {
9894 this.uiDialog = $("<div>")
9895 .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
9896 this.options.dialogClass )
9897 .hide()
9898 .attr({
9899 // Setting tabIndex makes the div focusable
9900 tabIndex: -1,
9901 role: "dialog"
9902 })
9903 .appendTo( this._appendTo() );
9904
9905 this._on( this.uiDialog, {
9906 keydown: function( event ) {
9907 if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
9908 event.keyCode === $.ui.keyCode.ESCAPE ) {
9909 event.preventDefault();
9910 this.close( event );
9911 return;
9912 }
9913
9914 // prevent tabbing out of dialogs
9915 if ( event.keyCode !== $.ui.keyCode.TAB ) {
9916 return;
9917 }
9918 var tabbables = this.uiDialog.find(":tabbable"),
9919 first = tabbables.filter(":first"),
9920 last = tabbables.filter(":last");
9921
9922 if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
9923 first.focus( 1 );
9924 event.preventDefault();
9925 } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
9926 last.focus( 1 );
9927 event.preventDefault();
9928 }
9929 },
9930 mousedown: function( event ) {
9931 if ( this._moveToTop( event ) ) {
9932 this._focusTabbable();
9933 }
9934 }
9935 });
9936
9937 // We assume that any existing aria-describedby attribute means
9938 // that the dialog content is marked up properly
9939 // otherwise we brute force the content as the description
9940 if ( !this.element.find("[aria-describedby]").length ) {
9941 this.uiDialog.attr({
9942 "aria-describedby": this.element.uniqueId().attr("id")
9943 });
9944 }
9945 },
9946
9947 _createTitlebar: function() {
9948 var uiDialogTitle;
9949
9950 this.uiDialogTitlebar = $("<div>")
9951 .addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix")
9952 .prependTo( this.uiDialog );
9953 this._on( this.uiDialogTitlebar, {
9954 mousedown: function( event ) {
9955 // Don't prevent click on close button (#8838)
9956 // Focusing a dialog that is partially scrolled out of view
9957 // causes the browser to scroll it into view, preventing the click event
9958 if ( !$( event.target ).closest(".ui-dialog-titlebar-close") ) {
9959 // Dialog isn't getting focus when dragging (#8063)
9960 this.uiDialog.focus();
9961 }
9962 }
9963 });
9964
9965 this.uiDialogTitlebarClose = $("<button></button>")
9966 .button({
9967 label: this.options.closeText,
9968 icons: {
9969 primary: "ui-icon-closethick"
9970 },
9971 text: false
9972 })
9973 .addClass("ui-dialog-titlebar-close")
9974 .appendTo( this.uiDialogTitlebar );
9975 this._on( this.uiDialogTitlebarClose, {
9976 click: function( event ) {
9977 event.preventDefault();
9978 this.close( event );
9979 }
9980 });
9981
9982 uiDialogTitle = $("<span>")
9983 .uniqueId()
9984 .addClass("ui-dialog-title")
9985 .prependTo( this.uiDialogTitlebar );
9986 this._title( uiDialogTitle );
9987
9988 this.uiDialog.attr({
9989 "aria-labelledby": uiDialogTitle.attr("id")
9990 });
9991 },
9992
9993 _title: function( title ) {
9994 if ( !this.options.title ) {
9995 title.html("&#160;");
9996 }
9997 title.text( this.options.title );
9998 },
9999
10000 _createButtonPane: function() {
10001 this.uiDialogButtonPane = $("<div>")
10002 .addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");
10003
10004 this.uiButtonSet = $("<div>")
10005 .addClass("ui-dialog-buttonset")
10006 .appendTo( this.uiDialogButtonPane );
10007
10008 this._createButtons();
10009 },
10010
10011 _createButtons: function() {
10012 var that = this,
10013 buttons = this.options.buttons;
10014
10015 // if we already have a button pane, remove it
10016 this.uiDialogButtonPane.remove();
10017 this.uiButtonSet.empty();
10018
10019 if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
10020 this.uiDialog.removeClass("ui-dialog-buttons");
10021 return;
10022 }
10023
10024 $.each( buttons, function( name, props ) {
10025 var click, buttonOptions;
10026 props = $.isFunction( props ) ?
10027 { click: props, text: name } :
10028 props;
10029 // Default to a non-submitting button
10030 props = $.extend( { type: "button" }, props );
10031 // Change the context for the click callback to be the main element
10032 click = props.click;
10033 props.click = function() {
10034 click.apply( that.element[0], arguments );
10035 };
10036 buttonOptions = {
10037 icons: props.icons,
10038 text: props.showText
10039 };
10040 delete props.icons;
10041 delete props.showText;
10042 $( "<button></button>", props )
10043 .button( buttonOptions )
10044 .appendTo( that.uiButtonSet );
10045 });
10046 this.uiDialog.addClass("ui-dialog-buttons");
10047 this.uiDialogButtonPane.appendTo( this.uiDialog );
10048 },
10049
10050 _makeDraggable: function() {
10051 var that = this,
10052 options = this.options;
10053
10054 function filteredUi( ui ) {
10055 return {
10056 position: ui.position,
10057 offset: ui.offset
10058 };
10059 }
10060
10061 this.uiDialog.draggable({
10062 cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
10063 handle: ".ui-dialog-titlebar",
10064 containment: "document",
10065 start: function( event, ui ) {
10066 $( this ).addClass("ui-dialog-dragging");
10067 that._blockFrames();
10068 that._trigger( "dragStart", event, filteredUi( ui ) );
10069 },
10070 drag: function( event, ui ) {
10071 that._trigger( "drag", event, filteredUi( ui ) );
10072 },
10073 stop: function( event, ui ) {
10074 options.position = [
10075 ui.position.left - that.document.scrollLeft(),
10076 ui.position.top - that.document.scrollTop()
10077 ];
10078 $( this ).removeClass("ui-dialog-dragging");
10079 that._unblockFrames();
10080 that._trigger( "dragStop", event, filteredUi( ui ) );
10081 }
10082 });
10083 },
10084
10085 _makeResizable: function() {
10086 var that = this,
10087 options = this.options,
10088 handles = options.resizable,
10089 // .ui-resizable has position: relative defined in the stylesheet
10090 // but dialogs have to use absolute or fixed positioning
10091 position = this.uiDialog.css("position"),
10092 resizeHandles = typeof handles === "string" ?
10093 handles :
10094 "n,e,s,w,se,sw,ne,nw";
10095
10096 function filteredUi( ui ) {
10097 return {
10098 originalPosition: ui.originalPosition,
10099 originalSize: ui.originalSize,
10100 position: ui.position,
10101 size: ui.size
10102 };
10103 }
10104
10105 this.uiDialog.resizable({
10106 cancel: ".ui-dialog-content",
10107 containment: "document",
10108 alsoResize: this.element,
10109 maxWidth: options.maxWidth,
10110 maxHeight: options.maxHeight,
10111 minWidth: options.minWidth,
10112 minHeight: this._minHeight(),
10113 handles: resizeHandles,
10114 start: function( event, ui ) {
10115 $( this ).addClass("ui-dialog-resizing");
10116 that._blockFrames();
10117 that._trigger( "resizeStart", event, filteredUi( ui ) );
10118 },
10119 resize: function( event, ui ) {
10120 that._trigger( "resize", event, filteredUi( ui ) );
10121 },
10122 stop: function( event, ui ) {
10123 options.height = $( this ).height();
10124 options.width = $( this ).width();
10125 $( this ).removeClass("ui-dialog-resizing");
10126 that._unblockFrames();
10127 that._trigger( "resizeStop", event, filteredUi( ui ) );
10128 }
10129 })
10130 .css( "position", position );
10131 },
10132
10133 _minHeight: function() {
10134 var options = this.options;
10135
10136 return options.height === "auto" ?
10137 options.minHeight :
10138 Math.min( options.minHeight, options.height );
10139 },
10140
10141 _position: function() {
10142 // Need to show the dialog to get the actual offset in the position plugin
10143 var isVisible = this.uiDialog.is(":visible");
10144 if ( !isVisible ) {
10145 this.uiDialog.show();
10146 }
10147 this.uiDialog.position( this.options.position );
10148 if ( !isVisible ) {
10149 this.uiDialog.hide();
10150 }
10151 },
10152
10153 _setOptions: function( options ) {
10154 var that = this,
10155 resize = false,
10156 resizableOptions = {};
10157
10158 $.each( options, function( key, value ) {
10159 that._setOption( key, value );
10160
10161 if ( key in sizeRelatedOptions ) {
10162 resize = true;
10163 }
10164 if ( key in resizableRelatedOptions ) {
10165 resizableOptions[ key ] = value;
10166 }
10167 });
10168
10169 if ( resize ) {
10170 this._size();
10171 this._position();
10172 }
10173 if ( this.uiDialog.is(":data(ui-resizable)") ) {
10174 this.uiDialog.resizable( "option", resizableOptions );
10175 }
10176 },
10177
10178 _setOption: function( key, value ) {
10179 /*jshint maxcomplexity:15*/
10180 var isDraggable, isResizable,
10181 uiDialog = this.uiDialog;
10182
10183 if ( key === "dialogClass" ) {
10184 uiDialog
10185 .removeClass( this.options.dialogClass )
10186 .addClass( value );
10187 }
10188
10189 if ( key === "disabled" ) {
10190 return;
10191 }
10192
10193 this._super( key, value );
10194
10195 if ( key === "appendTo" ) {
10196 this.uiDialog.appendTo( this._appendTo() );
10197 }
10198
10199 if ( key === "buttons" ) {
10200 this._createButtons();
10201 }
10202
10203 if ( key === "closeText" ) {
10204 this.uiDialogTitlebarClose.button({
10205 // Ensure that we always pass a string
10206 label: "" + value
10207 });
10208 }
10209
10210 if ( key === "draggable" ) {
10211 isDraggable = uiDialog.is(":data(ui-draggable)");
10212 if ( isDraggable && !value ) {
10213 uiDialog.draggable("destroy");
10214 }
10215
10216 if ( !isDraggable && value ) {
10217 this._makeDraggable();
10218 }
10219 }
10220
10221 if ( key === "position" ) {
10222 this._position();
10223 }
10224
10225 if ( key === "resizable" ) {
10226 // currently resizable, becoming non-resizable
10227 isResizable = uiDialog.is(":data(ui-resizable)");
10228 if ( isResizable && !value ) {
10229 uiDialog.resizable("destroy");
10230 }
10231
10232 // currently resizable, changing handles
10233 if ( isResizable && typeof value === "string" ) {
10234 uiDialog.resizable( "option", "handles", value );
10235 }
10236
10237 // currently non-resizable, becoming resizable
10238 if ( !isResizable && value !== false ) {
10239 this._makeResizable();
10240 }
10241 }
10242
10243 if ( key === "title" ) {
10244 this._title( this.uiDialogTitlebar.find(".ui-dialog-title") );
10245 }
10246 },
10247
10248 _size: function() {
10249 // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
10250 // divs will both have width and height set, so we need to reset them
10251 var nonContentHeight, minContentHeight, maxContentHeight,
10252 options = this.options;
10253
10254 // Reset content sizing
10255 this.element.show().css({
10256 width: "auto",
10257 minHeight: 0,
10258 maxHeight: "none",
10259 height: 0
10260 });
10261
10262 if ( options.minWidth > options.width ) {
10263 options.width = options.minWidth;
10264 }
10265
10266 // reset wrapper sizing
10267 // determine the height of all the non-content elements
10268 nonContentHeight = this.uiDialog.css({
10269 height: "auto",
10270 width: options.width
10271 })
10272 .outerHeight();
10273 minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
10274 maxContentHeight = typeof options.maxHeight === "number" ?
10275 Math.max( 0, options.maxHeight - nonContentHeight ) :
10276 "none";
10277
10278 if ( options.height === "auto" ) {
10279 this.element.css({
10280 minHeight: minContentHeight,
10281 maxHeight: maxContentHeight,
10282 height: "auto"
10283 });
10284 } else {
10285 this.element.height( Math.max( 0, options.height - nonContentHeight ) );
10286 }
10287
10288 if (this.uiDialog.is(":data(ui-resizable)") ) {
10289 this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
10290 }
10291 },
10292
10293 _blockFrames: function() {
10294 this.iframeBlocks = this.document.find( "iframe" ).map(function() {
10295 var iframe = $( this );
10296
10297 return $( "<div>" )
10298 .css({
10299 position: "absolute",
10300 width: iframe.outerWidth(),
10301 height: iframe.outerHeight()
10302 })
10303 .appendTo( iframe.parent() )
10304 .offset( iframe.offset() )[0];
10305 });
10306 },
10307
10308 _unblockFrames: function() {
10309 if ( this.iframeBlocks ) {
10310 this.iframeBlocks.remove();
10311 delete this.iframeBlocks;
10312 }
10313 },
10314
10315 _allowInteraction: function( event ) {
10316 if ( $( event.target ).closest(".ui-dialog").length ) {
10317 return true;
10318 }
10319
10320 // TODO: Remove hack when datepicker implements
10321 // the .ui-front logic (#8989)
10322 return !!$( event.target ).closest(".ui-datepicker").length;
10323 },
10324
10325 _createOverlay: function() {
10326 if ( !this.options.modal ) {
10327 return;
10328 }
10329
10330 var that = this,
10331 widgetFullName = this.widgetFullName;
10332 if ( !$.ui.dialog.overlayInstances ) {
10333 // Prevent use of anchors and inputs.
10334 // We use a delay in case the overlay is created from an
10335 // event that we're going to be cancelling. (#2804)
10336 this._delay(function() {
10337 // Handle .dialog().dialog("close") (#4065)
10338 if ( $.ui.dialog.overlayInstances ) {
10339 this.document.bind( "focusin.dialog", function( event ) {
10340 if ( !that._allowInteraction( event ) ) {
10341 event.preventDefault();
10342 $(".ui-dialog:visible:last .ui-dialog-content")
10343 .data( widgetFullName )._focusTabbable();
10344 }
10345 });
10346 }
10347 });
10348 }
10349
10350 this.overlay = $("<div>")
10351 .addClass("ui-widget-overlay ui-front")
10352 .appendTo( this._appendTo() );
10353 this._on( this.overlay, {
10354 mousedown: "_keepFocus"
10355 });
10356 $.ui.dialog.overlayInstances++;
10357 },
10358
10359 _destroyOverlay: function() {
10360 if ( !this.options.modal ) {
10361 return;
10362 }
10363
10364 if ( this.overlay ) {
10365 $.ui.dialog.overlayInstances--;
10366
10367 if ( !$.ui.dialog.overlayInstances ) {
10368 this.document.unbind( "focusin.dialog" );
10369 }
10370 this.overlay.remove();
10371 this.overlay = null;
10372 }
10373 }
10374});
10375
10376$.ui.dialog.overlayInstances = 0;
10377
10378// DEPRECATED
10379if ( $.uiBackCompat !== false ) {
10380 // position option with array notation
10381 // just override with old implementation
10382 $.widget( "ui.dialog", $.ui.dialog, {
10383 _position: function() {
10384 var position = this.options.position,
10385 myAt = [],
10386 offset = [ 0, 0 ],
10387 isVisible;
10388
10389 if ( position ) {
10390 if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
10391 myAt = position.split ? position.split(" ") : [ position[0], position[1] ];
10392 if ( myAt.length === 1 ) {
10393 myAt[1] = myAt[0];
10394 }
10395
10396 $.each( [ "left", "top" ], function( i, offsetPosition ) {
10397 if ( +myAt[ i ] === myAt[ i ] ) {
10398 offset[ i ] = myAt[ i ];
10399 myAt[ i ] = offsetPosition;
10400 }
10401 });
10402
10403 position = {
10404 my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
10405 myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
10406 at: myAt.join(" ")
10407 };
10408 }
10409
10410 position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
10411 } else {
10412 position = $.ui.dialog.prototype.options.position;
10413 }
10414
10415 // need to show the dialog to get the actual offset in the position plugin
10416 isVisible = this.uiDialog.is(":visible");
10417 if ( !isVisible ) {
10418 this.uiDialog.show();
10419 }
10420 this.uiDialog.position( position );
10421 if ( !isVisible ) {
10422 this.uiDialog.hide();
10423 }
10424 }
10425 });
10426}
10427
10428}( jQuery ) );
10429
10430(function( $, undefined ) {
10431
10432var rvertical = /up|down|vertical/,
10433 rpositivemotion = /up|left|vertical|horizontal/;
10434
10435$.effects.effect.blind = function( o, done ) {
10436 // Create element
10437 var el = $( this ),
10438 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10439 mode = $.effects.setMode( el, o.mode || "hide" ),
10440 direction = o.direction || "up",
10441 vertical = rvertical.test( direction ),
10442 ref = vertical ? "height" : "width",
10443 ref2 = vertical ? "top" : "left",
10444 motion = rpositivemotion.test( direction ),
10445 animation = {},
10446 show = mode === "show",
10447 wrapper, distance, margin;
10448
10449 // if already wrapped, the wrapper's properties are my property. #6245
10450 if ( el.parent().is( ".ui-effects-wrapper" ) ) {
10451 $.effects.save( el.parent(), props );
10452 } else {
10453 $.effects.save( el, props );
10454 }
10455 el.show();
10456 wrapper = $.effects.createWrapper( el ).css({
10457 overflow: "hidden"
10458 });
10459
10460 distance = wrapper[ ref ]();
10461 margin = parseFloat( wrapper.css( ref2 ) ) || 0;
10462
10463 animation[ ref ] = show ? distance : 0;
10464 if ( !motion ) {
10465 el
10466 .css( vertical ? "bottom" : "right", 0 )
10467 .css( vertical ? "top" : "left", "auto" )
10468 .css({ position: "absolute" });
10469
10470 animation[ ref2 ] = show ? margin : distance + margin;
10471 }
10472
10473 // start at 0 if we are showing
10474 if ( show ) {
10475 wrapper.css( ref, 0 );
10476 if ( ! motion ) {
10477 wrapper.css( ref2, margin + distance );
10478 }
10479 }
10480
10481 // Animate
10482 wrapper.animate( animation, {
10483 duration: o.duration,
10484 easing: o.easing,
10485 queue: false,
10486 complete: function() {
10487 if ( mode === "hide" ) {
10488 el.hide();
10489 }
10490 $.effects.restore( el, props );
10491 $.effects.removeWrapper( el );
10492 done();
10493 }
10494 });
10495
10496};
10497
10498})(jQuery);
10499
10500(function( $, undefined ) {
10501
10502$.effects.effect.bounce = function( o, done ) {
10503 var el = $( this ),
10504 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10505
10506 // defaults:
10507 mode = $.effects.setMode( el, o.mode || "effect" ),
10508 hide = mode === "hide",
10509 show = mode === "show",
10510 direction = o.direction || "up",
10511 distance = o.distance,
10512 times = o.times || 5,
10513
10514 // number of internal animations
10515 anims = times * 2 + ( show || hide ? 1 : 0 ),
10516 speed = o.duration / anims,
10517 easing = o.easing,
10518
10519 // utility:
10520 ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10521 motion = ( direction === "up" || direction === "left" ),
10522 i,
10523 upAnim,
10524 downAnim,
10525
10526 // we will need to re-assemble the queue to stack our animations in place
10527 queue = el.queue(),
10528 queuelen = queue.length;
10529
10530 // Avoid touching opacity to prevent clearType and PNG issues in IE
10531 if ( show || hide ) {
10532 props.push( "opacity" );
10533 }
10534
10535 $.effects.save( el, props );
10536 el.show();
10537 $.effects.createWrapper( el ); // Create Wrapper
10538
10539 // default distance for the BIGGEST bounce is the outer Distance / 3
10540 if ( !distance ) {
10541 distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
10542 }
10543
10544 if ( show ) {
10545 downAnim = { opacity: 1 };
10546 downAnim[ ref ] = 0;
10547
10548 // if we are showing, force opacity 0 and set the initial position
10549 // then do the "first" animation
10550 el.css( "opacity", 0 )
10551 .css( ref, motion ? -distance * 2 : distance * 2 )
10552 .animate( downAnim, speed, easing );
10553 }
10554
10555 // start at the smallest distance if we are hiding
10556 if ( hide ) {
10557 distance = distance / Math.pow( 2, times - 1 );
10558 }
10559
10560 downAnim = {};
10561 downAnim[ ref ] = 0;
10562 // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
10563 for ( i = 0; i < times; i++ ) {
10564 upAnim = {};
10565 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
10566
10567 el.animate( upAnim, speed, easing )
10568 .animate( downAnim, speed, easing );
10569
10570 distance = hide ? distance * 2 : distance / 2;
10571 }
10572
10573 // Last Bounce when Hiding
10574 if ( hide ) {
10575 upAnim = { opacity: 0 };
10576 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
10577
10578 el.animate( upAnim, speed, easing );
10579 }
10580
10581 el.queue(function() {
10582 if ( hide ) {
10583 el.hide();
10584 }
10585 $.effects.restore( el, props );
10586 $.effects.removeWrapper( el );
10587 done();
10588 });
10589
10590 // inject all the animations we just queued to be first in line (after "inprogress")
10591 if ( queuelen > 1) {
10592 queue.splice.apply( queue,
10593 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
10594 }
10595 el.dequeue();
10596
10597};
10598
10599})(jQuery);
10600
10601(function( $, undefined ) {
10602
10603$.effects.effect.clip = function( o, done ) {
10604 // Create element
10605 var el = $( this ),
10606 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10607 mode = $.effects.setMode( el, o.mode || "hide" ),
10608 show = mode === "show",
10609 direction = o.direction || "vertical",
10610 vert = direction === "vertical",
10611 size = vert ? "height" : "width",
10612 position = vert ? "top" : "left",
10613 animation = {},
10614 wrapper, animate, distance;
10615
10616 // Save & Show
10617 $.effects.save( el, props );
10618 el.show();
10619
10620 // Create Wrapper
10621 wrapper = $.effects.createWrapper( el ).css({
10622 overflow: "hidden"
10623 });
10624 animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
10625 distance = animate[ size ]();
10626
10627 // Shift
10628 if ( show ) {
10629 animate.css( size, 0 );
10630 animate.css( position, distance / 2 );
10631 }
10632
10633 // Create Animation Object:
10634 animation[ size ] = show ? distance : 0;
10635 animation[ position ] = show ? 0 : distance / 2;
10636
10637 // Animate
10638 animate.animate( animation, {
10639 queue: false,
10640 duration: o.duration,
10641 easing: o.easing,
10642 complete: function() {
10643 if ( !show ) {
10644 el.hide();
10645 }
10646 $.effects.restore( el, props );
10647 $.effects.removeWrapper( el );
10648 done();
10649 }
10650 });
10651
10652};
10653
10654})(jQuery);
10655
10656(function( $, undefined ) {
10657
10658$.effects.effect.drop = function( o, done ) {
10659
10660 var el = $( this ),
10661 props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
10662 mode = $.effects.setMode( el, o.mode || "hide" ),
10663 show = mode === "show",
10664 direction = o.direction || "left",
10665 ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10666 motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
10667 animation = {
10668 opacity: show ? 1 : 0
10669 },
10670 distance;
10671
10672 // Adjust
10673 $.effects.save( el, props );
10674 el.show();
10675 $.effects.createWrapper( el );
10676
10677 distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
10678
10679 if ( show ) {
10680 el
10681 .css( "opacity", 0 )
10682 .css( ref, motion === "pos" ? -distance : distance );
10683 }
10684
10685 // Animation
10686 animation[ ref ] = ( show ?
10687 ( motion === "pos" ? "+=" : "-=" ) :
10688 ( motion === "pos" ? "-=" : "+=" ) ) +
10689 distance;
10690
10691 // Animate
10692 el.animate( animation, {
10693 queue: false,
10694 duration: o.duration,
10695 easing: o.easing,
10696 complete: function() {
10697 if ( mode === "hide" ) {
10698 el.hide();
10699 }
10700 $.effects.restore( el, props );
10701 $.effects.removeWrapper( el );
10702 done();
10703 }
10704 });
10705};
10706
10707})(jQuery);
10708
10709(function( $, undefined ) {
10710
10711$.effects.effect.explode = function( o, done ) {
10712
10713 var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
10714 cells = rows,
10715 el = $( this ),
10716 mode = $.effects.setMode( el, o.mode || "hide" ),
10717 show = mode === "show",
10718
10719 // show and then visibility:hidden the element before calculating offset
10720 offset = el.show().css( "visibility", "hidden" ).offset(),
10721
10722 // width and height of a piece
10723 width = Math.ceil( el.outerWidth() / cells ),
10724 height = Math.ceil( el.outerHeight() / rows ),
10725 pieces = [],
10726
10727 // loop
10728 i, j, left, top, mx, my;
10729
10730 // children animate complete:
10731 function childComplete() {
10732 pieces.push( this );
10733 if ( pieces.length === rows * cells ) {
10734 animComplete();
10735 }
10736 }
10737
10738 // clone the element for each row and cell.
10739 for( i = 0; i < rows ; i++ ) { // ===>
10740 top = offset.top + i * height;
10741 my = i - ( rows - 1 ) / 2 ;
10742
10743 for( j = 0; j < cells ; j++ ) { // |||
10744 left = offset.left + j * width;
10745 mx = j - ( cells - 1 ) / 2 ;
10746
10747 // Create a clone of the now hidden main element that will be absolute positioned
10748 // within a wrapper div off the -left and -top equal to size of our pieces
10749 el
10750 .clone()
10751 .appendTo( "body" )
10752 .wrap( "<div></div>" )
10753 .css({
10754 position: "absolute",
10755 visibility: "visible",
10756 left: -j * width,
10757 top: -i * height
10758 })
10759
10760 // select the wrapper - make it overflow: hidden and absolute positioned based on
10761 // where the original was located +left and +top equal to the size of pieces
10762 .parent()
10763 .addClass( "ui-effects-explode" )
10764 .css({
10765 position: "absolute",
10766 overflow: "hidden",
10767 width: width,
10768 height: height,
10769 left: left + ( show ? mx * width : 0 ),
10770 top: top + ( show ? my * height : 0 ),
10771 opacity: show ? 0 : 1
10772 }).animate({
10773 left: left + ( show ? 0 : mx * width ),
10774 top: top + ( show ? 0 : my * height ),
10775 opacity: show ? 1 : 0
10776 }, o.duration || 500, o.easing, childComplete );
10777 }
10778 }
10779
10780 function animComplete() {
10781 el.css({
10782 visibility: "visible"
10783 });
10784 $( pieces ).remove();
10785 if ( !show ) {
10786 el.hide();
10787 }
10788 done();
10789 }
10790};
10791
10792})(jQuery);
10793
10794(function( $, undefined ) {
10795
10796$.effects.effect.fade = function( o, done ) {
10797 var el = $( this ),
10798 mode = $.effects.setMode( el, o.mode || "toggle" );
10799
10800 el.animate({
10801 opacity: mode
10802 }, {
10803 queue: false,
10804 duration: o.duration,
10805 easing: o.easing,
10806 complete: done
10807 });
10808};
10809
10810})( jQuery );
10811
10812(function( $, undefined ) {
10813
10814$.effects.effect.fold = function( o, done ) {
10815
10816 // Create element
10817 var el = $( this ),
10818 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10819 mode = $.effects.setMode( el, o.mode || "hide" ),
10820 show = mode === "show",
10821 hide = mode === "hide",
10822 size = o.size || 15,
10823 percent = /([0-9]+)%/.exec( size ),
10824 horizFirst = !!o.horizFirst,
10825 widthFirst = show !== horizFirst,
10826 ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
10827 duration = o.duration / 2,
10828 wrapper, distance,
10829 animation1 = {},
10830 animation2 = {};
10831
10832 $.effects.save( el, props );
10833 el.show();
10834
10835 // Create Wrapper
10836 wrapper = $.effects.createWrapper( el ).css({
10837 overflow: "hidden"
10838 });
10839 distance = widthFirst ?
10840 [ wrapper.width(), wrapper.height() ] :
10841 [ wrapper.height(), wrapper.width() ];
10842
10843 if ( percent ) {
10844 size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
10845 }
10846 if ( show ) {
10847 wrapper.css( horizFirst ? {
10848 height: 0,
10849 width: size
10850 } : {
10851 height: size,
10852 width: 0
10853 });
10854 }
10855
10856 // Animation
10857 animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
10858 animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
10859
10860 // Animate
10861 wrapper
10862 .animate( animation1, duration, o.easing )
10863 .animate( animation2, duration, o.easing, function() {
10864 if ( hide ) {
10865 el.hide();
10866 }
10867 $.effects.restore( el, props );
10868 $.effects.removeWrapper( el );
10869 done();
10870 });
10871
10872};
10873
10874})(jQuery);
10875
10876(function( $, undefined ) {
10877
10878$.effects.effect.highlight = function( o, done ) {
10879 var elem = $( this ),
10880 props = [ "backgroundImage", "backgroundColor", "opacity" ],
10881 mode = $.effects.setMode( elem, o.mode || "show" ),
10882 animation = {
10883 backgroundColor: elem.css( "backgroundColor" )
10884 };
10885
10886 if (mode === "hide") {
10887 animation.opacity = 0;
10888 }
10889
10890 $.effects.save( elem, props );
10891
10892 elem
10893 .show()
10894 .css({
10895 backgroundImage: "none",
10896 backgroundColor: o.color || "#ffff99"
10897 })
10898 .animate( animation, {
10899 queue: false,
10900 duration: o.duration,
10901 easing: o.easing,
10902 complete: function() {
10903 if ( mode === "hide" ) {
10904 elem.hide();
10905 }
10906 $.effects.restore( elem, props );
10907 done();
10908 }
10909 });
10910};
10911
10912})(jQuery);
10913
10914(function( $, undefined ) {
10915
10916$.effects.effect.pulsate = function( o, done ) {
10917 var elem = $( this ),
10918 mode = $.effects.setMode( elem, o.mode || "show" ),
10919 show = mode === "show",
10920 hide = mode === "hide",
10921 showhide = ( show || mode === "hide" ),
10922
10923 // showing or hiding leaves of the "last" animation
10924 anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
10925 duration = o.duration / anims,
10926 animateTo = 0,
10927 queue = elem.queue(),
10928 queuelen = queue.length,
10929 i;
10930
10931 if ( show || !elem.is(":visible")) {
10932 elem.css( "opacity", 0 ).show();
10933 animateTo = 1;
10934 }
10935
10936 // anims - 1 opacity "toggles"
10937 for ( i = 1; i < anims; i++ ) {
10938 elem.animate({
10939 opacity: animateTo
10940 }, duration, o.easing );
10941 animateTo = 1 - animateTo;
10942 }
10943
10944 elem.animate({
10945 opacity: animateTo
10946 }, duration, o.easing);
10947
10948 elem.queue(function() {
10949 if ( hide ) {
10950 elem.hide();
10951 }
10952 done();
10953 });
10954
10955 // We just queued up "anims" animations, we need to put them next in the queue
10956 if ( queuelen > 1 ) {
10957 queue.splice.apply( queue,
10958 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
10959 }
10960 elem.dequeue();
10961};
10962
10963})(jQuery);
10964
10965(function( $, undefined ) {
10966
10967$.effects.effect.puff = function( o, done ) {
10968 var elem = $( this ),
10969 mode = $.effects.setMode( elem, o.mode || "hide" ),
10970 hide = mode === "hide",
10971 percent = parseInt( o.percent, 10 ) || 150,
10972 factor = percent / 100,
10973 original = {
10974 height: elem.height(),
10975 width: elem.width(),
10976 outerHeight: elem.outerHeight(),
10977 outerWidth: elem.outerWidth()
10978 };
10979
10980 $.extend( o, {
10981 effect: "scale",
10982 queue: false,
10983 fade: true,
10984 mode: mode,
10985 complete: done,
10986 percent: hide ? percent : 100,
10987 from: hide ?
10988 original :
10989 {
10990 height: original.height * factor,
10991 width: original.width * factor,
10992 outerHeight: original.outerHeight * factor,
10993 outerWidth: original.outerWidth * factor
10994 }
10995 });
10996
10997 elem.effect( o );
10998};
10999
11000$.effects.effect.scale = function( o, done ) {
11001
11002 // Create element
11003 var el = $( this ),
11004 options = $.extend( true, {}, o ),
11005 mode = $.effects.setMode( el, o.mode || "effect" ),
11006 percent = parseInt( o.percent, 10 ) ||
11007 ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
11008 direction = o.direction || "both",
11009 origin = o.origin,
11010 original = {
11011 height: el.height(),
11012 width: el.width(),
11013 outerHeight: el.outerHeight(),
11014 outerWidth: el.outerWidth()
11015 },
11016 factor = {
11017 y: direction !== "horizontal" ? (percent / 100) : 1,
11018 x: direction !== "vertical" ? (percent / 100) : 1
11019 };
11020
11021 // We are going to pass this effect to the size effect:
11022 options.effect = "size";
11023 options.queue = false;
11024 options.complete = done;
11025
11026 // Set default origin and restore for show/hide
11027 if ( mode !== "effect" ) {
11028 options.origin = origin || ["middle","center"];
11029 options.restore = true;
11030 }
11031
11032 options.from = o.from || ( mode === "show" ? {
11033 height: 0,
11034 width: 0,
11035 outerHeight: 0,
11036 outerWidth: 0
11037 } : original );
11038 options.to = {
11039 height: original.height * factor.y,
11040 width: original.width * factor.x,
11041 outerHeight: original.outerHeight * factor.y,
11042 outerWidth: original.outerWidth * factor.x
11043 };
11044
11045 // Fade option to support puff
11046 if ( options.fade ) {
11047 if ( mode === "show" ) {
11048 options.from.opacity = 0;
11049 options.to.opacity = 1;
11050 }
11051 if ( mode === "hide" ) {
11052 options.from.opacity = 1;
11053 options.to.opacity = 0;
11054 }
11055 }
11056
11057 // Animate
11058 el.effect( options );
11059
11060};
11061
11062$.effects.effect.size = function( o, done ) {
11063
11064 // Create element
11065 var original, baseline, factor,
11066 el = $( this ),
11067 props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
11068
11069 // Always restore
11070 props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
11071
11072 // Copy for children
11073 props2 = [ "width", "height", "overflow" ],
11074 cProps = [ "fontSize" ],
11075 vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
11076 hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
11077
11078 // Set options
11079 mode = $.effects.setMode( el, o.mode || "effect" ),
11080 restore = o.restore || mode !== "effect",
11081 scale = o.scale || "both",
11082 origin = o.origin || [ "middle", "center" ],
11083 position = el.css( "position" ),
11084 props = restore ? props0 : props1,
11085 zero = {
11086 height: 0,
11087 width: 0,
11088 outerHeight: 0,
11089 outerWidth: 0
11090 };
11091
11092 if ( mode === "show" ) {
11093 el.show();
11094 }
11095 original = {
11096 height: el.height(),
11097 width: el.width(),
11098 outerHeight: el.outerHeight(),
11099 outerWidth: el.outerWidth()
11100 };
11101
11102 if ( o.mode === "toggle" && mode === "show" ) {
11103 el.from = o.to || zero;
11104 el.to = o.from || original;
11105 } else {
11106 el.from = o.from || ( mode === "show" ? zero : original );
11107 el.to = o.to || ( mode === "hide" ? zero : original );
11108 }
11109
11110 // Set scaling factor
11111 factor = {
11112 from: {
11113 y: el.from.height / original.height,
11114 x: el.from.width / original.width
11115 },
11116 to: {
11117 y: el.to.height / original.height,
11118 x: el.to.width / original.width
11119 }
11120 };
11121
11122 // Scale the css box
11123 if ( scale === "box" || scale === "both" ) {
11124
11125 // Vertical props scaling
11126 if ( factor.from.y !== factor.to.y ) {
11127 props = props.concat( vProps );
11128 el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
11129 el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
11130 }
11131
11132 // Horizontal props scaling
11133 if ( factor.from.x !== factor.to.x ) {
11134 props = props.concat( hProps );
11135 el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
11136 el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
11137 }
11138 }
11139
11140 // Scale the content
11141 if ( scale === "content" || scale === "both" ) {
11142
11143 // Vertical props scaling
11144 if ( factor.from.y !== factor.to.y ) {
11145 props = props.concat( cProps ).concat( props2 );
11146 el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
11147 el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
11148 }
11149 }
11150
11151 $.effects.save( el, props );
11152 el.show();
11153 $.effects.createWrapper( el );
11154 el.css( "overflow", "hidden" ).css( el.from );
11155
11156 // Adjust
11157 if (origin) { // Calculate baseline shifts
11158 baseline = $.effects.getBaseline( origin, original );
11159 el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
11160 el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
11161 el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
11162 el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
11163 }
11164 el.css( el.from ); // set top & left
11165
11166 // Animate
11167 if ( scale === "content" || scale === "both" ) { // Scale the children
11168
11169 // Add margins/font-size
11170 vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
11171 hProps = hProps.concat([ "marginLeft", "marginRight" ]);
11172 props2 = props0.concat(vProps).concat(hProps);
11173
11174 el.find( "*[width]" ).each( function(){
11175 var child = $( this ),
11176 c_original = {
11177 height: child.height(),
11178 width: child.width(),
11179 outerHeight: child.outerHeight(),
11180 outerWidth: child.outerWidth()
11181 };
11182 if (restore) {
11183 $.effects.save(child, props2);
11184 }
11185
11186 child.from = {
11187 height: c_original.height * factor.from.y,
11188 width: c_original.width * factor.from.x,
11189 outerHeight: c_original.outerHeight * factor.from.y,
11190 outerWidth: c_original.outerWidth * factor.from.x
11191 };
11192 child.to = {
11193 height: c_original.height * factor.to.y,
11194 width: c_original.width * factor.to.x,
11195 outerHeight: c_original.height * factor.to.y,
11196 outerWidth: c_original.width * factor.to.x
11197 };
11198
11199 // Vertical props scaling
11200 if ( factor.from.y !== factor.to.y ) {
11201 child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
11202 child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
11203 }
11204
11205 // Horizontal props scaling
11206 if ( factor.from.x !== factor.to.x ) {
11207 child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
11208 child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
11209 }
11210
11211 // Animate children
11212 child.css( child.from );
11213 child.animate( child.to, o.duration, o.easing, function() {
11214
11215 // Restore children
11216 if ( restore ) {
11217 $.effects.restore( child, props2 );
11218 }
11219 });
11220 });
11221 }
11222
11223 // Animate
11224 el.animate( el.to, {
11225 queue: false,
11226 duration: o.duration,
11227 easing: o.easing,
11228 complete: function() {
11229 if ( el.to.opacity === 0 ) {
11230 el.css( "opacity", el.from.opacity );
11231 }
11232 if( mode === "hide" ) {
11233 el.hide();
11234 }
11235 $.effects.restore( el, props );
11236 if ( !restore ) {
11237
11238 // we need to calculate our new positioning based on the scaling
11239 if ( position === "static" ) {
11240 el.css({
11241 position: "relative",
11242 top: el.to.top,
11243 left: el.to.left
11244 });
11245 } else {
11246 $.each([ "top", "left" ], function( idx, pos ) {
11247 el.css( pos, function( _, str ) {
11248 var val = parseInt( str, 10 ),
11249 toRef = idx ? el.to.left : el.to.top;
11250
11251 // if original was "auto", recalculate the new value from wrapper
11252 if ( str === "auto" ) {
11253 return toRef + "px";
11254 }
11255
11256 return val + toRef + "px";
11257 });
11258 });
11259 }
11260 }
11261
11262 $.effects.removeWrapper( el );
11263 done();
11264 }
11265 });
11266
11267};
11268
11269})(jQuery);
11270
11271(function( $, undefined ) {
11272
11273$.effects.effect.shake = function( o, done ) {
11274
11275 var el = $( this ),
11276 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
11277 mode = $.effects.setMode( el, o.mode || "effect" ),
11278 direction = o.direction || "left",
11279 distance = o.distance || 20,
11280 times = o.times || 3,
11281 anims = times * 2 + 1,
11282 speed = Math.round(o.duration/anims),
11283 ref = (direction === "up" || direction === "down") ? "top" : "left",
11284 positiveMotion = (direction === "up" || direction === "left"),
11285 animation = {},
11286 animation1 = {},
11287 animation2 = {},
11288 i,
11289
11290 // we will need to re-assemble the queue to stack our animations in place
11291 queue = el.queue(),
11292 queuelen = queue.length;
11293
11294 $.effects.save( el, props );
11295 el.show();
11296 $.effects.createWrapper( el );
11297
11298 // Animation
11299 animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
11300 animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
11301 animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
11302
11303 // Animate
11304 el.animate( animation, speed, o.easing );
11305
11306 // Shakes
11307 for ( i = 1; i < times; i++ ) {
11308 el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
11309 }
11310 el
11311 .animate( animation1, speed, o.easing )
11312 .animate( animation, speed / 2, o.easing )
11313 .queue(function() {
11314 if ( mode === "hide" ) {
11315 el.hide();
11316 }
11317 $.effects.restore( el, props );
11318 $.effects.removeWrapper( el );
11319 done();
11320 });
11321
11322 // inject all the animations we just queued to be first in line (after "inprogress")
11323 if ( queuelen > 1) {
11324 queue.splice.apply( queue,
11325 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
11326 }
11327 el.dequeue();
11328
11329};
11330
11331})(jQuery);
11332
11333(function( $, undefined ) {
11334
11335$.effects.effect.slide = function( o, done ) {
11336
11337 // Create element
11338 var el = $( this ),
11339 props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
11340 mode = $.effects.setMode( el, o.mode || "show" ),
11341 show = mode === "show",
11342 direction = o.direction || "left",
11343 ref = (direction === "up" || direction === "down") ? "top" : "left",
11344 positiveMotion = (direction === "up" || direction === "left"),
11345 distance,
11346 animation = {};
11347
11348 // Adjust
11349 $.effects.save( el, props );
11350 el.show();
11351 distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
11352
11353 $.effects.createWrapper( el ).css({
11354 overflow: "hidden"
11355 });
11356
11357 if ( show ) {
11358 el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
11359 }
11360
11361 // Animation
11362 animation[ ref ] = ( show ?
11363 ( positiveMotion ? "+=" : "-=") :
11364 ( positiveMotion ? "-=" : "+=")) +
11365 distance;
11366
11367 // Animate
11368 el.animate( animation, {
11369 queue: false,
11370 duration: o.duration,
11371 easing: o.easing,
11372 complete: function() {
11373 if ( mode === "hide" ) {
11374 el.hide();
11375 }
11376 $.effects.restore( el, props );
11377 $.effects.removeWrapper( el );
11378 done();
11379 }
11380 });
11381};
11382
11383})(jQuery);
11384
11385(function( $, undefined ) {
11386
11387$.effects.effect.transfer = function( o, done ) {
11388 var elem = $( this ),
11389 target = $( o.to ),
11390 targetFixed = target.css( "position" ) === "fixed",
11391 body = $("body"),
11392 fixTop = targetFixed ? body.scrollTop() : 0,
11393 fixLeft = targetFixed ? body.scrollLeft() : 0,
11394 endPosition = target.offset(),
11395 animation = {
11396 top: endPosition.top - fixTop ,
11397 left: endPosition.left - fixLeft ,
11398 height: target.innerHeight(),
11399 width: target.innerWidth()
11400 },
11401 startPosition = elem.offset(),
11402 transfer = $( "<div class='ui-effects-transfer'></div>" )
11403 .appendTo( document.body )
11404 .addClass( o.className )
11405 .css({
11406 top: startPosition.top - fixTop ,
11407 left: startPosition.left - fixLeft ,
11408 height: elem.innerHeight(),
11409 width: elem.innerWidth(),
11410 position: targetFixed ? "fixed" : "absolute"
11411 })
11412 .animate( animation, o.duration, o.easing, function() {
11413 transfer.remove();
11414 done();
11415 });
11416};
11417
11418})(jQuery);
11419
11420(function( $, undefined ) {
11421
11422$.widget( "ui.menu", {
11423 version: "1.10.3",
11424 defaultElement: "<ul>",
11425 delay: 300,
11426 options: {
11427 icons: {
11428 submenu: "ui-icon-carat-1-e"
11429 },
11430 menus: "ul",
11431 position: {
11432 my: "left top",
11433 at: "right top"
11434 },
11435 role: "menu",
11436
11437 // callbacks
11438 blur: null,
11439 focus: null,
11440 select: null
11441 },
11442
11443 _create: function() {
11444 this.activeMenu = this.element;
11445 // flag used to prevent firing of the click handler
11446 // as the event bubbles up through nested menus
11447 this.mouseHandled = false;
11448 this.element
11449 .uniqueId()
11450 .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
11451 .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
11452 .attr({
11453 role: this.options.role,
11454 tabIndex: 0
11455 })
11456 // need to catch all clicks on disabled menu
11457 // not possible through _on
11458 .bind( "click" + this.eventNamespace, $.proxy(function( event ) {
11459 if ( this.options.disabled ) {
11460 event.preventDefault();
11461 }
11462 }, this ));
11463
11464 if ( this.options.disabled ) {
11465 this.element
11466 .addClass( "ui-state-disabled" )
11467 .attr( "aria-disabled", "true" );
11468 }
11469
11470 this._on({
11471 // Prevent focus from sticking to links inside menu after clicking
11472 // them (focus should always stay on UL during navigation).
11473 "mousedown .ui-menu-item > a": function( event ) {
11474 event.preventDefault();
11475 },
11476 "click .ui-state-disabled > a": function( event ) {
11477 event.preventDefault();
11478 },
11479 "click .ui-menu-item:has(a)": function( event ) {
11480 var target = $( event.target ).closest( ".ui-menu-item" );
11481 if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
11482 this.mouseHandled = true;
11483
11484 this.select( event );
11485 // Open submenu on click
11486 if ( target.has( ".ui-menu" ).length ) {
11487 this.expand( event );
11488 } else if ( !this.element.is( ":focus" ) ) {
11489 // Redirect focus to the menu
11490 this.element.trigger( "focus", [ true ] );
11491
11492 // If the active item is on the top level, let it stay active.
11493 // Otherwise, blur the active item since it is no longer visible.
11494 if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
11495 clearTimeout( this.timer );
11496 }
11497 }
11498 }
11499 },
11500 "mouseenter .ui-menu-item": function( event ) {
11501 var target = $( event.currentTarget );
11502 // Remove ui-state-active class from siblings of the newly focused menu item
11503 // to avoid a jump caused by adjacent elements both having a class with a border
11504 target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
11505 this.focus( event, target );
11506 },
11507 mouseleave: "collapseAll",
11508 "mouseleave .ui-menu": "collapseAll",
11509 focus: function( event, keepActiveItem ) {
11510 // If there's already an active item, keep it active
11511 // If not, activate the first item
11512 var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
11513
11514 if ( !keepActiveItem ) {
11515 this.focus( event, item );
11516 }
11517 },
11518 blur: function( event ) {
11519 this._delay(function() {
11520 if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
11521 this.collapseAll( event );
11522 }
11523 });
11524 },
11525 keydown: "_keydown"
11526 });
11527
11528 this.refresh();
11529
11530 // Clicks outside of a menu collapse any open menus
11531 this._on( this.document, {
11532 click: function( event ) {
11533 if ( !$( event.target ).closest( ".ui-menu" ).length ) {
11534 this.collapseAll( event );
11535 }
11536
11537 // Reset the mouseHandled flag
11538 this.mouseHandled = false;
11539 }
11540 });
11541 },
11542
11543 _destroy: function() {
11544 // Destroy (sub)menus
11545 this.element
11546 .removeAttr( "aria-activedescendant" )
11547 .find( ".ui-menu" ).addBack()
11548 .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
11549 .removeAttr( "role" )
11550 .removeAttr( "tabIndex" )
11551 .removeAttr( "aria-labelledby" )
11552 .removeAttr( "aria-expanded" )
11553 .removeAttr( "aria-hidden" )
11554 .removeAttr( "aria-disabled" )
11555 .removeUniqueId()
11556 .show();
11557
11558 // Destroy menu items
11559 this.element.find( ".ui-menu-item" )
11560 .removeClass( "ui-menu-item" )
11561 .removeAttr( "role" )
11562 .removeAttr( "aria-disabled" )
11563 .children( "a" )
11564 .removeUniqueId()
11565 .removeClass( "ui-corner-all ui-state-hover" )
11566 .removeAttr( "tabIndex" )
11567 .removeAttr( "role" )
11568 .removeAttr( "aria-haspopup" )
11569 .children().each( function() {
11570 var elem = $( this );
11571 if ( elem.data( "ui-menu-submenu-carat" ) ) {
11572 elem.remove();
11573 }
11574 });
11575
11576 // Destroy menu dividers
11577 this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
11578 },
11579
11580 _keydown: function( event ) {
11581 /*jshint maxcomplexity:20*/
11582 var match, prev, character, skip, regex,
11583 preventDefault = true;
11584
11585 function escape( value ) {
11586 return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
11587 }
11588
11589 switch ( event.keyCode ) {
11590 case $.ui.keyCode.PAGE_UP:
11591 this.previousPage( event );
11592 break;
11593 case $.ui.keyCode.PAGE_DOWN:
11594 this.nextPage( event );
11595 break;
11596 case $.ui.keyCode.HOME:
11597 this._move( "first", "first", event );
11598 break;
11599 case $.ui.keyCode.END:
11600 this._move( "last", "last", event );
11601 break;
11602 case $.ui.keyCode.UP:
11603 this.previous( event );
11604 break;
11605 case $.ui.keyCode.DOWN:
11606 this.next( event );
11607 break;
11608 case $.ui.keyCode.LEFT:
11609 this.collapse( event );
11610 break;
11611 case $.ui.keyCode.RIGHT:
11612 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
11613 this.expand( event );
11614 }
11615 break;
11616 case $.ui.keyCode.ENTER:
11617 case $.ui.keyCode.SPACE:
11618 this._activate( event );
11619 break;
11620 case $.ui.keyCode.ESCAPE:
11621 this.collapse( event );
11622 break;
11623 default:
11624 preventDefault = false;
11625 prev = this.previousFilter || "";
11626 character = String.fromCharCode( event.keyCode );
11627 skip = false;
11628
11629 clearTimeout( this.filterTimer );
11630
11631 if ( character === prev ) {
11632 skip = true;
11633 } else {
11634 character = prev + character;
11635 }
11636
11637 regex = new RegExp( "^" + escape( character ), "i" );
11638 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
11639 return regex.test( $( this ).children( "a" ).text() );
11640 });
11641 match = skip && match.index( this.active.next() ) !== -1 ?
11642 this.active.nextAll( ".ui-menu-item" ) :
11643 match;
11644
11645 // If no matches on the current filter, reset to the last character pressed
11646 // to move down the menu to the first item that starts with that character
11647 if ( !match.length ) {
11648 character = String.fromCharCode( event.keyCode );
11649 regex = new RegExp( "^" + escape( character ), "i" );
11650 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
11651 return regex.test( $( this ).children( "a" ).text() );
11652 });
11653 }
11654
11655 if ( match.length ) {
11656 this.focus( event, match );
11657 if ( match.length > 1 ) {
11658 this.previousFilter = character;
11659 this.filterTimer = this._delay(function() {
11660 delete this.previousFilter;
11661 }, 1000 );
11662 } else {
11663 delete this.previousFilter;
11664 }
11665 } else {
11666 delete this.previousFilter;
11667 }
11668 }
11669
11670 if ( preventDefault ) {
11671 event.preventDefault();
11672 }
11673 },
11674
11675 _activate: function( event ) {
11676 if ( !this.active.is( ".ui-state-disabled" ) ) {
11677 if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
11678 this.expand( event );
11679 } else {
11680 this.select( event );
11681 }
11682 }
11683 },
11684
11685 refresh: function() {
11686 var menus,
11687 icon = this.options.icons.submenu,
11688 submenus = this.element.find( this.options.menus );
11689
11690 // Initialize nested menus
11691 submenus.filter( ":not(.ui-menu)" )
11692 .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
11693 .hide()
11694 .attr({
11695 role: this.options.role,
11696 "aria-hidden": "true",
11697 "aria-expanded": "false"
11698 })
11699 .each(function() {
11700 var menu = $( this ),
11701 item = menu.prev( "a" ),
11702 submenuCarat = $( "<span>" )
11703 .addClass( "ui-menu-icon ui-icon " + icon )
11704 .data( "ui-menu-submenu-carat", true );
11705
11706 item
11707 .attr( "aria-haspopup", "true" )
11708 .prepend( submenuCarat );
11709 menu.attr( "aria-labelledby", item.attr( "id" ) );
11710 });
11711
11712 menus = submenus.add( this.element );
11713
11714 // Don't refresh list items that are already adapted
11715 menus.children( ":not(.ui-menu-item):has(a)" )
11716 .addClass( "ui-menu-item" )
11717 .attr( "role", "presentation" )
11718 .children( "a" )
11719 .uniqueId()
11720 .addClass( "ui-corner-all" )
11721 .attr({
11722 tabIndex: -1,
11723 role: this._itemRole()
11724 });
11725
11726 // Initialize unlinked menu-items containing spaces and/or dashes only as dividers
11727 menus.children( ":not(.ui-menu-item)" ).each(function() {
11728 var item = $( this );
11729 // hyphen, em dash, en dash
11730 if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) {
11731 item.addClass( "ui-widget-content ui-menu-divider" );
11732 }
11733 });
11734
11735 // Add aria-disabled attribute to any disabled menu item
11736 menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
11737
11738 // If the active item has been removed, blur the menu
11739 if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
11740 this.blur();
11741 }
11742 },
11743
11744 _itemRole: function() {
11745 return {
11746 menu: "menuitem",
11747 listbox: "option"
11748 }[ this.options.role ];
11749 },
11750
11751 _setOption: function( key, value ) {
11752 if ( key === "icons" ) {
11753 this.element.find( ".ui-menu-icon" )
11754 .removeClass( this.options.icons.submenu )
11755 .addClass( value.submenu );
11756 }
11757 this._super( key, value );
11758 },
11759
11760 focus: function( event, item ) {
11761 var nested, focused;
11762 this.blur( event, event && event.type === "focus" );
11763
11764 this._scrollIntoView( item );
11765
11766 this.active = item.first();
11767 focused = this.active.children( "a" ).addClass( "ui-state-focus" );
11768 // Only update aria-activedescendant if there's a role
11769 // otherwise we assume focus is managed elsewhere
11770 if ( this.options.role ) {
11771 this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
11772 }
11773
11774 // Highlight active parent menu item, if any
11775 this.active
11776 .parent()
11777 .closest( ".ui-menu-item" )
11778 .children( "a:first" )
11779 .addClass( "ui-state-active" );
11780
11781 if ( event && event.type === "keydown" ) {
11782 this._close();
11783 } else {
11784 this.timer = this._delay(function() {
11785 this._close();
11786 }, this.delay );
11787 }
11788
11789 nested = item.children( ".ui-menu" );
11790 if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
11791 this._startOpening(nested);
11792 }
11793 this.activeMenu = item.parent();
11794
11795 this._trigger( "focus", event, { item: item } );
11796 },
11797
11798 _scrollIntoView: function( item ) {
11799 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
11800 if ( this._hasScroll() ) {
11801 borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
11802 paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
11803 offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
11804 scroll = this.activeMenu.scrollTop();
11805 elementHeight = this.activeMenu.height();
11806 itemHeight = item.height();
11807
11808 if ( offset < 0 ) {
11809 this.activeMenu.scrollTop( scroll + offset );
11810 } else if ( offset + itemHeight > elementHeight ) {
11811 this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
11812 }
11813 }
11814 },
11815
11816 blur: function( event, fromFocus ) {
11817 if ( !fromFocus ) {
11818 clearTimeout( this.timer );
11819 }
11820
11821 if ( !this.active ) {
11822 return;
11823 }
11824
11825 this.active.children( "a" ).removeClass( "ui-state-focus" );
11826 this.active = null;
11827
11828 this._trigger( "blur", event, { item: this.active } );
11829 },
11830
11831 _startOpening: function( submenu ) {
11832 clearTimeout( this.timer );
11833
11834 // Don't open if already open fixes a Firefox bug that caused a .5 pixel
11835 // shift in the submenu position when mousing over the carat icon
11836 if ( submenu.attr( "aria-hidden" ) !== "true" ) {
11837 return;
11838 }
11839
11840 this.timer = this._delay(function() {
11841 this._close();
11842 this._open( submenu );
11843 }, this.delay );
11844 },
11845
11846 _open: function( submenu ) {
11847 var position = $.extend({
11848 of: this.active
11849 }, this.options.position );
11850
11851 clearTimeout( this.timer );
11852 this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
11853 .hide()
11854 .attr( "aria-hidden", "true" );
11855
11856 submenu
11857 .show()
11858 .removeAttr( "aria-hidden" )
11859 .attr( "aria-expanded", "true" )
11860 .position( position );
11861 },
11862
11863 collapseAll: function( event, all ) {
11864 clearTimeout( this.timer );
11865 this.timer = this._delay(function() {
11866 // If we were passed an event, look for the submenu that contains the event
11867 var currentMenu = all ? this.element :
11868 $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
11869
11870 // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
11871 if ( !currentMenu.length ) {
11872 currentMenu = this.element;
11873 }
11874
11875 this._close( currentMenu );
11876
11877 this.blur( event );
11878 this.activeMenu = currentMenu;
11879 }, this.delay );
11880 },
11881
11882 // With no arguments, closes the currently active menu - if nothing is active
11883 // it closes all menus. If passed an argument, it will search for menus BELOW
11884 _close: function( startMenu ) {
11885 if ( !startMenu ) {
11886 startMenu = this.active ? this.active.parent() : this.element;
11887 }
11888
11889 startMenu
11890 .find( ".ui-menu" )
11891 .hide()
11892 .attr( "aria-hidden", "true" )
11893 .attr( "aria-expanded", "false" )
11894 .end()
11895 .find( "a.ui-state-active" )
11896 .removeClass( "ui-state-active" );
11897 },
11898
11899 collapse: function( event ) {
11900 var newItem = this.active &&
11901 this.active.parent().closest( ".ui-menu-item", this.element );
11902 if ( newItem && newItem.length ) {
11903 this._close();
11904 this.focus( event, newItem );
11905 }
11906 },
11907
11908 expand: function( event ) {
11909 var newItem = this.active &&
11910 this.active
11911 .children( ".ui-menu " )
11912 .children( ".ui-menu-item" )
11913 .first();
11914
11915 if ( newItem && newItem.length ) {
11916 this._open( newItem.parent() );
11917
11918 // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
11919 this._delay(function() {
11920 this.focus( event, newItem );
11921 });
11922 }
11923 },
11924
11925 next: function( event ) {
11926 this._move( "next", "first", event );
11927 },
11928
11929 previous: function( event ) {
11930 this._move( "prev", "last", event );
11931 },
11932
11933 isFirstItem: function() {
11934 return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
11935 },
11936
11937 isLastItem: function() {
11938 return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
11939 },
11940
11941 _move: function( direction, filter, event ) {
11942 var next;
11943 if ( this.active ) {
11944 if ( direction === "first" || direction === "last" ) {
11945 next = this.active
11946 [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
11947 .eq( -1 );
11948 } else {
11949 next = this.active
11950 [ direction + "All" ]( ".ui-menu-item" )
11951 .eq( 0 );
11952 }
11953 }
11954 if ( !next || !next.length || !this.active ) {
11955 next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
11956 }
11957
11958 this.focus( event, next );
11959 },
11960
11961 nextPage: function( event ) {
11962 var item, base, height;
11963
11964 if ( !this.active ) {
11965 this.next( event );
11966 return;
11967 }
11968 if ( this.isLastItem() ) {
11969 return;
11970 }
11971 if ( this._hasScroll() ) {
11972 base = this.active.offset().top;
11973 height = this.element.height();
11974 this.active.nextAll( ".ui-menu-item" ).each(function() {
11975 item = $( this );
11976 return item.offset().top - base - height < 0;
11977 });
11978
11979 this.focus( event, item );
11980 } else {
11981 this.focus( event, this.activeMenu.children( ".ui-menu-item" )
11982 [ !this.active ? "first" : "last" ]() );
11983 }
11984 },
11985
11986 previousPage: function( event ) {
11987 var item, base, height;
11988 if ( !this.active ) {
11989 this.next( event );
11990 return;
11991 }
11992 if ( this.isFirstItem() ) {
11993 return;
11994 }
11995 if ( this._hasScroll() ) {
11996 base = this.active.offset().top;
11997 height = this.element.height();
11998 this.active.prevAll( ".ui-menu-item" ).each(function() {
11999 item = $( this );
12000 return item.offset().top - base + height > 0;
12001 });
12002
12003 this.focus( event, item );
12004 } else {
12005 this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
12006 }
12007 },
12008
12009 _hasScroll: function() {
12010 return this.element.outerHeight() < this.element.prop( "scrollHeight" );
12011 },
12012
12013 select: function( event ) {
12014 // TODO: It should never be possible to not have an active item at this
12015 // point, but the tests don't trigger mouseenter before click.
12016 this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
12017 var ui = { item: this.active };
12018 if ( !this.active.has( ".ui-menu" ).length ) {
12019 this.collapseAll( event, true );
12020 }
12021 this._trigger( "select", event, ui );
12022 }
12023});
12024
12025}( jQuery ));
12026
12027(function( $, undefined ) {
12028
12029$.ui = $.ui || {};
12030
12031var cachedScrollbarWidth,
12032 max = Math.max,
12033 abs = Math.abs,
12034 round = Math.round,
12035 rhorizontal = /left|center|right/,
12036 rvertical = /top|center|bottom/,
12037 roffset = /[\+\-]\d+(\.[\d]+)?%?/,
12038 rposition = /^\w+/,
12039 rpercent = /%$/,
12040 _position = $.fn.position;
12041
12042function getOffsets( offsets, width, height ) {
12043 return [
12044 parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
12045 parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
12046 ];
12047}
12048
12049function parseCss( element, property ) {
12050 return parseInt( $.css( element, property ), 10 ) || 0;
12051}
12052
12053function getDimensions( elem ) {
12054 var raw = elem[0];
12055 if ( raw.nodeType === 9 ) {
12056 return {
12057 width: elem.width(),
12058 height: elem.height(),
12059 offset: { top: 0, left: 0 }
12060 };
12061 }
12062 if ( $.isWindow( raw ) ) {
12063 return {
12064 width: elem.width(),
12065 height: elem.height(),
12066 offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
12067 };
12068 }
12069 if ( raw.preventDefault ) {
12070 return {
12071 width: 0,
12072 height: 0,
12073 offset: { top: raw.pageY, left: raw.pageX }
12074 };
12075 }
12076 return {
12077 width: elem.outerWidth(),
12078 height: elem.outerHeight(),
12079 offset: elem.offset()
12080 };
12081}
12082
12083$.position = {
12084 scrollbarWidth: function() {
12085 if ( cachedScrollbarWidth !== undefined ) {
12086 return cachedScrollbarWidth;
12087 }
12088 var w1, w2,
12089 div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
12090 innerDiv = div.children()[0];
12091
12092 $( "body" ).append( div );
12093 w1 = innerDiv.offsetWidth;
12094 div.css( "overflow", "scroll" );
12095
12096 w2 = innerDiv.offsetWidth;
12097
12098 if ( w1 === w2 ) {
12099 w2 = div[0].clientWidth;
12100 }
12101
12102 div.remove();
12103
12104 return (cachedScrollbarWidth = w1 - w2);
12105 },
12106 getScrollInfo: function( within ) {
12107 var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
12108 overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
12109 hasOverflowX = overflowX === "scroll" ||
12110 ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
12111 hasOverflowY = overflowY === "scroll" ||
12112 ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
12113 return {
12114 width: hasOverflowY ? $.position.scrollbarWidth() : 0,
12115 height: hasOverflowX ? $.position.scrollbarWidth() : 0
12116 };
12117 },
12118 getWithinInfo: function( element ) {
12119 var withinElement = $( element || window ),
12120 isWindow = $.isWindow( withinElement[0] );
12121 return {
12122 element: withinElement,
12123 isWindow: isWindow,
12124 offset: withinElement.offset() || { left: 0, top: 0 },
12125 scrollLeft: withinElement.scrollLeft(),
12126 scrollTop: withinElement.scrollTop(),
12127 width: isWindow ? withinElement.width() : withinElement.outerWidth(),
12128 height: isWindow ? withinElement.height() : withinElement.outerHeight()
12129 };
12130 }
12131};
12132
12133$.fn.position = function( options ) {
12134 if ( !options || !options.of ) {
12135 return _position.apply( this, arguments );
12136 }
12137
12138 // make a copy, we don't want to modify arguments
12139 options = $.extend( {}, options );
12140
12141 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
12142 target = $( options.of ),
12143 within = $.position.getWithinInfo( options.within ),
12144 scrollInfo = $.position.getScrollInfo( within ),
12145 collision = ( options.collision || "flip" ).split( " " ),
12146 offsets = {};
12147
12148 dimensions = getDimensions( target );
12149 if ( target[0].preventDefault ) {
12150 // force left top to allow flipping
12151 options.at = "left top";
12152 }
12153 targetWidth = dimensions.width;
12154 targetHeight = dimensions.height;
12155 targetOffset = dimensions.offset;
12156 // clone to reuse original targetOffset later
12157 basePosition = $.extend( {}, targetOffset );
12158
12159 // force my and at to have valid horizontal and vertical positions
12160 // if a value is missing or invalid, it will be converted to center
12161 $.each( [ "my", "at" ], function() {
12162 var pos = ( options[ this ] || "" ).split( " " ),
12163 horizontalOffset,
12164 verticalOffset;
12165
12166 if ( pos.length === 1) {
12167 pos = rhorizontal.test( pos[ 0 ] ) ?
12168 pos.concat( [ "center" ] ) :
12169 rvertical.test( pos[ 0 ] ) ?
12170 [ "center" ].concat( pos ) :
12171 [ "center", "center" ];
12172 }
12173 pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
12174 pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
12175
12176 // calculate offsets
12177 horizontalOffset = roffset.exec( pos[ 0 ] );
12178 verticalOffset = roffset.exec( pos[ 1 ] );
12179 offsets[ this ] = [
12180 horizontalOffset ? horizontalOffset[ 0 ] : 0,
12181 verticalOffset ? verticalOffset[ 0 ] : 0
12182 ];
12183
12184 // reduce to just the positions without the offsets
12185 options[ this ] = [
12186 rposition.exec( pos[ 0 ] )[ 0 ],
12187 rposition.exec( pos[ 1 ] )[ 0 ]
12188 ];
12189 });
12190
12191 // normalize collision option
12192 if ( collision.length === 1 ) {
12193 collision[ 1 ] = collision[ 0 ];
12194 }
12195
12196 if ( options.at[ 0 ] === "right" ) {
12197 basePosition.left += targetWidth;
12198 } else if ( options.at[ 0 ] === "center" ) {
12199 basePosition.left += targetWidth / 2;
12200 }
12201
12202 if ( options.at[ 1 ] === "bottom" ) {
12203 basePosition.top += targetHeight;
12204 } else if ( options.at[ 1 ] === "center" ) {
12205 basePosition.top += targetHeight / 2;
12206 }
12207
12208 atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
12209 basePosition.left += atOffset[ 0 ];
12210 basePosition.top += atOffset[ 1 ];
12211
12212 return this.each(function() {
12213 var collisionPosition, using,
12214 elem = $( this ),
12215 elemWidth = elem.outerWidth(),
12216 elemHeight = elem.outerHeight(),
12217 marginLeft = parseCss( this, "marginLeft" ),
12218 marginTop = parseCss( this, "marginTop" ),
12219 collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
12220 collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
12221 position = $.extend( {}, basePosition ),
12222 myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
12223
12224 if ( options.my[ 0 ] === "right" ) {
12225 position.left -= elemWidth;
12226 } else if ( options.my[ 0 ] === "center" ) {
12227 position.left -= elemWidth / 2;
12228 }
12229
12230 if ( options.my[ 1 ] === "bottom" ) {
12231 position.top -= elemHeight;
12232 } else if ( options.my[ 1 ] === "center" ) {
12233 position.top -= elemHeight / 2;
12234 }
12235
12236 position.left += myOffset[ 0 ];
12237 position.top += myOffset[ 1 ];
12238
12239 // if the browser doesn't support fractions, then round for consistent results
12240 if ( !$.support.offsetFractions ) {
12241 position.left = round( position.left );
12242 position.top = round( position.top );
12243 }
12244
12245 collisionPosition = {
12246 marginLeft: marginLeft,
12247 marginTop: marginTop
12248 };
12249
12250 $.each( [ "left", "top" ], function( i, dir ) {
12251 if ( $.ui.position[ collision[ i ] ] ) {
12252 $.ui.position[ collision[ i ] ][ dir ]( position, {
12253 targetWidth: targetWidth,
12254 targetHeight: targetHeight,
12255 elemWidth: elemWidth,
12256 elemHeight: elemHeight,
12257 collisionPosition: collisionPosition,
12258 collisionWidth: collisionWidth,
12259 collisionHeight: collisionHeight,
12260 offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
12261 my: options.my,
12262 at: options.at,
12263 within: within,
12264 elem : elem
12265 });
12266 }
12267 });
12268
12269 if ( options.using ) {
12270 // adds feedback as second argument to using callback, if present
12271 using = function( props ) {
12272 var left = targetOffset.left - position.left,
12273 right = left + targetWidth - elemWidth,
12274 top = targetOffset.top - position.top,
12275 bottom = top + targetHeight - elemHeight,
12276 feedback = {
12277 target: {
12278 element: target,
12279 left: targetOffset.left,
12280 top: targetOffset.top,
12281 width: targetWidth,
12282 height: targetHeight
12283 },
12284 element: {
12285 element: elem,
12286 left: position.left,
12287 top: position.top,
12288 width: elemWidth,
12289 height: elemHeight
12290 },
12291 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
12292 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
12293 };
12294 if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
12295 feedback.horizontal = "center";
12296 }
12297 if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
12298 feedback.vertical = "middle";
12299 }
12300 if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
12301 feedback.important = "horizontal";
12302 } else {
12303 feedback.important = "vertical";
12304 }
12305 options.using.call( this, props, feedback );
12306 };
12307 }
12308
12309 elem.offset( $.extend( position, { using: using } ) );
12310 });
12311};
12312
12313$.ui.position = {
12314 fit: {
12315 left: function( position, data ) {
12316 var within = data.within,
12317 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
12318 outerWidth = within.width,
12319 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
12320 overLeft = withinOffset - collisionPosLeft,
12321 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
12322 newOverRight;
12323
12324 // element is wider than within
12325 if ( data.collisionWidth > outerWidth ) {
12326 // element is initially over the left side of within
12327 if ( overLeft > 0 && overRight <= 0 ) {
12328 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
12329 position.left += overLeft - newOverRight;
12330 // element is initially over right side of within
12331 } else if ( overRight > 0 && overLeft <= 0 ) {
12332 position.left = withinOffset;
12333 // element is initially over both left and right sides of within
12334 } else {
12335 if ( overLeft > overRight ) {
12336 position.left = withinOffset + outerWidth - data.collisionWidth;
12337 } else {
12338 position.left = withinOffset;
12339 }
12340 }
12341 // too far left -> align with left edge
12342 } else if ( overLeft > 0 ) {
12343 position.left += overLeft;
12344 // too far right -> align with right edge
12345 } else if ( overRight > 0 ) {
12346 position.left -= overRight;
12347 // adjust based on position and margin
12348 } else {
12349 position.left = max( position.left - collisionPosLeft, position.left );
12350 }
12351 },
12352 top: function( position, data ) {
12353 var within = data.within,
12354 withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
12355 outerHeight = data.within.height,
12356 collisionPosTop = position.top - data.collisionPosition.marginTop,
12357 overTop = withinOffset - collisionPosTop,
12358 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
12359 newOverBottom;
12360
12361 // element is taller than within
12362 if ( data.collisionHeight > outerHeight ) {
12363 // element is initially over the top of within
12364 if ( overTop > 0 && overBottom <= 0 ) {
12365 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
12366 position.top += overTop - newOverBottom;
12367 // element is initially over bottom of within
12368 } else if ( overBottom > 0 && overTop <= 0 ) {
12369 position.top = withinOffset;
12370 // element is initially over both top and bottom of within
12371 } else {
12372 if ( overTop > overBottom ) {
12373 position.top = withinOffset + outerHeight - data.collisionHeight;
12374 } else {
12375 position.top = withinOffset;
12376 }
12377 }
12378 // too far up -> align with top
12379 } else if ( overTop > 0 ) {
12380 position.top += overTop;
12381 // too far down -> align with bottom edge
12382 } else if ( overBottom > 0 ) {
12383 position.top -= overBottom;
12384 // adjust based on position and margin
12385 } else {
12386 position.top = max( position.top - collisionPosTop, position.top );
12387 }
12388 }
12389 },
12390 flip: {
12391 left: function( position, data ) {
12392 var within = data.within,
12393 withinOffset = within.offset.left + within.scrollLeft,
12394 outerWidth = within.width,
12395 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
12396 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
12397 overLeft = collisionPosLeft - offsetLeft,
12398 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
12399 myOffset = data.my[ 0 ] === "left" ?
12400 -data.elemWidth :
12401 data.my[ 0 ] === "right" ?
12402 data.elemWidth :
12403 0,
12404 atOffset = data.at[ 0 ] === "left" ?
12405 data.targetWidth :
12406 data.at[ 0 ] === "right" ?
12407 -data.targetWidth :
12408 0,
12409 offset = -2 * data.offset[ 0 ],
12410 newOverRight,
12411 newOverLeft;
12412
12413 if ( overLeft < 0 ) {
12414 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
12415 if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
12416 position.left += myOffset + atOffset + offset;
12417 }
12418 }
12419 else if ( overRight > 0 ) {
12420 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
12421 if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
12422 position.left += myOffset + atOffset + offset;
12423 }
12424 }
12425 },
12426 top: function( position, data ) {
12427 var within = data.within,
12428 withinOffset = within.offset.top + within.scrollTop,
12429 outerHeight = within.height,
12430 offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
12431 collisionPosTop = position.top - data.collisionPosition.marginTop,
12432 overTop = collisionPosTop - offsetTop,
12433 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
12434 top = data.my[ 1 ] === "top",
12435 myOffset = top ?
12436 -data.elemHeight :
12437 data.my[ 1 ] === "bottom" ?
12438 data.elemHeight :
12439 0,
12440 atOffset = data.at[ 1 ] === "top" ?
12441 data.targetHeight :
12442 data.at[ 1 ] === "bottom" ?
12443 -data.targetHeight :
12444 0,
12445 offset = -2 * data.offset[ 1 ],
12446 newOverTop,
12447 newOverBottom;
12448 if ( overTop < 0 ) {
12449 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
12450 if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
12451 position.top += myOffset + atOffset + offset;
12452 }
12453 }
12454 else if ( overBottom > 0 ) {
12455 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
12456 if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
12457 position.top += myOffset + atOffset + offset;
12458 }
12459 }
12460 }
12461 },
12462 flipfit: {
12463 left: function() {
12464 $.ui.position.flip.left.apply( this, arguments );
12465 $.ui.position.fit.left.apply( this, arguments );
12466 },
12467 top: function() {
12468 $.ui.position.flip.top.apply( this, arguments );
12469 $.ui.position.fit.top.apply( this, arguments );
12470 }
12471 }
12472};
12473
12474// fraction support test
12475(function () {
12476 var testElement, testElementParent, testElementStyle, offsetLeft, i,
12477 body = document.getElementsByTagName( "body" )[ 0 ],
12478 div = document.createElement( "div" );
12479
12480 //Create a "fake body" for testing based on method used in jQuery.support
12481 testElement = document.createElement( body ? "div" : "body" );
12482 testElementStyle = {
12483 visibility: "hidden",
12484 width: 0,
12485 height: 0,
12486 border: 0,
12487 margin: 0,
12488 background: "none"
12489 };
12490 if ( body ) {
12491 $.extend( testElementStyle, {
12492 position: "absolute",
12493 left: "-1000px",
12494 top: "-1000px"
12495 });
12496 }
12497 for ( i in testElementStyle ) {
12498 testElement.style[ i ] = testElementStyle[ i ];
12499 }
12500 testElement.appendChild( div );
12501 testElementParent = body || document.documentElement;
12502 testElementParent.insertBefore( testElement, testElementParent.firstChild );
12503
12504 div.style.cssText = "position: absolute; left: 10.7432222px;";
12505
12506 offsetLeft = $( div ).offset().left;
12507 $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
12508
12509 testElement.innerHTML = "";
12510 testElementParent.removeChild( testElement );
12511})();
12512
12513}( jQuery ) );
12514
12515(function( $, undefined ) {
12516
12517$.widget( "ui.progressbar", {
12518 version: "1.10.3",
12519 options: {
12520 max: 100,
12521 value: 0,
12522
12523 change: null,
12524 complete: null
12525 },
12526
12527 min: 0,
12528
12529 _create: function() {
12530 // Constrain initial value
12531 this.oldValue = this.options.value = this._constrainedValue();
12532
12533 this.element
12534 .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
12535 .attr({
12536 // Only set static values, aria-valuenow and aria-valuemax are
12537 // set inside _refreshValue()
12538 role: "progressbar",
12539 "aria-valuemin": this.min
12540 });
12541
12542 this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
12543 .appendTo( this.element );
12544
12545 this._refreshValue();
12546 },
12547
12548 _destroy: function() {
12549 this.element
12550 .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
12551 .removeAttr( "role" )
12552 .removeAttr( "aria-valuemin" )
12553 .removeAttr( "aria-valuemax" )
12554 .removeAttr( "aria-valuenow" );
12555
12556 this.valueDiv.remove();
12557 },
12558
12559 value: function( newValue ) {
12560 if ( newValue === undefined ) {
12561 return this.options.value;
12562 }
12563
12564 this.options.value = this._constrainedValue( newValue );
12565 this._refreshValue();
12566 },
12567
12568 _constrainedValue: function( newValue ) {
12569 if ( newValue === undefined ) {
12570 newValue = this.options.value;
12571 }
12572
12573 this.indeterminate = newValue === false;
12574
12575 // sanitize value
12576 if ( typeof newValue !== "number" ) {
12577 newValue = 0;
12578 }
12579
12580 return this.indeterminate ? false :
12581 Math.min( this.options.max, Math.max( this.min, newValue ) );
12582 },
12583
12584 _setOptions: function( options ) {
12585 // Ensure "value" option is set after other values (like max)
12586 var value = options.value;
12587 delete options.value;
12588
12589 this._super( options );
12590
12591 this.options.value = this._constrainedValue( value );
12592 this._refreshValue();
12593 },
12594
12595 _setOption: function( key, value ) {
12596 if ( key === "max" ) {
12597 // Don't allow a max less than min
12598 value = Math.max( this.min, value );
12599 }
12600
12601 this._super( key, value );
12602 },
12603
12604 _percentage: function() {
12605 return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
12606 },
12607
12608 _refreshValue: function() {
12609 var value = this.options.value,
12610 percentage = this._percentage();
12611
12612 this.valueDiv
12613 .toggle( this.indeterminate || value > this.min )
12614 .toggleClass( "ui-corner-right", value === this.options.max )
12615 .width( percentage.toFixed(0) + "%" );
12616
12617 this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
12618
12619 if ( this.indeterminate ) {
12620 this.element.removeAttr( "aria-valuenow" );
12621 if ( !this.overlayDiv ) {
12622 this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
12623 }
12624 } else {
12625 this.element.attr({
12626 "aria-valuemax": this.options.max,
12627 "aria-valuenow": value
12628 });
12629 if ( this.overlayDiv ) {
12630 this.overlayDiv.remove();
12631 this.overlayDiv = null;
12632 }
12633 }
12634
12635 if ( this.oldValue !== value ) {
12636 this.oldValue = value;
12637 this._trigger( "change" );
12638 }
12639 if ( value === this.options.max ) {
12640 this._trigger( "complete" );
12641 }
12642 }
12643});
12644
12645})( jQuery );
12646
12647(function( $, undefined ) {
12648
12649// number of pages in a slider
12650// (how many times can you page up/down to go through the whole range)
12651var numPages = 5;
12652
12653$.widget( "ui.slider", $.ui.mouse, {
12654 version: "1.10.3",
12655 widgetEventPrefix: "slide",
12656
12657 options: {
12658 animate: false,
12659 distance: 0,
12660 max: 100,
12661 min: 0,
12662 orientation: "horizontal",
12663 range: false,
12664 step: 1,
12665 value: 0,
12666 values: null,
12667
12668 // callbacks
12669 change: null,
12670 slide: null,
12671 start: null,
12672 stop: null
12673 },
12674
12675 _create: function() {
12676 this._keySliding = false;
12677 this._mouseSliding = false;
12678 this._animateOff = true;
12679 this._handleIndex = null;
12680 this._detectOrientation();
12681 this._mouseInit();
12682
12683 this.element
12684 .addClass( "ui-slider" +
12685 " ui-slider-" + this.orientation +
12686 " ui-widget" +
12687 " ui-widget-content" +
12688 " ui-corner-all");
12689
12690 this._refresh();
12691 this._setOption( "disabled", this.options.disabled );
12692
12693 this._animateOff = false;
12694 },
12695
12696 _refresh: function() {
12697 this._createRange();
12698 this._createHandles();
12699 this._setupEvents();
12700 this._refreshValue();
12701 },
12702
12703 _createHandles: function() {
12704 var i, handleCount,
12705 options = this.options,
12706 existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
12707 handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
12708 handles = [];
12709
12710 handleCount = ( options.values && options.values.length ) || 1;
12711
12712 if ( existingHandles.length > handleCount ) {
12713 existingHandles.slice( handleCount ).remove();
12714 existingHandles = existingHandles.slice( 0, handleCount );
12715 }
12716
12717 for ( i = existingHandles.length; i < handleCount; i++ ) {
12718 handles.push( handle );
12719 }
12720
12721 this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
12722
12723 this.handle = this.handles.eq( 0 );
12724
12725 this.handles.each(function( i ) {
12726 $( this ).data( "ui-slider-handle-index", i );
12727 });
12728 },
12729
12730 _createRange: function() {
12731 var options = this.options,
12732 classes = "";
12733
12734 if ( options.range ) {
12735 if ( options.range === true ) {
12736 if ( !options.values ) {
12737 options.values = [ this._valueMin(), this._valueMin() ];
12738 } else if ( options.values.length && options.values.length !== 2 ) {
12739 options.values = [ options.values[0], options.values[0] ];
12740 } else if ( $.isArray( options.values ) ) {
12741 options.values = options.values.slice(0);
12742 }
12743 }
12744
12745 if ( !this.range || !this.range.length ) {
12746 this.range = $( "<div></div>" )
12747 .appendTo( this.element );
12748
12749 classes = "ui-slider-range" +
12750 // note: this isn't the most fittingly semantic framework class for this element,
12751 // but worked best visually with a variety of themes
12752 " ui-widget-header ui-corner-all";
12753 } else {
12754 this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
12755 // Handle range switching from true to min/max
12756 .css({
12757 "left": "",
12758 "bottom": ""
12759 });
12760 }
12761
12762 this.range.addClass( classes +
12763 ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
12764 } else {
12765 this.range = $([]);
12766 }
12767 },
12768
12769 _setupEvents: function() {
12770 var elements = this.handles.add( this.range ).filter( "a" );
12771 this._off( elements );
12772 this._on( elements, this._handleEvents );
12773 this._hoverable( elements );
12774 this._focusable( elements );
12775 },
12776
12777 _destroy: function() {
12778 this.handles.remove();
12779 this.range.remove();
12780
12781 this.element
12782 .removeClass( "ui-slider" +
12783 " ui-slider-horizontal" +
12784 " ui-slider-vertical" +
12785 " ui-widget" +
12786 " ui-widget-content" +
12787 " ui-corner-all" );
12788
12789 this._mouseDestroy();
12790 },
12791
12792 _mouseCapture: function( event ) {
12793 var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
12794 that = this,
12795 o = this.options;
12796
12797 if ( o.disabled ) {
12798 return false;
12799 }
12800
12801 this.elementSize = {
12802 width: this.element.outerWidth(),
12803 height: this.element.outerHeight()
12804 };
12805 this.elementOffset = this.element.offset();
12806
12807 position = { x: event.pageX, y: event.pageY };
12808 normValue = this._normValueFromMouse( position );
12809 distance = this._valueMax() - this._valueMin() + 1;
12810 this.handles.each(function( i ) {
12811 var thisDistance = Math.abs( normValue - that.values(i) );
12812 if (( distance > thisDistance ) ||
12813 ( distance === thisDistance &&
12814 (i === that._lastChangedValue || that.values(i) === o.min ))) {
12815 distance = thisDistance;
12816 closestHandle = $( this );
12817 index = i;
12818 }
12819 });
12820
12821 allowed = this._start( event, index );
12822 if ( allowed === false ) {
12823 return false;
12824 }
12825 this._mouseSliding = true;
12826
12827 this._handleIndex = index;
12828
12829 closestHandle
12830 .addClass( "ui-state-active" )
12831 .focus();
12832
12833 offset = closestHandle.offset();
12834 mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
12835 this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
12836 left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
12837 top: event.pageY - offset.top -
12838 ( closestHandle.height() / 2 ) -
12839 ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
12840 ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
12841 ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
12842 };
12843
12844 if ( !this.handles.hasClass( "ui-state-hover" ) ) {
12845 this._slide( event, index, normValue );
12846 }
12847 this._animateOff = true;
12848 return true;
12849 },
12850
12851 _mouseStart: function() {
12852 return true;
12853 },
12854
12855 _mouseDrag: function( event ) {
12856 var position = { x: event.pageX, y: event.pageY },
12857 normValue = this._normValueFromMouse( position );
12858
12859 this._slide( event, this._handleIndex, normValue );
12860
12861 return false;
12862 },
12863
12864 _mouseStop: function( event ) {
12865 this.handles.removeClass( "ui-state-active" );
12866 this._mouseSliding = false;
12867
12868 this._stop( event, this._handleIndex );
12869 this._change( event, this._handleIndex );
12870
12871 this._handleIndex = null;
12872 this._clickOffset = null;
12873 this._animateOff = false;
12874
12875 return false;
12876 },
12877
12878 _detectOrientation: function() {
12879 this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
12880 },
12881
12882 _normValueFromMouse: function( position ) {
12883 var pixelTotal,
12884 pixelMouse,
12885 percentMouse,
12886 valueTotal,
12887 valueMouse;
12888
12889 if ( this.orientation === "horizontal" ) {
12890 pixelTotal = this.elementSize.width;
12891 pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
12892 } else {
12893 pixelTotal = this.elementSize.height;
12894 pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
12895 }
12896
12897 percentMouse = ( pixelMouse / pixelTotal );
12898 if ( percentMouse > 1 ) {
12899 percentMouse = 1;
12900 }
12901 if ( percentMouse < 0 ) {
12902 percentMouse = 0;
12903 }
12904 if ( this.orientation === "vertical" ) {
12905 percentMouse = 1 - percentMouse;
12906 }
12907
12908 valueTotal = this._valueMax() - this._valueMin();
12909 valueMouse = this._valueMin() + percentMouse * valueTotal;
12910
12911 return this._trimAlignValue( valueMouse );
12912 },
12913
12914 _start: function( event, index ) {
12915 var uiHash = {
12916 handle: this.handles[ index ],
12917 value: this.value()
12918 };
12919 if ( this.options.values && this.options.values.length ) {
12920 uiHash.value = this.values( index );
12921 uiHash.values = this.values();
12922 }
12923 return this._trigger( "start", event, uiHash );
12924 },
12925
12926 _slide: function( event, index, newVal ) {
12927 var otherVal,
12928 newValues,
12929 allowed;
12930
12931 if ( this.options.values && this.options.values.length ) {
12932 otherVal = this.values( index ? 0 : 1 );
12933
12934 if ( ( this.options.values.length === 2 && this.options.range === true ) &&
12935 ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
12936 ) {
12937 newVal = otherVal;
12938 }
12939
12940 if ( newVal !== this.values( index ) ) {
12941 newValues = this.values();
12942 newValues[ index ] = newVal;
12943 // A slide can be canceled by returning false from the slide callback
12944 allowed = this._trigger( "slide", event, {
12945 handle: this.handles[ index ],
12946 value: newVal,
12947 values: newValues
12948 } );
12949 otherVal = this.values( index ? 0 : 1 );
12950 if ( allowed !== false ) {
12951 this.values( index, newVal, true );
12952 }
12953 }
12954 } else {
12955 if ( newVal !== this.value() ) {
12956 // A slide can be canceled by returning false from the slide callback
12957 allowed = this._trigger( "slide", event, {
12958 handle: this.handles[ index ],
12959 value: newVal
12960 } );
12961 if ( allowed !== false ) {
12962 this.value( newVal );
12963 }
12964 }
12965 }
12966 },
12967
12968 _stop: function( event, index ) {
12969 var uiHash = {
12970 handle: this.handles[ index ],
12971 value: this.value()
12972 };
12973 if ( this.options.values && this.options.values.length ) {
12974 uiHash.value = this.values( index );
12975 uiHash.values = this.values();
12976 }
12977
12978 this._trigger( "stop", event, uiHash );
12979 },
12980
12981 _change: function( event, index ) {
12982 if ( !this._keySliding && !this._mouseSliding ) {
12983 var uiHash = {
12984 handle: this.handles[ index ],
12985 value: this.value()
12986 };
12987 if ( this.options.values && this.options.values.length ) {
12988 uiHash.value = this.values( index );
12989 uiHash.values = this.values();
12990 }
12991
12992 //store the last changed value index for reference when handles overlap
12993 this._lastChangedValue = index;
12994
12995 this._trigger( "change", event, uiHash );
12996 }
12997 },
12998
12999 value: function( newValue ) {
13000 if ( arguments.length ) {
13001 this.options.value = this._trimAlignValue( newValue );
13002 this._refreshValue();
13003 this._change( null, 0 );
13004 return;
13005 }
13006
13007 return this._value();
13008 },
13009
13010 values: function( index, newValue ) {
13011 var vals,
13012 newValues,
13013 i;
13014
13015 if ( arguments.length > 1 ) {
13016 this.options.values[ index ] = this._trimAlignValue( newValue );
13017 this._refreshValue();
13018 this._change( null, index );
13019 return;
13020 }
13021
13022 if ( arguments.length ) {
13023 if ( $.isArray( arguments[ 0 ] ) ) {
13024 vals = this.options.values;
13025 newValues = arguments[ 0 ];
13026 for ( i = 0; i < vals.length; i += 1 ) {
13027 vals[ i ] = this._trimAlignValue( newValues[ i ] );
13028 this._change( null, i );
13029 }
13030 this._refreshValue();
13031 } else {
13032 if ( this.options.values && this.options.values.length ) {
13033 return this._values( index );
13034 } else {
13035 return this.value();
13036 }
13037 }
13038 } else {
13039 return this._values();
13040 }
13041 },
13042
13043 _setOption: function( key, value ) {
13044 var i,
13045 valsLength = 0;
13046
13047 if ( key === "range" && this.options.range === true ) {
13048 if ( value === "min" ) {
13049 this.options.value = this._values( 0 );
13050 this.options.values = null;
13051 } else if ( value === "max" ) {
13052 this.options.value = this._values( this.options.values.length-1 );
13053 this.options.values = null;
13054 }
13055 }
13056
13057 if ( $.isArray( this.options.values ) ) {
13058 valsLength = this.options.values.length;
13059 }
13060
13061 $.Widget.prototype._setOption.apply( this, arguments );
13062
13063 switch ( key ) {
13064 case "orientation":
13065 this._detectOrientation();
13066 this.element
13067 .removeClass( "ui-slider-horizontal ui-slider-vertical" )
13068 .addClass( "ui-slider-" + this.orientation );
13069 this._refreshValue();
13070 break;
13071 case "value":
13072 this._animateOff = true;
13073 this._refreshValue();
13074 this._change( null, 0 );
13075 this._animateOff = false;
13076 break;
13077 case "values":
13078 this._animateOff = true;
13079 this._refreshValue();
13080 for ( i = 0; i < valsLength; i += 1 ) {
13081 this._change( null, i );
13082 }
13083 this._animateOff = false;
13084 break;
13085 case "min":
13086 case "max":
13087 this._animateOff = true;
13088 this._refreshValue();
13089 this._animateOff = false;
13090 break;
13091 case "range":
13092 this._animateOff = true;
13093 this._refresh();
13094 this._animateOff = false;
13095 break;
13096 }
13097 },
13098
13099 //internal value getter
13100 // _value() returns value trimmed by min and max, aligned by step
13101 _value: function() {
13102 var val = this.options.value;
13103 val = this._trimAlignValue( val );
13104
13105 return val;
13106 },
13107
13108 //internal values getter
13109 // _values() returns array of values trimmed by min and max, aligned by step
13110 // _values( index ) returns single value trimmed by min and max, aligned by step
13111 _values: function( index ) {
13112 var val,
13113 vals,
13114 i;
13115
13116 if ( arguments.length ) {
13117 val = this.options.values[ index ];
13118 val = this._trimAlignValue( val );
13119
13120 return val;
13121 } else if ( this.options.values && this.options.values.length ) {
13122 // .slice() creates a copy of the array
13123 // this copy gets trimmed by min and max and then returned
13124 vals = this.options.values.slice();
13125 for ( i = 0; i < vals.length; i+= 1) {
13126 vals[ i ] = this._trimAlignValue( vals[ i ] );
13127 }
13128
13129 return vals;
13130 } else {
13131 return [];
13132 }
13133 },
13134
13135 // returns the step-aligned value that val is closest to, between (inclusive) min and max
13136 _trimAlignValue: function( val ) {
13137 if ( val <= this._valueMin() ) {
13138 return this._valueMin();
13139 }
13140 if ( val >= this._valueMax() ) {
13141 return this._valueMax();
13142 }
13143 var step = ( this.options.step > 0 ) ? this.options.step : 1,
13144 valModStep = (val - this._valueMin()) % step,
13145 alignValue = val - valModStep;
13146
13147 if ( Math.abs(valModStep) * 2 >= step ) {
13148 alignValue += ( valModStep > 0 ) ? step : ( -step );
13149 }
13150
13151 // Since JavaScript has problems with large floats, round
13152 // the final value to 5 digits after the decimal point (see #4124)
13153 return parseFloat( alignValue.toFixed(5) );
13154 },
13155
13156 _valueMin: function() {
13157 return this.options.min;
13158 },
13159
13160 _valueMax: function() {
13161 return this.options.max;
13162 },
13163
13164 _refreshValue: function() {
13165 var lastValPercent, valPercent, value, valueMin, valueMax,
13166 oRange = this.options.range,
13167 o = this.options,
13168 that = this,
13169 animate = ( !this._animateOff ) ? o.animate : false,
13170 _set = {};
13171
13172 if ( this.options.values && this.options.values.length ) {
13173 this.handles.each(function( i ) {
13174 valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
13175 _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13176 $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13177 if ( that.options.range === true ) {
13178 if ( that.orientation === "horizontal" ) {
13179 if ( i === 0 ) {
13180 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
13181 }
13182 if ( i === 1 ) {
13183 that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13184 }
13185 } else {
13186 if ( i === 0 ) {
13187 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
13188 }
13189 if ( i === 1 ) {
13190 that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13191 }
13192 }
13193 }
13194 lastValPercent = valPercent;
13195 });
13196 } else {
13197 value = this.value();
13198 valueMin = this._valueMin();
13199 valueMax = this._valueMax();
13200 valPercent = ( valueMax !== valueMin ) ?
13201 ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
13202 0;
13203 _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13204 this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13205
13206 if ( oRange === "min" && this.orientation === "horizontal" ) {
13207 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
13208 }
13209 if ( oRange === "max" && this.orientation === "horizontal" ) {
13210 this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13211 }
13212 if ( oRange === "min" && this.orientation === "vertical" ) {
13213 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
13214 }
13215 if ( oRange === "max" && this.orientation === "vertical" ) {
13216 this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13217 }
13218 }
13219 },
13220
13221 _handleEvents: {
13222 keydown: function( event ) {
13223 /*jshint maxcomplexity:25*/
13224 var allowed, curVal, newVal, step,
13225 index = $( event.target ).data( "ui-slider-handle-index" );
13226
13227 switch ( event.keyCode ) {
13228 case $.ui.keyCode.HOME:
13229 case $.ui.keyCode.END:
13230 case $.ui.keyCode.PAGE_UP:
13231 case $.ui.keyCode.PAGE_DOWN:
13232 case $.ui.keyCode.UP:
13233 case $.ui.keyCode.RIGHT:
13234 case $.ui.keyCode.DOWN:
13235 case $.ui.keyCode.LEFT:
13236 event.preventDefault();
13237 if ( !this._keySliding ) {
13238 this._keySliding = true;
13239 $( event.target ).addClass( "ui-state-active" );
13240 allowed = this._start( event, index );
13241 if ( allowed === false ) {
13242 return;
13243 }
13244 }
13245 break;
13246 }
13247
13248 step = this.options.step;
13249 if ( this.options.values && this.options.values.length ) {
13250 curVal = newVal = this.values( index );
13251 } else {
13252 curVal = newVal = this.value();
13253 }
13254
13255 switch ( event.keyCode ) {
13256 case $.ui.keyCode.HOME:
13257 newVal = this._valueMin();
13258 break;
13259 case $.ui.keyCode.END:
13260 newVal = this._valueMax();
13261 break;
13262 case $.ui.keyCode.PAGE_UP:
13263 newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
13264 break;
13265 case $.ui.keyCode.PAGE_DOWN:
13266 newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
13267 break;
13268 case $.ui.keyCode.UP:
13269 case $.ui.keyCode.RIGHT:
13270 if ( curVal === this._valueMax() ) {
13271 return;
13272 }
13273 newVal = this._trimAlignValue( curVal + step );
13274 break;
13275 case $.ui.keyCode.DOWN:
13276 case $.ui.keyCode.LEFT:
13277 if ( curVal === this._valueMin() ) {
13278 return;
13279 }
13280 newVal = this._trimAlignValue( curVal - step );
13281 break;
13282 }
13283
13284 this._slide( event, index, newVal );
13285 },
13286 click: function( event ) {
13287 event.preventDefault();
13288 },
13289 keyup: function( event ) {
13290 var index = $( event.target ).data( "ui-slider-handle-index" );
13291
13292 if ( this._keySliding ) {
13293 this._keySliding = false;
13294 this._stop( event, index );
13295 this._change( event, index );
13296 $( event.target ).removeClass( "ui-state-active" );
13297 }
13298 }
13299 }
13300
13301});
13302
13303}(jQuery));
13304
13305(function( $ ) {
13306
13307function modifier( fn ) {
13308 return function() {
13309 var previous = this.element.val();
13310 fn.apply( this, arguments );
13311 this._refresh();
13312 if ( previous !== this.element.val() ) {
13313 this._trigger( "change" );
13314 }
13315 };
13316}
13317
13318$.widget( "ui.spinner", {
13319 version: "1.10.3",
13320 defaultElement: "<input>",
13321 widgetEventPrefix: "spin",
13322 options: {
13323 culture: null,
13324 icons: {
13325 down: "ui-icon-triangle-1-s",
13326 up: "ui-icon-triangle-1-n"
13327 },
13328 incremental: true,
13329 max: null,
13330 min: null,
13331 numberFormat: null,
13332 page: 10,
13333 step: 1,
13334
13335 change: null,
13336 spin: null,
13337 start: null,
13338 stop: null
13339 },
13340
13341 _create: function() {
13342 // handle string values that need to be parsed
13343 this._setOption( "max", this.options.max );
13344 this._setOption( "min", this.options.min );
13345 this._setOption( "step", this.options.step );
13346
13347 // format the value, but don't constrain
13348 this._value( this.element.val(), true );
13349
13350 this._draw();
13351 this._on( this._events );
13352 this._refresh();
13353
13354 // turning off autocomplete prevents the browser from remembering the
13355 // value when navigating through history, so we re-enable autocomplete
13356 // if the page is unloaded before the widget is destroyed. #7790
13357 this._on( this.window, {
13358 beforeunload: function() {
13359 this.element.removeAttr( "autocomplete" );
13360 }
13361 });
13362 },
13363
13364 _getCreateOptions: function() {
13365 var options = {},
13366 element = this.element;
13367
13368 $.each( [ "min", "max", "step" ], function( i, option ) {
13369 var value = element.attr( option );
13370 if ( value !== undefined && value.length ) {
13371 options[ option ] = value;
13372 }
13373 });
13374
13375 return options;
13376 },
13377
13378 _events: {
13379 keydown: function( event ) {
13380 if ( this._start( event ) && this._keydown( event ) ) {
13381 event.preventDefault();
13382 }
13383 },
13384 keyup: "_stop",
13385 focus: function() {
13386 this.previous = this.element.val();
13387 },
13388 blur: function( event ) {
13389 if ( this.cancelBlur ) {
13390 delete this.cancelBlur;
13391 return;
13392 }
13393
13394 this._stop();
13395 this._refresh();
13396 if ( this.previous !== this.element.val() ) {
13397 this._trigger( "change", event );
13398 }
13399 },
13400 mousewheel: function( event, delta ) {
13401 if ( !delta ) {
13402 return;
13403 }
13404 if ( !this.spinning && !this._start( event ) ) {
13405 return false;
13406 }
13407
13408 this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
13409 clearTimeout( this.mousewheelTimer );
13410 this.mousewheelTimer = this._delay(function() {
13411 if ( this.spinning ) {
13412 this._stop( event );
13413 }
13414 }, 100 );
13415 event.preventDefault();
13416 },
13417 "mousedown .ui-spinner-button": function( event ) {
13418 var previous;
13419
13420 // We never want the buttons to have focus; whenever the user is
13421 // interacting with the spinner, the focus should be on the input.
13422 // If the input is focused then this.previous is properly set from
13423 // when the input first received focus. If the input is not focused
13424 // then we need to set this.previous based on the value before spinning.
13425 previous = this.element[0] === this.document[0].activeElement ?
13426 this.previous : this.element.val();
13427 function checkFocus() {
13428 var isActive = this.element[0] === this.document[0].activeElement;
13429 if ( !isActive ) {
13430 this.element.focus();
13431 this.previous = previous;
13432 // support: IE
13433 // IE sets focus asynchronously, so we need to check if focus
13434 // moved off of the input because the user clicked on the button.
13435 this._delay(function() {
13436 this.previous = previous;
13437 });
13438 }
13439 }
13440
13441 // ensure focus is on (or stays on) the text field
13442 event.preventDefault();
13443 checkFocus.call( this );
13444
13445 // support: IE
13446 // IE doesn't prevent moving focus even with event.preventDefault()
13447 // so we set a flag to know when we should ignore the blur event
13448 // and check (again) if focus moved off of the input.
13449 this.cancelBlur = true;
13450 this._delay(function() {
13451 delete this.cancelBlur;
13452 checkFocus.call( this );
13453 });
13454
13455 if ( this._start( event ) === false ) {
13456 return;
13457 }
13458
13459 this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
13460 },
13461 "mouseup .ui-spinner-button": "_stop",
13462 "mouseenter .ui-spinner-button": function( event ) {
13463 // button will add ui-state-active if mouse was down while mouseleave and kept down
13464 if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
13465 return;
13466 }
13467
13468 if ( this._start( event ) === false ) {
13469 return false;
13470 }
13471 this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
13472 },
13473 // TODO: do we really want to consider this a stop?
13474 // shouldn't we just stop the repeater and wait until mouseup before
13475 // we trigger the stop event?
13476 "mouseleave .ui-spinner-button": "_stop"
13477 },
13478
13479 _draw: function() {
13480 var uiSpinner = this.uiSpinner = this.element
13481 .addClass( "ui-spinner-input" )
13482 .attr( "autocomplete", "off" )
13483 .wrap( this._uiSpinnerHtml() )
13484 .parent()
13485 // add buttons
13486 .append( this._buttonHtml() );
13487
13488 this.element.attr( "role", "spinbutton" );
13489
13490 // button bindings
13491 this.buttons = uiSpinner.find( ".ui-spinner-button" )
13492 .attr( "tabIndex", -1 )
13493 .button()
13494 .removeClass( "ui-corner-all" );
13495
13496 // IE 6 doesn't understand height: 50% for the buttons
13497 // unless the wrapper has an explicit height
13498 if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
13499 uiSpinner.height() > 0 ) {
13500 uiSpinner.height( uiSpinner.height() );
13501 }
13502
13503 // disable spinner if element was already disabled
13504 if ( this.options.disabled ) {
13505 this.disable();
13506 }
13507 },
13508
13509 _keydown: function( event ) {
13510 var options = this.options,
13511 keyCode = $.ui.keyCode;
13512
13513 switch ( event.keyCode ) {
13514 case keyCode.UP:
13515 this._repeat( null, 1, event );
13516 return true;
13517 case keyCode.DOWN:
13518 this._repeat( null, -1, event );
13519 return true;
13520 case keyCode.PAGE_UP:
13521 this._repeat( null, options.page, event );
13522 return true;
13523 case keyCode.PAGE_DOWN:
13524 this._repeat( null, -options.page, event );
13525 return true;
13526 }
13527
13528 return false;
13529 },
13530
13531 _uiSpinnerHtml: function() {
13532 return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
13533 },
13534
13535 _buttonHtml: function() {
13536 return "" +
13537 "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
13538 "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
13539 "</a>" +
13540 "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
13541 "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
13542 "</a>";
13543 },
13544
13545 _start: function( event ) {
13546 if ( !this.spinning && this._trigger( "start", event ) === false ) {
13547 return false;
13548 }
13549
13550 if ( !this.counter ) {
13551 this.counter = 1;
13552 }
13553 this.spinning = true;
13554 return true;
13555 },
13556
13557 _repeat: function( i, steps, event ) {
13558 i = i || 500;
13559
13560 clearTimeout( this.timer );
13561 this.timer = this._delay(function() {
13562 this._repeat( 40, steps, event );
13563 }, i );
13564
13565 this._spin( steps * this.options.step, event );
13566 },
13567
13568 _spin: function( step, event ) {
13569 var value = this.value() || 0;
13570
13571 if ( !this.counter ) {
13572 this.counter = 1;
13573 }
13574
13575 value = this._adjustValue( value + step * this._increment( this.counter ) );
13576
13577 if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
13578 this._value( value );
13579 this.counter++;
13580 }
13581 },
13582
13583 _increment: function( i ) {
13584 var incremental = this.options.incremental;
13585
13586 if ( incremental ) {
13587 return $.isFunction( incremental ) ?
13588 incremental( i ) :
13589 Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
13590 }
13591
13592 return 1;
13593 },
13594
13595 _precision: function() {
13596 var precision = this._precisionOf( this.options.step );
13597 if ( this.options.min !== null ) {
13598 precision = Math.max( precision, this._precisionOf( this.options.min ) );
13599 }
13600 return precision;
13601 },
13602
13603 _precisionOf: function( num ) {
13604 var str = num.toString(),
13605 decimal = str.indexOf( "." );
13606 return decimal === -1 ? 0 : str.length - decimal - 1;
13607 },
13608
13609 _adjustValue: function( value ) {
13610 var base, aboveMin,
13611 options = this.options;
13612
13613 // make sure we're at a valid step
13614 // - find out where we are relative to the base (min or 0)
13615 base = options.min !== null ? options.min : 0;
13616 aboveMin = value - base;
13617 // - round to the nearest step
13618 aboveMin = Math.round(aboveMin / options.step) * options.step;
13619 // - rounding is based on 0, so adjust back to our base
13620 value = base + aboveMin;
13621
13622 // fix precision from bad JS floating point math
13623 value = parseFloat( value.toFixed( this._precision() ) );
13624
13625 // clamp the value
13626 if ( options.max !== null && value > options.max) {
13627 return options.max;
13628 }
13629 if ( options.min !== null && value < options.min ) {
13630 return options.min;
13631 }
13632
13633 return value;
13634 },
13635
13636 _stop: function( event ) {
13637 if ( !this.spinning ) {
13638 return;
13639 }
13640
13641 clearTimeout( this.timer );
13642 clearTimeout( this.mousewheelTimer );
13643 this.counter = 0;
13644 this.spinning = false;
13645 this._trigger( "stop", event );
13646 },
13647
13648 _setOption: function( key, value ) {
13649 if ( key === "culture" || key === "numberFormat" ) {
13650 var prevValue = this._parse( this.element.val() );
13651 this.options[ key ] = value;
13652 this.element.val( this._format( prevValue ) );
13653 return;
13654 }
13655
13656 if ( key === "max" || key === "min" || key === "step" ) {
13657 if ( typeof value === "string" ) {
13658 value = this._parse( value );
13659 }
13660 }
13661 if ( key === "icons" ) {
13662 this.buttons.first().find( ".ui-icon" )
13663 .removeClass( this.options.icons.up )
13664 .addClass( value.up );
13665 this.buttons.last().find( ".ui-icon" )
13666 .removeClass( this.options.icons.down )
13667 .addClass( value.down );
13668 }
13669
13670 this._super( key, value );
13671
13672 if ( key === "disabled" ) {
13673 if ( value ) {
13674 this.element.prop( "disabled", true );
13675 this.buttons.button( "disable" );
13676 } else {
13677 this.element.prop( "disabled", false );
13678 this.buttons.button( "enable" );
13679 }
13680 }
13681 },
13682
13683 _setOptions: modifier(function( options ) {
13684 this._super( options );
13685 this._value( this.element.val() );
13686 }),
13687
13688 _parse: function( val ) {
13689 if ( typeof val === "string" && val !== "" ) {
13690 val = window.Globalize && this.options.numberFormat ?
13691 Globalize.parseFloat( val, 10, this.options.culture ) : +val;
13692 }
13693 return val === "" || isNaN( val ) ? null : val;
13694 },
13695
13696 _format: function( value ) {
13697 if ( value === "" ) {
13698 return "";
13699 }
13700 return window.Globalize && this.options.numberFormat ?
13701 Globalize.format( value, this.options.numberFormat, this.options.culture ) :
13702 value;
13703 },
13704
13705 _refresh: function() {
13706 this.element.attr({
13707 "aria-valuemin": this.options.min,
13708 "aria-valuemax": this.options.max,
13709 // TODO: what should we do with values that can't be parsed?
13710 "aria-valuenow": this._parse( this.element.val() )
13711 });
13712 },
13713
13714 // update the value without triggering change
13715 _value: function( value, allowAny ) {
13716 var parsed;
13717 if ( value !== "" ) {
13718 parsed = this._parse( value );
13719 if ( parsed !== null ) {
13720 if ( !allowAny ) {
13721 parsed = this._adjustValue( parsed );
13722 }
13723 value = this._format( parsed );
13724 }
13725 }
13726 this.element.val( value );
13727 this._refresh();
13728 },
13729
13730 _destroy: function() {
13731 this.element
13732 .removeClass( "ui-spinner-input" )
13733 .prop( "disabled", false )
13734 .removeAttr( "autocomplete" )
13735 .removeAttr( "role" )
13736 .removeAttr( "aria-valuemin" )
13737 .removeAttr( "aria-valuemax" )
13738 .removeAttr( "aria-valuenow" );
13739 this.uiSpinner.replaceWith( this.element );
13740 },
13741
13742 stepUp: modifier(function( steps ) {
13743 this._stepUp( steps );
13744 }),
13745 _stepUp: function( steps ) {
13746 if ( this._start() ) {
13747 this._spin( (steps || 1) * this.options.step );
13748 this._stop();
13749 }
13750 },
13751
13752 stepDown: modifier(function( steps ) {
13753 this._stepDown( steps );
13754 }),
13755 _stepDown: function( steps ) {
13756 if ( this._start() ) {
13757 this._spin( (steps || 1) * -this.options.step );
13758 this._stop();
13759 }
13760 },
13761
13762 pageUp: modifier(function( pages ) {
13763 this._stepUp( (pages || 1) * this.options.page );
13764 }),
13765
13766 pageDown: modifier(function( pages ) {
13767 this._stepDown( (pages || 1) * this.options.page );
13768 }),
13769
13770 value: function( newVal ) {
13771 if ( !arguments.length ) {
13772 return this._parse( this.element.val() );
13773 }
13774 modifier( this._value ).call( this, newVal );
13775 },
13776
13777 widget: function() {
13778 return this.uiSpinner;
13779 }
13780});
13781
13782}( jQuery ) );
13783
13784(function( $, undefined ) {
13785
13786var tabId = 0,
13787 rhash = /#.*$/;
13788
13789function getNextTabId() {
13790 return ++tabId;
13791}
13792
13793function isLocal( anchor ) {
13794 return anchor.hash.length > 1 &&
13795 decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
13796 decodeURIComponent( location.href.replace( rhash, "" ) );
13797}
13798
13799$.widget( "ui.tabs", {
13800 version: "1.10.3",
13801 delay: 300,
13802 options: {
13803 active: null,
13804 collapsible: false,
13805 event: "click",
13806 heightStyle: "content",
13807 hide: null,
13808 show: null,
13809
13810 // callbacks
13811 activate: null,
13812 beforeActivate: null,
13813 beforeLoad: null,
13814 load: null
13815 },
13816
13817 _create: function() {
13818 var that = this,
13819 options = this.options;
13820
13821 this.running = false;
13822
13823 this.element
13824 .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
13825 .toggleClass( "ui-tabs-collapsible", options.collapsible )
13826 // Prevent users from focusing disabled tabs via click
13827 .delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
13828 if ( $( this ).is( ".ui-state-disabled" ) ) {
13829 event.preventDefault();
13830 }
13831 })
13832 // support: IE <9
13833 // Preventing the default action in mousedown doesn't prevent IE
13834 // from focusing the element, so if the anchor gets focused, blur.
13835 // We don't have to worry about focusing the previously focused
13836 // element since clicking on a non-focusable element should focus
13837 // the body anyway.
13838 .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
13839 if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
13840 this.blur();
13841 }
13842 });
13843
13844 this._processTabs();
13845 options.active = this._initialActive();
13846
13847 // Take disabling tabs via class attribute from HTML
13848 // into account and update option properly.
13849 if ( $.isArray( options.disabled ) ) {
13850 options.disabled = $.unique( options.disabled.concat(
13851 $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
13852 return that.tabs.index( li );
13853 })
13854 ) ).sort();
13855 }
13856
13857 // check for length avoids error when initializing empty list
13858 if ( this.options.active !== false && this.anchors.length ) {
13859 this.active = this._findActive( options.active );
13860 } else {
13861 this.active = $();
13862 }
13863
13864 this._refresh();
13865
13866 if ( this.active.length ) {
13867 this.load( options.active );
13868 }
13869 },
13870
13871 _initialActive: function() {
13872 var active = this.options.active,
13873 collapsible = this.options.collapsible,
13874 locationHash = location.hash.substring( 1 );
13875
13876 if ( active === null ) {
13877 // check the fragment identifier in the URL
13878 if ( locationHash ) {
13879 this.tabs.each(function( i, tab ) {
13880 if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
13881 active = i;
13882 return false;
13883 }
13884 });
13885 }
13886
13887 // check for a tab marked active via a class
13888 if ( active === null ) {
13889 active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
13890 }
13891
13892 // no active tab, set to false
13893 if ( active === null || active === -1 ) {
13894 active = this.tabs.length ? 0 : false;
13895 }
13896 }
13897
13898 // handle numbers: negative, out of range
13899 if ( active !== false ) {
13900 active = this.tabs.index( this.tabs.eq( active ) );
13901 if ( active === -1 ) {
13902 active = collapsible ? false : 0;
13903 }
13904 }
13905
13906 // don't allow collapsible: false and active: false
13907 if ( !collapsible && active === false && this.anchors.length ) {
13908 active = 0;
13909 }
13910
13911 return active;
13912 },
13913
13914 _getCreateEventData: function() {
13915 return {
13916 tab: this.active,
13917 panel: !this.active.length ? $() : this._getPanelForTab( this.active )
13918 };
13919 },
13920
13921 _tabKeydown: function( event ) {
13922 /*jshint maxcomplexity:15*/
13923 var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
13924 selectedIndex = this.tabs.index( focusedTab ),
13925 goingForward = true;
13926
13927 if ( this._handlePageNav( event ) ) {
13928 return;
13929 }
13930
13931 switch ( event.keyCode ) {
13932 case $.ui.keyCode.RIGHT:
13933 case $.ui.keyCode.DOWN:
13934 selectedIndex++;
13935 break;
13936 case $.ui.keyCode.UP:
13937 case $.ui.keyCode.LEFT:
13938 goingForward = false;
13939 selectedIndex--;
13940 break;
13941 case $.ui.keyCode.END:
13942 selectedIndex = this.anchors.length - 1;
13943 break;
13944 case $.ui.keyCode.HOME:
13945 selectedIndex = 0;
13946 break;
13947 case $.ui.keyCode.SPACE:
13948 // Activate only, no collapsing
13949 event.preventDefault();
13950 clearTimeout( this.activating );
13951 this._activate( selectedIndex );
13952 return;
13953 case $.ui.keyCode.ENTER:
13954 // Toggle (cancel delayed activation, allow collapsing)
13955 event.preventDefault();
13956 clearTimeout( this.activating );
13957 // Determine if we should collapse or activate
13958 this._activate( selectedIndex === this.options.active ? false : selectedIndex );
13959 return;
13960 default:
13961 return;
13962 }
13963
13964 // Focus the appropriate tab, based on which key was pressed
13965 event.preventDefault();
13966 clearTimeout( this.activating );
13967 selectedIndex = this._focusNextTab( selectedIndex, goingForward );
13968
13969 // Navigating with control key will prevent automatic activation
13970 if ( !event.ctrlKey ) {
13971 // Update aria-selected immediately so that AT think the tab is already selected.
13972 // Otherwise AT may confuse the user by stating that they need to activate the tab,
13973 // but the tab will already be activated by the time the announcement finishes.
13974 focusedTab.attr( "aria-selected", "false" );
13975 this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
13976
13977 this.activating = this._delay(function() {
13978 this.option( "active", selectedIndex );
13979 }, this.delay );
13980 }
13981 },
13982
13983 _panelKeydown: function( event ) {
13984 if ( this._handlePageNav( event ) ) {
13985 return;
13986 }
13987
13988 // Ctrl+up moves focus to the current tab
13989 if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
13990 event.preventDefault();
13991 this.active.focus();
13992 }
13993 },
13994
13995 // Alt+page up/down moves focus to the previous/next tab (and activates)
13996 _handlePageNav: function( event ) {
13997 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
13998 this._activate( this._focusNextTab( this.options.active - 1, false ) );
13999 return true;
14000 }
14001 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
14002 this._activate( this._focusNextTab( this.options.active + 1, true ) );
14003 return true;
14004 }
14005 },
14006
14007 _findNextTab: function( index, goingForward ) {
14008 var lastTabIndex = this.tabs.length - 1;
14009
14010 function constrain() {
14011 if ( index > lastTabIndex ) {
14012 index = 0;
14013 }
14014 if ( index < 0 ) {
14015 index = lastTabIndex;
14016 }
14017 return index;
14018 }
14019
14020 while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
14021 index = goingForward ? index + 1 : index - 1;
14022 }
14023
14024 return index;
14025 },
14026
14027 _focusNextTab: function( index, goingForward ) {
14028 index = this._findNextTab( index, goingForward );
14029 this.tabs.eq( index ).focus();
14030 return index;
14031 },
14032
14033 _setOption: function( key, value ) {
14034 if ( key === "active" ) {
14035 // _activate() will handle invalid values and update this.options
14036 this._activate( value );
14037 return;
14038 }
14039
14040 if ( key === "disabled" ) {
14041 // don't use the widget factory's disabled handling
14042 this._setupDisabled( value );
14043 return;
14044 }
14045
14046 this._super( key, value);
14047
14048 if ( key === "collapsible" ) {
14049 this.element.toggleClass( "ui-tabs-collapsible", value );
14050 // Setting collapsible: false while collapsed; open first panel
14051 if ( !value && this.options.active === false ) {
14052 this._activate( 0 );
14053 }
14054 }
14055
14056 if ( key === "event" ) {
14057 this._setupEvents( value );
14058 }
14059
14060 if ( key === "heightStyle" ) {
14061 this._setupHeightStyle( value );
14062 }
14063 },
14064
14065 _tabId: function( tab ) {
14066 return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
14067 },
14068
14069 _sanitizeSelector: function( hash ) {
14070 return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
14071 },
14072
14073 refresh: function() {
14074 var options = this.options,
14075 lis = this.tablist.children( ":has(a[href])" );
14076
14077 // get disabled tabs from class attribute from HTML
14078 // this will get converted to a boolean if needed in _refresh()
14079 options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
14080 return lis.index( tab );
14081 });
14082
14083 this._processTabs();
14084
14085 // was collapsed or no tabs
14086 if ( options.active === false || !this.anchors.length ) {
14087 options.active = false;
14088 this.active = $();
14089 // was active, but active tab is gone
14090 } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
14091 // all remaining tabs are disabled
14092 if ( this.tabs.length === options.disabled.length ) {
14093 options.active = false;
14094 this.active = $();
14095 // activate previous tab
14096 } else {
14097 this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
14098 }
14099 // was active, active tab still exists
14100 } else {
14101 // make sure active index is correct
14102 options.active = this.tabs.index( this.active );
14103 }
14104
14105 this._refresh();
14106 },
14107
14108 _refresh: function() {
14109 this._setupDisabled( this.options.disabled );
14110 this._setupEvents( this.options.event );
14111 this._setupHeightStyle( this.options.heightStyle );
14112
14113 this.tabs.not( this.active ).attr({
14114 "aria-selected": "false",
14115 tabIndex: -1
14116 });
14117 this.panels.not( this._getPanelForTab( this.active ) )
14118 .hide()
14119 .attr({
14120 "aria-expanded": "false",
14121 "aria-hidden": "true"
14122 });
14123
14124 // Make sure one tab is in the tab order
14125 if ( !this.active.length ) {
14126 this.tabs.eq( 0 ).attr( "tabIndex", 0 );
14127 } else {
14128 this.active
14129 .addClass( "ui-tabs-active ui-state-active" )
14130 .attr({
14131 "aria-selected": "true",
14132 tabIndex: 0
14133 });
14134 this._getPanelForTab( this.active )
14135 .show()
14136 .attr({
14137 "aria-expanded": "true",
14138 "aria-hidden": "false"
14139 });
14140 }
14141 },
14142
14143 _processTabs: function() {
14144 var that = this;
14145
14146 this.tablist = this._getList()
14147 .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
14148 .attr( "role", "tablist" );
14149
14150 this.tabs = this.tablist.find( "> li:has(a[href])" )
14151 .addClass( "ui-state-default ui-corner-top" )
14152 .attr({
14153 role: "tab",
14154 tabIndex: -1
14155 });
14156
14157 this.anchors = this.tabs.map(function() {
14158 return $( "a", this )[ 0 ];
14159 })
14160 .addClass( "ui-tabs-anchor" )
14161 .attr({
14162 role: "presentation",
14163 tabIndex: -1
14164 });
14165
14166 this.panels = $();
14167
14168 this.anchors.each(function( i, anchor ) {
14169 var selector, panel, panelId,
14170 anchorId = $( anchor ).uniqueId().attr( "id" ),
14171 tab = $( anchor ).closest( "li" ),
14172 originalAriaControls = tab.attr( "aria-controls" );
14173
14174 // inline tab
14175 if ( isLocal( anchor ) ) {
14176 selector = anchor.hash;
14177 panel = that.element.find( that._sanitizeSelector( selector ) );
14178 // remote tab
14179 } else {
14180 panelId = that._tabId( tab );
14181 selector = "#" + panelId;
14182 panel = that.element.find( selector );
14183 if ( !panel.length ) {
14184 panel = that._createPanel( panelId );
14185 panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
14186 }
14187 panel.attr( "aria-live", "polite" );
14188 }
14189
14190 if ( panel.length) {
14191 that.panels = that.panels.add( panel );
14192 }
14193 if ( originalAriaControls ) {
14194 tab.data( "ui-tabs-aria-controls", originalAriaControls );
14195 }
14196 tab.attr({
14197 "aria-controls": selector.substring( 1 ),
14198 "aria-labelledby": anchorId
14199 });
14200 panel.attr( "aria-labelledby", anchorId );
14201 });
14202
14203 this.panels
14204 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
14205 .attr( "role", "tabpanel" );
14206 },
14207
14208 // allow overriding how to find the list for rare usage scenarios (#7715)
14209 _getList: function() {
14210 return this.element.find( "ol,ul" ).eq( 0 );
14211 },
14212
14213 _createPanel: function( id ) {
14214 return $( "<div>" )
14215 .attr( "id", id )
14216 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
14217 .data( "ui-tabs-destroy", true );
14218 },
14219
14220 _setupDisabled: function( disabled ) {
14221 if ( $.isArray( disabled ) ) {
14222 if ( !disabled.length ) {
14223 disabled = false;
14224 } else if ( disabled.length === this.anchors.length ) {
14225 disabled = true;
14226 }
14227 }
14228
14229 // disable tabs
14230 for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
14231 if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
14232 $( li )
14233 .addClass( "ui-state-disabled" )
14234 .attr( "aria-disabled", "true" );
14235 } else {
14236 $( li )
14237 .removeClass( "ui-state-disabled" )
14238 .removeAttr( "aria-disabled" );
14239 }
14240 }
14241
14242 this.options.disabled = disabled;
14243 },
14244
14245 _setupEvents: function( event ) {
14246 var events = {
14247 click: function( event ) {
14248 event.preventDefault();
14249 }
14250 };
14251 if ( event ) {
14252 $.each( event.split(" "), function( index, eventName ) {
14253 events[ eventName ] = "_eventHandler";
14254 });
14255 }
14256
14257 this._off( this.anchors.add( this.tabs ).add( this.panels ) );
14258 this._on( this.anchors, events );
14259 this._on( this.tabs, { keydown: "_tabKeydown" } );
14260 this._on( this.panels, { keydown: "_panelKeydown" } );
14261
14262 this._focusable( this.tabs );
14263 this._hoverable( this.tabs );
14264 },
14265
14266 _setupHeightStyle: function( heightStyle ) {
14267 var maxHeight,
14268 parent = this.element.parent();
14269
14270 if ( heightStyle === "fill" ) {
14271 maxHeight = parent.height();
14272 maxHeight -= this.element.outerHeight() - this.element.height();
14273
14274 this.element.siblings( ":visible" ).each(function() {
14275 var elem = $( this ),
14276 position = elem.css( "position" );
14277
14278 if ( position === "absolute" || position === "fixed" ) {
14279 return;
14280 }
14281 maxHeight -= elem.outerHeight( true );
14282 });
14283
14284 this.element.children().not( this.panels ).each(function() {
14285 maxHeight -= $( this ).outerHeight( true );
14286 });
14287
14288 this.panels.each(function() {
14289 $( this ).height( Math.max( 0, maxHeight -
14290 $( this ).innerHeight() + $( this ).height() ) );
14291 })
14292 .css( "overflow", "auto" );
14293 } else if ( heightStyle === "auto" ) {
14294 maxHeight = 0;
14295 this.panels.each(function() {
14296 maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
14297 }).height( maxHeight );
14298 }
14299 },
14300
14301 _eventHandler: function( event ) {
14302 var options = this.options,
14303 active = this.active,
14304 anchor = $( event.currentTarget ),
14305 tab = anchor.closest( "li" ),
14306 clickedIsActive = tab[ 0 ] === active[ 0 ],
14307 collapsing = clickedIsActive && options.collapsible,
14308 toShow = collapsing ? $() : this._getPanelForTab( tab ),
14309 toHide = !active.length ? $() : this._getPanelForTab( active ),
14310 eventData = {
14311 oldTab: active,
14312 oldPanel: toHide,
14313 newTab: collapsing ? $() : tab,
14314 newPanel: toShow
14315 };
14316
14317 event.preventDefault();
14318
14319 if ( tab.hasClass( "ui-state-disabled" ) ||
14320 // tab is already loading
14321 tab.hasClass( "ui-tabs-loading" ) ||
14322 // can't switch durning an animation
14323 this.running ||
14324 // click on active header, but not collapsible
14325 ( clickedIsActive && !options.collapsible ) ||
14326 // allow canceling activation
14327 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
14328 return;
14329 }
14330
14331 options.active = collapsing ? false : this.tabs.index( tab );
14332
14333 this.active = clickedIsActive ? $() : tab;
14334 if ( this.xhr ) {
14335 this.xhr.abort();
14336 }
14337
14338 if ( !toHide.length && !toShow.length ) {
14339 $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
14340 }
14341
14342 if ( toShow.length ) {
14343 this.load( this.tabs.index( tab ), event );
14344 }
14345 this._toggle( event, eventData );
14346 },
14347
14348 // handles show/hide for selecting tabs
14349 _toggle: function( event, eventData ) {
14350 var that = this,
14351 toShow = eventData.newPanel,
14352 toHide = eventData.oldPanel;
14353
14354 this.running = true;
14355
14356 function complete() {
14357 that.running = false;
14358 that._trigger( "activate", event, eventData );
14359 }
14360
14361 function show() {
14362 eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
14363
14364 if ( toShow.length && that.options.show ) {
14365 that._show( toShow, that.options.show, complete );
14366 } else {
14367 toShow.show();
14368 complete();
14369 }
14370 }
14371
14372 // start out by hiding, then showing, then completing
14373 if ( toHide.length && this.options.hide ) {
14374 this._hide( toHide, this.options.hide, function() {
14375 eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
14376 show();
14377 });
14378 } else {
14379 eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
14380 toHide.hide();
14381 show();
14382 }
14383
14384 toHide.attr({
14385 "aria-expanded": "false",
14386 "aria-hidden": "true"
14387 });
14388 eventData.oldTab.attr( "aria-selected", "false" );
14389 // If we're switching tabs, remove the old tab from the tab order.
14390 // If we're opening from collapsed state, remove the previous tab from the tab order.
14391 // If we're collapsing, then keep the collapsing tab in the tab order.
14392 if ( toShow.length && toHide.length ) {
14393 eventData.oldTab.attr( "tabIndex", -1 );
14394 } else if ( toShow.length ) {
14395 this.tabs.filter(function() {
14396 return $( this ).attr( "tabIndex" ) === 0;
14397 })
14398 .attr( "tabIndex", -1 );
14399 }
14400
14401 toShow.attr({
14402 "aria-expanded": "true",
14403 "aria-hidden": "false"
14404 });
14405 eventData.newTab.attr({
14406 "aria-selected": "true",
14407 tabIndex: 0
14408 });
14409 },
14410
14411 _activate: function( index ) {
14412 var anchor,
14413 active = this._findActive( index );
14414
14415 // trying to activate the already active panel
14416 if ( active[ 0 ] === this.active[ 0 ] ) {
14417 return;
14418 }
14419
14420 // trying to collapse, simulate a click on the current active header
14421 if ( !active.length ) {
14422 active = this.active;
14423 }
14424
14425 anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
14426 this._eventHandler({
14427 target: anchor,
14428 currentTarget: anchor,
14429 preventDefault: $.noop
14430 });
14431 },
14432
14433 _findActive: function( index ) {
14434 return index === false ? $() : this.tabs.eq( index );
14435 },
14436
14437 _getIndex: function( index ) {
14438 // meta-function to give users option to provide a href string instead of a numerical index.
14439 if ( typeof index === "string" ) {
14440 index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
14441 }
14442
14443 return index;
14444 },
14445
14446 _destroy: function() {
14447 if ( this.xhr ) {
14448 this.xhr.abort();
14449 }
14450
14451 this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
14452
14453 this.tablist
14454 .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
14455 .removeAttr( "role" );
14456
14457 this.anchors
14458 .removeClass( "ui-tabs-anchor" )
14459 .removeAttr( "role" )
14460 .removeAttr( "tabIndex" )
14461 .removeUniqueId();
14462
14463 this.tabs.add( this.panels ).each(function() {
14464 if ( $.data( this, "ui-tabs-destroy" ) ) {
14465 $( this ).remove();
14466 } else {
14467 $( this )
14468 .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
14469 "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
14470 .removeAttr( "tabIndex" )
14471 .removeAttr( "aria-live" )
14472 .removeAttr( "aria-busy" )
14473 .removeAttr( "aria-selected" )
14474 .removeAttr( "aria-labelledby" )
14475 .removeAttr( "aria-hidden" )
14476 .removeAttr( "aria-expanded" )
14477 .removeAttr( "role" );
14478 }
14479 });
14480
14481 this.tabs.each(function() {
14482 var li = $( this ),
14483 prev = li.data( "ui-tabs-aria-controls" );
14484 if ( prev ) {
14485 li
14486 .attr( "aria-controls", prev )
14487 .removeData( "ui-tabs-aria-controls" );
14488 } else {
14489 li.removeAttr( "aria-controls" );
14490 }
14491 });
14492
14493 this.panels.show();
14494
14495 if ( this.options.heightStyle !== "content" ) {
14496 this.panels.css( "height", "" );
14497 }
14498 },
14499
14500 enable: function( index ) {
14501 var disabled = this.options.disabled;
14502 if ( disabled === false ) {
14503 return;
14504 }
14505
14506 if ( index === undefined ) {
14507 disabled = false;
14508 } else {
14509 index = this._getIndex( index );
14510 if ( $.isArray( disabled ) ) {
14511 disabled = $.map( disabled, function( num ) {
14512 return num !== index ? num : null;
14513 });
14514 } else {
14515 disabled = $.map( this.tabs, function( li, num ) {
14516 return num !== index ? num : null;
14517 });
14518 }
14519 }
14520 this._setupDisabled( disabled );
14521 },
14522
14523 disable: function( index ) {
14524 var disabled = this.options.disabled;
14525 if ( disabled === true ) {
14526 return;
14527 }
14528
14529 if ( index === undefined ) {
14530 disabled = true;
14531 } else {
14532 index = this._getIndex( index );
14533 if ( $.inArray( index, disabled ) !== -1 ) {
14534 return;
14535 }
14536 if ( $.isArray( disabled ) ) {
14537 disabled = $.merge( [ index ], disabled ).sort();
14538 } else {
14539 disabled = [ index ];
14540 }
14541 }
14542 this._setupDisabled( disabled );
14543 },
14544
14545 load: function( index, event ) {
14546 index = this._getIndex( index );
14547 var that = this,
14548 tab = this.tabs.eq( index ),
14549 anchor = tab.find( ".ui-tabs-anchor" ),
14550 panel = this._getPanelForTab( tab ),
14551 eventData = {
14552 tab: tab,
14553 panel: panel
14554 };
14555
14556 // not remote
14557 if ( isLocal( anchor[ 0 ] ) ) {
14558 return;
14559 }
14560
14561 this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
14562
14563 // support: jQuery <1.8
14564 // jQuery <1.8 returns false if the request is canceled in beforeSend,
14565 // but as of 1.8, $.ajax() always returns a jqXHR object.
14566 if ( this.xhr && this.xhr.statusText !== "canceled" ) {
14567 tab.addClass( "ui-tabs-loading" );
14568 panel.attr( "aria-busy", "true" );
14569
14570 this.xhr
14571 .success(function( response ) {
14572 // support: jQuery <1.8
14573 // http://bugs.jquery.com/ticket/11778
14574 setTimeout(function() {
14575 panel.html( response );
14576 that._trigger( "load", event, eventData );
14577 }, 1 );
14578 })
14579 .complete(function( jqXHR, status ) {
14580 // support: jQuery <1.8
14581 // http://bugs.jquery.com/ticket/11778
14582 setTimeout(function() {
14583 if ( status === "abort" ) {
14584 that.panels.stop( false, true );
14585 }
14586
14587 tab.removeClass( "ui-tabs-loading" );
14588 panel.removeAttr( "aria-busy" );
14589
14590 if ( jqXHR === that.xhr ) {
14591 delete that.xhr;
14592 }
14593 }, 1 );
14594 });
14595 }
14596 },
14597
14598 _ajaxSettings: function( anchor, event, eventData ) {
14599 var that = this;
14600 return {
14601 url: anchor.attr( "href" ),
14602 beforeSend: function( jqXHR, settings ) {
14603 return that._trigger( "beforeLoad", event,
14604 $.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
14605 }
14606 };
14607 },
14608
14609 _getPanelForTab: function( tab ) {
14610 var id = $( tab ).attr( "aria-controls" );
14611 return this.element.find( this._sanitizeSelector( "#" + id ) );
14612 }
14613});
14614
14615})( jQuery );
14616
14617(function( $ ) {
14618
14619var increments = 0;
14620
14621function addDescribedBy( elem, id ) {
14622 var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
14623 describedby.push( id );
14624 elem
14625 .data( "ui-tooltip-id", id )
14626 .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
14627}
14628
14629function removeDescribedBy( elem ) {
14630 var id = elem.data( "ui-tooltip-id" ),
14631 describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
14632 index = $.inArray( id, describedby );
14633 if ( index !== -1 ) {
14634 describedby.splice( index, 1 );
14635 }
14636
14637 elem.removeData( "ui-tooltip-id" );
14638 describedby = $.trim( describedby.join( " " ) );
14639 if ( describedby ) {
14640 elem.attr( "aria-describedby", describedby );
14641 } else {
14642 elem.removeAttr( "aria-describedby" );
14643 }
14644}
14645
14646$.widget( "ui.tooltip", {
14647 version: "1.10.3",
14648 options: {
14649 content: function() {
14650 // support: IE<9, Opera in jQuery <1.7
14651 // .text() can't accept undefined, so coerce to a string
14652 var title = $( this ).attr( "title" ) || "";
14653 // Escape title, since we're going from an attribute to raw HTML
14654 return $( "<a>" ).text( title ).html();
14655 },
14656 hide: true,
14657 // Disabled elements have inconsistent behavior across browsers (#8661)
14658 items: "[title]:not([disabled])",
14659 position: {
14660 my: "left top+15",
14661 at: "left bottom",
14662 collision: "flipfit flip"
14663 },
14664 show: true,
14665 tooltipClass: null,
14666 track: false,
14667
14668 // callbacks
14669 close: null,
14670 open: null
14671 },
14672
14673 _create: function() {
14674 this._on({
14675 mouseover: "open",
14676 focusin: "open"
14677 });
14678
14679 // IDs of generated tooltips, needed for destroy
14680 this.tooltips = {};
14681 // IDs of parent tooltips where we removed the title attribute
14682 this.parents = {};
14683
14684 if ( this.options.disabled ) {
14685 this._disable();
14686 }
14687 },
14688
14689 _setOption: function( key, value ) {
14690 var that = this;
14691
14692 if ( key === "disabled" ) {
14693 this[ value ? "_disable" : "_enable" ]();
14694 this.options[ key ] = value;
14695 // disable element style changes
14696 return;
14697 }
14698
14699 this._super( key, value );
14700
14701 if ( key === "content" ) {
14702 $.each( this.tooltips, function( id, element ) {
14703 that._updateContent( element );
14704 });
14705 }
14706 },
14707
14708 _disable: function() {
14709 var that = this;
14710
14711 // close open tooltips
14712 $.each( this.tooltips, function( id, element ) {
14713 var event = $.Event( "blur" );
14714 event.target = event.currentTarget = element[0];
14715 that.close( event, true );
14716 });
14717
14718 // remove title attributes to prevent native tooltips
14719 this.element.find( this.options.items ).addBack().each(function() {
14720 var element = $( this );
14721 if ( element.is( "[title]" ) ) {
14722 element
14723 .data( "ui-tooltip-title", element.attr( "title" ) )
14724 .attr( "title", "" );
14725 }
14726 });
14727 },
14728
14729 _enable: function() {
14730 // restore title attributes
14731 this.element.find( this.options.items ).addBack().each(function() {
14732 var element = $( this );
14733 if ( element.data( "ui-tooltip-title" ) ) {
14734 element.attr( "title", element.data( "ui-tooltip-title" ) );
14735 }
14736 });
14737 },
14738
14739 open: function( event ) {
14740 var that = this,
14741 target = $( event ? event.target : this.element )
14742 // we need closest here due to mouseover bubbling,
14743 // but always pointing at the same event target
14744 .closest( this.options.items );
14745
14746 // No element to show a tooltip for or the tooltip is already open
14747 if ( !target.length || target.data( "ui-tooltip-id" ) ) {
14748 return;
14749 }
14750
14751 if ( target.attr( "title" ) ) {
14752 target.data( "ui-tooltip-title", target.attr( "title" ) );
14753 }
14754
14755 target.data( "ui-tooltip-open", true );
14756
14757 // kill parent tooltips, custom or native, for hover
14758 if ( event && event.type === "mouseover" ) {
14759 target.parents().each(function() {
14760 var parent = $( this ),
14761 blurEvent;
14762 if ( parent.data( "ui-tooltip-open" ) ) {
14763 blurEvent = $.Event( "blur" );
14764 blurEvent.target = blurEvent.currentTarget = this;
14765 that.close( blurEvent, true );
14766 }
14767 if ( parent.attr( "title" ) ) {
14768 parent.uniqueId();
14769 that.parents[ this.id ] = {
14770 element: this,
14771 title: parent.attr( "title" )
14772 };
14773 parent.attr( "title", "" );
14774 }
14775 });
14776 }
14777
14778 this._updateContent( target, event );
14779 },
14780
14781 _updateContent: function( target, event ) {
14782 var content,
14783 contentOption = this.options.content,
14784 that = this,
14785 eventType = event ? event.type : null;
14786
14787 if ( typeof contentOption === "string" ) {
14788 return this._open( event, target, contentOption );
14789 }
14790
14791 content = contentOption.call( target[0], function( response ) {
14792 // ignore async response if tooltip was closed already
14793 if ( !target.data( "ui-tooltip-open" ) ) {
14794 return;
14795 }
14796 // IE may instantly serve a cached response for ajax requests
14797 // delay this call to _open so the other call to _open runs first
14798 that._delay(function() {
14799 // jQuery creates a special event for focusin when it doesn't
14800 // exist natively. To improve performance, the native event
14801 // object is reused and the type is changed. Therefore, we can't
14802 // rely on the type being correct after the event finished
14803 // bubbling, so we set it back to the previous value. (#8740)
14804 if ( event ) {
14805 event.type = eventType;
14806 }
14807 this._open( event, target, response );
14808 });
14809 });
14810 if ( content ) {
14811 this._open( event, target, content );
14812 }
14813 },
14814
14815 _open: function( event, target, content ) {
14816 var tooltip, events, delayedShow,
14817 positionOption = $.extend( {}, this.options.position );
14818
14819 if ( !content ) {
14820 return;
14821 }
14822
14823 // Content can be updated multiple times. If the tooltip already
14824 // exists, then just update the content and bail.
14825 tooltip = this._find( target );
14826 if ( tooltip.length ) {
14827 tooltip.find( ".ui-tooltip-content" ).html( content );
14828 return;
14829 }
14830
14831 // if we have a title, clear it to prevent the native tooltip
14832 // we have to check first to avoid defining a title if none exists
14833 // (we don't want to cause an element to start matching [title])
14834 //
14835 // We use removeAttr only for key events, to allow IE to export the correct
14836 // accessible attributes. For mouse events, set to empty string to avoid
14837 // native tooltip showing up (happens only when removing inside mouseover).
14838 if ( target.is( "[title]" ) ) {
14839 if ( event && event.type === "mouseover" ) {
14840 target.attr( "title", "" );
14841 } else {
14842 target.removeAttr( "title" );
14843 }
14844 }
14845
14846 tooltip = this._tooltip( target );
14847 addDescribedBy( target, tooltip.attr( "id" ) );
14848 tooltip.find( ".ui-tooltip-content" ).html( content );
14849
14850 function position( event ) {
14851 positionOption.of = event;
14852 if ( tooltip.is( ":hidden" ) ) {
14853 return;
14854 }
14855 tooltip.position( positionOption );
14856 }
14857 if ( this.options.track && event && /^mouse/.test( event.type ) ) {
14858 this._on( this.document, {
14859 mousemove: position
14860 });
14861 // trigger once to override element-relative positioning
14862 position( event );
14863 } else {
14864 tooltip.position( $.extend({
14865 of: target
14866 }, this.options.position ) );
14867 }
14868
14869 tooltip.hide();
14870
14871 this._show( tooltip, this.options.show );
14872 // Handle tracking tooltips that are shown with a delay (#8644). As soon
14873 // as the tooltip is visible, position the tooltip using the most recent
14874 // event.
14875 if ( this.options.show && this.options.show.delay ) {
14876 delayedShow = this.delayedShow = setInterval(function() {
14877 if ( tooltip.is( ":visible" ) ) {
14878 position( positionOption.of );
14879 clearInterval( delayedShow );
14880 }
14881 }, $.fx.interval );
14882 }
14883
14884 this._trigger( "open", event, { tooltip: tooltip } );
14885
14886 events = {
14887 keyup: function( event ) {
14888 if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
14889 var fakeEvent = $.Event(event);
14890 fakeEvent.currentTarget = target[0];
14891 this.close( fakeEvent, true );
14892 }
14893 },
14894 remove: function() {
14895 this._removeTooltip( tooltip );
14896 }
14897 };
14898 if ( !event || event.type === "mouseover" ) {
14899 events.mouseleave = "close";
14900 }
14901 if ( !event || event.type === "focusin" ) {
14902 events.focusout = "close";
14903 }
14904 this._on( true, target, events );
14905 },
14906
14907 close: function( event ) {
14908 var that = this,
14909 target = $( event ? event.currentTarget : this.element ),
14910 tooltip = this._find( target );
14911
14912 // disabling closes the tooltip, so we need to track when we're closing
14913 // to avoid an infinite loop in case the tooltip becomes disabled on close
14914 if ( this.closing ) {
14915 return;
14916 }
14917
14918 // Clear the interval for delayed tracking tooltips
14919 clearInterval( this.delayedShow );
14920
14921 // only set title if we had one before (see comment in _open())
14922 if ( target.data( "ui-tooltip-title" ) ) {
14923 target.attr( "title", target.data( "ui-tooltip-title" ) );
14924 }
14925
14926 removeDescribedBy( target );
14927
14928 tooltip.stop( true );
14929 this._hide( tooltip, this.options.hide, function() {
14930 that._removeTooltip( $( this ) );
14931 });
14932
14933 target.removeData( "ui-tooltip-open" );
14934 this._off( target, "mouseleave focusout keyup" );
14935 // Remove 'remove' binding only on delegated targets
14936 if ( target[0] !== this.element[0] ) {
14937 this._off( target, "remove" );
14938 }
14939 this._off( this.document, "mousemove" );
14940
14941 if ( event && event.type === "mouseleave" ) {
14942 $.each( this.parents, function( id, parent ) {
14943 $( parent.element ).attr( "title", parent.title );
14944 delete that.parents[ id ];
14945 });
14946 }
14947
14948 this.closing = true;
14949 this._trigger( "close", event, { tooltip: tooltip } );
14950 this.closing = false;
14951 },
14952
14953 _tooltip: function( element ) {
14954 var id = "ui-tooltip-" + increments++,
14955 tooltip = $( "<div>" )
14956 .attr({
14957 id: id,
14958 role: "tooltip"
14959 })
14960 .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
14961 ( this.options.tooltipClass || "" ) );
14962 $( "<div>" )
14963 .addClass( "ui-tooltip-content" )
14964 .appendTo( tooltip );
14965 tooltip.appendTo( this.document[0].body );
14966 this.tooltips[ id ] = element;
14967 return tooltip;
14968 },
14969
14970 _find: function( target ) {
14971 var id = target.data( "ui-tooltip-id" );
14972 return id ? $( "#" + id ) : $();
14973 },
14974
14975 _removeTooltip: function( tooltip ) {
14976 tooltip.remove();
14977 delete this.tooltips[ tooltip.attr( "id" ) ];
14978 },
14979
14980 _destroy: function() {
14981 var that = this;
14982
14983 // close open tooltips
14984 $.each( this.tooltips, function( id, element ) {
14985 // Delegate to close method to handle common cleanup
14986 var event = $.Event( "blur" );
14987 event.target = event.currentTarget = element[0];
14988 that.close( event, true );
14989
14990 // Remove immediately; destroying an open tooltip doesn't use the
14991 // hide animation
14992 $( "#" + id ).remove();
14993
14994 // Restore the title
14995 if ( element.data( "ui-tooltip-title" ) ) {
14996 element.attr( "title", element.data( "ui-tooltip-title" ) );
14997 element.removeData( "ui-tooltip-title" );
14998 }
14999 });
15000 }
15001});
15002
15003}( jQuery ) );
diff --git a/bitbake/lib/toaster/toastergui/static/js/jquery.cookie.js b/bitbake/lib/toaster/toastergui/static/js/jquery.cookie.js
new file mode 100644
index 0000000000..9271900087
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/jquery.cookie.js
@@ -0,0 +1,117 @@
1/*!
2 * jQuery Cookie Plugin v1.4.0
3 * https://github.com/carhartl/jquery-cookie
4 *
5 * Copyright 2013 Klaus Hartl
6 * Released under the MIT license
7 */
8(function (factory) {
9 if (typeof define === 'function' && define.amd) {
10 // AMD. Register as anonymous module.
11 define(['jquery'], factory);
12 } else {
13 // Browser globals.
14 factory(jQuery);
15 }
16}(function ($) {
17
18 var pluses = /\+/g;
19
20 function encode(s) {
21 return config.raw ? s : encodeURIComponent(s);
22 }
23
24 function decode(s) {
25 return config.raw ? s : decodeURIComponent(s);
26 }
27
28 function stringifyCookieValue(value) {
29 return encode(config.json ? JSON.stringify(value) : String(value));
30 }
31
32 function parseCookieValue(s) {
33 if (s.indexOf('"') === 0) {
34 // This is a quoted cookie as according to RFC2068, unescape...
35 s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
36 }
37
38 try {
39 // Replace server-side written pluses with spaces.
40 // If we can't decode the cookie, ignore it, it's unusable.
41 s = decodeURIComponent(s.replace(pluses, ' '));
42 } catch(e) {
43 return;
44 }
45
46 try {
47 // If we can't parse the cookie, ignore it, it's unusable.
48 return config.json ? JSON.parse(s) : s;
49 } catch(e) {}
50 }
51
52 function read(s, converter) {
53 var value = config.raw ? s : parseCookieValue(s);
54 return $.isFunction(converter) ? converter(value) : value;
55 }
56
57 var config = $.cookie = function (key, value, options) {
58
59 // Write
60 if (value !== undefined && !$.isFunction(value)) {
61 options = $.extend({}, config.defaults, options);
62
63 if (typeof options.expires === 'number') {
64 var days = options.expires, t = options.expires = new Date();
65 t.setDate(t.getDate() + days);
66 }
67
68 return (document.cookie = [
69 encode(key), '=', stringifyCookieValue(value),
70 options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
71 options.path ? '; path=' + options.path : '',
72 options.domain ? '; domain=' + options.domain : '',
73 options.secure ? '; secure' : ''
74 ].join(''));
75 }
76
77 // Read
78
79 var result = key ? undefined : {};
80
81 // To prevent the for loop in the first place assign an empty array
82 // in case there are no cookies at all. Also prevents odd result when
83 // calling $.cookie().
84 var cookies = document.cookie ? document.cookie.split('; ') : [];
85
86 for (var i = 0, l = cookies.length; i < l; i++) {
87 var parts = cookies[i].split('=');
88 var name = decode(parts.shift());
89 var cookie = parts.join('=');
90
91 if (key && key === name) {
92 // If second argument (value) is a function it's a converter...
93 result = read(cookie, value);
94 break;
95 }
96
97 // Prevent storing a cookie that we couldn't decode.
98 if (!key && (cookie = read(cookie)) !== undefined) {
99 result[name] = cookie;
100 }
101 }
102
103 return result;
104 };
105
106 config.defaults = {};
107
108 $.removeCookie = function (key, options) {
109 if ($.cookie(key) !== undefined) {
110 // Must not alter options, thus extending a fresh object...
111 $.cookie(key, '', $.extend({}, options, { expires: -1 }));
112 return true;
113 }
114 return false;
115 };
116
117}));
diff --git a/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js b/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js
new file mode 100644
index 0000000000..42e7427cc0
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js
@@ -0,0 +1,620 @@
1/*
2 * jQuery treetable Plugin 3.1.0
3 * http://ludo.cubicphuse.nl/jquery-treetable
4 *
5 * Copyright 2013, Ludo van den Boom
6 * Dual licensed under the MIT or GPL Version 2 licenses.
7 */
8(function() {
9 var $, Node, Tree, methods;
10
11 $ = jQuery;
12
13 Node = (function() {
14 function Node(row, tree, settings) {
15 var parentId;
16
17 this.row = row;
18 this.tree = tree;
19 this.settings = settings;
20
21 // TODO Ensure id/parentId is always a string (not int)
22 this.id = this.row.data(this.settings.nodeIdAttr);
23
24 // TODO Move this to a setParentId function?
25 parentId = this.row.data(this.settings.parentIdAttr);
26 if (parentId != null && parentId !== "") {
27 this.parentId = parentId;
28 }
29
30 this.treeCell = $(this.row.children(this.settings.columnElType)[this.settings.column]);
31 this.expander = $(this.settings.expanderTemplate);
32 this.indenter = $(this.settings.indenterTemplate);
33 this.children = [];
34 this.initialized = false;
35 this.treeCell.prepend(this.indenter);
36 }
37
38 Node.prototype.addChild = function(child) {
39 return this.children.push(child);
40 };
41
42 Node.prototype.ancestors = function() {
43 var ancestors, node;
44 node = this;
45 ancestors = [];
46 while (node = node.parentNode()) {
47 ancestors.push(node);
48 }
49 return ancestors;
50 };
51
52 Node.prototype.collapse = function() {
53 if (this.collapsed()) {
54 return this;
55 }
56
57 this.row.removeClass("expanded").addClass("collapsed");
58
59 this._hideChildren();
60 this.expander.attr("title", this.settings.stringExpand);
61
62 if (this.initialized && this.settings.onNodeCollapse != null) {
63 this.settings.onNodeCollapse.apply(this);
64 }
65
66 return this;
67 };
68
69 Node.prototype.collapsed = function() {
70 return this.row.hasClass("collapsed");
71 };
72
73 // TODO destroy: remove event handlers, expander, indenter, etc.
74
75 Node.prototype.expand = function() {
76 if (this.expanded()) {
77 return this;
78 }
79
80 this.row.removeClass("collapsed").addClass("expanded");
81
82 if (this.initialized && this.settings.onNodeExpand != null) {
83 this.settings.onNodeExpand.apply(this);
84 }
85
86 if ($(this.row).is(":visible")) {
87 this._showChildren();
88 }
89
90 this.expander.attr("title", this.settings.stringCollapse);
91
92 return this;
93 };
94
95 Node.prototype.expanded = function() {
96 return this.row.hasClass("expanded");
97 };
98
99 Node.prototype.hide = function() {
100 this._hideChildren();
101 this.row.hide();
102 return this;
103 };
104
105 Node.prototype.isBranchNode = function() {
106 if(this.children.length > 0 || this.row.data(this.settings.branchAttr) === true) {
107 return true;
108 } else {
109 return false;
110 }
111 };
112
113 Node.prototype.updateBranchLeafClass = function(){
114 this.row.removeClass('branch');
115 this.row.removeClass('leaf');
116 this.row.addClass(this.isBranchNode() ? 'branch' : 'leaf');
117 };
118
119 Node.prototype.level = function() {
120 return this.ancestors().length;
121 };
122
123 Node.prototype.parentNode = function() {
124 if (this.parentId != null) {
125 return this.tree[this.parentId];
126 } else {
127 return null;
128 }
129 };
130
131 Node.prototype.removeChild = function(child) {
132 var i = $.inArray(child, this.children);
133 return this.children.splice(i, 1)
134 };
135
136 Node.prototype.render = function() {
137 var handler,
138 settings = this.settings,
139 target;
140
141 if (settings.expandable === true && this.isBranchNode()) {
142 handler = function(e) {
143 $(this).parents("table").treetable("node", $(this).parents("tr").data(settings.nodeIdAttr)).toggle();
144 return e.preventDefault();
145 };
146
147 this.indenter.html(this.expander);
148 target = settings.clickableNodeNames === true ? this.treeCell : this.expander;
149
150 target.off("click.treetable").on("click.treetable", handler);
151 target.off("keydown.treetable").on("keydown.treetable", function(e) {
152 if (e.keyCode == 13) {
153 handler.apply(this, [e]);
154 }
155 });
156 }
157
158 this.indenter[0].style.paddingLeft = "" + (this.level() * settings.indent) + "px";
159
160 return this;
161 };
162
163 Node.prototype.reveal = function() {
164 if (this.parentId != null) {
165 this.parentNode().reveal();
166 }
167 return this.expand();
168 };
169
170 Node.prototype.setParent = function(node) {
171 if (this.parentId != null) {
172 this.tree[this.parentId].removeChild(this);
173 }
174 this.parentId = node.id;
175 this.row.data(this.settings.parentIdAttr, node.id);
176 return node.addChild(this);
177 };
178
179 Node.prototype.show = function() {
180 if (!this.initialized) {
181 this._initialize();
182 }
183 this.row.show();
184 if (this.expanded()) {
185 this._showChildren();
186 }
187 return this;
188 };
189
190 Node.prototype.toggle = function() {
191 if (this.expanded()) {
192 this.collapse();
193 } else {
194 this.expand();
195 }
196 return this;
197 };
198
199 Node.prototype._hideChildren = function() {
200 var child, _i, _len, _ref, _results;
201 _ref = this.children;
202 _results = [];
203 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
204 child = _ref[_i];
205 _results.push(child.hide());
206 }
207 return _results;
208 };
209
210 Node.prototype._initialize = function() {
211 var settings = this.settings;
212
213 this.render();
214
215 if (settings.expandable === true && settings.initialState === "collapsed") {
216 this.collapse();
217 } else {
218 this.expand();
219 }
220
221 if (settings.onNodeInitialized != null) {
222 settings.onNodeInitialized.apply(this);
223 }
224
225 return this.initialized = true;
226 };
227
228 Node.prototype._showChildren = function() {
229 var child, _i, _len, _ref, _results;
230 _ref = this.children;
231 _results = [];
232 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
233 child = _ref[_i];
234 _results.push(child.show());
235 }
236 return _results;
237 };
238
239 return Node;
240 })();
241
242 Tree = (function() {
243 function Tree(table, settings) {
244 this.table = table;
245 this.settings = settings;
246 this.tree = {};
247
248 // Cache the nodes and roots in simple arrays for quick access/iteration
249 this.nodes = [];
250 this.roots = [];
251 }
252
253 Tree.prototype.collapseAll = function() {
254 var node, _i, _len, _ref, _results;
255 _ref = this.nodes;
256 _results = [];
257 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
258 node = _ref[_i];
259 _results.push(node.collapse());
260 }
261 return _results;
262 };
263
264 Tree.prototype.expandAll = function() {
265 var node, _i, _len, _ref, _results;
266 _ref = this.nodes;
267 _results = [];
268 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
269 node = _ref[_i];
270 _results.push(node.expand());
271 }
272 return _results;
273 };
274
275 Tree.prototype.findLastNode = function (node) {
276 if (node.children.length > 0) {
277 return this.findLastNode(node.children[node.children.length - 1]);
278 } else {
279 return node;
280 }
281 };
282
283 Tree.prototype.loadRows = function(rows) {
284 var node, row, i;
285
286 if (rows != null) {
287 for (i = 0; i < rows.length; i++) {
288 row = $(rows[i]);
289
290 if (row.data(this.settings.nodeIdAttr) != null) {
291 node = new Node(row, this.tree, this.settings);
292 this.nodes.push(node);
293 this.tree[node.id] = node;
294
295 if (node.parentId != null) {
296 this.tree[node.parentId].addChild(node);
297 } else {
298 this.roots.push(node);
299 }
300 }
301 }
302 }
303
304 for (i = 0; i < this.nodes.length; i++) {
305 node = this.nodes[i].updateBranchLeafClass();
306 }
307
308 return this;
309 };
310
311 Tree.prototype.move = function(node, destination) {
312 // Conditions:
313 // 1: +node+ should not be inserted as a child of +node+ itself.
314 // 2: +destination+ should not be the same as +node+'s current parent (this
315 // prevents +node+ from being moved to the same location where it already
316 // is).
317 // 3: +node+ should not be inserted in a location in a branch if this would
318 // result in +node+ being an ancestor of itself.
319 var nodeParent = node.parentNode();
320 if (node !== destination && destination.id !== node.parentId && $.inArray(node, destination.ancestors()) === -1) {
321 node.setParent(destination);
322 this._moveRows(node, destination);
323
324 // Re-render parentNode if this is its first child node, and therefore
325 // doesn't have the expander yet.
326 if (node.parentNode().children.length === 1) {
327 node.parentNode().render();
328 }
329 }
330
331 if(nodeParent){
332 nodeParent.updateBranchLeafClass();
333 }
334 if(node.parentNode()){
335 node.parentNode().updateBranchLeafClass();
336 }
337 node.updateBranchLeafClass();
338 return this;
339 };
340
341 Tree.prototype.removeNode = function(node) {
342 // Recursively remove all descendants of +node+
343 this.unloadBranch(node);
344
345 // Remove node from DOM (<tr>)
346 node.row.remove();
347
348 // Clean up Tree object (so Node objects are GC-ed)
349 delete this.tree[node.id];
350 this.nodes.splice($.inArray(node, this.nodes), 1);
351 }
352
353 Tree.prototype.render = function() {
354 var root, _i, _len, _ref;
355 _ref = this.roots;
356 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
357 root = _ref[_i];
358
359 // Naming is confusing (show/render). I do not call render on node from
360 // here.
361 root.show();
362 }
363 return this;
364 };
365
366 Tree.prototype.sortBranch = function(node, sortFun) {
367 // First sort internal array of children
368 node.children.sort(sortFun);
369
370 // Next render rows in correct order on page
371 this._sortChildRows(node);
372
373 return this;
374 };
375
376 Tree.prototype.unloadBranch = function(node) {
377 var children, i;
378
379 for (i = 0; i < node.children.length; i++) {
380 this.removeNode(node.children[i]);
381 }
382
383 // Reset node's collection of children
384 node.children = [];
385
386 node.updateBranchLeafClass();
387
388 return this;
389 };
390
391 Tree.prototype._moveRows = function(node, destination) {
392 var children = node.children, i;
393
394 node.row.insertAfter(destination.row);
395 node.render();
396
397 // Loop backwards through children to have them end up on UI in correct
398 // order (see #112)
399 for (i = children.length - 1; i >= 0; i--) {
400 this._moveRows(children[i], node);
401 }
402 };
403
404 // Special _moveRows case, move children to itself to force sorting
405 Tree.prototype._sortChildRows = function(parentNode) {
406 return this._moveRows(parentNode, parentNode);
407 };
408
409 return Tree;
410 })();
411
412 // jQuery Plugin
413 methods = {
414 init: function(options, force) {
415 var settings;
416
417 settings = $.extend({
418 branchAttr: "ttBranch",
419 clickableNodeNames: false,
420 column: 0,
421 columnElType: "td", // i.e. 'td', 'th' or 'td,th'
422 expandable: false,
423 expanderTemplate: "<a href='#'>&nbsp;</a>",
424 indent: 19,
425 indenterTemplate: "<span class='indenter'></span>",
426 initialState: "collapsed",
427 nodeIdAttr: "ttId", // maps to data-tt-id
428 parentIdAttr: "ttParentId", // maps to data-tt-parent-id
429 stringExpand: "Expand",
430 stringCollapse: "Collapse",
431
432 // Events
433 onInitialized: null,
434 onNodeCollapse: null,
435 onNodeExpand: null,
436 onNodeInitialized: null
437 }, options);
438
439 return this.each(function() {
440 var el = $(this), tree;
441
442 if (force || el.data("treetable") === undefined) {
443 tree = new Tree(this, settings);
444 tree.loadRows(this.rows).render();
445
446 el.addClass("treetable").data("treetable", tree);
447
448 if (settings.onInitialized != null) {
449 settings.onInitialized.apply(tree);
450 }
451 }
452
453 return el;
454 });
455 },
456
457 destroy: function() {
458 return this.each(function() {
459 return $(this).removeData("treetable").removeClass("treetable");
460 });
461 },
462
463 collapseAll: function() {
464 this.data("treetable").collapseAll();
465 return this;
466 },
467
468 collapseNode: function(id) {
469 var node = this.data("treetable").tree[id];
470
471 if (node) {
472 node.collapse();
473 } else {
474 throw new Error("Unknown node '" + id + "'");
475 }
476
477 return this;
478 },
479
480 expandAll: function() {
481 this.data("treetable").expandAll();
482 return this;
483 },
484
485 expandNode: function(id) {
486 var node = this.data("treetable").tree[id];
487
488 if (node) {
489 if (!node.initialized) {
490 node._initialize();
491 }
492
493 node.expand();
494 } else {
495 throw new Error("Unknown node '" + id + "'");
496 }
497
498 return this;
499 },
500
501 loadBranch: function(node, rows) {
502 var settings = this.data("treetable").settings,
503 tree = this.data("treetable").tree;
504
505 // TODO Switch to $.parseHTML
506 rows = $(rows);
507
508 if (node == null) { // Inserting new root nodes
509 this.append(rows);
510 } else {
511 var lastNode = this.data("treetable").findLastNode(node);
512 rows.insertAfter(lastNode.row);
513 }
514
515 this.data("treetable").loadRows(rows);
516
517 // Make sure nodes are properly initialized
518 rows.filter("tr").each(function() {
519 tree[$(this).data(settings.nodeIdAttr)].show();
520 });
521
522 if (node != null) {
523 // Re-render parent to ensure expander icon is shown (#79)
524 node.render().expand();
525 }
526
527 return this;
528 },
529
530 move: function(nodeId, destinationId) {
531 var destination, node;
532
533 node = this.data("treetable").tree[nodeId];
534 destination = this.data("treetable").tree[destinationId];
535 this.data("treetable").move(node, destination);
536
537 return this;
538 },
539
540 node: function(id) {
541 return this.data("treetable").tree[id];
542 },
543
544 removeNode: function(id) {
545 var node = this.data("treetable").tree[id];
546
547 if (node) {
548 this.data("treetable").removeNode(node);
549 } else {
550 throw new Error("Unknown node '" + id + "'");
551 }
552
553 return this;
554 },
555
556 reveal: function(id) {
557 var node = this.data("treetable").tree[id];
558
559 if (node) {
560 node.reveal();
561 } else {
562 throw new Error("Unknown node '" + id + "'");
563 }
564
565 return this;
566 },
567
568 sortBranch: function(node, columnOrFunction) {
569 var settings = this.data("treetable").settings,
570 prepValue,
571 sortFun;
572
573 columnOrFunction = columnOrFunction || settings.column;
574 sortFun = columnOrFunction;
575
576 if ($.isNumeric(columnOrFunction)) {
577 sortFun = function(a, b) {
578 var extractValue, valA, valB;
579
580 extractValue = function(node) {
581 var val = node.row.find("td:eq(" + columnOrFunction + ")").text();
582 // Ignore trailing/leading whitespace and use uppercase values for
583 // case insensitive ordering
584 return $.trim(val).toUpperCase();
585 }
586
587 valA = extractValue(a);
588 valB = extractValue(b);
589
590 if (valA < valB) return -1;
591 if (valA > valB) return 1;
592 return 0;
593 };
594 }
595
596 this.data("treetable").sortBranch(node, sortFun);
597 return this;
598 },
599
600 unloadBranch: function(node) {
601 this.data("treetable").unloadBranch(node);
602 return this;
603 }
604 };
605
606 $.fn.treetable = function(method) {
607 if (methods[method]) {
608 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
609 } else if (typeof method === 'object' || !method) {
610 return methods.init.apply(this, arguments);
611 } else {
612 return $.error("Method " + method + " does not exist on jQuery.treetable");
613 }
614 };
615
616 // Expose classes to world
617 this.TreeTable || (this.TreeTable = {});
618 this.TreeTable.Node = Node;
619 this.TreeTable.Tree = Tree;
620}).call(this);
diff --git a/bitbake/lib/toaster/toastergui/static/js/main.js b/bitbake/lib/toaster/toastergui/static/js/main.js
new file mode 100644
index 0000000000..eef6b468f4
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/main.js
@@ -0,0 +1,111 @@
1$(document).ready(function() {
2
3 /*
4 * PrettyPrint plugin.
5 *
6 */
7 // Init
8 prettyPrint();
9
10 // Prevent invalid links from jumping page scroll
11 $('a[href=#]').click(function() {
12 return false;
13 });
14
15
16 /* Belen's additions */
17
18 // turn Edit columns dropdown into a multiselect menu
19 $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
20 e.stopPropagation();
21 });
22
23 // enable popovers in any table cells that contain an anchor with the
24 // .btn class applied, and make sure popovers work on click, are mutually
25 // exclusive and they close when your click outside their area
26
27 $('html').click(function(e){
28 $('td > a.btn').popover('hide');
29 });
30
31 $('td > a.btn').popover({
32 html:true,
33 placement:'left',
34 container:'body',
35 trigger:'manual'
36 }).click(function(e){
37 $('td > a.btn').not(this).popover('hide');
38 // ideally we would use 'toggle' here
39 // but it seems buggy in our Bootstrap version
40 $(this).popover('show');
41 e.stopPropagation();
42 });
43
44 // enable tooltips for applied filters
45 $('th a.btn-primary').tooltip({container:'body', html:true, placement:'bottom', delay:{hide:1500}});
46
47 // hide applied filter tooltip when you click on the filter button
48 $('th a.btn-primary').click(function () {
49 $('.tooltip').hide();
50 });
51
52 // enable help information tooltip
53 $(".get-help").tooltip({container:'body', html:true, delay:{show:300}});
54
55 // show help bubble only on hover inside tables
56 $(".hover-help").css("visibility","hidden");
57 $("th, td").hover(function () {
58 $(this).find(".hover-help").css("visibility","visible");
59 });
60 $("th, td").mouseleave(function () {
61 $(this).find(".hover-help").css("visibility","hidden");
62 });
63
64 // show task type and outcome in task details pages
65 $(".task-info").tooltip({ container: 'body', html: true, delay: {show: 200}, placement: 'right' });
66
67 // linking directly to tabs
68 $(function(){
69 var hash = window.location.hash;
70 hash && $('ul.nav a[href="' + hash + '"]').tab('show');
71
72 $('.nav-tabs a').click(function (e) {
73 $(this).tab('show');
74 $('body').scrollTop();
75 });
76 });
77
78 // toggle for long content (variables, python stack trace, etc)
79 $('.full, .full-hide').hide();
80 $('.full-show').click(function(){
81 $('.full').slideDown(function(){
82 $('.full-hide').show();
83 });
84 $(this).hide();
85 });
86 $('.full-hide').click(function(){
87 $(this).hide();
88 $('.full').slideUp(function(){
89 $('.full-show').show();
90 });
91 });
92
93 //toggle the errors and warnings sections
94 $('.show-errors').click(function() {
95 $('#collapse-errors').addClass('in');
96 });
97 $('.toggle-errors').click(function() {
98 $('#collapse-errors').toggleClass('in');
99 });
100 $('.show-warnings').click(function() {
101 $('#collapse-warnings').addClass('in');
102 });
103 $('.toggle-warnings').click(function() {
104 $('#collapse-warnings').toggleClass('in');
105 });
106 //show warnings section when requested from the previous page
107 if (location.href.search('#warnings') > -1) {
108 $('#collapse-warnings').addClass('in');
109 }
110
111});
diff --git a/bitbake/lib/toaster/toastergui/static/js/prettify.js b/bitbake/lib/toaster/toastergui/static/js/prettify.js
new file mode 100755
index 0000000000..eef5ad7e6a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/prettify.js
@@ -0,0 +1,28 @@
1var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
2(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
3[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
4f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
5(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
6{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
7t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
8"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
9l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
10q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
11q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
12"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
13a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
14for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
15m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
16a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
17j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
18"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
19H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
20J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
21I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
22["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
23/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
24["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
25hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
26!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
27250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
28PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
new file mode 100644
index 0000000000..9ca9c9ac3b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -0,0 +1,74 @@
1<!DOCTYPE html>
2{% load static %}
3<html>
4 <head>
5 <title>{% if objectname %} {{objectname|title}} - {% endif %}Toaster</title>
6<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css">
7<link rel="stylesheet" href="{% static 'css/bootstrap-responsive.min.css' %}" type='text/css'>
8<link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'>
9<link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'>
10<link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'>
11<meta name="viewport" content="width=device-width, initial-scale=1.0" />
12<script src="{% static 'js/jquery-2.0.3.min.js' %}">
13</script>
14<script src="{% static 'js/jquery.cookie.js' %}">
15</script>
16<script src="{% static 'js/bootstrap.min.js' %}">
17</script>
18<script src="{% static 'js/prettify.js' %}">
19</script>
20<script src="{% static 'js/main.js' %}">
21</script>
22<script>
23function reload_params(params) {
24 uri = window.location.href;
25 splitlist = uri.split("?");
26 url = splitlist[0], parameters=splitlist[1];
27 // deserialize the call parameters
28 if(parameters){
29 cparams = parameters.split("&");
30 }else{
31 cparams = []
32 }
33 nparams = {}
34 for (i = 0; i < cparams.length; i++) {
35 temp = cparams[i].split("=");
36 nparams[temp[0]] = temp[1];
37 }
38 // update parameter values
39 for (i in params) {
40 nparams[encodeURIComponent(i)] = encodeURIComponent(params[i]);
41 }
42 // serialize the structure
43 callparams = []
44 for (i in nparams) {
45 callparams.push(i+"="+nparams[i]);
46 }
47 window.location.href = url+"?"+callparams.join('&');
48
49}
50</script>
51
52{% block extraheadcontent %}
53{% endblock %}
54 </head>
55
56<body style="height: 100%">
57<div class="navbar navbar-static-top">
58 <div class="navbar-inner">
59 <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a>
60 <a class="brand" href="/">Toaster</a>
61 <a class="pull-right manual" target="_blank" href="http://www.yoctoproject.org/documentation/toaster-manual">
62 <i class="icon-book"></i>
63 Toaster manual
64 </a>
65 </div>
66</div>
67
68<div class="container-fluid">
69{% block pagecontent %}
70{% endblock %}
71</div>
72</body>
73</html>
74
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
new file mode 100755
index 0000000000..5149768517
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
@@ -0,0 +1,28 @@
1{% extends "base.html" %}
2{% load humanize %}
3{% block pagecontent %}
4
5<div class="row-fluid">
6<!-- Breadcrumbs -->
7 <div class="section">
8 <ul class="breadcrumb" id="breadcrumb">
9 <li><a href="{% url 'all-builds' %}">All builds</a></li>
10 <li><a href="{%url 'builddashboard' build.pk%}">{{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})</a></li>
11 {% block localbreadcrumb %}{% endblock %}
12 </ul>
13 <script>
14 $( function () {
15 $('#breadcrumb > li').append("<span class=\"divider\">→</span>");
16 $('#breadcrumb > li:last').addClass("active");
17 $('#breadcrumb > li:last > span').remove();
18 });
19 </script>
20 </div> <!--section-->
21
22 <!-- Begin container -->
23 {% block pagedetailinfomain %}{% endblock %}
24 <!-- End container -->
25
26</div>
27
28{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
new file mode 100644
index 0000000000..46110519e9
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
@@ -0,0 +1,80 @@
1{% extends "base.html" %}
2{% load projecttags %}
3{% load humanize %}
4{% block pagecontent %}
5
6
7 <div class="">
8<!-- Breadcrumbs -->
9 <div class="section">
10 <ul class="breadcrumb" id="breadcrumb">
11<li><a href="{% url 'all-builds' %}">All builds</a></li>
12 <li>
13 {% block parentbreadcrumb %}
14 <a href="{%url 'builddashboard' build.pk%}">
15 {{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})
16 </a>
17 {% endblock %}
18 </li>
19 {% block localbreadcrumb %}{% endblock %}
20 </ul>
21 <script>
22 $( function () {
23 $('#breadcrumb > li').append("<span class=\"divider\">→</span>");
24 $('#breadcrumb > li:last').addClass("active");
25 $('#breadcrumb > li:last > span').remove();
26 });
27 </script>
28 </div>
29
30 <div class="row-fluid">
31
32 <!-- begin left sidebar container -->
33 <div id="nav" class="span2">
34 <ul class="nav nav-list well">
35 {% if build.target_set.all.0.is_image and build.outcome == 0 %}
36 <li class="nav-header">Images</li>
37 {% block nav-target %}
38 {% for t in build.get_sorted_target_list %}
39 <li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
40 {% endfor %}
41 {% endblock %}
42 {% endif %}
43 <li class="nav-header">Build</li>
44 {% block nav-configuration %}
45 <li><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
46 {% endblock %}
47 {% block nav-tasks %}
48 <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
49 {% endblock %}
50 {% block nav-recipes %}
51 <li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
52 {% endblock %}
53 {% block nav-packages %}
54 <li><a href="{% url 'packages' build.pk %}">Packages</a></li>
55 {% endblock %}
56 <li class="nav-header">Performance</li>
57 {% block nav-buildtime %}
58 <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
59 {% endblock %}
60 {% block nav-cpuusage %}
61 <li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
62 {% endblock %}
63 {% block nav-diskio %}
64 <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
65 {% endblock %}
66 </ul>
67 </div>
68 <!-- end left sidebar container -->
69
70 <!-- Begin right container -->
71 {% block buildinfomain %}{% endblock %}
72 <!-- End right container -->
73
74
75 </div>
76 </div>
77
78
79{% endblock %}
80
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
new file mode 100644
index 0000000000..ac14363798
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
@@ -0,0 +1,85 @@
1 </tbody>
2 </table>
3
4<!-- Show pagination controls -->
5<div class="pagination pagination-centered">
6 <div class="pull-left">
7 Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.
8 </div>
9
10 <ul class="pagination" style="display: block-inline">
11{%if objects.has_previous %}
12 <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
13{%else%}
14 <li class="disabled"><a href="#">&laquo;</a></li>
15{%endif%}
16{% for i in objects.page_range %}
17 <li{%if i == objects.number %} class="active" {%endif%}><a href="javascript:reload_params({'page':{{i}}})">{{i}}</a></li>
18{% endfor %}
19{%if objects.has_next%}
20 <li><a href="javascript:reload_params({'page':{{objects.next_page_number}}})">&raquo;</a></li>
21{%else%}
22 <li class="disabled"><a href="#">&raquo;</a></li>
23{%endif%}
24 </ul>
25 <div class="pull-right">
26 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
27 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
28 {% with "2 5 10 25 50 100" as list%}
29 {% for i in list.split %}<option{%if i == request.GET.count %} selected{%endif%}>{{i}}</option>
30 {% endfor %}
31 {% endwith %}
32 </select>
33 </div>
34</div>
35
36<!-- Update page display settings -->
37
38<script>
39 $(document).ready(function() {
40
41 // we load cookies for the column display
42 save = $.cookie('_displaycols_{{objectname}}');
43 if (save != undefined) {
44 setting = save.split(';');
45 for ( i = 0; i < setting.length; i++) {
46 if (setting[i].length > 0) {
47 splitlist = setting[i].split(':');
48 id = splitlist[0], v = splitlist[1];
49 if (v == 'true') {
50 $('.chbxtoggle#'+id).prop('checked', true);
51 }
52 else {
53 $('.chbxtoggle#'+id).prop('checked', false);
54 }
55 }
56 }
57 }
58
59 $('.chbxtoggle').each(function () {
60 showhideTableColumn($(this).attr('id'), $(this).is(':checked'))
61 });
62
63 //turn edit columns dropdown into a multi-select menu
64 $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
65 e.stopPropagation();
66 });
67
68 //show tooltip with applied filter
69 $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true});
70
71 //progress bar tooltip
72 $('.progress, .lead span').tooltip({container:'table', placement:'top'});
73
74 $(".pagesize").change(function () {
75 console.log("page size change");
76 reload_params({"count":$(this).val()}); ;
77 });
78});
79</script>
80
81<!-- modal filter boxes -->
82 {% for tc in tablecols %}{% if tc.filter %}{% with objectname=objectname f=tc.filter %}
83 {% include "filtersnippet.html" %}
84 {% endwith %}{% endif %} {% endfor %}
85<!-- end modals -->
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
new file mode 100644
index 0000000000..22c389799a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -0,0 +1,87 @@
1{% load projecttags %}
2<!-- component to display a generic table -->
3 <script>
4 function showhideTableColumn(clname, sh) {
5 if (sh) $('.' + clname).show(100);
6 else $('.' + clname).hide(100);
7
8 // save cookie for all checkboxes
9 save = '';
10 $('.chbxtoggle').each(function() { if ($(this).attr('id') != undefined) { save += ';' + $(this).attr('id') +':'+ $(this).is(':checked')} })
11 $.cookie('_displaycols_{{objectname}}', save);
12 save = '';
13 }
14
15
16 function filterTableRows(test) {
17 if (test.length > 0) {
18 var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
19 $('tr.data').map( function (i, el) {
20 (! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
21 });
22 } else
23 {
24 $('tr.data').show();
25 }
26 }
27 </script>
28
29<!-- control header -->
30<div class="navbar">
31 <div class="navbar-inner">
32 <form class="navbar-search input-append pull-left" id="searchform">
33 <input class="input-xxlarge" id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{%endif%}
34 <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
35 <input type="hidden" name="page" value="1">
36 <input type="hidden" name="count" value="{{request.GET.count}}">
37 <button class="btn" type="submit" value="Search">Search</button>
38 </form>
39 <div class="pull-right">
40{% if tablecols %}
41 <div class="btn-group">
42 <button class="btn dropdown-toggle" data-toggle="dropdown">Edit columns
43 <span class="caret"></span>
44 </button>
45<!--
46 {{tablecols|sortcols}}
47-->
48 <ul class="dropdown-menu">{% for i in tablecols|sortcols %}
49 <li>
50 <label {% if not i.clclass %} class="checkbox muted" {%else%} class="checkbox" {%endif%}>
51 <input type="checkbox" class="chbxtoggle" {% if i.clclass %}id="{{i.clclass}}" value="ct{{i.name}}" {% if not i.hidden %}checked="checked"{%endif%} onchange="showhideTableColumn($(this).attr('id'), $(this).is(':checked'))" {%else%} checked disabled {% endif %}/> {{i.name}}
52 </label>
53 </li>{% endfor %}
54 </ul>
55 </div>
56{% endif %}
57 <div style="display:inline">
58 <span class="divider-vertical"></span>
59 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
60 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
61 {% with "2 5 10 25 50 100" as list%}
62{% for i in list.split %} <option{%if i == request.GET.count %} selected{%endif%}>{{i}}</option>
63 {% endfor %}
64 {% endwith %}
65 </select>
66 </div>
67 </div>
68 </div> <!-- navbar-inner -->
69</div>
70
71<!-- the actual rows of the table -->
72 <table class="table table-bordered table-hover tablesorter" id="otable">
73 <thead>
74 <!-- Table header row; generated from "tablecols" entry in the context dict -->
75 <tr>
76 {% for tc in tablecols %}<th class="{{tc.dclass}} {{tc.clclass}}">
77 {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%}
78 {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })" >{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%}
79 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
80 {%if tc.filter%}<div class="btn-group pull-right">
81 <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-small btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="icon-filter filtered"></i> </a>
82 </div>{%endif%}
83 </th>{% endfor %}
84 </tr>
85 </thead>
86 <tbody>
87
diff --git a/bitbake/lib/toaster/toastergui/templates/bfile.html b/bitbake/lib/toaster/toastergui/templates/bfile.html
new file mode 100644
index 0000000000..c7f59434a5
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/bfile.html
@@ -0,0 +1,24 @@
1{% extends "basebuildpage.html" %}
2
3{% block pagetitle %}Files for package {{objects.0.bpackage.name}} {% endblock %}
4{% block pagetable %}
5 {% if not objects %}
6 <p>No files were recorded for this package!</p>
7 {% else %}
8
9 <tr>
10 <th>Name</th>
11 <th>Size (Bytes)</th>
12 </tr>
13
14 {% for file in objects %}
15
16 <tr class="data">
17 <td>{{file.path}}</td>
18 <td>{{file.size}}</td>
19
20 {% endfor %}
21
22 {% endif %}
23
24{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
new file mode 100644
index 0000000000..2d4948be4b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -0,0 +1,108 @@
1{% extends "basebuildpage.html" %}
2
3{% load projecttags %}
4
5{% block localbreadcrumb %}
6<li>Packages</li>
7{% endblock %}
8
9{% block nav-packages %}
10 <li class="active"><a href="{% url 'packages' build.pk %}">Packages</a></li>
11{% endblock %}
12
13{% block buildinfomain %}
14<div class="span10">
15
16{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
17
18<!-- Empty - no data in database -->
19<div class="page-header">
20 <h1>
21 Packages
22 </h1>
23</div>
24<div class="alert alert-info lead">
25 <strong>No packages were built.</strong> How did this happen? Well, BitBake reuses as much stuff as possible.
26 If all of the packages needed were already built and available in your build infrastructure, BitBake
27 will not rebuild any of them. This might be slightly confusing, but it does make everything faster.
28</div>
29
30{% else %}
31
32<div class="page-header">
33 <h1>
34 {% if request.GET.search and objects.paginator.count > 0 %}
35 {{objects.paginator.count}} package{{objects.paginator.count|pluralize}} found
36 {%elif request.GET.search and objects.paginator.count == 0%}
37 No packages found
38 {%else%}
39 Packages
40 {%endif%}
41 </h1>
42</div>
43
44 {% if objects.paginator.count == 0 %}
45 <div class="row-fluid">
46 <div class="alert">
47 <form class="no-results input-append" id="searchform">
48 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
49 <button class="btn" type="submit" value="Search">Search</button>
50 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
51 </form>
52 </div>
53 </div>
54
55 {% else %}
56 {% include "basetable_top.html" %}
57
58 {% for package in objects %}
59
60 <tr class="data">
61
62 <!-- Package -->
63 <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.name}}</a></td>
64 <!-- Package Version -->
65 <td>{%if package.version%}<a href="{% url "package_built_detail" build.pk package.pk %}">{{package.version}}-{{package.revision}}</a>{%endif%}</td>
66 <!-- Package Size -->
67 <td class="size sizecol">{{package.size|filtered_filesizeformat}}</td>
68 <!-- License -->
69 <td class="license">{{package.license}}</td>
70
71 {%if package.recipe%}
72 <!-- Recipe -->
73 <td class="recipe__name"><a href="{% url "recipe" build.pk package.recipe.pk %}">{{package.recipe.name}}</a></td>
74 <!-- Recipe Version -->
75 <td class="recipe__version"><a href="{% url "recipe" build.pk package.recipe.pk %}">{{package.recipe.version}}</a></td>
76
77 <!-- Layer -->
78 <td class="recipe__layer_version__layer__name">{{package.recipe.layer_version.layer.name}}</td>
79 <!-- Layer branch -->
80 <td class="recipe__layer_version__branch">{{package.recipe.layer_version.branch}}</td>
81 <!-- Layer commit -->
82 <td class="recipe__layer_version__layer__commit">
83 <a class="btn"
84 data-content="<ul class='unstyled'>
85 <li>{{package.recipe.layer_version.commit}}</li>
86 </ul>">
87 {{package.recipe.layer_version.commit|truncatechars:13}}
88 </a>
89 </td>
90 <!-- Layer directory -->
91 <td class="recipe__layer_version__layer__local_path">{{package.recipe.layer_version.layer.local_path}}</td>
92 {%else%}
93 <td class="recipe__name"></td>
94 <td class="recipe__version"></td>
95 <td class="recipe__layer_version__layer__name"></td>
96 <td class="recipe__layer_version__branch"></td>
97 <td class="recipe__layer_version__layer__commit"></td>
98 <td class="recipe__layer_version__layer__local_path"></td>
99 {%endif%}
100
101 </tr>
102 {% endfor %}
103
104 {% include "basetable_bottom.html" %}
105 {% endif %} {# objects.paginator.count #}
106{% endif %} {# Empty #}
107</div>
108{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/build.html b/bitbake/lib/toaster/toastergui/templates/build.html
new file mode 100644
index 0000000000..faabd22f8b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/build.html
@@ -0,0 +1,140 @@
1{% extends "base.html" %}
2
3{% load static %}
4{% load projecttags %}
5{% load humanize %}
6
7{% block pagecontent %}
8<div class="row-fluid">
9 {% if not objects.paginator.count and not request.GET.filter and not request.GET.search %}
10 <!-- Empty - no data in database -->
11 <div class="hero-unit span12">
12 <button type="button" class="close" data-dismiss="alert">&times;</button>
13 <div class="row-fluid">
14 <div class="span6">
15 <h1>This is Toaster</h1>
16 <p>A web interface to <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
17 <p class="hero-actions">
18 <a class="btn btn-primary btn-large" href="https://www.yoctoproject.org/documentation/toaster-manual">Show me the manual</a>
19 <a class="btn btn-large" href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster">I want to contribute</a>
20 </p>
21 </div>
22 <div class="span5">
23 <a href="http://www.yoctoproject.org"><img src="{% static 'img/toaster.png' %}" class="thumbnail" alt="Yocto Project"/> </a>
24 </div>
25 </div>
26 </div>
27 {% endif %}
28
29 {%if mru.count > 0%}
30 <div class="page-header top-air">
31 <h1>
32 Recent Builds
33 </h1>
34 </div>
35 {% for build in mru %}
36 <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
37 <div class="row-fluid">
38 <div class="lead span5">
39 {%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}
40 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
41 <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
42 {% endif %}
43 <span data-toggle="tooltip" {%if build.target_set.all.count > 1%}title="Targets: {%for target in build.target_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|naturaltime}})</span>
44 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
45 </a>
46 {% endif %}
47 </div>
48 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
49 <div class="span2 lead">
50 {% if build.errors_no %}
51 <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>
52 {% endif %}
53 </div>
54 <div class="span2 lead">
55 {% if build.warnings_no %}
56 <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>
57 {% endif %}
58 </div>
59 <div class="lead pull-right">
60 Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent|sectohms }}</a>
61 </div>
62 {%endif%}{%if build.outcome == build.IN_PROGRESS %}
63 <div class="span4">
64 <div class="progress" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
65 <div style="width: {{build.completeper}}%;" class="bar"></div>
66 </div>
67 </div>
68 <div class="lead pull-right">ETA: in {{build.eta|naturaltime}}</div>
69 {%endif%}
70 </div>
71 </div>
72
73 {% endfor %}{%endif%}
74
75 {% if not objects.paginator.count and not request.GET.filter and not request.GET.search %}
76 <!-- Empty - no data in database -->
77 {% if mru.count == 0 %}
78 <div class="page-header top-air">
79 <h1>All builds</h1>
80 </div>
81 <div class="alert alert-info lead">
82 Toaster has not recorded any builds yet. Go build something with <a href="http://www.yoctoproject.org/docs/current/yocto-project-qs/yocto-project-qs.html#test-run">Knotty</a> or <a href="https://www.yoctoproject.org/documentation/hob-manual">Hob</a>
83 </div>
84 {% endif %}
85 {% else %}
86 <div class="page-header top-air">
87 <h1>
88 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
89 {{objects.paginator.count}} build{{objects.paginator.count|pluralize}} found
90 {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
91 No builds found
92 {%else%}
93 All builds
94 {%endif%}
95 </h1>
96 </div>
97
98 {% if objects.paginator.count == 0 %}
99 <div class="row-fluid">
100 <div class="alert">
101 <form class="no-results input-append" id="searchform">
102 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
103 <button class="btn" type="submit" value="Search">Search</button>
104 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button>
105 </form>
106 </div>
107 </div>
108
109
110 {% else %}
111 {% include "basetable_top.html" %}
112 <!-- Table data rows; the order needs to match the order of "tablecols" definitions; and the <td class value needs to match the tablecols clclass value for show/hide buttons to work -->
113 {% for build in objects %}
114 <tr class="data">
115 <td class="outcome"><a href="{% url "builddashboard" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a></td>
116 <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td>
117 <td class="machine"><a href="{% url "builddashboard" build.id %}">{{build.machine}}</a></td>
118 <td class="started_on"><a href="{% url "builddashboard" build.id %}">{{build.started_on|date:"d/m/y H:i"}}</a></td>
119 <td class="completed_on"><a href="{% url "builddashboard" build.id %}">{{build.completed_on|date:"d/m/y H:i"}}</a></td>
120 <td class="failed_tasks error">{% query build.task_build outcome=4 order__gt=0 as exectask%}{% if exectask.count == 1 %}<a href="{% url "task" build.id exectask.0.id %}">{{exectask.0.recipe.name}}.{{exectask.0.task_name}}</a>{% elif exectask.count > 1%}<a href="{% url "tasks" build.id %}?filter=outcome%3A4">{{exectask.count}}</a>{%endif%}</td>
121 <td class="errors_no">{% if build.errors_no %}<a class="errors_no error" href="{% url "builddashboard" build.id %}#errors">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>{%endif%}</td>
122 <td class="warnings_no">{% if build.warnings_no %}<a class="warnings_no warning" href="{% url "builddashboard" build.id %}#warnings">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>{%endif%}</td>
123 <td class="time"><a href="{% url "buildtime" build.id %}">{{build.timespent|sectohms}}</a></td>
124 <td class="log">{{build.cooker_log_path}}</td>
125 <td class="output">
126 {% if build.outcome == build.SUCCEEDED %}
127 <a href="{%url "builddashboard" build.id%}#images">{{fstypes|get_dict_value:build.id}}</a>
128 {% endif %}
129 </td>
130 </tr>
131
132 {% endfor %}
133
134
135 {% include "basetable_bottom.html" %}
136 {% endif %} {# objects.paginator.count #}
137{% endif %} {# empty #}
138</div><!-- end row-fluid-->
139
140{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
new file mode 100644
index 0000000000..fa4b194eb9
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -0,0 +1,198 @@
1{% extends "basebuildpage.html" %}
2{% load humanize %}
3{% load projecttags %}
4
5{% block parentbreadcrumb %}
6{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})
7{% endblock %}
8
9{% block buildinfomain %}
10<!-- page title -->
11<div class="row-fluid span10">
12 <div class="page-header">
13 <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1>
14 </div>
15</div>
16
17<!-- build result bar -->
18<div class="row-fluid span10 pull-right">
19 <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
20 <div class="row-fluid lead">
21 <span class="pull-left"><strong>
22 {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}
23 </strong> on
24 {{build.completed_on|date:"d/m/y H:i"}}
25</span>
26{% if build.warnings_no or build.errors_no %}
27&nbsp;with
28{% endif %}
29{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
30{% if build.errors_no %}
31 <span > <i class="icon-minus-sign red"></i><strong><a href="#errors" class="error show-errors"> {{build.errors_no}} error{{build.errors_no|pluralize}}</a></strong></span>
32{% endif %}
33{% if build.warnings_no %}
34{% if build.errors_no %}
35 and
36{% endif %}
37 <span > <i class="icon-warning-sign yellow"></i><strong><a href="#warnings" class="warning show-warnings"> {{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a></strong></span>
38{% endif %}
39 <span class="pull-right">Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent|sectohms }}</a></span>
40{%endif%}
41 </div>
42 </div>
43</div>
44
45{% if build.errors_no %}
46<div class="accordion span10 pull-right" id="errors">
47 <div class="accordion-group">
48 <div class="accordion-heading">
49 <a class="accordion-toggle error toggle-errors">
50 <h2 id="error-toggle">
51 <i class="icon-minus-sign"></i>
52 {{build.errors_no}} error{{build.errors_no|pluralize}}
53 </h2>
54 </a>
55 </div>
56 <div class="accordion-body collapse in" id="collapse-errors">
57 <div class="accordion-inner">
58 <div class="span10">
59 {% for error in logmessages %}{% if error.level == 2 %}
60 <div class="alert alert-error">
61 <pre>{{error.message}}</pre>
62 </div>
63 {% endif %}{% endfor %}
64 </div>
65 </div>
66 </div>
67 </div>
68</div>
69{% endif %}
70
71{%if build.outcome == build.SUCCEEDED%}
72<!-- built images -->
73<div class="row-fluid span10 pull-right">
74 {% if hasImages %}
75 <h2>Images</h2>
76 {% for target in targets %}
77 {% if target.target.is_image %}
78 <div class="well dashboard-section">
79 <h3><a href="{% url 'target' build.pk target.target.pk %}">{{target.target}}</a>
80 </h3>
81 <dl class="dl-horizontal">
82 <dt>Packages included</dt>
83 <dd><a href="{% url 'target' build.pk target.target.pk %}">{{target.npkg}}</a></dd>
84 <dt>Total package size</dt>
85 <dd>{{target.pkgsz|filtered_filesizeformat}}</dd>
86 <dt>
87 <i class="icon-question-sign get-help" title="The location in disk of the license manifest, a document listing all packages installed in your image and their licenses"></i>
88 <a href="{% url 'target' build.pk target.target.pk %}">License manifest</a>
89 </dt>
90 <dd><code>{{target.target.license_manifest_path}}</code></dd>
91 <dt>
92 <i class="icon-question-sign get-help" title="Image files are stored in <code>/build/tmp/deploy/images/</code>"></i>
93 Image files
94 </dt>
95 <dd>
96 <ul>
97 {% for i in target.imageFiles %}
98 <li>{{i.path}}
99 ({{i.size|filtered_filesizeformat}})</li>
100 {% endfor %}
101 </ul>
102 </dd>
103 </dl>
104 </div>
105 {% endif %}
106 {% endfor %}
107 {% endif %}
108</div>
109
110{%else%}
111<!-- error dump -->
112{%endif%}
113
114<!-- build summary -->
115<div class="row-fluid span10 pull-right">
116<h2>Build summary</h2>
117 <div class="well span4 dashboard-section" style="margin-left:0px;">
118 <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4>
119 <dl>
120 <dt>Machine</dt><dd>{{build.machine}}</dd>
121 <dt>Distro</dt><dd>{{build.distro}}</dd>
122 <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%}
123 </dl>
124 </div>
125 <div class="well span4 dashboard-section">
126 <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4>
127 <dl>
128 <dt>Total number of tasks</dt><dd><a href="{% url 'tasks' build.pk %}">{{build.task_build.all.count}}</a></dd>
129 <dt>
130 Tasks executed
131 <i class="icon-question-sign get-help" title="'Executed' tasks are those that need to be run in order to generate the task output"></i>
132 </dt>
133 <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A1&amp;count=25&amp;search=&amp;page=1&amp;orderby=order%3A%2B">{% query build.task_build task_executed=1 order__gt=0 as exectask%}{{exectask.count}}</a></dd>
134 <dt>
135 Tasks not executed
136 <i class="icon-question-sign get-help" title="'Not executed' tasks don't need to run because their outcome is provided by another task"></i>
137 </dt>
138 <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A0&amp;count=25&amp;search=&amp;page=1&amp;orderby=order%3A%2B">{% query build.task_build task_executed=0 order__gt=0 as noexectask%}{{noexectask.count}}</a></dd>
139 <dt>
140 Reuse
141 <i class="icon-question-sign get-help" title="The percentage of 'not executed' tasks over the total number of tasks, which is a measure of the efficiency of your build"></i>
142 </dt>
143 <dd>
144{% query build.task_build order__gt=0 as texec %}
145{% if noexectask.count|multiply:100|divide:texec.count < 0 %}
1460
147{% else %}
148{{noexectask.count|multiply:100|divide:texec.count}}
149{% endif %}
150%
151 </dd>
152 </dl>
153 </div>
154 <div class="well span4 dashboard-section">
155 <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4>
156 <dl>
157 <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd>
158 <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd>
159 </dl>
160 </div>
161</div>
162
163{% if build.warnings_no %}
164<div class="accordion span10 pull-right" id="warnings">
165 <div class="accordion-group">
166 <div class="accordion-heading">
167 <a class="accordion-toggle warning toggle-warnings">
168 <h2 id="warning-toggle">
169 <i class="icon-warning-sign"></i>
170 {{build.warnings_no}} warning{{build.warnings_no|pluralize}}
171 </h2>
172 </a>
173 </div>
174 <div class="accordion-body collapse" id="collapse-warnings">
175 <div class="accordion-inner">
176 <div class="span10">
177 {% for warning in logmessages %}{% if warning.level == 1 %}
178 <div class="alert alert-warning">
179 <pre>{{warning.message}}</pre>
180 </div>
181 {% endif %}{% endfor %}
182 </div>
183 </div>
184 </div>
185 </div>
186</div>
187{% endif %}
188
189<script type="text/javascript">
190 $(document).ready(function() {
191 //show warnings section when requested from the previous page
192 if (location.href.search('#warnings') > -1) {
193 $('#collapse-warnings').addClass('in');
194 }
195 });
196</script>
197
198{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/buildtime.html b/bitbake/lib/toaster/toastergui/templates/buildtime.html
new file mode 100644
index 0000000000..ea84ae797c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/buildtime.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Build Time</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
new file mode 100644
index 0000000000..49a6a89d5c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -0,0 +1,73 @@
1{% extends "basebuildpage.html" %}
2{% load projecttags %}
3
4{% block localbreadcrumb %}
5<li>Configuration</li>
6{% endblock %}
7
8{% block nav-configuration %}
9 <li class="active"><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
10{% endblock %}
11
12{% block buildinfomain %}
13<!-- page title -->
14<div class="row-fluid span10">
15 <div class="page-header">
16 <h1>Configuration</h1>
17 </div>
18</div>
19
20<!-- configuration table -->
21<div class="row-fluid pull-right span10" id="navTab">
22<ul class="nav nav-pills">
23 <li class="active"><a href="#">Summary</a></li>
24 <li class=""><a href="{% url 'configvars' build.id %}">BitBake variables</a></li>
25</ul>
26
27 <!-- summary -->
28 <div id="summary" class="tab-pane active">
29 <h3>Build configuration</h3>
30 <dl class="dl-horizontal">
31 {%if BB_VERSION %}<dt>BitBake version</dt><dd>{{BB_VERSION}}</dd> {% endif %}
32 {%if BUILD_SYS %}<dt>Build system</dt><dd>{{BUILD_SYS}}</dd> {% endif %}
33 {%if NATIVELSBSTRING %}<dt>Host distribution</dt><dd>{{NATIVELSBSTRING}}</dd> {% endif %}
34 {%if TARGET_SYS %}<dt>Target system</dt><dd>{{TARGET_SYS}}</dd> {% endif %}
35 {%if MACHINE %}<dt>Machine</dt><dd>{{MACHINE}}</dd> {% endif %}
36 {%if DISTRO %}<dt>Distro</dt><dd>{{DISTRO}}</dd> {% endif %}
37 {%if DISTRO_VERSION %}<dt>Distro version</dt><dd>{{DISTRO_VERSION}}</dd> {% endif %}
38 {%if TUNE_FEATURES %}<dt>Tune features</dt><dd>{{TUNE_FEATURES}}</dd> {% endif %}
39 {%if TARGET_FPU %}<dt>Target FPU</dt><dd>{{TARGET_FPU}}</dd> {% endif %}
40 {%if targets.all %}<dt>Target(s)</dt>
41 <dd> <ul> {% for target in targets.all %}
42 <li>{{target.target}}{%if forloop.counter > 1 %}<br>{% endif %}</li>
43 {% endfor %} </ul> </dd> {% endif %}
44 </dl>
45 <h3>Layers</h3>
46 <div class="span9" style="margin-left:0px;">
47 <table class="table table-bordered table-hover">
48 <thead>
49 <tr>
50 <th>Layer</th>
51 <th>Layer branch</th>
52 <th>Layer commit</th>
53 <th>Layer directory</th>
54 </tr>
55 </thead>
56 <tbody>{% for lv in build.layer_version_build.all|dictsort:"layer.name" %}
57 <tr>
58 <td>{{lv.layer.name}}</td>
59 <td>{{lv.branch}}</td>
60 <td> <a class="btn" data-content="<ul class='unstyled'>
61 <li>{{lv.commit}}</li> </ul>">
62 {{lv.commit|truncatechars:13}}
63 </a></td>
64 <td>{{lv.layer.local_path}}</td>
65 </tr>{% endfor %}
66 </tbody>
67 </table>
68 </div>
69 </div>
70
71
72</div>
73{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
new file mode 100644
index 0000000000..1bd29aac0d
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -0,0 +1,130 @@
1{% extends "basebuildpage.html" %}
2{% load projecttags %}
3
4{% block localbreadcrumb %}
5<li>Configuration</li>
6{% endblock %}
7
8{% block nav-configuration %}
9 <li class="active"><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
10{% endblock %}
11
12{% block buildinfomain %}
13<!-- page title -->
14<div class="row-fluid span10">
15 <div class="page-header">
16 <h1>
17 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
18 {{objects.paginator.count}} variable{{objects.paginator.count|pluralize}} found
19 {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
20 No variables found
21 {%else%}
22 Configuration
23 {%endif%}
24 </h1>
25 </div>
26</div>
27
28<!-- configuration table -->
29<div class="row-fluid pull-right span10" id="navTab">
30 <ul class="nav nav-pills">
31 <li class=""><a href="{% url 'configuration' build.id %}">Summary</a></li>
32 <li class="active"><a href="#" >BitBake variables</a></li>
33 </ul>
34
35 <!-- variables -->
36 <div id="variables" class="tab-pane">
37
38 {% if objects.paginator.count == 0 %}
39 <div class="row-fluid">
40 <div class="alert">
41 <form class="no-results input-append" id="searchform">
42 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
43 <button class="btn" type="submit" value="Search">Search</button>
44 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
45 </form>
46 </div>
47 </div>
48
49 {% else %}
50 {% include "basetable_top.html" %}
51
52 {% for variable in objects %}
53 <tr class="data">
54 <td class="variable_name"><a data-toggle="modal" href="#variable-{{variable.pk}}">{{variable.variable_name}}</a></td>
55 <td class="variable_value"><a data-toggle="modal" href="#variable-{{variable.pk}}">{{variable.variable_value|truncatechars:153}}</a></td>
56 <td class="file"><a data-toggle="modal" href="#variable-{{variable.pk}}">
57 {% if variable.vhistory.all %} {% autoescape off %}
58 {{variable.vhistory.all | filter_setin_files:file_filter }}
59 {% endautoescape %} {% endif %}
60 </a></td>
61 <td class="description">
62 {% if variable.description %}
63 {{variable.description}}
64 <a href="http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-{{variable.variable_name|variable_parent_name}}" target="_blank">
65 <i class="icon-share get-info"></i></a>
66 {% endif %}
67 </td>
68 </tr>
69{% endfor %}
70
71{% include "basetable_bottom.html" %}
72{% endif %}
73</div> <!-- endvariables -->
74
75<!-- file list popups -->
76{% for variable in objects %}
77 {% if variable.vhistory.count %}
78 <div id="variable-{{variable.pk}}" class="modal hide fade" tabindex="-1" role="dialog">
79 <div class="modal-header">
80 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
81 <h3>History of {{variable.variable_name}}</h3>
82 </div>
83 <div class="modal-body">
84 {% if variable.variable_value %}
85 {% if variable.variable_value|length < 570 %}
86 <h4>{{variable.variable_name}} value is:</h4>
87 <p>
88 {{variable.variable_value}}
89 </p>
90 {% else %}
91 <h4>{{variable.variable_name}} value is:</h4>
92 <p>
93 <span>{{variable.variable_value|string_slice:':570'}}
94 <span class="full"> {{variable.variable_value|string_slice:'570:'}}
95 </span>
96 <a class="btn btn-mini full-show">...</a>
97 </span>
98 </p>
99 <a class="btn btn-mini full-hide">Collapse variable value <i class="icon-caret-up"></i>
100 </a>
101 {% endif %}
102 {% else %}
103 <div class="alert alert-info">The value of <strong>{{variable.variable_name}}</strong> is an empty string</div>
104 {% endif %}
105 <h4>The value was set in the following configuration files:</h4>
106 <table class="table table-bordered table-hover">
107 <thead>
108 <tr>
109 <th>Order</th>
110 <th>Configuration file</th>
111 <th>Operation</th>
112 <th>Line number</th>
113 </tr>
114 </thead>
115 <tbody>
116 {% for vh in variable.vhistory.all %}
117 <tr>
118 <td>{{forloop.counter}}</td><td>{{vh.file_name}}</td><td>{{vh.operation}}</td><td>{{vh.line_number}}</td>
119 </tr>
120 {%endfor%}
121 </tbody>
122 </table>
123 </div>
124 </div>
125 {% endif %}
126{% endfor %}
127
128</div> <!-- buildinfomain -->
129
130{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/cpuusage.html b/bitbake/lib/toaster/toastergui/templates/cpuusage.html
new file mode 100644
index 0000000000..02f07b7605
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/cpuusage.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Cpu Usage</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/dirinfo.html b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
new file mode 100644
index 0000000000..749ae242ea
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
@@ -0,0 +1,237 @@
1{% extends "basebuildpage.html" %}
2{% block extraheadcontent %}
3{% load static %}
4<link rel="stylesheet" href="{% static 'css/jquery.treetable.css' %}" type="text/css">
5<link rel="stylesheet" href="{% static 'css/jquery.treetable.theme.toaster.css' %}" type="text/css">
6{% endblock extraheadcontent %}
7
8{% block localbreadcrumb %}
9<li>{{target.target}}</li>
10{% endblock localbreadcrumb%}
11
12{% block buildinfomain %}
13
14{% load static %}
15<script src="{% static 'js/jquery.treetable.js' %}">
16</script>
17{% load projecttags %}
18
19<script type='text/javascript'>
20 function setupTreetable() {
21 $("#dirtable").treetable({
22 expandable: true,
23 branchAttr: "ttBranch",
24 clickableNodeNames: true,
25 onNodeCollapse: function() {
26 /* Do nothing, keep cached */
27 },
28 onNodeExpand: function() {
29 var start = this.id;
30 var n = $("#dirtable").treetable("node", start);
31 if (this.children.length > 0) {
32 /* already was expanded once */
33 $("#dirtable").treetable("reveal", start);
34 }
35 else {
36 var url = "{% url "dirinfo_ajax" build.id target.id %}";
37 $.ajax({
38 async: false,
39 type : "GET",
40 url : url,
41 data : "start=" + start,
42 success : function(response) {
43 var objects = $.parseJSON(response);
44 addRows(n, objects)
45 },
46 error : function(jqXHR, textStatus, errorThrown ) {alert(textStatus + ":" + errorThrown)},
47 });
48 }
49 },
50 });
51 }
52 function td(data) {
53 if (data == null) {
54 data = '';
55 }
56 return '<td>' + data + '</td>'
57 }
58
59 function formatRow(o) {
60 /* setup tr-wide formatting */
61 var tr = '<tr class="';
62 if (o.link_to != null) {
63 tr += 'muted ';
64 }
65 if (o.isdir && o.childcount) {
66 tr += 'branch" data-tt-branch="true" ';
67 }
68 else {
69 tr += 'leaf" data-tt-branch="false" ';
70 }
71 tr += ' data-tt-id="' + o.fullpath +'" ';
72 if (o.parent != "/") {
73 tr += ' data-tt-parent-id="' + o.parent +'" ';
74 }
75 tr += '>';
76
77 /* setup td specific formatting */
78 var link_to = td(o.link_to);
79 var size = '<td class = "sizecol">' + o.size + '</td>'
80 var permission = td(o.permission);
81 var owner = td(o.owner);
82 var group = td(o.group);
83
84 /* handle the name column */
85 var name = null;;
86 var namespan=1;
87 if (o.isdir) {
88 if (o.link_to == null) {
89 namespan = 2;
90 if (o.package == null) {
91 namespan = 3;
92 }
93 }
94 var colspan = 'colspan="' + namespan + '"';
95 name = '<td class="content-directory"' + colspan + '>';
96 if (o.childcount) {
97 name += '<a href="">';
98 }
99 name += '<i class="icon-folder-close"></i>';
100 name += '&nbsp;' + o.name;
101 if (o.childcount) {
102 name += '</a>';
103 }
104 name += '</td>';
105 }
106 else {
107 name = '<td>';
108 if (o.link_to == null) {
109 name += '<i class="icon-file"></i>';
110 }
111 else {
112 name += '<i class="icon-hand-right"></i>';
113 }
114 name += '&nbsp;' + o.name;
115 name += '</td>';
116 }
117
118 /* handle the package column */
119 var package = null;
120 if (o.package != null) {
121 /* add link to included package page */
122 build_id = {{ build.id }};
123 target_id = {{ target.id }};
124 /* Create a url for a dummy package id of 0 */
125 dummy = "{% url 'package_included_detail' build.id target.id 0 %}"
126 /* fill in the package id */
127 url = dummy.substr(0, dummy.length-1) + o.package_id;
128 package = '<a href=' + url + '>' ;
129 package += o.package;
130 package += '</a>';
131 if (o.installed_package != o.package) {
132 /* make class muted and add hover help */
133 package += '<span class="muted"> as ' + o.installed_package + ' </span>';
134 package += '<i class="icon-question-sign get-help hover-help" ';
135 package += 'title="' + o.package + ' was renamed at packaging time and was installed in your image as ' + o.installed_package + '">';
136 package += '</i>';
137 }
138 }
139 package = td(package);
140
141 var cols1to3;
142 switch (namespan) {
143 case 3:
144 cols1to3 = name;
145 break;
146 case 2:
147 cols1to3 = name + package;
148 break;
149 default:
150 cols1to3 = name + link_to + package;
151 }
152 r = tr + cols1to3 + size + permission + owner + group + "</tr>"
153 return r;
154 }
155
156 function addRows(n, objs) {
157 rows = "";
158 for (i=0; i<objs.length; i++) {
159 rows += formatRow(objs[i]);
160 }
161 $("#dirtable").treetable("loadBranch", n, rows);
162 }
163
164 $.fn.isOffScreen = function(){
165 var win = $(window);
166 viewportBottom = win.scrollTop() + win.height();
167
168 var bounds = this.offset();
169 bounds.bottom = bounds.top + this.outerHeight();
170
171 return (bounds.bottom > viewportBottom);
172 };
173
174 function selectRow(path) {
175 var row = $('tr[data-tt-id="' + path + '"]');
176 row.addClass(" highlight");
177 if (row.isOffScreen()) {
178 $('html, body').animate({ scrollTop: row.offset().top - 150}, 2000);
179 }
180 }
181</script>
182
183<div class="span10">
184
185 <div class="page-header">
186 <h1> {{target.target}} </h1>
187 </div>
188
189 <ul class="nav nav-pills">
190 <li class="">
191 <a href="{% url 'target' build.id target.id %}">
192 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Of all the packages built, the subset installed in the root file system of this image"></i>
193 Packages included ({{target.package_count}} - {{packages_sum|filtered_filesizeformat}})
194 </a>
195 </li>
196 <li class="active">
197 <a href="{% url 'dirinfo' build.id target.id %}">
198 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The directories and files in the root file system of this image"></i>
199 Directory structure
200 </a>
201 </li>
202 </ul>
203
204 <div id="directory-structure" class="tab-pane active">
205 <table id="dirtable" class="table table-bordered table-hover treetable">
206 <thead>
207 <tr>
208 <th>Directory / File</th>
209 <th>Symbolic link to</th>
210 <th>Source package</th>
211 <th>Size</th>
212 <th>Permissions</th>
213 <th>Owner</th>
214 <th>Group</th>
215 </tr>
216 </thead>
217 <tbody>
218 <script type='text/javascript'>
219 setupTreetable();
220 addRows(null, {{ objects|safe }} );
221 {% if file_path %}
222 {% comment %}
223 link from package_included_detail specifies file path
224 {% endcomment %}
225 {% for dir_elem in dir_list %}
226 $("#dirtable").treetable("expandNode", "{{dir_elem}}");
227 {% endfor %}
228 selectRow("{{file_path}}");
229 {% endif %}
230 </script>
231 </tbody>
232 </table>
233 </div> <!-- directory-structure -->
234</div> <!-- span10 -->
235
236{% endblock buildinfomain %}
237
diff --git a/bitbake/lib/toaster/toastergui/templates/diskio.html b/bitbake/lib/toaster/toastergui/templates/diskio.html
new file mode 100644
index 0000000000..c5cef6f385
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/diskio.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Disk I/O</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
new file mode 100644
index 0000000000..90ffd3de6c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
@@ -0,0 +1,39 @@
1{% load projecttags %}
2<!-- '{{f.class}}' filter -->
3<form id="filter_{{f.class}}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
4 <input type="hidden" name="search" value="{{request.GET.search}}"/>
5 <div class="modal-header">
6 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
7 {% if search_term %}
8 <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3>
9 {% else %}
10 <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
11 {% endif %}
12 </div>
13 <div class="modal-body">
14 <p>{{f.label}}</p>
15 <label class="radio">
16 <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value=""> All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} ({{total_count}})
17 </label>
18 {% for option in f.options %}
19 {% if option.2 %}
20 <label class="radio">
21 <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}"> {{option.0}} ({{option.2}})
22 {% else %}
23 <label class="radio muted">
24 <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}"> {{option.0}} ({{option.2}})
25 {% endif %}
26 {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %}
27 </label>
28 {% endfor %}
29 </div>
30 <div class="modal-footer">
31 <button type="submit" class="btn btn-primary">Apply</button>
32 {% if request.GET.filter %}
33 {% if request.GET.filter|string_remove_regex:':.*' != f.options.0.1|string_remove_regex:':.*' %}
34 <span class="help-inline pull-left">You can only apply one filter to the table. This filter will override the current filter.</span>
35 {% endif %}
36 {% endif %}
37 </div>
38</form>
39
diff --git a/bitbake/lib/toaster/toastergui/templates/layer.html b/bitbake/lib/toaster/toastergui/templates/layer.html
new file mode 100644
index 0000000000..410d766c60
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/layer.html
@@ -0,0 +1,34 @@
1{% extends "basetable.html" %}
2
3{% block pagename %}
4 <h1>Toaster - Layers</h1>
5{% endblock %}
6
7{% block pagetable %}
8 {% load projecttags %}
9
10 <tr>
11 <th>Name</th>
12 <th>Local Path</th>
13 <th>Layer Index URL</th>
14 <th>Known Versions</th>
15 </tr>
16
17 {% for layer in objects %}
18
19 <tr class="data">
20 <td>{{layer.name}}</td>
21 <td>{{layer.local_path}}</td>
22 <td><a href='{{layer.layer_index_url}}'>{{layer.layer_index_url}}</a></td>
23 <td><table>
24 {% for lv in layer.versions %}
25 <tr><td>
26 <a href="{% url "layer_versions_recipes" lv.id %}">({{lv.priority}}){{lv.branch}}:{{lv.commit}} ({{lv.count}} recipes)</a>
27 </td></tr>
28 {% endfor %}
29 </table></td>
30 </tr>
31
32 {% endfor %}
33
34{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package.html b/bitbake/lib/toaster/toastergui/templates/package.html
new file mode 100644
index 0000000000..1ba372608d
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package.html
@@ -0,0 +1,36 @@
1{% extends "basebuildpage.html" %}
2
3{% block pagetable %}
4 {% if not objects %}
5 <p>No packages were recorded for this target!</p>
6 {% else %}
7
8 <tr>
9 <th>Name</th>
10 <th>Version</th>
11 <th>Size (Bytes)</th>
12 <th>Recipe</th>
13 <th>Depends on</th>
14 </tr>
15
16 {% for package in objects %}
17
18 <tr class="data">
19 <td><a name="#{{package.name}}">{{package.name}}</a></td>
20 <td>{{package.version}}</td>
21 <td>{{package.size}}</td>
22 <td>{%if package.recipe %}<a name="{{package.recipe.name}}.{{package.package_name}}">
23 <a href="{% url "layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
24 <td>
25 <div style="height: 4em; overflow:auto">
26 {% for d in package.package_dependencies_source.all %}
27 <a href="#{{d.name}}">{{d.depends_on.name}}</a><br/>
28 {% endfor %}
29 </div>
30 </td>
31
32 {% endfor %}
33
34 {% endif %}
35
36{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
new file mode 100644
index 0000000000..a0c5a1e4f0
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
@@ -0,0 +1,99 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block tabcontent %}
5 <ul class="nav nav-pills">
6 <li class="">
7 <a href="{% url 'package_built_detail' build.id package.id %}">
8 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Shows the files produced by this package."></i>
9 Generated files ({{package.buildfilelist_package.count}})
10 </a>
11 </li>
12 <li class="active">
13 <a href="{% url 'package_built_dependencies' build.id package.id %}">
14 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Shows the runtime packages required by this package."></i>
15 Runtime dependencies ({{dependency_count}})
16 </a>
17 </li>
18 </ul>
19 <div class="tab-content">
20 <div class="tab-pane active" id="dependencies">
21 {% ifequal runtime_deps|length 0 %}
22 <div class="alert alert-info">
23 <strong>{{package.fullpackagespec}}</strong> has no runtime dependencies.
24 </div>
25 {% else %}
26 <div class="alert alert-info">
27 <strong>{{package.fullpackagespec}}</strong> is <strong>not included</strong> in any image. This page shows you the projected runtime dependencies if you include <strong>{{package.fullpackagespec}}</strong> in future builds.
28 </div>
29 <table class="table table-bordered table-hover">
30 <thead>
31 <tr>
32 <th>Package</th>
33 <th>Version</th>
34 <th class="sizecol span2">Size</th>
35 </tr>
36 </thead>
37 <tbody>
38 {% for runtime_dep in runtime_deps %}
39 <tr {{runtime_dep.size|format_vpackage_rowclass}} >
40 {% if runtime_dep.size != -1 %}
41 <td>
42 <a href="{% url 'package_built_detail' build.id runtime_dep.depends_on_id %}">
43 {{runtime_dep.name}}
44 </a>
45 </td>
46 {% else %}
47 <td>
48 {{runtime_dep.name|format_vpackage_namehelp}}
49 </td>
50 {% endif %}
51 <td>{{runtime_dep.version}}</td>
52 <td class="sizecol">{{runtime_dep.size|filtered_filesizeformat}}</td>
53 </tr>
54 {% endfor %}
55 </tbody>
56 </table>
57 {% endifequal %}
58 {% ifnotequal other_deps|length 0 %}
59 <h3>Other runtime relationships</h3>
60 <table class="table table-bordered table-hover">
61 <thead>
62 <tr>
63 <th>Package</th>
64 <th>Version</th>
65 <th class="sizecol span2">Size</th>
66 <th>
67 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
68 Relationship type
69 </th>
70 </tr>
71 </thead>
72 <tbody>
73 {% for other_dep in other_deps %}
74 <tr {{other_dep.size|format_vpackage_rowclass}} >
75 {% if other_dep.size != -1 %}
76 <td>
77 <a href="{% url 'package_built_detail' build.id other_dep.depends_on_id %}">
78 {{other_dep.name}}
79 </a>
80 </td>
81 {% else %}
82 <td>
83 {{other_dep.name|format_vpackage_namehelp}}
84 </td>
85 {% endif %}
86 <td>{{other_dep.version}}</td>
87 <td class="sizecol">{{other_dep.size|filtered_filesizeformat}}</td>
88 <td>
89 {{other_dep.dep_type_display}}
90 <i class="icon-question-sign get-help hover-help" title="{{other_dep.dep_type_help}}" ></i>
91 </td>
92 </tr>
93 {% endfor %}
94 </tbody>
95 </table>
96 {% endifnotequal %}
97 </div> <!-- tab-pane -->
98 </div> <!-- tab-content -->
99{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_built_detail.html b/bitbake/lib/toaster/toastergui/templates/package_built_detail.html
new file mode 100644
index 0000000000..0fe01165da
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_built_detail.html
@@ -0,0 +1,65 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block tabcontent %}
5 {% with packageFileCount=package.buildfilelist_package.count %}
6 <!-- Generated Files -->
7 {% if package.buildtargetlist_package.count == 0 %}
8 {# Not included case #}
9 <ul class="nav nav-pills">
10 <li class="active"> <a href="#">
11 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Files added to a root file system when you include {{package.name}} in an image"></i>
12 Generated files ({{packageFileCount}})
13 </a></li>
14 <li class=""><a href="{% url 'package_built_dependencies' build.id package.id %}">
15 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Projected runtime dependencies when you include {{package.name}} in an image"></i>
16 Runtime dependencies ({{dependency_count}})
17 </a></li>
18 </ul>
19 <div class="tab-content">
20 <div class="tab-pane active" id="files">
21 <!-- Package file list or if empty, alert pane -->
22 {% if packageFileCount > 0 %}
23 <div class="alert alert-info">
24 <strong>{{package.fullpackagespec}}</strong> is <strong>not included</strong> in any image. This page shows you the files added to an image root file system if you include <strong>{{package.fullpackagespec}}</strong> in future builds.
25 </div>
26 {% include "tablesort.html" %}
27 <tbody>
28 {% for file in objects %}
29 <tr>
30 <td class="path">{{file.path}}</td>
31 <td class="filesize sizecol">{{file.size|filtered_filesizeformat}}</td>
32 </tr>
33 {% endfor %}
34 </tbody>
35 </table>
36
37 {% else %}
38 <div class="alert alert-info">
39 <strong>{{package.fullpackagespec}}</strong> does not generate any files.
40 </div>
41 {% endif %}
42
43 </div> <!-- tab-pane active -->
44 </div> <!-- tab-content -->
45 {% else %}
46 {# Included case #}
47 <div class="tab-content">
48 <div class="tab-pane active">
49 <div class="lead well">
50 Package included in:
51 {% for itarget in package.buildtargetlist_package.all|dictsort:"target.target" %}
52 <a href="{% url 'package_included_detail' build.id itarget.target.id package.id %}">
53 {% if forloop.counter0 > 0 %}
54 ,&nbsp;
55 {% endif %}
56 {{itarget.target.target}}
57 </a>
58 {% endfor %}
59 </div>
60 </div> <!-- tab-pane active -->
61 </div> <!-- tab-content -->
62 {% endif %}
63
64 {% endwith %}
65{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
new file mode 100644
index 0000000000..5888513486
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
@@ -0,0 +1,145 @@
1{% extends "basebuilddetailpage.html" %}
2{% load projecttags %}
3
4{% block extraheadcontent %}
5 <!-- functions to format package 'installed_package' alias -->
6 <script>
7 function fmtAliasHelp(package_name, alias, hover) {
8 var r = null;
9 if (alias != null && alias != '') {
10 r = '<span class="muted"> as ' + alias + '&nbsp';
11 r += '<i class="icon-question-sign get-help';
12 if (hover) {
13 r+= ' hover-help';
14 }
15 else {
16 r+= ' heading-help';
17 }
18 r += '"';
19 title = package_name + ' was renamed at packaging time and was installed on your system as ' + alias;
20 r += ' title="' + title + '">';
21 r += '</i>';
22 r += '</span>';
23 document.write(r);
24 }
25 }
26 </script>
27{% endblock extraheadcontent %}
28{% block localbreadcrumb %}
29 {% if target %}
30 <li><a href="{% url "target" build.id target.id %}">{{target.target}}</a></li>
31 <li>{{package.fullpackagespec}} {% if package.alias %} as {{package.alias}}{% endif %}</li>
32 {% else %}
33 <li><a href="{% url "packages" build.id %}"> Packages </a></li>
34 <li>{{package.fullpackagespec}}</li>
35 {% endif %}
36{% endblock localbreadcrumb %}
37
38{% block pagedetailinfomain %}
39 <div class="row span11">
40 <div class="page-header">
41 {% block title %}
42 <h1>{{package.fullpackagespec}}</h1>
43 {% endblock title %}
44 </div> <!-- page-header -->
45 </div> <!-- row span11 page-header -->
46
47 {% block twocolumns %}
48 <div class="row span7 tabbable">
49 {% block tabcontent %}
50 {% endblock tabcontent %}
51 </div> <!-- row span7 -->
52
53 <div class="row span4 well">
54 <h2>Package information</h2>
55
56 <!-- info presented as definition list -->
57 <dl>
58 <dt>
59 Size
60 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The size of the package"></i>
61 </dt>
62 <dd>
63 {% comment %}
64 if recipe is absent, filesize is not 0
65 {% endcomment %}
66 {% if package.recipe_id > 0 %}
67 {{package.size|filtered_filesizeformat}}
68 {% if target.file_size %}
69 ({{package.size|multiply:100|divide:target.file_size}}% of included package size)
70 {% endif %}
71
72 {% endif %}
73 </dd>
74
75 <dt>
76 License
77 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The license under which this package is distributed"></i>
78 </dt>
79 <dd>{{package.license}}</dd>
80
81 {% comment %}
82 # Removed per review on 1/18/2014 until license data population
83 # problemse are resolved.
84 <dt>
85 License files
86 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Path to the license files that apply to the package"></i>
87 </dt>
88 <dd></dd>
89 {% endcomment %}
90
91 <dt>
92 Recipe
93 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The name of the recipe building this package"></i>
94 </dt>
95 <dd>
96 {% if package.recipe_id > 0 %}
97 <a href="{% url "recipe" build.id package.recipe_id %}"> {{package.recipe.name}} </a>
98 {% else %}
99 {{package.recipe.name}}
100 {% endif %}
101 </dd>
102
103 <dt>
104 Recipe version
105 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The version of the recipe building this package"></i>
106 </dt>
107 <dd>{{package.recipe.version}}</dd>
108
109 <dt>
110 Layer
111 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The name of the layer providing the recipe that builds this package"></i>
112 </dt>
113 <dd>
114 {{package.recipe.layer_version.layer.name}}
115 {% if package.recipe.layer_version.layer.name|format_none_and_zero != "" %}
116 {% comment %}
117 # Removed per team meeting of 1/29/2014 until
118 # decision on index search algorithm
119 <a href="http://layers.openembedded.org" target="_blank">
120 <i class="icon-share get-info"></i>
121 </a>
122 {% endcomment %}
123 {% endif %}
124 </dd>
125
126 <dt>
127 Layer branch
128 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git branch of the layer providing the recipe that builds this package"></i>
129 </dt>
130 <dd>{{package.recipe.layer_version.branch}}</dd>
131 <dt>
132 Layer commit
133 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git commit of the layer providing the recipe that builds this package"></i>
134 </dt>
135
136 <dd class="iscommit">{{package.recipe.layer_version.commit}}</dd>
137 <dt>
138 Layer directory
139 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Path to the layer providing the recipe that builds this package"></i>
140 </dt>
141 <dd><code>{{package.recipe.layer_version.layer.local_path}}</code></dd>
142 </dl>
143 </div> <!-- row4 well -->
144 {% endblock twocolumns %}
145{% endblock pagedetailinfomain %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
new file mode 100644
index 0000000000..642ca69568
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
@@ -0,0 +1,110 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block title %}
5 <h1>
6 {{package.fullpackagespec}}
7 <script> fmtAliasHelp("{{package.name}}", "{{package.alias}}", false) </script>
8 <small>({{target.target}})</small>
9 </h1>
10{% endblock title %}
11
12{% block tabcontent %}
13 {% with packageFileCount=package.buildfilelist_package.count %}
14 {% include "package_included_tabs.html" with active_tab="dependencies" %}
15 <div class="tab-content">
16 <div class="tab-pane active" id="dependencies">
17 {% ifnotequal runtime_deps|length 0 %}
18 <table class="table table-bordered table-hover">
19 <thead>
20 <tr>
21 <th>Package</th>
22 <th>Version</th>
23 <th class='sizecol span2'>Size</th>
24 </tr>
25 </thead>
26 <tbody>
27 {% for runtime_dep in runtime_deps %}
28 <tr {{runtime_dep.size|format_vpackage_rowclass}} >
29 {% if runtime_dep.size != -1 %}
30 <td>
31 <a href="{% url 'package_included_detail' build.id target.id runtime_dep.depends_on_id %}">
32 {{runtime_dep.name}}
33 </a>
34 <script>fmtAliasHelp("{{runtime_dep.name}}", "{{runtime_dep.alias}}", true)</script>
35 </td>
36 {% else %}
37 <td>
38 {{runtime_dep.name|format_vpackage_namehelp}}
39 </td>
40 {% endif %}
41 <td>{{runtime_dep.version}}&nbsp;</td>
42 <td class='sizecol'>{{runtime_dep.size|filtered_filesizeformat}}&nbsp;</td>
43 </tr>
44 {% endfor %}
45 </tbody>
46 </table>
47 {% else %}
48 <div class="alert alert-info">
49 <strong>{{package.fullpackagespec}}</strong> has no runtime dependencies.
50 </div>
51 {% endifnotequal %}
52
53 {% ifnotequal other_deps|length 0 %}
54 <h3>Other runtime relationships</h3>
55 <table class="table table-bordered table-hover">
56 <thead>
57 <tr>
58 <th>Package</th>
59 <th>Version</th>
60 <th class='sizecol span2'>Size</th>
61 <th>
62 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
63 Relationship type
64 </th>
65 </tr>
66 </thead>
67 <tbody>
68 {% for other_dep in other_deps %}
69 {% if other_dep.installed %}
70 <tr {{other_dep.size|format_vpackage_rowclass}}>
71 {% if other_dep.size != -1 %}
72 <td>
73 <a href="{% url 'package_included_detail' build.id target.id other_dep.depends_on_id %}">
74 {{other_dep.name}}
75 <script>
76 fmtAliasHelp("{{other_dep.name}}","{{other_dep.alias}}", true)
77 </script>
78 </a>
79 </td>
80 {% else %}
81 <td>
82 {{other_dep.name|format_vpackage_namehelp}}
83 </td>
84 {% endif %}
85 <td>{{other_dep.version}}&nbsp;</td>
86 <td class='sizecol'>{{other_dep.size|filtered_filesizeformat}}&nbsp;</td>
87 <td>
88 {{other_dep.dep_type_display}}
89 <i class="icon-question-sign get-help hover-help" title="{{other_dep.dep_type_help}}" ></i>
90 </td>
91 </tr>
92 {% else %}
93 <tr class="muted">
94 <td>{{other_dep.name}}</td>
95 <td>{{other_dep.version}}</td>
96 <td></td>
97 <td>
98 {{other_dep.dep_type_display}}
99 <i class="icon-question-sign get-help hover-help" title="{{other_dep.dep_type_help}}" ></i>
100 </td>
101 </tr>
102 {% endif %}
103 {% endfor %}
104 </tbody>
105 </table>
106 {% endifnotequal %}
107 </div> <!-- end tab-pane -->
108 </div> <!-- end tab content -->
109 {% endwith %}
110{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_detail.html b/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
new file mode 100644
index 0000000000..d2aa26eefa
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
@@ -0,0 +1,44 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block title %}
5 <h1>
6 {{package.fullpackagespec}}
7 <script>
8 fmtAliasHelp("{{package.name}}", "{{package.alias}}", false)
9 </script>
10 <small>({{target.target}})</small>
11 </h1>
12{% endblock title %}
13
14{% block tabcontent %}
15{% with packageFileCount=package.buildfilelist_package.count %}
16 {% include "package_included_tabs.html" with active_tab="detail" %}
17 <div class="tab-content">
18 <div class="tab-pane active" id="files">
19 {% if packageFileCount > 0 %}
20 {% include "tablesort.html" %}
21 <tbody>
22 {% for file in objects %}
23 <tr>
24 <td class="path">
25 <a href="{% url 'dirinfo_filepath' build.id target.id file.path %}">
26 {{file.path}}
27 </a>
28 </td>
29 <td class="filesize sizecol" >{{file.size|filtered_filesizeformat}}</td>
30 </tr>
31 {% endfor %}
32 </tbody>
33 </table>
34
35 {% else %}
36 <div class="alert alert-info">
37 <strong>{{package.fullpackagespec}}</strong> does not generate any files.
38 </div>
39 {% endif %}
40 </div> <!-- end tab-pane -->
41 </div> <!-- end tab content -->
42
43{% endwith %}
44{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
new file mode 100644
index 0000000000..a36464cad5
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
@@ -0,0 +1,50 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block title %}
5 <h1>
6 {{package.fullpackagespec}}
7 <script> fmtAliasHelp("{{package.name}}", "{{package.alias}}", false) </script>
8 <small>({{target.target}})</small>
9 </h1>
10{% endblock title %}
11
12{% block tabcontent %}
13 {% with packageFileCount=package.buildfilelist_package.count %}
14 {% include "package_included_tabs.html" with active_tab="reverse" %}
15 <div class="tab-content">
16 <div class="tab-pane active" id="brought-in-by">
17
18 {% ifequal reverse_deps|length 0 %}
19 <div class="alert alert-info">
20 <strong>{{package.fullpackagespec}}</strong> has no reverse runtime dependencies.
21 </div>
22 {% else %}
23 {% include "tablesort.html" %}
24 <tbody>
25 {% for reverse_dep in objects %}
26 <tr {{reverse_dep.size|format_vpackage_rowclass}} >
27 {% if reverse_dep.size != -1 %}
28 <td>
29 <a href="{% url 'package_included_detail' build.id target.id reverse_dep.package_id %}">
30 {{reverse_dep.package.name}}
31 </a>
32 <script>fmtAliasHelp("{{reverse_dep.name}}", "{{reverse_dep.alias}}", true)</script>
33 </td>
34 {% else %}
35 <td>
36 {{reverse_dep.name|format_vpackage_namehelp}}
37 </td>
38 {% endif %}
39
40 <td>{{reverse_dep.package.version}}&nbsp;</td>
41 <td class='sizecol'>{{reverse_dep.package.size|filtered_filesizeformat}}&nbsp;</td>
42 </tr>
43 {% endfor %}
44 </tbody>
45 </table>
46 {% endifequal %}
47 </div> <!-- end tab-pane -->
48 </div> <!-- end tab content -->
49 {% endwith %}
50{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_tabs.html b/bitbake/lib/toaster/toastergui/templates/package_included_tabs.html
new file mode 100644
index 0000000000..0140b03c05
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_tabs.html
@@ -0,0 +1,33 @@
1
2 <ul class="nav nav-pills">
3 {% if active_tab == "detail" %}
4 <li class="active">
5 {% else %}
6 <li class="">
7 {% endif %}
8 <a href="{% url 'package_included_detail' build.id target.id package.id %}">
9 <i class="icon-question-sign get-help" title="The files this package adds to the image root file system"></i>
10 Files in root file system ({{packageFileCount}})
11 </a>
12 </li>
13 {% if active_tab == "dependencies" %}
14 <li class="active">
15 {% else %}
16 <li class="">
17 {% endif %}
18 <a href="{% url 'package_included_dependencies' build.id target.id package.id %}">
19 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Package runtime dependencies"></i>
20 Runtime dependencies ({{dependency_count}})
21 </a>
22 </li>
23 {% if active_tab == "reverse" %}
24 <li class="active">
25 {% else %}
26 <li class="">
27 {% endif %}
28 <a href="{% url 'package_included_reverse_dependencies' build.id target.id package.id %}">
29 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The package runtime reverse dependencies (i.e. the packages in this image that depend on this package). Reverse dependencies reflect only the 'depends' dependency type"></i>
30 Reverse runtime dependencies ({{reverse_count}})
31 </a>
32 </li>
33 </ul>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
new file mode 100644
index 0000000000..6e9cd23424
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -0,0 +1,273 @@
1{% extends "basebuilddetailpage.html" %}
2
3{% load projecttags %}
4
5{% block localbreadcrumb %}
6<li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
7<li>{{object.name}}_{{object.version}} </li>
8{% endblock %}
9
10{% block pagedetailinfomain %}
11
12<!-- Begin container -->
13
14<div class="row span11">
15 <div class="page-header">
16 <h1>{{object.name}}_{{object.version}}</h1>
17 </div>
18</div>
19
20<div class="row span7 tabbable">
21 <ul class="nav nav-pills">
22 <li class="active">
23 <a href="#information" data-toggle="tab">
24 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Build-related information about the recipe"></i>
25 Recipe details
26 </a>
27 </li>
28 <li>
29 <a href="#packages-built" data-toggle="tab">
30 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The packaged output resulting from building the recipe"></i>
31 Packages ({{packages.count}})
32 </a>
33 </li>
34 <li>
35 <a href="#dependencies" data-toggle="tab">
36 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The recipe build-time dependencies (i.e. other recipes)"></i>
37 Build dependencies ({{object.r_dependencies_recipe.all.count}})
38 </a>
39 </li>
40 <li>
41 <a href="#brought-in-by" data-toggle="tab">
42 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The recipe build-time reverse dependencies (i.e. the recipes that depend on this recipe)"></i>
43 Reverse build dependencies ({{object.r_dependencies_depends.all.count}})
44 </a>
45 </li>
46 </ul>
47 <div class="tab-content">
48 <div class="tab-pane active" id="information" name="information">
49 <dl class="dl-horizontal">
50 <dt>
51 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The name of the layer providing the recipe"></i>
52 Layer
53 </dt>
54 <dd>{{layer.name}}</dd>
55 <dt>
56 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Path to the layer providing the recipe"></i>
57 Layer directory
58 </dt>
59 <dd><code>{{layer.local_path}}</code></dd>
60 <dt>
61 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Path to the recipe .bb file"></i>
62 Recipe file
63 </dt>
64 <dd><code>{{object.file_path}}</code></dd>
65 <dt>
66 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git branch of the layer providing the recipe"></i>
67 Layer branch
68 </dt>
69 <dd>{{layer_version.branch}}</dd>
70 <dt>
71 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git commit of the layer providing the recipe"></i>
72 Layer commit
73 </dt>
74 <dd class="iscommit">{{layer_version.commit}}</dd>
75 </dl>
76
77 <h2 class="details">Tasks</h2>
78 {% if not tasks %}
79 <div class="alert alert-info">
80 <strong>{{object.name}}_{{object.version}}</strong> does not have any tasks in this build.
81 </div>
82 {% else %}
83 <table class="table table-bordered table-hover">
84 <thead>
85 <th>
86 <i class="icon-question-sign get-help" title="The running sequence of each task in the build"></i>
87 Order
88 </th>
89 <th>
90 <i class="icon-question-sign get-help" title="The name of the task"></i>
91 Task
92 </th>
93 <th>
94 <i class="icon-question-sign get-help" title="This value tells you if a task had to run (executed) in order to generate the task output, or if the output was provided by another task and therefore the task didn't need to run (not executed)"></i>
95 Executed
96 </th>
97 <th>
98 <i class="icon-question-sign get-help" title="This column tells you if 'executed' tasks succeeded or failed. The column also tells you why 'not executed' tasks did not need to run"></i>
99 Outcome
100 </th>
101 <th>
102 <i class="icon-question-sign get-help" title="This column tells you if a task tried to restore output from the <code>sstate-cache</code> directory or mirrors, and reports the result: Succeeded, Failed or File not in cache"></i>
103 Cache attempt
104 </th>
105 </thead>
106 <tbody>
107
108 {% for task in tasks %}
109
110 <tr {{ task|task_color }} >
111
112 <td><a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.order}}</a></td>
113 <td>
114 <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.task_name}}</a>
115 {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="" data-original-title="{{task.get_description}}"></i> {% endif %}
116 </td>
117
118 <td><a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_executed_display}}</a></td>
119
120 <td>
121 <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_outcome_display}} </a>
122 <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
123 </td>
124 <td>
125 {% ifnotequal task.sstate_result task.SSTATE_NA %}
126 <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_sstate_result_display}}</a>
127 {% endifnotequal %}
128 </td>
129
130 </tr>
131
132 {% endfor %}
133 </tbody>
134 </table>
135 {% endif %}
136 </div>
137 <div class="tab-pane" id="packages-built" name="packages-built">
138 {% if not packages %}
139 <div class="alert alert-info">
140 <strong>{{object.name}}_{{object.version}}</strong> does not build any packages.
141 </div>
142 {% else %}
143 <table class="table table-bordered table-hover" style="margin-top:10px;">
144 <thead>
145 <tr>
146 <th>
147 Package
148 </th>
149 <th>
150 Version
151 </th>
152 <th class="sizecol span2">
153 Size
154 </th>
155 </tr>
156 </thead>
157 <tbody>
158
159 {% for package in packages|dictsort:"name" %}
160
161 <tr>
162 <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.name}}</a></td>
163 <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.version}}_{{package.revision}}</a></td>
164 <td class="sizecol"><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.size|filtered_filesizeformat}}</a></td>
165 </tr>
166
167 {% endfor %}
168
169 </tbody>
170 </table>
171 {% endif %}
172 </div>
173 <div class="tab-pane" id="dependencies" name="dependencies">
174
175 {% if not object.r_dependencies_recipe.all %}
176 <div class="alert alert-info">
177 <strong>{{object.name}}_{{object.version}}</strong> has no build dependencies.
178 </div>
179 {% else %}
180 <table class="table table-bordered table-hover">
181 <thead>
182 <tr>
183 <th>
184 Recipe
185 </th>
186 <th>
187 Version
188 </th>
189 </tr>
190 </thead>
191 <tbody>
192
193 {% for rr in object.r_dependencies_recipe.all|dictsort:"depends_on.name" %}
194 <tr>
195 <td><a href="{% url "recipe" build.pk rr.depends_on.pk %}">{{rr.depends_on.name}}</a></td>
196 <td><a href="{% url "recipe" build.pk rr.depends_on.pk %}">{{rr.depends_on.version}}</a></td>
197 </tr>
198 {% endfor %}
199
200 </tbody>
201 </table>
202 {% endif %}
203
204 </div>
205 <div class="tab-pane" id="brought-in-by" name="brought-in-by">
206
207 {% if not object.r_dependencies_depends.all %}
208 <div class="alert alert-info">
209 <strong>{{object.name}}_{{object.version}}</strong> has no reverse build dependencies.
210 </div>
211 {% else %}
212 <table class="table table-bordered table-hover">
213 <thead>
214 <tr>
215 <th>
216 Recipe
217 </th>
218 <th>
219 Version
220 </th>
221 </tr>
222 </thead>
223 <tbody>
224
225 {% for rr in object.r_dependencies_depends.all|dictsort:"recipe.name" %}
226 <tr>
227 <td><a href="{% url "recipe" build.pk rr.recipe.pk %}">{{rr.recipe.name}}</a></td>
228 <td><a href="{% url "recipe" build.pk rr.recipe.pk %}">{{rr.recipe.version}}</a></td>
229 </tr>
230 {% endfor %}
231
232 </tbody>
233 </table>
234 {% endif %}
235
236 </div>
237 </div>
238</div>
239
240<div class="row span4 well">
241 <h2>About {{object.name}}</h2>
242 <dl>
243 {% if object.summary %}
244 <dt>Summary</dt>
245 <dd><p>{{object.summary}}</p></dd>
246 {% endif %}
247 {% if object.description %}
248 <dt>Description</dt>
249 <dd><p>{{object.description}}</dd>
250 {% endif %}
251 {% if object.homepage %}
252 <dt>Homepage</dt>
253 <dd><a href="{{object.homepage}}">{{object.homepage}}</a></dd>
254 {% endif %}
255 {% if object.bugtracker %}
256 <dt>Bugtracker</dt>
257 <dd><a href="{{object.bugtracker}}">{{object.bugtracker}}</a></dd>
258 {% endif %}
259 {% if object.section %}
260 <dt>
261 Section
262 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The section in which recipes should be categorized"></i>
263 </dt>
264 <dd>{{object.section}}</dd>
265 {% endif %}
266 {% if object.license %}
267 <dt>License</dt>
268 <dd>{{object.license}}</dd>
269 {% endif %}
270 </dl>
271</div>
272
273{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
new file mode 100755
index 0000000000..907b83d269
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -0,0 +1,102 @@
1{% extends "basebuildpage.html" %}
2
3{% load projecttags %}
4
5{% block localbreadcrumb %}
6<li>Recipes</li>
7{% endblock %}
8
9{% block nav-recipes %}
10 <li class="active"><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
11{% endblock %}
12
13{% block buildinfomain %}
14<div class="span10">
15<div class="page-header">
16<h1>
17 {% if request.GET.search and objects.paginator.count > 0 %}
18 {{objects.paginator.count}} recipe{{objects.paginator.count|pluralize}} found
19 {%elif request.GET.search and objects.paginator.count == 0%}
20 No recipes found
21 {%else%}
22 Recipes
23 {%endif%}
24 </h1>
25</div>
26
27{% if objects.paginator.count == 0 %}
28 <div class="row-fluid">
29 <div class="alert">
30 <form class="no-results input-append" id="searchform">
31 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
32 <button class="btn" type="submit" value="Search">Search</button>
33 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
34 </form>
35 </div>
36 </div>
37
38{% else %}
39{% include "basetable_top.html" %}
40
41 {% for recipe in objects %}
42
43 <tr class="data">
44 <td><a href="{% url "recipe" build.pk recipe.pk %}">{{recipe.name}}</a></td>
45 <td><a href="{% url "recipe" build.pk recipe.pk %}">{{recipe.version}}</a></td>
46 <!-- Depends -->
47 <td class="depends_on">
48 {% if recipe.r_dependencies_recipe.all.count %}
49 <a class="btn"
50 title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies"
51 data-content="<ul class='unstyled'>
52 {% for i in recipe.r_dependencies_recipe.all|dictsort:"depends_on.name"%}
53 <li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
54 {% endfor %}
55 </ul>">
56 {{recipe.r_dependencies_recipe.all.count}}
57 </a>
58 {% endif %}
59 </td>
60 <!-- Brought in by -->
61 <td class="depends_by">
62 {% if recipe.r_dependencies_depends.all.count %}
63 <a class="btn"
64 title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies"
65 data-content="<ul class='unstyled'>
66 {% for i in recipe.r_dependencies_depends.all|dictsort:"recipe.name"%}
67 <li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li>
68 {% endfor %}
69 </ul>">
70 {{recipe.r_dependencies_depends.all.count}}
71 </a>
72 {% endif %}
73 </td>
74 <!-- Recipe file -->
75 <td class="recipe_file">{{recipe.file_path}}</td>
76 <!-- Section -->
77 <td class="recipe_section">{{recipe.section}}</td>
78 <!-- License -->
79 <td class="recipe_license">{{recipe.license}}</td>
80 <!-- Layer -->
81 <td class="layer_version__layer__name">{{recipe.layer_version.layer.name}}</td>
82 <!-- Layer branch -->
83 <td class="layer_version__branch">{{recipe.layer_version.branch}}</td>
84 <!-- Layer commit -->
85 <td class="layer_version__layer__commit">
86 <a class="btn"
87 data-content="<ul class='unstyled'>
88 <li>{{recipe.layer_version.commit}}</li>
89 </ul>">
90 {{recipe.layer_version.commit|truncatechars:13}}
91 </a>
92 </td>
93 <!-- Layer directory -->
94 <td class="layer_version__layer__local_path">{{recipe.layer_version.layer.local_path}}</td>
95 </tr>
96
97 {% endfor %}
98
99{% include "basetable_bottom.html" %}
100{% endif %}
101</div>
102{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/tablesort.html b/bitbake/lib/toaster/toastergui/templates/tablesort.html
new file mode 100644
index 0000000000..bf311b6edd
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/tablesort.html
@@ -0,0 +1,38 @@
1{% load projecttags %}
2<!-- component to display a generic table -->
3 {% if disable_sort %}
4 <table class="table table-bordered table-hover" id="detail_table">
5 <thead>
6 <tr>
7 {% for tc in tablecols %}
8 <th class="{{tc.dclass}} {{tc.clclass}}">
9 {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%}
10 {{tc.name}}
11 </th>
12 {% endfor %}
13 </tr>
14 </thead>
15 {% else %}
16 <table class="table table-bordered table-hover tablesorter" id="otable">
17 <thead>
18 <!-- Table header row; generated from "tablecols" entry in the context dict -->
19 <tr>
20 {% for tc in tablecols %}
21 <th class="{{tc.dclass}} {{tc.clclass}}">
22 {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%}
23 {%if tc.orderfield%}
24 <a {%if tc.ordericon%} class="sorted" {%endif%}
25 href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })" >
26 {{tc.name}}
27 </a>
28 {%else%}
29 <span class="muted">
30 {{tc.name}}
31 </span>
32 {%endif%}
33 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
34 </th>
35 {% endfor %}
36 </tr>
37 </thead>
38 {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
new file mode 100644
index 0000000000..3a0c4d7998
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -0,0 +1,163 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>{{target.target}}</li>
4{% endblock localbreadcrumb%}
5
6{% load projecttags %}
7
8{% block nav-target %}
9 {% for t in build.get_sorted_target_list %}
10 {% ifequal target.pk t.pk %}
11 <li class="active"><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
12 {% else %}
13 <li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
14 {% endifequal %}
15 {% endfor %}
16{% endblock %}
17
18{% block buildinfomain %}
19
20<div class="row-fluid span10">
21 <div class="page-header">
22 <h1>
23 {% if request.GET.search and objects.paginator.count > 0 %}
24 {{objects.paginator.count}} package{{objects.paginator.count|pluralize}} found
25 {% elif request.GET.search and objects.paginator.count == 0 %}
26 No packages found
27 {% else %}
28 {{target.target}}
29 {% endif %}
30 </h1>
31 </div>
32</div>
33
34<div class="row-fluid pull-right span10" id="navTab">
35 <ul class="nav nav-pills">
36 <li class="active">
37 <a href="#target">
38 <i class="icon-question-sign get-help" data-toggle="tooltip" title="Of all the packages built, the subset installed in the root file system of this image"></i>
39 Packages included ({{target.package_count}} - {{packages_sum|filtered_filesizeformat}})
40 </a>
41 </li>
42 <li>
43 <a href="{% url 'dirinfo' build.id target.id %}">
44 <i class="icon-question-sign get-help" data-toggle="tooltip" title="The directories and files in the root file system of this image"></i>
45 Directory structure
46 </a>
47 </li>
48 </ul>
49
50 <div id="image-packages" class="tab-pane">
51
52 {% if objects.paginator.count == 0 %}
53 <div class="row-fluid">
54 <div class="alert">
55 <form class="no-results input-append" id="searchform">
56 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
57 <button class="btn" type="submit" value="Search">Search</button>
58 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
59 </form>
60 </div>
61 </div>
62
63
64 {% else %}
65 {% include "basetable_top.html" %}
66 {% for package in objects %}
67 <tr>
68 <td class="package_name">
69 <a href="{% url 'package_included_detail' build.id target.id package.id %}">
70 {{package.name}}
71 </a>
72 {% if package.installed_name and package.name != package.installed_name %}
73 <span class="muted"> as {{package.installed_name}}</span>
74 <i class="icon-question-sign get-help hover-help" title='{{package.name|add:" was renamed at packaging time and was installed in your image as "|add:package.installed_name}}'></i>
75 {% endif %}
76 </td>
77 <td class="package_version">
78 <a href="{% url 'package_included_detail' build.id target.id package.id %}">
79 {{package.version|filtered_packageversion:package.revision}}
80 </a>
81 </td>
82 <td class="package-size sizecol">
83 {{package.size|filtered_installedsize:package.installed_size|filtered_filesizeformat}}
84 </td>
85 <td class="size_over_total sizecol">
86 {{package|filter_sizeovertotal:packages_sum}}
87 </td>
88 <td class="license">
89 {{package.license}}
90 </td>
91 <td class="depends">
92 {% with deps=package.runtime_dependencies %}
93 {% with deps_count=deps|length %}
94 {% if deps_count > 0 %}
95 <a class="btn"
96 title="<a href='{% url "package_included_dependencies" build.id target.id package.id %}'>{{package.name}}</a> dependencies"
97 data-content="<ul class='unstyled'>
98 {% for i in deps|dictsort:'depends_on.name' %}
99 <li><a href='{% url "package_included_detail" build.pk target.id i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
100 {% endfor %}
101 </ul>">
102 {{deps_count}}
103 </a>
104 {% endif %}
105 {% endwith %}
106 {% endwith %}
107 </td>
108 <td class="brought_in_by">
109 {% with rdeps=package.reverse_runtime_dependencies %}
110 {% with rdeps_count=rdeps|length %}
111 {% if rdeps_count > 0 %}
112 <a class="btn"
113 title="<a href='{% url "package_included_reverse_dependencies" build.id target.id package.id %}'>{{package.name}}</a> reverse dependencies"
114 data-content="<ul class='unstyled'>
115 {% for i in rdeps|dictsort:'package.name' %}
116 <li><a href='{% url "package_included_detail" build.id target.id i.package.id %}'>{{i.package.name}}</a></li>
117 {% endfor %}
118 </ul>">
119 {{rdeps_count}}
120 </a>
121 {% endif %}
122 {% endwith %}
123 {% endwith %}
124 </td>
125 <td class="recipe_name">
126 {% if package.recipe.version %}
127 <a href="{% url 'recipe' build.id package.recipe_id %}">
128 {{ package.recipe.name }}
129 </a>
130 {% endif %}
131 </td>
132 <td class="recipe_version">
133 {% if package.recipe.version %}
134 <a href="{% url 'recipe' build.id package.recipe_id %}">
135 {{ package.recipe.version }}
136 </a>
137 {% endif %}
138 </td>
139 <td class="layer_name">
140 {{ package.recipe.layer_version.layer.name }}
141 </td>
142 <td class="layer_branch">
143 {{ package.recipe.layer_version.branch}}
144 </td>
145 <td class="layer_commit">
146 <a class="btn"
147 data-content="<ul class='unstyled'>
148 <li>{{package.recipe.layer_version.commit}}</li>
149 </ul>">
150 {{package.recipe.layer_version.commit|truncatechars:13}}
151 </a>
152 </td>
153 <td class="layer_directory">
154 {{ package.recipe.layer_version.layer.local_path }}
155 </td>
156 </tr>
157 {% endfor %}
158
159 {% include "basetable_bottom.html" %}
160 {% endif %}
161 </div> <!-- tabpane -->
162</div> <!--span 10-->
163{% endblock buildinfomain %}
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
new file mode 100644
index 0000000000..455599932c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -0,0 +1,283 @@
1{% extends "basebuilddetailpage.html" %}
2
3{% load projecttags %}
4{% load humanize %}
5
6{% block localbreadcrumb %}
7<li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
8<li>{{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}}</li>
9{% endblock %}
10
11{% block pagedetailinfomain %}
12
13<div class="row span11">
14 <div class="page-header">
15 <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1>
16 </div>
17
18{# Outcome section #}
19<h2 {{ task|task_color:True }}>
20 {{task.get_outcome_display}}
21 <i class="icon-question-sign get-help heading-help" title="{{task.get_outcome_help}}"></i>
22</h2>
23{%if task.task_executed %}
24 {# executed tasks outcome #}
25 <dl class="dl-horizontal">
26 {% if task.logfile %}
27 <dt>
28 <i class="icon-question-sign get-help" title="Path the task log file"></i> Log file
29 </dt>
30 <dd>
31 <code>{{task.logfile}}</code>
32 </dd>
33 {% endif %}
34 {# show stack trace for failed task #}
35 {% if task.outcome == task.OUTCOME_FAILED and log_head %}
36 <h3>Python stack trace</h3>
37 <div>
38 <pre style="min-height:160px;">
39 <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-mini">...</a>
40 <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;">
41 <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-mini collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre>
42 </div>
43 {% endif %}
44 </dl>
45{% else %}
46{# not executed tasks outcome #}
47 {% if task.outcome == task.OUTCOME_PREBUILT %}
48 {% if not showing_matches %}
49 <a class="btn" href="javascript:reload_params({'show_matches' : 'true' })">Match to tasks in previous builds <i class="icon-question-sign get-help" style="margin-top:20px;" data-toggle="tooltip" title="This shows you a list of tasks from previous builds with the same signature generated from the same inputs as used in the prebuilt task. Any of them could be the task that generated the output this prebuilt task is reusing"></i></a>
50 {% elif matching_tasks %}
51 <h3 class="details">Prebuilt task could be based on
52 <i class="icon-question-sign get-help heading-help" title="This table shows a list of tasks from previous builds with the same signature generated from the same inputs as used in the prebuilt task. Any of them could be the task that generated the output this prebuilt task is reusing"></i>
53 </h3>
54 <table class="table table-bordered table-hover">
55 <thead>
56 <th>
57 <i class="icon-question-sign get-help" title="The name of the recipe to which each task applies"></i>
58 Recipe
59 </th>
60 <th>
61 <i class="icon-question-sign get-help" title="The name of the task"></i>
62 Task
63 </th>
64 <th>
65 <i class="icon-question-sign get-help" title="This value tells you if a task had to run (executed) in order to generate the task output, or if the output was provided by another task and therefore the task didn't need to run (not executed)"></i>
66 Executed
67 </th>
68 <th>
69 <i class="icon-question-sign get-help" title="This column tells you if 'executed' tasks succeeded or failed. The column also tells you why 'not executed' tasks did not need to run"></i>
70 Outcome
71 </th>
72 <th>
73 <i class="icon-question-sign get-help" title="The date and time the build finished"></i>
74 Build completed on
75 </th>
76 </thead>
77 <tbody>
78 {% for match in matching_tasks %}
79 <tr {{ match|task_color }}>
80 <td>
81 <a href="{%url "task" match.build.pk match.pk%}">{{match.recipe.name}}</a>
82 </td>
83 <td>
84 <a href="{%url "task" match.build.pk match.pk%}">{{match.task_name}}</a>
85 </td>
86 <td>
87 <a href="{%url "task" match.build.pk match.pk%}">{{match.get_executed_display}}</a>
88 </td>
89 <td>
90 <a href="{%url "task" match.build.pk match.pk%}">{{match.get_outcome_display}} </a><i class="icon-question-sign get-help hover-help" title="{{match.get_outcome_help}}"></i>
91 </td>
92 <td>
93 <a href="{%url "task" match.build.pk match.pk%}">{{match.build.completed_on|date:"d/m/y H:i"}}</a>
94 </td>
95 </tr>
96 {% endfor %}
97 </tbody>
98 </table>
99 {% else %}
100 <p class="alert">
101 <strong> We have found no tasks matching this prebuilt task</strong><br/>
102 The task you are looking for could belong to a build for which Toaster has no data.
103 </p>
104 {% endif %}
105 {% elif task.outcome == task.OUTCOME_COVERED %}
106 <dl class="dl-horizontal">
107 <dt>
108 <i class="icon-question-sign get-help" title="The task providing the outcome of this task"></i> Task covered by
109 </dt>
110 <dd>
111 <ul>
112 {% for t in covered_by %}
113 <li>
114 <a href="{%url 'task' t.build.pk t.pk%}"
115 class="task-info"
116 title="{{t.get_executed_display}} | {{t.get_outcome_display}}">
117 {{t.recipe.name}}_{{t.recipe.version}}
118 {{t.task_name}}
119 </a>
120 </li>
121 {% endfor %}
122 </ul>
123 </dd>
124 </dl>
125 {%elif task.outcome == task.OUTCOME_CACHED%}
126 <dl class="dl-horizontal">
127 <dt>
128 <i class="icon-question-sign get-help" title="Path the task log file"></i> Log file
129 </dt>
130 <dd>
131 <code>{% for t in task.get_related_setscene %} {{t.logfile}} {% endfor %}</code>
132 </dd>
133 </dl>
134 {%elif task.outcome == task.OUTCOME_EMPTY%}
135 <div class="alert alert-info details">
136 This task is empty because it has the <code>noexec</code> flag set to <code>1</code>, or the task function is empty
137 </div>
138 {% endif %}
139{% endif %}
140
141{# Execution section #}
142 {% if task.task_executed %}
143 <h2>
144 Executed
145 <i class="icon-question-sign get-help heading-help" title="'Executed' tasks are those that need to run in order to generate the task output"></i>
146 {% else %}
147 <h2 class="muted">
148 Not Executed
149 <i class="icon-question-sign get-help heading-help" title="'Not executed' tasks don't need to run because their outcome is provided by another task"></i>
150 {% endif %}
151 </h2>
152<dl class="dl-horizontal">
153 <dt>
154 <i class="icon-question-sign get-help" title="To make builds more efficient, the build system detects changes in the 'inputs' to a given task by creating a 'task signature'. If the signature changes, the build system assumes the inputs have changed and the task needs to be rerun"></i>
155 Task inputs signature
156 </dt>
157 <dd>
158 {{task.sstate_checksum}}
159 </dd>
160 {% if task.sstate_result != task.SSTATE_NA %}
161 </dl>
162 <div class="alert alert-info">Attempting to restore output from sstate cache
163 <i class="icon-question-sign get-help get-help-blue" title="The build system is searching for the task output in your <code>sstate-cache</code> directory and mirrors. If the build system finds the task output, it will reuse it instead of building it from scratch by running the real task. Reusing the task output makes the build faster"></i>
164 </div>
165 <dl class="dl-horizontal">
166 <dt>
167 <i class="icon-question-sign get-help" title="The name of the file searched for in your <code>sstate-cache</code> directory and mirrors"></i>
168 File searched for
169 </dt>
170 <dd><code>{{task.path_to_sstate_obj}}</code></dd>
171 <dt>
172 <i class="icon-question-sign get-help" title="The locations searched for the above file (i.e. your <code>sstate-cache</code> directory and any mirrors you have set up)"></i>
173 URI(s) searched
174 </dt>
175 <dd><ul>{% for uri in uri_list %}<li><code>{{uri}}</code></li>{% endfor %}</ul></dd>
176 </dl>
177 {% endif %}
178 {% if task.sstate_result == task.SSTATE_MISS %}
179 <div class="alert alert-info">
180 <strong>File not in sstate cache.</strong> Running the real task instead.
181 </div>
182 {% elif task.sstate_result == task.SSTATE_FAILED%}
183 <div class="alert">
184 <strong>Failed</strong> to restore output from sstate cache. The file was found but could not be unpacked.
185 </div>
186 <dl class="dl-horizontal">
187 <dt>
188 <i class="icon-question-sign get-help" title="Path to the cache attempt log file"></i>
189 Log file
190 </dt>
191 <dd><code>{{task.logfile}}</code></dd>
192 <dt>
193 <i class="icon-question-sign get-help" title="How long it took the cache attempt to finish in seconds"></i>
194 Time (secs)
195 </dt>
196 <dd>{{task.elapsed_time|format_none_and_zero}}</dd>
197 </dl>
198 <div class="alert alert-info">
199 Running the real task instead.
200 </div>
201 {% elif task.sstate_result == task.SSTATE_RESTORED %}
202 <div class="alert alert-info">
203 Output <strong>successfully restored</strong> from sstate cache.
204 </div>
205 {% endif %}
206 <dl class="dl-horizontal">
207 <dt>
208 <i class="icon-question-sign get-help" title="The running sequence of each task in the build"></i>
209 Task order
210 </dt>
211 <dd><a href="{%url "tasks_task" build.pk task.order %}#{{task.order}}">{{task.order}}</a></dd>
212 {% if task.task_executed %}
213 <dt>
214 <i class="icon-question-sign get-help" title="Indicates if this task executes a Python or Shell function(s)"></i>
215 Task script type
216 </dt>
217 <dd>{{task.get_script_type_display}}</dd>
218 {% endif %}
219<!--
220 <dt>
221 <i class="icon-question-sign get-help" title="The code executed by the task"></i>
222 Task executable output
223 </dt>
224 <dd><code>{{task.source_url}}</code></dd>
225-->
226 <dt>
227 <i class="icon-question-sign get-help" title="Task dependency chain (i.e. other tasks)"></i>
228 Dependencies
229 </dt>
230 <dd>
231 <ul>
232 {% for dep in deps %}
233 <li><a href="{%url 'task' dep.build.pk dep.pk%}" class="task-info" title="{{dep.get_executed_display}} | {{dep.get_outcome_display}}">{{dep.recipe.name}}_{{dep.recipe.version}} <span class="task-name">{{dep.task_name}}</span></a></li>
234 {% empty %}
235 <li class="muted">This task has no dependencies</li>
236 {% endfor %}
237 </ul>
238 </dd>
239 <dt>
240 <i class="icon-question-sign get-help" title="Tasks that depend on this task"></i>
241 Reverse dependencies
242 </dt>
243 <dd>
244 <ul>
245 {% for dep in rdeps %}
246 <li><a href="{%url 'task' dep.build.pk dep.pk%}" class="task-info" title="{{dep.get_executed_display}} | {{dep.get_outcome_display}}">{{dep.recipe.name}}_{{dep.recipe.version}} <span class="task-name">{{dep.task_name}}</span></a></li>
247 {% empty %}
248 <li class="muted">This task has no reverse dependencies</li>
249 {% endfor %}
250 </ul>
251</dl>
252
253{# Performance section - shown only for executed tasks #}
254{%if task.elapsed_time or task.cpu_usage or task.disk_io %}
255 <h2 class="details">Performance</h2>
256{% endif %}
257 <dl class="dl-horizontal">
258 {% if task.elapsed_time %}
259 <dt>
260 <i class="icon-question-sign get-help" title="How long it took the task to finish in seconds"></i>
261 Time (secs)
262 </dt>
263 <dd>{{task.elapsed_time|format_none_and_zero|floatformat:2}}</dd>
264 {% endif %}
265 {% if task.cpu_usage > 0 %}
266 <dt>
267 <i class="icon-question-sign get-help" title="The percentage of task CPU utilization"></i>
268 CPU usage
269 </dt>
270 <dd>{{task.cpu_usage|format_none_and_zero|floatformat:2}}%</dd>
271 {% endif %}
272 {% if task.disk_io > 0 %}
273 <dt>
274 <i class="icon-question-sign get-help" title="Number of miliseconds the task spent doing disk input and output"></i>
275 Disk I/O (ms)
276 </dt>
277 <dd>{{task.disk_io|format_none_and_zero}}</dd>
278 {% endif %}
279 </dl>
280
281</div>
282{% endblock %}
283
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
new file mode 100644
index 0000000000..77d38b00de
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -0,0 +1,133 @@
1{% extends "basebuildpage.html" %}
2{% load projecttags %}
3
4{% block localbreadcrumb %}
5<li>{{title}}</li>
6{% endblock %}
7
8{% block nav-tasks %}
9 {% if 'Tasks' == title %}
10 <li class="active"><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
11 {% else %}
12 <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
13 {% endif %}
14{% endblock %}
15{% block nav-buildtime %}
16 {% if 'Time' == title %}
17 <li class="active"><a href="{% url 'buildtime' build.pk %}">Time</a></li>
18 {% else %}
19 <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
20 {% endif %}
21{% endblock %}
22{% block nav-cpuusage %}
23 {% if 'CPU usage' == title %}
24 <li class="active"><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
25 {% else %}
26 <li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
27 {% endif %}
28{% endblock %}
29{% block nav-diskio %}
30 {% if 'Disk I/O' == title %}
31 <li class="active"><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
32 {% else %}
33 <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
34 {% endif %}
35{% endblock %}
36
37{% block buildinfomain %}
38<div class="span10">
39{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
40 <!-- Empty - no data in database -->
41 <div class="page-header">
42 <h1>{{title}}</h1>
43 </div>
44 <div class="alert alert-info lead">
45 No data was recorded for this build.
46 </div>
47
48{% else %}
49
50 <div class="page-header">
51 <h1>
52 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
53 {{objects.paginator.count}} task{{objects.paginator.count|pluralize}} found
54 {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
55 No tasks found
56 {%else%}
57 {{title}}
58 {%endif%}
59 </h1>
60 </div>
61
62 {% if objects.paginator.count == 0 %}
63 <div class="row-fluid">
64 <div class="alert">
65 <form class="no-results input-append" id="searchform">
66 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
67 <button class="btn" type="submit" value="Search">Search</button>
68 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
69 </form>
70 </div>
71 </div>
72
73
74 {% else %}
75 {% include "basetable_top.html" %}
76
77 {% for task in objects %}
78 <tr {{ task|task_color }} id="{{task.order}}">
79 <td class="order">
80 <a href="{%url "task" build.pk task.pk%}">{{task.order}}</a>
81 </td>
82 <td class="recipe_name" >
83 <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.name}}</a>
84 </td>
85 <td class="recipe_version">
86 <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.version}}</a>
87 </td>
88 <td class="task_name">
89 <a href="{%url "task" build.pk task.pk%} ">{{task.task_name}}</a> {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="" data-original-title="{{task.get_description}}"></i> {% endif %}
90 </td>
91 <td class="executed">
92 <a href="{%url "task" build.pk task.pk%} ">{{task.get_executed_display}}</a>
93 </td>
94 <td class="outcome">
95 <a href="{%url "task" build.pk task.pk%} ">{{task.get_outcome_display}} </a>
96 <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
97 </td>
98 <td class="cache_attempt">
99 <a href="{%url "task" build.pk task.pk%} ">{{task.get_sstate_result_display|format_none_and_zero}}</a>
100 </td>
101 <td class="time_taken">
102 {{task.elapsed_time|format_none_and_zero|floatformat:2}}
103 </td>
104 <td class="cpu_used">
105 {{task.cpu_usage|format_none_and_zero|floatformat:2}}{% if task.cpu_usage %}%{% endif %}
106 </td>
107 <td class="disk_io">
108 {{task.disk_io|format_none_and_zero}}
109 </td>
110 <td class="task_log">
111 {{task.logfile}}
112 </td>
113 </tr>
114 {% endfor %}
115
116 {% include "basetable_bottom.html" %}
117 {% endif %} {# objects.paginator.count #}
118{% endif %} {# empty #}
119</div>
120
121<script type="text/javascript">
122
123 $(document).ready(function() {
124 // enable blue hightlight animation for the order link
125 if (location.href.search('#') > -1) {
126 var task_order = location.href.split('#')[1];
127 $("#" + task_order).addClass("highlight");
128 }
129 });
130
131</script>
132
133{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templatetags/__init__.py b/bitbake/lib/toaster/toastergui/templatetags/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templatetags/__init__.py
diff --git a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
new file mode 100644
index 0000000000..be75b214ac
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
@@ -0,0 +1,255 @@
1#
2# ex:ts=4:sw=4:sts=4:et
3# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4#
5# BitBake Toaster Implementation
6#
7# Copyright (C) 2013 Intel Corporation
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License version 2 as
11# published by the Free Software Foundation.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License along
19# with this program; if not, write to the Free Software Foundation, Inc.,
20# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
22from datetime import datetime, timedelta
23import re
24from django import template
25from django.utils import timezone
26from django.template.defaultfilters import filesizeformat
27
28register = template.Library()
29
30@register.simple_tag
31def time_difference(start_time, end_time):
32 return end_time - start_time
33
34@register.filter(name = 'sectohms')
35def sectohms(time):
36 try:
37 tdsec = int(time)
38 except ValueError:
39 tdsec = 0
40 hours = int(tdsec / 3600)
41 return "%02d:%02d:%02d" % (hours, int((tdsec - (hours * 3600))/ 60), int(tdsec) % 60)
42
43@register.assignment_tag
44def query(qs, **kwargs):
45 """ template tag which allows queryset filtering. Usage:
46 {% query books author=author as mybooks %}
47 {% for book in mybooks %}
48 ...
49 {% endfor %}
50 """
51 return qs.filter(**kwargs)
52
53@register.filter
54def divide(value, arg):
55 if int(arg) == 0:
56 return -1
57 return int(value) / int(arg)
58
59@register.filter
60def multiply(value, arg):
61 return int(value) * int(arg)
62
63@register.assignment_tag
64def datecompute(delta, start = timezone.now()):
65 return start + timedelta(delta)
66
67
68@register.filter(name = 'sortcols')
69def sortcols(tablecols):
70 return sorted(tablecols, key = lambda t: t['name'])
71
72@register.filter
73def task_color(task_object, show_green=False):
74 """ Return css class depending on Task execution status and execution outcome.
75 By default, green is not returned for executed and successful tasks;
76 show_green argument should be True to get green color.
77 """
78 if not task_object.task_executed:
79 return 'class=muted'
80 elif task_object.outcome == task_object.OUTCOME_FAILED:
81 return 'class=error'
82 elif task_object.outcome == task_object.OUTCOME_SUCCESS and show_green:
83 return 'class=green'
84 else:
85 return ''
86
87@register.filter
88def filtered_icon(options, filter):
89 """Returns btn-primary if the filter matches one of the filter options
90 """
91 for option in options:
92 if filter == option[1]:
93 return "btn-primary"
94 return ""
95
96@register.filter
97def filtered_tooltip(options, filter):
98 """Returns tooltip for the filter icon if the filter matches one of the filter options
99 """
100 for option in options:
101 if filter == option[1]:
102 return "Showing only %s"%option[0]
103 return ""
104
105@register.filter
106def format_none_and_zero(value):
107 """Return empty string if the value is None, zero or Not Applicable
108 """
109 return "" if (not value) or (value == 0) or (value == "0") or (value == 'Not Applicable') else value
110
111@register.filter
112def filtered_filesizeformat(value):
113 """
114 If the value is -1 return an empty string. Otherwise,
115 change output from fileformatsize to suppress trailing '.0'
116 and change 'bytes' to 'B'.
117 """
118 if value == -1:
119 return ''
120
121 return filesizeformat(value).replace("bytes", "B")
122
123@register.filter
124def filtered_packagespec(value):
125 """Strip off empty version and revision"""
126 return re.sub(r'(--$)', '', value)
127
128@register.filter
129def check_filter_status(options, filter):
130 """Check if the active filter is among the available options, and return 'checked'
131 if filter is not active.
132 Used in FilterDialog to select the first radio button if the filter is not active.
133 """
134 for option in options:
135 if filter == option[1]:
136 return ""
137 return "checked"
138
139@register.filter
140def variable_parent_name(value):
141 """ filter extended variable names to the parent name
142 """
143 value=re.sub('_\$.*', '', value)
144 return re.sub('_[a-z].*', '', value)
145
146@register.filter
147def filter_setin_files(file_list,matchstr):
148 """ filter/search the 'set in' file lists. Note
149 that this output is not autoescaped to allow
150 the <p> marks, but this is safe as the data
151 is file paths
152 """
153
154 # no filters, show last file (if any)
155 if matchstr == ":":
156 if file_list:
157 return file_list[len(file_list)-1].file_name
158 else:
159 return ''
160
161 search, filter = matchstr.partition(':')[::2]
162 htmlstr=""
163 # match only filters
164 if search == '':
165 for i in range(len(file_list)):
166 if re.search(filter, file_list[i].file_name):
167 if htmlstr.find(file_list[i].file_name + "<p>") < 0:
168 htmlstr += file_list[i].file_name + "<p>"
169 return htmlstr
170
171 # match only search string, plus always last file
172 if filter == "":
173 for i in range(len(file_list)-1):
174 if re.search(search,file_list[i].file_name):
175 if htmlstr.find(file_list[i].file_name + "<p>") < 0:
176 htmlstr += file_list[i].file_name + "<p>"
177 if htmlstr.find(file_list[len(file_list)-1].file_name) < 0:
178 htmlstr += file_list[len(file_list)-1].file_name
179 return htmlstr
180
181 # match filter or search string
182 for i in range(len(file_list)):
183 if re.search(filter, file_list[i].file_name) or re.search(search,file_list[i].file_name):
184 if htmlstr.find(file_list[i].file_name + "<p>") < 0:
185 htmlstr += file_list[i].file_name + "<p>"
186 return htmlstr
187
188
189@register.filter
190def string_slice(strvar,slicevar):
191 """ slice a string with |string_slice:'[first]:[last]'
192 """
193 first,last= slicevar.partition(':')[::2]
194 if first=='':
195 return strvar[:int(last)]
196 elif last=='':
197 return strvar[int(first):]
198 else:
199 return strvar[int(first):int(last)]
200
201@register.filter
202def string_remove_regex(value,ex):
203 """ remove sub-string of string that matches regex
204 """
205 return re.sub(ex, '', value)
206
207@register.filter
208def filtered_installedsize(size, installed_size):
209 """If package.installed_size not null and not empty return it,
210 else return package.size
211 """
212 return size if (installed_size == 0) or (installed_size == "") or (installed_size == None) else installed_size
213
214@register.filter
215def filtered_packageversion(version, revision):
216 """ Emit "version-revision" if version and revision are not null
217 else "version" if version is not null
218 else ""
219 """
220 return "" if (not version or version == "") else version if (not revision or revision == "") else version + "-" + revision
221
222@register.filter
223def filter_sizeovertotal(package_object, total_size):
224 """ Return the % size of the package over the total size argument
225 formatted nicely.
226 """
227 size = package_object.installed_size
228 if size == None or size == '':
229 size = package_object.size
230
231 return '{:.1%}'.format(float(size)/float(total_size))
232
233from django.utils.safestring import mark_safe
234@register.filter
235def format_vpackage_rowclass(size):
236 if size == -1:
237 return mark_safe('class="muted"')
238 return ''
239
240@register.filter
241def format_vpackage_namehelp(name):
242 r = name + '&nbsp;'
243 r += '<i class="icon-question-sign get-help hover-help"'
244 r += ' title = "' + name + ' has not been built">'
245 r += '</i>'
246 return mark_safe(r)
247
248@register.filter
249def get_dict_value(dictionary, key):
250 """ return the value of a dictionary key
251 """
252 try:
253 return dictionary[key]
254 except (KeyError, IndexError):
255 return ''
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
new file mode 100644
index 0000000000..d7e9457c66
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -0,0 +1,69 @@
1#
2# BitBake Toaster Implementation
3#
4# Copyright (C) 2013 Intel Corporation
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License version 2 as
8# published by the Free Software Foundation.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along
16# with this program; if not, write to the Free Software Foundation, Inc.,
17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19from django.conf.urls import patterns, include, url
20from django.views.generic import RedirectView
21
22urlpatterns = patterns('toastergui.views',
23 # landing page
24 url(r'^builds/$', 'builds', name='all-builds'),
25 # build info navigation
26 url(r'^build/(?P<build_id>\d+)$', 'builddashboard', name="builddashboard"),
27
28 url(r'^build/(?P<build_id>\d+)/tasks/$', 'tasks', name='tasks'),
29 url(r'^build/(?P<build_id>\d+)/tasks/(?P<task_id>\d+)/$', 'tasks_task', name='tasks_task'),
30 url(r'^build/(?P<build_id>\d+)/task/(?P<task_id>\d+)$', 'task', name='task'),
31
32 url(r'^build/(?P<build_id>\d+)/recipes/$', 'recipes', name='recipes'),
33 url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)$', 'recipe', name='recipe'),
34
35 url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='packages'),
36 url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)$', 'package_built_detail',
37 name='package_built_detail'),
38 url(r'^build/(?P<build_id>\d+)/package_built_dependencies/(?P<package_id>\d+)$',
39 'package_built_dependencies', name='package_built_dependencies'),
40 url(r'^build/(?P<build_id>\d+)/package_included_detail/(?P<target_id>\d+)/(?P<package_id>\d+)$',
41 'package_included_detail', name='package_included_detail'),
42 url(r'^build/(?P<build_id>\d+)/package_included_dependencies/(?P<target_id>\d+)/(?P<package_id>\d+)$',
43 'package_included_dependencies', name='package_included_dependencies'),
44 url(r'^build/(?P<build_id>\d+)/package_included_reverse_dependencies/(?P<target_id>\d+)/(?P<package_id>\d+)$',
45 'package_included_reverse_dependencies', name='package_included_reverse_dependencies'),
46
47 # images are known as targets in the internal model
48 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'target', name='target'),
49 url(r'^dentries/build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'dirinfo_ajax', name='dirinfo_ajax'),
50 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo$', 'dirinfo', name='dirinfo'),
51 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo_filepath/(?P<file_path>(?:/[^/\n]+)*)$', 'dirinfo', name='dirinfo_filepath'),
52 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packages$', 'tpackage', name='targetpackages'),
53 url(r'^build/(?P<build_id>\d+)/configuration$', 'configuration', name='configuration'),
54 url(r'^build/(?P<build_id>\d+)/configvars$', 'configvars', name='configvars'),
55 url(r'^build/(?P<build_id>\d+)/buildtime$', 'buildtime', name='buildtime'),
56 url(r'^build/(?P<build_id>\d+)/cpuusage$', 'cpuusage', name='cpuusage'),
57 url(r'^build/(?P<build_id>\d+)/diskio$', 'diskio', name='diskio'),
58
59 # image information dir - not yet implemented
60 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packagefile/(?P<packagefile_id>\d+)$',
61 'image_information_dir', name='image_information_dir'),
62
63
64 # urls not linked from the dashboard
65 url(r'^layers/$', 'layer', name='all-layers'),
66 url(r'^layerversions/(?P<layerversion_id>\d+)/recipes/.*$', 'layer_versions_recipes', name='layer_versions_recipes'),
67 # default redirection
68 url(r'^$', RedirectView.as_view( url= 'builds/')),
69)
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
new file mode 100644
index 0000000000..e4ada14125
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -0,0 +1,1645 @@
1#
2# ex:ts=4:sw=4:sts=4:et
3# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4#
5# BitBake Toaster Implementation
6#
7# Copyright (C) 2013 Intel Corporation
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License version 2 as
11# published by the Free Software Foundation.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License along
19# with this program; if not, write to the Free Software Foundation, Inc.,
20# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
22import operator,re
23
24from django.db.models import Q, Sum
25from django.shortcuts import render, redirect
26from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable
27from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
28from orm.models import Target_Installed_Package, Target_File, Target_Image_File
29from django.views.decorators.cache import cache_control
30from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
31from django.http import HttpResponseBadRequest
32from django.utils import timezone
33from datetime import timedelta
34from django.utils import formats
35import json
36
37def _build_page_range(paginator, index = 1):
38 try:
39 page = paginator.page(index)
40 except PageNotAnInteger:
41 page = paginator.page(1)
42 except EmptyPage:
43 page = paginator.page(paginator.num_pages)
44
45
46 page.page_range = [page.number]
47 crt_range = 0
48 for i in range(1,5):
49 if (page.number + i) <= paginator.num_pages:
50 page.page_range = page.page_range + [ page.number + i]
51 crt_range +=1
52 if (page.number - i) > 0:
53 page.page_range = [page.number -i] + page.page_range
54 crt_range +=1
55 if crt_range == 4:
56 break
57 return page
58
59
60def _verify_parameters(g, mandatory_parameters):
61 miss = []
62 for mp in mandatory_parameters:
63 if not mp in g:
64 miss.append(mp)
65 if len(miss):
66 return miss
67 return None
68
69def _redirect_parameters(view, g, mandatory_parameters, *args, **kwargs):
70 import urllib
71 from django.core.urlresolvers import reverse
72 url = reverse(view, kwargs=kwargs)
73 params = {}
74 for i in g:
75 params[i] = g[i]
76 for i in mandatory_parameters:
77 if not i in params:
78 params[i] = mandatory_parameters[i]
79
80 return redirect(url + "?%s" % urllib.urlencode(params), *args, **kwargs)
81
82FIELD_SEPARATOR = ":"
83VALUE_SEPARATOR = "!"
84DESCENDING = "-"
85
86def __get_q_for_val(name, value):
87 if "OR" in value:
88 return reduce(operator.or_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("OR") ]))
89 if "AND" in value:
90 return reduce(operator.and_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("AND") ]))
91 if value.startswith("NOT"):
92 kwargs = { name : value.strip("NOT") }
93 return ~Q(**kwargs)
94 else:
95 kwargs = { name : value }
96 return Q(**kwargs)
97
98def _get_filtering_query(filter_string):
99
100 search_terms = filter_string.split(FIELD_SEPARATOR)
101 keys = search_terms[0].split(VALUE_SEPARATOR)
102 values = search_terms[1].split(VALUE_SEPARATOR)
103
104 querydict = dict(zip(keys, values))
105 return reduce(operator.and_, map(lambda x: __get_q_for_val(x, querydict[x]), [k for k in querydict]))
106
107def _get_toggle_order(request, orderkey, reverse = False):
108 if reverse:
109 return "%s:+" % orderkey if request.GET.get('orderby', "") == "%s:-" % orderkey else "%s:-" % orderkey
110 else:
111 return "%s:-" % orderkey if request.GET.get('orderby', "") == "%s:+" % orderkey else "%s:+" % orderkey
112
113def _get_toggle_order_icon(request, orderkey):
114 if request.GET.get('orderby', "") == "%s:+"%orderkey:
115 return "down"
116 elif request.GET.get('orderby', "") == "%s:-"%orderkey:
117 return "up"
118 else:
119 return None
120
121# we check that the input comes in a valid form that we can recognize
122def _validate_input(input, model):
123
124 invalid = None
125
126 if input:
127 input_list = input.split(FIELD_SEPARATOR)
128
129 # Check we have only one colon
130 if len(input_list) != 2:
131 invalid = "We have an invalid number of separators: " + input + " -> " + str(input_list)
132 return None, invalid
133
134 # Check we have an equal number of terms both sides of the colon
135 if len(input_list[0].split(VALUE_SEPARATOR)) != len(input_list[1].split(VALUE_SEPARATOR)):
136 invalid = "Not all arg names got values"
137 return None, invalid + str(input_list)
138
139 # Check we are looking for a valid field
140 valid_fields = model._meta.get_all_field_names()
141 for field in input_list[0].split(VALUE_SEPARATOR):
142 if not reduce(lambda x, y: x or y, map(lambda x: field.startswith(x), [ x for x in valid_fields ])):
143 return None, (field, [ x for x in valid_fields ])
144
145 return input, invalid
146
147# uses search_allowed_fields in orm/models.py to create a search query
148# for these fields with the supplied input text
149def _get_search_results(search_term, queryset, model):
150 search_objects = []
151 for st in search_term.split(" "):
152 q_map = map(lambda x: Q(**{x+'__icontains': st}),
153 model.search_allowed_fields)
154
155 search_objects.append(reduce(operator.or_, q_map))
156 search_object = reduce(operator.and_, search_objects)
157 queryset = queryset.filter(search_object)
158
159 return queryset
160
161
162# function to extract the search/filter/ordering parameters from the request
163# it uses the request and the model to validate input for the filter and orderby values
164def _search_tuple(request, model):
165 ordering_string, invalid = _validate_input(request.GET.get('orderby', ''), model)
166 if invalid:
167 raise BaseException("Invalid ordering model:" + str(model) + str(invalid))
168
169 filter_string, invalid = _validate_input(request.GET.get('filter', ''), model)
170 if invalid:
171 raise BaseException("Invalid filter " + str(invalid))
172
173 search_term = request.GET.get('search', '')
174 return (filter_string, search_term, ordering_string)
175
176
177# returns a lazy-evaluated queryset for a filter/search/order combination
178def _get_queryset(model, queryset, filter_string, search_term, ordering_string, ordering_secondary=''):
179 if filter_string:
180 filter_query = _get_filtering_query(filter_string)
181 queryset = queryset.filter(filter_query)
182 else:
183 queryset = queryset.all()
184
185 if search_term:
186 queryset = _get_search_results(search_term, queryset, model)
187
188 if ordering_string and queryset:
189 column, order = ordering_string.split(':')
190 if column == re.sub('-','',ordering_secondary):
191 ordering_secondary=''
192 if order.lower() == DESCENDING:
193 column = '-' + column
194 if ordering_secondary:
195 queryset = queryset.order_by(column, ordering_secondary)
196 else:
197 queryset = queryset.order_by(column)
198
199 # insure only distinct records (e.g. from multiple search hits) are returned
200 return queryset.distinct()
201
202
203# shows the "all builds" page
204def builds(request):
205 template = 'build.html'
206 # define here what parameters the view needs in the GET portion in order to
207 # be able to display something. 'count' and 'page' are mandatory for all views
208 # that use paginators.
209 mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'completed_on:-' };
210 retval = _verify_parameters( request.GET, mandatory_parameters )
211 if retval:
212 return _redirect_parameters( 'all-builds', request.GET, mandatory_parameters)
213
214 # boilerplate code that takes a request for an object type and returns a queryset
215 # for that object type. copypasta for all needed table searches
216 (filter_string, search_term, ordering_string) = _search_tuple(request, Build)
217 queryset_all = Build.objects.exclude(outcome = Build.IN_PROGRESS)
218 queryset_with_search = _get_queryset(Build, queryset_all, None, search_term, ordering_string, '-completed_on')
219 queryset = _get_queryset(Build, queryset_all, filter_string, search_term, ordering_string, '-completed_on')
220
221 # retrieve the objects that will be displayed in the table; builds a paginator and gets a page range to display
222 build_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1))
223
224 # build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds)
225 build_mru = Build.objects.filter(completed_on__gte=(timezone.now()-timedelta(hours=24))).order_by("-started_on")[:3]
226 for b in [ x for x in build_mru if x.outcome == Build.IN_PROGRESS ]:
227 tf = Task.objects.filter(build = b)
228 tfc = tf.count()
229 if tfc > 0:
230 b.completeper = tf.exclude(order__isnull=True).count()*100/tf.count()
231 else:
232 b.completeper = 0
233 b.eta = timezone.now()
234 if b.completeper > 0:
235 b.eta += ((timezone.now() - b.started_on)*100/b.completeper)
236 else:
237 b.eta = 0
238
239 # set up list of fstypes for each build
240 fstypes_map = {};
241 for build in build_info:
242 targets = Target.objects.filter( build_id = build.id )
243 comma = "";
244 extensions = "";
245 for t in targets:
246 if ( not t.is_image ):
247 continue
248 tif = Target_Image_File.objects.filter( target_id = t.id )
249 for i in tif:
250 s=re.sub('.*tar.bz2', 'tar.bz2', i.file_name)
251 if s == i.file_name:
252 s=re.sub('.*\.', '', i.file_name)
253 if None == re.search(s,extensions):
254 extensions += comma + s
255 comma = ", "
256 fstypes_map[build.id]=extensions
257
258 # send the data to the template
259 context = {
260 # specific info for
261 'mru' : build_mru,
262 # TODO: common objects for all table views, adapt as needed
263 'objects' : build_info,
264 'objectname' : "builds",
265 'fstypes' : fstypes_map,
266 'search_term' : search_term,
267 'total_count' : queryset_with_search.count(),
268 # Specifies the display of columns for the table, appearance in "Edit columns" box, toggling default show/hide, and specifying filters for columns
269 'tablecols' : [
270 {'name': 'Outcome', # column with a single filter
271 'qhelp' : "The outcome tells you if a build successfully completed or failed", # the help button content
272 'dclass' : "span2", # indication about column width; comes from the design
273 'orderfield': _get_toggle_order(request, "outcome"), # adds ordering by the field value; default ascending unless clicked from ascending into descending
274 'ordericon':_get_toggle_order_icon(request, "outcome"),
275 # filter field will set a filter on that column with the specs in the filter description
276 # the class field in the filter has no relation with clclass; the control different aspects of the UI
277 # still, it is recommended for the values to be identical for easy tracking in the generated HTML
278 'filter' : {'class' : 'outcome',
279 'label': 'Show:',
280 'options' : [
281 ('Successful builds', 'outcome:' + str(Build.SUCCEEDED), queryset_with_search.filter(outcome=str(Build.SUCCEEDED)).count()), # this is the field search expression
282 ('Failed builds', 'outcome:'+ str(Build.FAILED), queryset_with_search.filter(outcome=str(Build.FAILED)).count()),
283 ]
284 }
285 },
286 {'name': 'Target', # default column, disabled box, with just the name in the list
287 'qhelp': "This is the build target or build targets (i.e. one or more recipes or image recipes)",
288 'orderfield': _get_toggle_order(request, "target__target"),
289 'ordericon':_get_toggle_order_icon(request, "target__target"),
290 },
291 {'name': 'Machine',
292 'qhelp': "The machine is the hardware for which you are building a recipe or image recipe",
293 'orderfield': _get_toggle_order(request, "machine"),
294 'ordericon':_get_toggle_order_icon(request, "machine"),
295 'dclass': 'span3'
296 }, # a slightly wider column
297 {'name': 'Started on', 'clclass': 'started_on', 'hidden' : 1, # this is an unchecked box, which hides the column
298 'qhelp': "The date and time you started the build",
299 'orderfield': _get_toggle_order(request, "started_on", True),
300 'ordericon':_get_toggle_order_icon(request, "started_on"),
301 'filter' : {'class' : 'started_on',
302 'label': 'Show:',
303 'options' : [
304 ("Today's builds" , 'started_on__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(started_on__gte=timezone.now().strftime("%Y-%m-%d")).count()),
305 ("Yesterday's builds", 'started_on__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(started_on__gte=(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d")).count()),
306 ("This week's builds", 'started_on__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(started_on__gte=(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d")).count()),
307 ]
308 }
309 },
310 {'name': 'Completed on',
311 'qhelp': "The date and time the build finished",
312 'orderfield': _get_toggle_order(request, "completed_on", True),
313 'ordericon':_get_toggle_order_icon(request, "completed_on"),
314 'filter' : {'class' : 'completed_on',
315 'label': 'Show:',
316 'options' : [
317 ("Today's builds", 'completed_on__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(completed_on__gte=timezone.now().strftime("%Y-%m-%d")).count()),
318 ("Yesterday's builds", 'completed_on__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(completed_on__gte=(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d")).count()),
319 ("This week's builds", 'completed_on__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(completed_on__gte=(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d")).count()),
320 ]
321 }
322 },
323 {'name': 'Failed tasks', 'clclass': 'failed_tasks', # specifing a clclass will enable the checkbox
324 'qhelp': "How many tasks failed during the build",
325 'filter' : {'class' : 'failed_tasks',
326 'label': 'Show:',
327 'options' : [
328 ('Builds with failed tasks', 'task_build__outcome:4', queryset_with_search.filter(task_build__outcome=4).count()),
329 ('Builds without failed tasks', 'task_build__outcome:NOT4', queryset_with_search.filter(~Q(task_build__outcome=4)).count()),
330 ]
331 }
332 },
333 {'name': 'Errors', 'clclass': 'errors_no',
334 'qhelp': "How many errors were encountered during the build (if any)",
335 'orderfield': _get_toggle_order(request, "errors_no", True),
336 'ordericon':_get_toggle_order_icon(request, "errors_no"),
337 'filter' : {'class' : 'errors_no',
338 'label': 'Show:',
339 'options' : [
340 ('Builds with errors', 'errors_no__gte:1', queryset_with_search.filter(errors_no__gte=1).count()),
341 ('Builds without errors', 'errors_no:0', queryset_with_search.filter(errors_no=0).count()),
342 ]
343 }
344 },
345 {'name': 'Warnings', 'clclass': 'warnings_no',
346 'qhelp': "How many warnings were encountered during the build (if any)",
347 'orderfield': _get_toggle_order(request, "warnings_no", True),
348 'ordericon':_get_toggle_order_icon(request, "warnings_no"),
349 'filter' : {'class' : 'warnings_no',
350 'label': 'Show:',
351 'options' : [
352 ('Builds with warnings','warnings_no__gte:1', queryset_with_search.filter(warnings_no__gte=1).count()),
353 ('Builds without warnings','warnings_no:0', queryset_with_search.filter(warnings_no=0).count()),
354 ]
355 }
356 },
357 {'name': 'Time', 'clclass': 'time', 'hidden' : 1,
358 'qhelp': "How long it took the build to finish",
359 'orderfield': _get_toggle_order(request, "timespent", True),
360 'ordericon':_get_toggle_order_icon(request, "timespent"),
361 },
362 {'name': 'Log',
363 'dclass': "span4",
364 'qhelp': "Path to the build main log file",
365 'clclass': 'log', 'hidden': 1,
366 'orderfield': _get_toggle_order(request, "cooker_log_path"),
367 'ordericon':_get_toggle_order_icon(request, "cooker_log_path"),
368 },
369 {'name': 'Output', 'clclass': 'output',
370 'qhelp': "The root file system types produced by the build. You can find them in your <code>/build/tmp/deploy/images/</code> directory",
371 # TODO: compute image fstypes from Target_Image_File
372 },
373 ]
374 }
375
376 return render(request, template, context)
377
378
379##
380# build dashboard for a single build, coming in as argument
381# Each build may contain multiple targets and each target
382# may generate multiple image files. display them all.
383#
384def builddashboard( request, build_id ):
385 template = "builddashboard.html"
386 if Build.objects.filter( pk=build_id ).count( ) == 0 :
387 return redirect( builds )
388 build = Build.objects.filter( pk = build_id )[ 0 ];
389 layerVersionId = Layer_Version.objects.filter( build = build_id );
390 recipeCount = Recipe.objects.filter( layer_version__id__in = layerVersionId ).count( );
391 tgts = Target.objects.filter( build_id = build_id ).order_by( 'target' );
392
393 ##
394 # set up custom target list with computed package and image data
395 #
396
397 targets = [ ]
398 ntargets = 0
399 hasImages = False
400 for t in tgts:
401 elem = { }
402 elem[ 'target' ] = t
403 if ( t.is_image ):
404 hasImages = True
405 npkg = 0
406 pkgsz = 0
407 pid= 0
408 tp = Target_Installed_Package.objects.filter( target_id = t.id )
409 package = None
410 for p in tp:
411 pid = p.package_id
412 package = Package.objects.get( pk = p.package_id )
413 pkgsz = pkgsz + package.size
414 if ( package.installed_name ):
415 npkg = npkg + 1
416 elem[ 'npkg' ] = npkg
417 elem[ 'pkgsz' ] = pkgsz
418 ti = Target_Image_File.objects.filter( target_id = t.id )
419 imageFiles = [ ]
420 for i in ti:
421 ndx = i.file_name.rfind( '/' )
422 if ( ndx < 0 ):
423 ndx = 0;
424 f = i.file_name[ ndx + 1: ]
425 imageFiles.append({ 'path': f, 'size' : i.file_size })
426 elem[ 'imageFiles' ] = imageFiles
427 targets.append( elem )
428
429 ##
430 # how many packages in this build - ignore anonymous ones
431 #
432
433 packageCount = 0
434 packages = Package.objects.filter( build_id = build_id )
435 for p in packages:
436 if ( p.installed_name ):
437 packageCount = packageCount + 1
438
439 context = {
440 'build' : build,
441 'hasImages' : hasImages,
442 'ntargets' : ntargets,
443 'targets' : targets,
444 'recipecount' : recipeCount,
445 'packagecount' : packageCount,
446 'logmessages' : LogMessage.objects.filter( build = build_id ),
447 }
448 return render( request, template, context )
449
450
451def generateCoveredList( task ):
452 revList = _find_task_revdep( task );
453 list = { };
454 for t in revList:
455 if ( t.outcome == Task.OUTCOME_COVERED ):
456 list.update( generateCoveredList( t ));
457 else:
458 list[ t.task_name ] = t;
459 return( list );
460
461def task( request, build_id, task_id ):
462 template = "task.html"
463 tasks = Task.objects.filter( pk=task_id )
464 if tasks.count( ) == 0:
465 return redirect( builds )
466 task = tasks[ 0 ];
467 dependencies = sorted(
468 _find_task_dep( task ),
469 key=lambda t:'%s_%s %s'%(t.recipe.name, t.recipe.version, t.task_name))
470 reverse_dependencies = sorted(
471 _find_task_revdep( task ),
472 key=lambda t:'%s_%s %s'%( t.recipe.name, t.recipe.version, t.task_name ))
473 coveredBy = '';
474 if ( task.outcome == Task.OUTCOME_COVERED ):
475 dict = generateCoveredList( task )
476 coveredBy = [ ]
477 for name, t in dict.items( ):
478 coveredBy.append( t )
479 log_head = ''
480 log_body = ''
481 if task.outcome == task.OUTCOME_FAILED:
482 pass
483
484 uri_list= [ ]
485 variables = Variable.objects.filter(build=build_id)
486 v=variables.filter(variable_name='SSTATE_DIR')
487 if v.count > 0:
488 uri_list.append(v[0].variable_value)
489 v=variables.filter(variable_name='SSTATE_MIRRORS')
490 if (v.count > 0):
491 for mirror in v[0].variable_value.split('\\n'):
492 s=re.sub('.* ','',mirror.strip(' \t\n\r'))
493 if len(s): uri_list.append(s)
494
495 context = {
496 'build' : Build.objects.filter( pk = build_id )[ 0 ],
497 'object' : task,
498 'task' : task,
499 'covered_by' : coveredBy,
500 'deps' : dependencies,
501 'rdeps' : reverse_dependencies,
502 'log_head' : log_head,
503 'log_body' : log_body,
504 'showing_matches' : False,
505 'uri_list' : uri_list,
506 }
507 if request.GET.get( 'show_matches', "" ):
508 context[ 'showing_matches' ] = True
509 context[ 'matching_tasks' ] = Task.objects.filter(
510 sstate_checksum=task.sstate_checksum ).filter(
511 build__completed_on__lt=task.build.completed_on).exclude(
512 order__isnull=True).exclude(outcome=Task.OUTCOME_NA).order_by('-build__completed_on')
513
514 return render( request, template, context )
515
516
517def recipe(request, build_id, recipe_id):
518 template = "recipe.html"
519 if Recipe.objects.filter(pk=recipe_id).count() == 0 :
520 return redirect(builds)
521
522 object = Recipe.objects.filter(pk=recipe_id)[0]
523 layer_version = Layer_Version.objects.filter(pk=object.layer_version_id)[0]
524 layer = Layer.objects.filter(pk=layer_version.layer_id)[0]
525 tasks = Task.objects.filter(recipe_id = recipe_id, build_id = build_id).exclude(order__isnull=True).exclude(task_name__endswith='_setscene').exclude(outcome=Task.OUTCOME_NA)
526 packages = Package.objects.filter(recipe_id = recipe_id).filter(build_id = build_id).filter(size__gte=0)
527
528 context = {
529 'build' : Build.objects.filter(pk=build_id)[0],
530 'object' : object,
531 'layer_version' : layer_version,
532 'layer' : layer,
533 'tasks' : tasks,
534 'packages': packages,
535 }
536 return render(request, template, context)
537
538def target(request, build_id, target_id):
539 template = "target.html"
540 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'name:+'};
541 retval = _verify_parameters( request.GET, mandatory_parameters )
542 if retval:
543 return _redirect_parameters( 'target', request.GET, mandatory_parameters, build_id = build_id, target_id = target_id)
544 (filter_string, search_term, ordering_string) = _search_tuple(request, Package)
545
546 # FUTURE: get rid of nested sub-queries replacing with ManyToMany field
547 queryset = Package.objects.filter(size__gte=0, id__in=Target_Installed_Package.objects.filter(target_id=target_id).values('package_id'))
548 packages_sum = queryset.aggregate(Sum('installed_size'))
549 queryset = _get_queryset(Package, queryset, filter_string, search_term, ordering_string, 'name')
550 packages = _build_page_range(Paginator(queryset, request.GET.get('count', 25)),request.GET.get('page', 1))
551
552 # bring in package dependencies
553 for p in packages.object_list:
554 p.runtime_dependencies = p.package_dependencies_source.filter(target_id = target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS)
555 p.reverse_runtime_dependencies = p.package_dependencies_target.filter(target_id = target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS)
556
557 context = { 'build': Build.objects.filter(pk=build_id)[0],
558 'target': Target.objects.filter(pk=target_id)[0],
559 'objects': packages,
560 'packages_sum' : packages_sum['installed_size__sum'],
561 'object_search_display': "packages included",
562 'tablecols':[
563 {
564 'name':'Package',
565 'qhelp':'Packaged output resulting from building a recipe and included in this image',
566 'orderfield': _get_toggle_order(request, "name"),
567 'ordericon':_get_toggle_order_icon(request, "name"),
568 },
569 {
570 'name':'Package version',
571 'qhelp':'The package version and revision',
572 },
573 {
574 'name':'Size',
575 'qhelp':'The size of the package',
576 'orderfield': _get_toggle_order(request, "size", True),
577 'ordericon':_get_toggle_order_icon(request, "size"),
578 'clclass': 'package_size span2',
579 'hidden' : 0,
580 },
581 {
582 'name':'Size over total (%)',
583 'qhelp':'Proportion of the overall included package size represented by this package',
584 'clclass': 'size_over_total span2',
585 'hidden' : 1,
586 },
587 {
588 'name':'License',
589 'qhelp':'The license under which the package is distributed. Multiple license names separated by the pipe character indicates a choice between licenses. Multiple license names separated by the ampersand character indicates multiple licenses exist that cover different parts of the source',
590 'orderfield': _get_toggle_order(request, "license"),
591 'ordericon':_get_toggle_order_icon(request, "license"),
592 'clclass': 'license',
593 'hidden' : 1,
594 },
595 {
596 'name':'Dependencies',
597 'qhelp':"Package runtime dependencies (i.e. other packages)",
598 'clclass': 'depends',
599 'hidden' : 0,
600 },
601 {
602 'name':'Reverse dependencies',
603 'qhelp':'Package run-time reverse dependencies (i.e. other packages that depend on this package)',
604 'clclass': 'brought_in_by',
605 'hidden' : 0,
606 },
607 {
608 'name':'Recipe',
609 'qhelp':'The name of the recipe building the package',
610 'orderfield': _get_toggle_order(request, "recipe__name"),
611 'ordericon':_get_toggle_order_icon(request, "recipe__name"),
612 'clclass': 'recipe_name',
613 'hidden' : 0,
614 },
615 {
616 'name':'Recipe version',
617 'qhelp':'Version and revision of the recipe building the package',
618 'clclass': 'recipe_version',
619 'hidden' : 1,
620 },
621 {
622 'name':'Layer',
623 'qhelp':'The name of the layer providing the recipe that builds the package',
624 'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__name"),
625 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__name"),
626 'clclass': 'layer_name',
627 'hidden' : 1,
628 },
629 {
630 'name':'Layer branch',
631 'qhelp':'The Git branch of the layer providing the recipe that builds the package',
632 'orderfield': _get_toggle_order(request, "recipe__layer_version__branch"),
633 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__branch"),
634 'clclass': 'layer_branch',
635 'hidden' : 1,
636 },
637 {
638 'name':'Layer commit',
639 'qhelp':'The Git commit of the layer providing the recipe that builds the package',
640 'clclass': 'layer_commit',
641 'hidden' : 1,
642 },
643 {
644 'name':'Layer directory',
645 'qhelp':'Path to the layer providing the recipe that builds the package',
646 'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__local_path"),
647 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__local_path"),
648 'clclass': 'layer_directory',
649 'hidden' : 1,
650 },
651 ]
652 }
653
654 return render(request, template, context)
655
656from django.core.serializers.json import DjangoJSONEncoder
657from django.http import HttpResponse
658def dirinfo_ajax(request, build_id, target_id):
659 top = request.GET.get('start', '/')
660 return HttpResponse(_get_dir_entries(build_id, target_id, top))
661
662from django.utils.functional import Promise
663from django.utils.encoding import force_text
664class LazyEncoder(json.JSONEncoder):
665 def default(self, obj):
666 if isinstance(obj, Promise):
667 return force_text(obj)
668 return super(LazyEncoder, self).default(obj)
669
670from toastergui.templatetags.projecttags import filtered_filesizeformat
671from django import template
672import os
673def _get_dir_entries(build_id, target_id, start):
674 node_str = {
675 Target_File.ITYPE_REGULAR : '-',
676 Target_File.ITYPE_DIRECTORY : 'd',
677 Target_File.ITYPE_SYMLINK : 'l',
678 Target_File.ITYPE_SOCKET : 's',
679 Target_File.ITYPE_FIFO : 'p',
680 Target_File.ITYPE_CHARACTER : 'c',
681 Target_File.ITYPE_BLOCK : 'b',
682 }
683 response = []
684 objects = Target_File.objects.filter(target__exact=target_id, directory__path=start)
685 target_packages = Target_Installed_Package.objects.filter(target__exact=target_id).values_list('package_id', flat=True)
686 for o in objects:
687 # exclude root inode '/'
688 if o.path == '/':
689 continue
690 try:
691 entry = {}
692 entry['parent'] = start
693 entry['name'] = os.path.basename(o.path)
694 entry['fullpath'] = o.path
695
696 # set defaults, not all dentries have packages
697 entry['installed_package'] = None
698 entry['package_id'] = None
699 entry['package'] = None
700 entry['link_to'] = None
701 if o.inodetype == Target_File.ITYPE_DIRECTORY:
702 entry['isdir'] = 1
703 # is there content in directory
704 entry['childcount'] = Target_File.objects.filter(target__exact=target_id, directory__path=o.path).all().count()
705 else:
706 entry['isdir'] = 0
707
708 # resolve the file to get the package from the resolved file
709 resolved_id = o.sym_target_id
710 resolved_path = o.path
711 if target_packages.count():
712 while resolved_id != "" and resolved_id != None:
713 tf = Target_File.objects.get(pk=resolved_id)
714 resolved_path = tf.path
715 resolved_id = tf.sym_target_id
716
717 thisfile=Package_File.objects.all().filter(path__exact=resolved_path, package_id__in=target_packages)
718 if thisfile.count():
719 p = Package.objects.get(pk=thisfile[0].package_id)
720 entry['installed_package'] = p.installed_name
721 entry['package_id'] = str(p.id)
722 entry['package'] = p.name
723 # don't use resolved path from above, show immediate link-to
724 if o.sym_target_id != "" and o.sym_target_id != None:
725 entry['link_to'] = Target_File.objects.get(pk=o.sym_target_id).path
726 t = template.Template('{% load projecttags %} {{ size|filtered_filesizeformat }}')
727 c = template.Context({'size': o.size})
728 entry['size'] = str(t.render(c))
729 if entry['link_to'] != None:
730 entry['permission'] = node_str[o.inodetype] + o.permission
731 else:
732 entry['permission'] = node_str[o.inodetype] + o.permission
733 entry['owner'] = o.owner
734 entry['group'] = o.group
735 response.append(entry)
736
737 except:
738 pass
739
740 # sort by directories first, then by name
741 rsorted = sorted(response, key=lambda entry : entry['name'])
742 rsorted = sorted(rsorted, key=lambda entry : entry['isdir'], reverse=True)
743 return json.dumps(rsorted, cls=LazyEncoder)
744
745def dirinfo(request, build_id, target_id, file_path=None):
746 template = "dirinfo.html"
747 objects = _get_dir_entries(build_id, target_id, '/')
748 packages_sum = Package.objects.filter(id__in=Target_Installed_Package.objects.filter(target_id=target_id).values('package_id')).aggregate(Sum('installed_size'))
749 dir_list = None
750 if file_path != None:
751 """
752 Link from the included package detail file list page and is
753 requesting opening the dir info to a specific file path.
754 Provide the list of directories to expand and the full path to
755 highlight in the page.
756 """
757 # Aassume target's path separator matches host's, that is, os.sep
758 sep = os.sep
759 dir_list = []
760 head = file_path
761 while head != sep:
762 (head,tail) = os.path.split(head)
763 if head != sep:
764 dir_list.insert(0, head)
765
766 context = { 'build': Build.objects.filter(pk=build_id)[0],
767 'target': Target.objects.filter(pk=target_id)[0],
768 'packages_sum': packages_sum['installed_size__sum'],
769 'objects': objects,
770 'dir_list': dir_list,
771 'file_path': file_path,
772 }
773 return render(request, template, context)
774
775def _find_task_dep(task):
776 tp = []
777 for p in Task_Dependency.objects.filter(task=task):
778 if (p.depends_on.order > 0) and (p.depends_on.outcome != Task.OUTCOME_NA):
779 tp.append(p.depends_on);
780 return tp
781
782
783def _find_task_revdep(task):
784 tp = []
785 for p in Task_Dependency.objects.filter(depends_on=task):
786 if (p.task.order > 0) and (p.task.outcome != Task.OUTCOME_NA):
787 tp.append(p.task);
788 return tp
789
790def _find_task_provider(task):
791 task_revdeps = _find_task_revdep(task)
792 for tr in task_revdeps:
793 if tr.outcome != Task.OUTCOME_COVERED:
794 return tr
795 for tr in task_revdeps:
796 trc = _find_task_provider(tr)
797 if trc is not None:
798 return trc
799 return None
800
801def tasks_common(request, build_id, variant, task_anchor):
802# This class is shared between these pages
803#
804# Column tasks buildtime diskio cpuusage
805# --------- ------ ---------- ------- ---------
806# Cache def
807# CPU min -
808# Disk min -
809# Executed def def def def
810# Log
811# Order def +
812# Outcome def def def def
813# Recipe min min min min
814# Version
815# Task min min min min
816# Time min -
817#
818# 'min':on always, 'def':on by default, else hidden
819# '+' default column sort up, '-' default column sort down
820
821 anchor = request.GET.get('anchor', '')
822 if not anchor:
823 anchor=task_anchor
824
825 # default ordering depends on variant
826 if 'buildtime' == variant:
827 title_variant='Time'
828 object_search_display="time data"
829 filter_search_display="tasks"
830 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'elapsed_time:-'};
831 elif 'diskio' == variant:
832 title_variant='Disk I/O'
833 object_search_display="disk I/O data"
834 filter_search_display="tasks"
835 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'disk_io:-'};
836 elif 'cpuusage' == variant:
837 title_variant='CPU usage'
838 object_search_display="CPU usage data"
839 filter_search_display="tasks"
840 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'cpu_usage:-'};
841 else :
842 title_variant='Tasks'
843 object_search_display="tasks"
844 filter_search_display="tasks"
845 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'order:+'};
846
847 template = 'tasks.html'
848 retval = _verify_parameters( request.GET, mandatory_parameters )
849 if retval:
850 if task_anchor:
851 mandatory_parameters['anchor']=task_anchor
852 return _redirect_parameters( variant, request.GET, mandatory_parameters, build_id = build_id)
853 (filter_string, search_term, ordering_string) = _search_tuple(request, Task)
854 queryset_all = Task.objects.filter(build=build_id).exclude(order__isnull=True).exclude(outcome=Task.OUTCOME_NA)
855 queryset_with_search = _get_queryset(Task, queryset_all, None , search_term, ordering_string, 'order')
856 queryset = _get_queryset(Task, queryset_all, filter_string, search_term, ordering_string, 'order')
857
858 # compute the anchor's page
859 if anchor:
860 request.GET = request.GET.copy()
861 del request.GET['anchor']
862 i=0
863 a=int(anchor)
864 count_per_page=int(request.GET.get('count', 100))
865 for task in queryset.iterator():
866 if a == task.order:
867 new_page= (i / count_per_page ) + 1
868 request.GET.__setitem__('page', new_page)
869 mandatory_parameters['page']=new_page
870 return _redirect_parameters( variant, request.GET, mandatory_parameters, build_id = build_id)
871 i += 1
872
873 tasks = _build_page_range(Paginator(queryset, request.GET.get('count', 100)),request.GET.get('page', 1))
874
875 # define (and modify by variants) the 'tablecols' members
876 tc_order={
877 'name':'Order',
878 'qhelp':'The running sequence of each task in the build',
879 'clclass': 'order', 'hidden' : 1,
880 'orderfield':_get_toggle_order(request, "order"),
881 'ordericon':_get_toggle_order_icon(request, "order")}
882 if 'tasks' == variant: tc_order['hidden']='0'; del tc_order['clclass']
883 tc_recipe={
884 'name':'Recipe',
885 'qhelp':'The name of the recipe to which each task applies',
886 'orderfield': _get_toggle_order(request, "recipe__name"),
887 'ordericon':_get_toggle_order_icon(request, "recipe__name"),
888 }
889 tc_recipe_version={
890 'name':'Recipe version',
891 'qhelp':'The version of the recipe to which each task applies',
892 'clclass': 'recipe_version', 'hidden' : 1,
893 }
894 tc_task={
895 'name':'Task',
896 'qhelp':'The name of the task',
897 'orderfield': _get_toggle_order(request, "task_name"),
898 'ordericon':_get_toggle_order_icon(request, "task_name"),
899 }
900 tc_executed={
901 'name':'Executed',
902 'qhelp':"This value tells you if a task had to run (executed) in order to generate the task output, or if the output was provided by another task and therefore the task didn't need to run (not executed)",
903 'clclass': 'executed', 'hidden' : 0,
904 'orderfield': _get_toggle_order(request, "task_executed"),
905 'ordericon':_get_toggle_order_icon(request, "task_executed"),
906 'filter' : {
907 'class' : 'executed',
908 'label': 'Show:',
909 'options' : [
910 ('Executed Tasks', 'task_executed:1', queryset_with_search.filter(task_executed=1).count()),
911 ('Not Executed Tasks', 'task_executed:0', queryset_with_search.filter(task_executed=0).count()),
912 ]
913 }
914
915 }
916 tc_outcome={
917 'name':'Outcome',
918 'qhelp':"This column tells you if 'executed' tasks succeeded or failed. The column also tells you why 'not executed' tasks did not need to run",
919 'clclass': 'outcome', 'hidden' : 0,
920 'orderfield': _get_toggle_order(request, "outcome"),
921 'ordericon':_get_toggle_order_icon(request, "outcome"),
922 'filter' : {
923 'class' : 'outcome',
924 'label': 'Show:',
925 'options' : [
926 ('Succeeded Tasks', 'outcome:%d'%Task.OUTCOME_SUCCESS, queryset_with_search.filter(outcome=Task.OUTCOME_SUCCESS).count(), "'Succeeded' tasks are those that ran and completed during the build" ),
927 ('Failed Tasks', 'outcome:%d'%Task.OUTCOME_FAILED, queryset_with_search.filter(outcome=Task.OUTCOME_FAILED).count(), "'Failed' tasks are those that ran but did not complete during the build"),
928 ('Cached Tasks', 'outcome:%d'%Task.OUTCOME_CACHED, queryset_with_search.filter(outcome=Task.OUTCOME_CACHED).count(), 'Cached tasks restore output from the <code>sstate-cache</code> directory or mirrors'),
929 ('Prebuilt Tasks', 'outcome:%d'%Task.OUTCOME_PREBUILT, queryset_with_search.filter(outcome=Task.OUTCOME_PREBUILT).count(),'Prebuilt tasks didn\'t need to run because their output was reused from a previous build'),
930 ('Covered Tasks', 'outcome:%d'%Task.OUTCOME_COVERED, queryset_with_search.filter(outcome=Task.OUTCOME_COVERED).count(), 'Covered tasks didn\'t need to run because their output is provided by another task in this build'),
931 ('Empty Tasks', 'outcome:%d'%Task.OUTCOME_EMPTY, queryset_with_search.filter(outcome=Task.OUTCOME_NA).count(), 'Empty tasks have no executable content'),
932 ]
933 }
934
935 }
936 tc_log={
937 'name':'Log',
938 'qhelp':'Path to the task log file',
939 'orderfield': _get_toggle_order(request, "logfile"),
940 'ordericon':_get_toggle_order_icon(request, "logfile"),
941 'clclass': 'task_log', 'hidden' : 1,
942 }
943 tc_cache={
944 'name':'Cache attempt',
945 'qhelp':'This column tells you if a task tried to restore output from the <code>sstate-cache</code> directory or mirrors, and reports the result: Succeeded, Failed or File not in cache',
946 'clclass': 'cache_attempt', 'hidden' : 0,
947 'orderfield': _get_toggle_order(request, "sstate_result"),
948 'ordericon':_get_toggle_order_icon(request, "sstate_result"),
949 'filter' : {
950 'class' : 'cache_attempt',
951 'label': 'Show:',
952 'options' : [
953 ('Tasks with cache attempts', 'sstate_result__gt:%d'%Task.SSTATE_NA, queryset_with_search.filter(sstate_result__gt=Task.SSTATE_NA).count(), 'Show all tasks that tried to restore ouput from the <code>sstate-cache</code> directory or mirrors'),
954 ("Tasks with 'File not in cache' attempts", 'sstate_result:%d'%Task.SSTATE_MISS, queryset_with_search.filter(sstate_result=Task.SSTATE_MISS).count(), 'Show tasks that tried to restore output, but did not find it in the <code>sstate-cache</code> directory or mirrors'),
955 ("Tasks with 'Failed' cache attempts", 'sstate_result:%d'%Task.SSTATE_FAILED, queryset_with_search.filter(sstate_result=Task.SSTATE_FAILED).count(), 'Show tasks that found the required output in the <code>sstate-cache</code> directory or mirrors, but could not restore it'),
956 ("Tasks with 'Succeeded' cache attempts", 'sstate_result:%d'%Task.SSTATE_RESTORED, queryset_with_search.filter(sstate_result=Task.SSTATE_RESTORED).count(), 'Show tasks that successfully restored the required output from the <code>sstate-cache</code> directory or mirrors'),
957 ]
958 }
959
960 }
961 #if 'tasks' == variant: tc_cache['hidden']='0';
962 tc_time={
963 'name':'Time (secs)',
964 'qhelp':'How long it took the task to finish in seconds',
965 'orderfield': _get_toggle_order(request, "elapsed_time", True),
966 'ordericon':_get_toggle_order_icon(request, "elapsed_time"),
967 'clclass': 'time_taken', 'hidden' : 1,
968 }
969 if 'buildtime' == variant: tc_time['hidden']='0'; del tc_time['clclass']; tc_cache['hidden']='1';
970 tc_cpu={
971 'name':'CPU usage',
972 'qhelp':'The percentage of task CPU utilization',
973 'orderfield': _get_toggle_order(request, "cpu_usage", True),
974 'ordericon':_get_toggle_order_icon(request, "cpu_usage"),
975 'clclass': 'cpu_used', 'hidden' : 1,
976 }
977 if 'cpuusage' == variant: tc_cpu['hidden']='0'; del tc_cpu['clclass']; tc_cache['hidden']='1';
978 tc_diskio={
979 'name':'Disk I/O (ms)',
980 'qhelp':'Number of miliseconds the task spent doing disk input and output',
981 'orderfield': _get_toggle_order(request, "disk_io", True),
982 'ordericon':_get_toggle_order_icon(request, "disk_io"),
983 'clclass': 'disk_io', 'hidden' : 1,
984 }
985 if 'diskio' == variant: tc_diskio['hidden']='0'; del tc_diskio['clclass']; tc_cache['hidden']='1';
986
987
988 context = { 'objectname': variant,
989 'object_search_display': object_search_display,
990 'filter_search_display': filter_search_display,
991 'title': title_variant,
992 'build': Build.objects.filter(pk=build_id)[0],
993 'objects': tasks,
994 'search_term': search_term,
995 'total_count': queryset_with_search.count(),
996 'tablecols':[
997 tc_order,
998 tc_recipe,
999 tc_recipe_version,
1000 tc_task,
1001 tc_executed,
1002 tc_outcome,
1003 tc_cache,
1004 tc_time,
1005 tc_cpu,
1006 tc_diskio,
1007 tc_log,
1008 ]}
1009
1010 return render(request, template, context)
1011
1012def tasks(request, build_id):
1013 return tasks_common(request, build_id, 'tasks', '')
1014
1015def tasks_task(request, build_id, task_id):
1016 return tasks_common(request, build_id, 'tasks', task_id)
1017
1018def buildtime(request, build_id):
1019 return tasks_common(request, build_id, 'buildtime', '')
1020
1021def diskio(request, build_id):
1022 return tasks_common(request, build_id, 'diskio', '')
1023
1024def cpuusage(request, build_id):
1025 return tasks_common(request, build_id, 'cpuusage', '')
1026
1027
1028def recipes(request, build_id):
1029 template = 'recipes.html'
1030 mandatory_parameters = { 'count': 100, 'page' : 1, 'orderby':'name:+'};
1031 retval = _verify_parameters( request.GET, mandatory_parameters )
1032 if retval:
1033 return _redirect_parameters( 'recipes', request.GET, mandatory_parameters, build_id = build_id)
1034 (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe)
1035 queryset = Recipe.objects.filter(layer_version__id__in=Layer_Version.objects.filter(build=build_id))
1036 queryset = _get_queryset(Recipe, queryset, filter_string, search_term, ordering_string, 'name')
1037
1038 recipes = _build_page_range(Paginator(queryset, request.GET.get('count', 100)),request.GET.get('page', 1))
1039
1040 context = {
1041 'objectname': 'recipes',
1042 'build': Build.objects.filter(pk=build_id)[0],
1043 'objects': recipes,
1044 'tablecols':[
1045 {
1046 'name':'Recipe',
1047 'qhelp':'Information about a single piece of software, including where to download the source, configuration options, how to compile the source files and how to package the compiled output',
1048 'orderfield': _get_toggle_order(request, "name"),
1049 'ordericon':_get_toggle_order_icon(request, "name"),
1050 },
1051 {
1052 'name':'Recipe version',
1053 'qhelp':'The recipe version and revision',
1054 },
1055 {
1056 'name':'Dependencies',
1057 'qhelp':'Recipe build-time dependencies (i.e. other recipes)',
1058 'clclass': 'depends_on', 'hidden': 1,
1059 },
1060 {
1061 'name':'Reverse dependencies',
1062 'qhelp':'Recipe build-time reverse dependencies (i.e. the recipes that depend on this recipe)',
1063 'clclass': 'depends_by', 'hidden': 1,
1064 },
1065 {
1066 'name':'Recipe file',
1067 'qhelp':'Path to the recipe .bb file',
1068 'orderfield': _get_toggle_order(request, "file_path"),
1069 'ordericon':_get_toggle_order_icon(request, "file_path"),
1070 'clclass': 'recipe_file', 'hidden': 0,
1071 },
1072 {
1073 'name':'Section',
1074 'qhelp':'The section in which recipes should be categorized',
1075 'orderfield': _get_toggle_order(request, "section"),
1076 'ordericon':_get_toggle_order_icon(request, "section"),
1077 'clclass': 'recipe_section', 'hidden': 0,
1078 },
1079 {
1080 'name':'License',
1081 'qhelp':'The list of source licenses for the recipe. Multiple license names separated by the pipe character indicates a choice between licenses. Multiple license names separated by the ampersand character indicates multiple licenses exist that cover different parts of the source',
1082 'orderfield': _get_toggle_order(request, "license"),
1083 'ordericon':_get_toggle_order_icon(request, "license"),
1084 'clclass': 'recipe_license', 'hidden': 0,
1085 },
1086 {
1087 'name':'Layer',
1088 'qhelp':'The name of the layer providing the recipe',
1089 'orderfield': _get_toggle_order(request, "layer_version__layer__name"),
1090 'ordericon':_get_toggle_order_icon(request, "layer_version__layer__name"),
1091 'clclass': 'layer_version__layer__name', 'hidden': 0,
1092 },
1093 {
1094 'name':'Layer branch',
1095 'qhelp':'The Git branch of the layer providing the recipe',
1096 'orderfield': _get_toggle_order(request, "layer_version__branch"),
1097 'ordericon':_get_toggle_order_icon(request, "layer_version__branch"),
1098 'clclass': 'layer_version__branch', 'hidden': 1,
1099 },
1100 {
1101 'name':'Layer commit',
1102 'qhelp':'The Git commit of the layer providing the recipe',
1103 'clclass': 'layer_version__layer__commit', 'hidden': 1,
1104 },
1105 {
1106 'name':'Layer directory',
1107 'qhelp':'Path to the layer prodiving the recipe',
1108 'orderfield': _get_toggle_order(request, "layer_version__layer__local_path"),
1109 'ordericon':_get_toggle_order_icon(request, "layer_version__layer__local_path"),
1110 'clclass': 'layer_version__layer__local_path', 'hidden': 1,
1111 },
1112 ]
1113 }
1114
1115 return render(request, template, context)
1116
1117
1118def configuration(request, build_id):
1119 template = 'configuration.html'
1120
1121 variables = Variable.objects.filter(build=build_id)
1122 BB_VERSION=variables.filter(variable_name='BB_VERSION')[0].variable_value
1123 BUILD_SYS=variables.filter(variable_name='BUILD_SYS')[0].variable_value
1124 NATIVELSBSTRING=variables.filter(variable_name='NATIVELSBSTRING')[0].variable_value
1125 TARGET_SYS=variables.filter(variable_name='TARGET_SYS')[0].variable_value
1126 MACHINE=variables.filter(variable_name='MACHINE')[0].variable_value
1127 DISTRO=variables.filter(variable_name='DISTRO')[0].variable_value
1128 DISTRO_VERSION=variables.filter(variable_name='DISTRO_VERSION')[0].variable_value
1129 TUNE_FEATURES=variables.filter(variable_name='TUNE_FEATURES')[0].variable_value
1130 TARGET_FPU=variables.filter(variable_name='TARGET_FPU')[0].variable_value
1131
1132 targets = Target.objects.filter(build=build_id)
1133
1134 context = {
1135 'objectname': 'configuration',
1136 'object_search_display':'variables',
1137 'filter_search_display':'variables',
1138 'build': Build.objects.filter(pk=build_id)[0],
1139 'BB_VERSION':BB_VERSION,
1140 'BUILD_SYS':BUILD_SYS,
1141 'NATIVELSBSTRING':NATIVELSBSTRING,
1142 'TARGET_SYS':TARGET_SYS,
1143 'MACHINE':MACHINE,
1144 'DISTRO':DISTRO,
1145 'DISTRO_VERSION':DISTRO_VERSION,
1146 'TUNE_FEATURES':TUNE_FEATURES,
1147 'TARGET_FPU':TARGET_FPU,
1148 'targets':targets,
1149 }
1150 return render(request, template, context)
1151
1152
1153def configvars(request, build_id):
1154 template = 'configvars.html'
1155 mandatory_parameters = { 'count': 100, 'page' : 1, 'orderby':'variable_name:+', 'filter':'description__regex:.+'};
1156 retval = _verify_parameters( request.GET, mandatory_parameters )
1157 (filter_string, search_term, ordering_string) = _search_tuple(request, Variable)
1158 if retval:
1159 # if new search, clear the default filter
1160 if search_term and len(search_term):
1161 mandatory_parameters['filter']=''
1162 return _redirect_parameters( 'configvars', request.GET, mandatory_parameters, build_id = build_id)
1163
1164 queryset = Variable.objects.filter(build=build_id).exclude(variable_name__istartswith='B_').exclude(variable_name__istartswith='do_')
1165 queryset_with_search = _get_queryset(Variable, queryset, None, search_term, ordering_string, 'variable_name').exclude(variable_value='',vhistory__file_name__isnull=True)
1166 queryset = _get_queryset(Variable, queryset, filter_string, search_term, ordering_string, 'variable_name')
1167 # remove records where the value is empty AND there are no history files
1168 queryset = queryset.exclude(variable_value='',vhistory__file_name__isnull=True)
1169
1170 variables = _build_page_range(Paginator(queryset, request.GET.get('count', 50)), request.GET.get('page', 1))
1171
1172 # show all matching files (not just the last one)
1173 file_filter= search_term + ":"
1174 if filter_string.find('/conf/') > 0:
1175 file_filter += 'conf/(local|bblayers).conf'
1176 if filter_string.find('conf/machine/') > 0:
1177 file_filter += 'conf/machine/'
1178 if filter_string.find('conf/distro/') > 0:
1179 file_filter += 'conf/distro/'
1180 if filter_string.find('/bitbake.conf') > 0:
1181 file_filter += '/bitbake.conf'
1182 build_dir=re.sub("/tmp/log/.*","",Build.objects.filter(pk=build_id)[0].cooker_log_path)
1183
1184 context = {
1185 'objectname': 'configvars',
1186 'object_search_display':'BitBake variables',
1187 'filter_search_display':'variables',
1188 'file_filter': file_filter,
1189 'build': Build.objects.filter(pk=build_id)[0],
1190 'objects' : variables,
1191 'total_count':queryset_with_search.count(),
1192 'search_term':search_term,
1193 # Specifies the display of columns for the table, appearance in "Edit columns" box, toggling default show/hide, and specifying filters for columns
1194 'tablecols' : [
1195 {'name': 'Variable',
1196 'qhelp': "BitBake is a generic task executor that considers a list of tasks with dependencies and handles metadata that consists of variables in a certain format that get passed to the tasks",
1197 'orderfield': _get_toggle_order(request, "variable_name"),
1198 'ordericon':_get_toggle_order_icon(request, "variable_name"),
1199 },
1200 {'name': 'Value',
1201 'qhelp': "The value assigned to the variable",
1202 'dclass': "span4",
1203 },
1204 {'name': 'Set in file',
1205 'qhelp': "The last configuration file that touched the variable value",
1206 'clclass': 'file', 'hidden' : 0,
1207 'filter' : {
1208 'class' : 'vhistory__file_name',
1209 'label': 'Show:',
1210 'options' : [
1211 ('Local configuration variables', 'vhistory__file_name__contains:'+build_dir+'/conf/',queryset_with_search.filter(vhistory__file_name__contains=build_dir+'/conf/').count(), 'Select this filter to see variables set by the <code>local.conf</code> and <code>bblayers.conf</code> configuration files inside the <code>/build/conf/</code> directory'),
1212 ('Machine configuration variables', 'vhistory__file_name__contains:conf/machine/',queryset_with_search.filter(vhistory__file_name__contains='conf/machine').count(), 'Select this filter to see variables set by the configuration file(s) inside your layers <code>/conf/machine/</code> directory'),
1213 ('Distro configuration variables', 'vhistory__file_name__contains:conf/distro/',queryset_with_search.filter(vhistory__file_name__contains='conf/distro').count(), 'Select this filter to see variables set by the configuration file(s) inside your layers <code>/conf/distro/</code> directory'),
1214 ('Layer configuration variables', 'vhistory__file_name__contains:conf/layer.conf',queryset_with_search.filter(vhistory__file_name__contains='conf/layer.conf').count(), 'Select this filter to see variables set by the <code>layer.conf</code> configuration file inside your layers'),
1215 ('bitbake.conf variables', 'vhistory__file_name__contains:/bitbake.conf',queryset_with_search.filter(vhistory__file_name__contains='/bitbake.conf').count(), 'Select this filter to see variables set by the <code>bitbake.conf</code> configuration file'),
1216 ]
1217 },
1218 },
1219 {'name': 'Description',
1220 'qhelp': "A brief explanation of the variable",
1221 'clclass': 'description', 'hidden' : 0,
1222 'dclass': "span4",
1223 'filter' : {
1224 'class' : 'description',
1225 'label': 'Show:',
1226 'options' : [
1227 ('Variables with description', 'description__regex:.+', queryset_with_search.filter(description__regex='.+').count(), 'We provide descriptions for the most common BitBake variables. The list of descriptions lives in <code>meta/conf/documentation.conf</code>'),
1228 ]
1229 },
1230 },
1231 ],
1232 }
1233
1234 return render(request, template, context)
1235
1236
1237def bpackage(request, build_id):
1238 template = 'bpackage.html'
1239 mandatory_parameters = { 'count': 100, 'page' : 1, 'orderby':'name:+'};
1240 retval = _verify_parameters( request.GET, mandatory_parameters )
1241 if retval:
1242 return _redirect_parameters( 'packages', request.GET, mandatory_parameters, build_id = build_id)
1243 (filter_string, search_term, ordering_string) = _search_tuple(request, Package)
1244 queryset = Package.objects.filter(build = build_id).filter(size__gte=0)
1245 queryset = _get_queryset(Package, queryset, filter_string, search_term, ordering_string, 'name')
1246
1247 packages = _build_page_range(Paginator(queryset, request.GET.get('count', 100)),request.GET.get('page', 1))
1248
1249 context = {
1250 'objectname': 'packages built',
1251 'build': Build.objects.filter(pk=build_id)[0],
1252 'objects' : packages,
1253 'tablecols':[
1254 {
1255 'name':'Package',
1256 'qhelp':'Packaged output resulting from building a recipe',
1257 'orderfield': _get_toggle_order(request, "name"),
1258 'ordericon':_get_toggle_order_icon(request, "name"),
1259 },
1260 {
1261 'name':'Package version',
1262 'qhelp':'The package version and revision',
1263 },
1264 {
1265 'name':'Size',
1266 'qhelp':'The size of the package',
1267 'orderfield': _get_toggle_order(request, "size", True),
1268 'ordericon':_get_toggle_order_icon(request, "size"),
1269 'clclass': 'size span2', 'hidden': 0,
1270 },
1271 {
1272 'name':'License',
1273 'qhelp':'The license under which the package is distributed. Multiple license names separated by the pipe character indicates a choice between licenses. Multiple license names separated by the ampersand character indicates multiple licenses exist that cover different parts of the source',
1274 'orderfield': _get_toggle_order(request, "license"),
1275 'ordericon':_get_toggle_order_icon(request, "license"),
1276 'clclass': 'license', 'hidden': 1,
1277 },
1278 {
1279 'name':'Recipe',
1280 'qhelp':'The name of the recipe building the package',
1281 'orderfield': _get_toggle_order(request, "recipe__name"),
1282 'ordericon':_get_toggle_order_icon(request, "recipe__name"),
1283 'clclass': 'recipe__name', 'hidden': 0,
1284 },
1285 {
1286 'name':'Recipe version',
1287 'qhelp':'Version and revision of the recipe building the package',
1288 'clclass': 'recipe__version', 'hidden': 1,
1289 },
1290 {
1291 'name':'Layer',
1292 'qhelp':'The name of the layer providing the recipe that builds the package',
1293 'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__name"),
1294 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__name"),
1295 'clclass': 'recipe__layer_version__layer__name', 'hidden': 1,
1296 },
1297 {
1298 'name':'Layer branch',
1299 'qhelp':'The Git branch of the layer providing the recipe that builds the package',
1300 'orderfield': _get_toggle_order(request, "recipe__layer_version__branch"),
1301 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__branch"),
1302 'clclass': 'recipe__layer_version__branch', 'hidden': 1,
1303 },
1304 {
1305 'name':'Layer commit',
1306 'qhelp':'The Git commit of the layer providing the recipe that builds the package',
1307 'clclass': 'recipe__layer_version__layer__commit', 'hidden': 1,
1308 },
1309 {
1310 'name':'Layer directory',
1311 'qhelp':'Path to the layer providing the recipe that builds the package',
1312 'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__local_path"),
1313 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__local_path"),
1314 'clclass': 'recipe__layer_version__layer__local_path', 'hidden': 1,
1315 },
1316 ]
1317 }
1318
1319 return render(request, template, context)
1320
1321def bfile(request, build_id, package_id):
1322 template = 'bfile.html'
1323 files = Package_File.objects.filter(package = package_id)
1324 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : files}
1325 return render(request, template, context)
1326
1327def tpackage(request, build_id, target_id):
1328 template = 'package.html'
1329 packages = map(lambda x: x.package, list(Target_Installed_Package.objects.filter(target=target_id)))
1330 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
1331 return render(request, template, context)
1332
1333def layer(request):
1334 template = 'layer.html'
1335 layer_info = Layer.objects.all()
1336
1337 for li in layer_info:
1338 li.versions = Layer_Version.objects.filter(layer = li)
1339 for liv in li.versions:
1340 liv.count = Recipe.objects.filter(layer_version__id = liv.id).count()
1341
1342 context = {'objects': layer_info}
1343
1344 return render(request, template, context)
1345
1346
1347def layer_versions_recipes(request, layerversion_id):
1348 template = 'recipe.html'
1349 recipes = Recipe.objects.filter(layer_version__id = layerversion_id)
1350
1351 context = {'objects': recipes,
1352 'layer_version' : Layer_Version.objects.filter( id = layerversion_id )[0]
1353 }
1354
1355 return render(request, template, context)
1356
1357# A set of dependency types valid for both included and built package views
1358OTHER_DEPENDS_BASE = [
1359 Package_Dependency.TYPE_RSUGGESTS,
1360 Package_Dependency.TYPE_RPROVIDES,
1361 Package_Dependency.TYPE_RREPLACES,
1362 Package_Dependency.TYPE_RCONFLICTS,
1363 ]
1364
1365# value for invalid row id
1366INVALID_KEY = -1
1367
1368"""
1369Given a package id, target_id retrieves two sets of this image and package's
1370dependencies. The return value is a dictionary consisting of two other
1371lists: a list of 'runtime' dependencies, that is, having RDEPENDS
1372values in source package's recipe, and a list of other dependencies, that is
1373the list of possible recipe variables as found in OTHER_DEPENDS_BASE plus
1374the RRECOMENDS or TRECOMENDS value.
1375The lists are built in the sort order specified for the package runtime
1376dependency views.
1377"""
1378def _get_package_dependencies(package_id, target_id = INVALID_KEY):
1379 runtime_deps = []
1380 other_deps = []
1381 other_depends_types = OTHER_DEPENDS_BASE
1382
1383 if target_id != INVALID_KEY :
1384 rdepends_type = Package_Dependency.TYPE_TRDEPENDS
1385 other_depends_types += [Package_Dependency.TYPE_TRECOMMENDS]
1386 else :
1387 rdepends_type = Package_Dependency.TYPE_RDEPENDS
1388 other_depends_types += [Package_Dependency.TYPE_RRECOMMENDS]
1389
1390 package = Package.objects.get(pk=package_id)
1391 if target_id != INVALID_KEY :
1392 alldeps = package.package_dependencies_source.filter(target_id__exact = target_id)
1393 else :
1394 alldeps = package.package_dependencies_source.all()
1395 for idep in alldeps:
1396 dep_package = Package.objects.get(pk=idep.depends_on_id)
1397 dep_entry = Package_Dependency.DEPENDS_DICT[idep.dep_type]
1398 if dep_package.version == '' :
1399 version = ''
1400 else :
1401 version = dep_package.version + "-" + dep_package.revision
1402 installed = False
1403 if target_id != INVALID_KEY :
1404 if Target_Installed_Package.objects.filter(target_id__exact = target_id, package_id__exact = dep_package.id).count() > 0:
1405 installed = True
1406 dep = {
1407 'name' : dep_package.name,
1408 'version' : version,
1409 'size' : dep_package.size,
1410 'dep_type' : idep.dep_type,
1411 'dep_type_display' : dep_entry[0].capitalize(),
1412 'dep_type_help' : dep_entry[1] % (dep_package.name, package.name),
1413 'depends_on_id' : dep_package.id,
1414 'installed' : installed,
1415 }
1416
1417 if target_id != INVALID_KEY:
1418 dep['alias'] = _get_package_alias(dep_package)
1419
1420 if idep.dep_type == rdepends_type :
1421 runtime_deps.append(dep)
1422 elif idep.dep_type in other_depends_types :
1423 other_deps.append(dep)
1424
1425 rdep_sorted = sorted(runtime_deps, key=lambda k: k['name'])
1426 odep_sorted = sorted(
1427 sorted(other_deps, key=lambda k: k['name']),
1428 key=lambda k: k['dep_type'])
1429 retvalues = {'runtime_deps' : rdep_sorted, 'other_deps' : odep_sorted}
1430 return retvalues
1431
1432# Return the count of packages dependent on package for this target_id image
1433def _get_package_reverse_dep_count(package, target_id):
1434 return package.package_dependencies_target.filter(target_id__exact=target_id, dep_type__exact = Package_Dependency.TYPE_TRDEPENDS).count()
1435
1436# Return the count of the packages that this package_id is dependent on.
1437# Use one of the two RDEPENDS types, either TRDEPENDS if the package was
1438# installed, or else RDEPENDS if only built.
1439def _get_package_dependency_count(package, target_id, is_installed):
1440 if is_installed :
1441 return package.package_dependencies_source.filter(target_id__exact = target_id,
1442 dep_type__exact = Package_Dependency.TYPE_TRDEPENDS).count()
1443 else :
1444 return package.package_dependencies_source.filter(dep_type__exact = Package_Dependency.TYPE_RDEPENDS).count()
1445
1446def _get_package_alias(package):
1447 alias = package.installed_name
1448 if alias != None and alias != '' and alias != package.name:
1449 return alias
1450 else:
1451 return ''
1452
1453def _get_fullpackagespec(package):
1454 r = package.name
1455 version_good = package.version != None and package.version != ''
1456 revision_good = package.revision != None and package.revision != ''
1457 if version_good or revision_good:
1458 r += '_'
1459 if version_good:
1460 r += package.version
1461 if revision_good:
1462 r += '-'
1463 if revision_good:
1464 r += package.revision
1465 return r
1466
1467def package_built_detail(request, build_id, package_id):
1468 template = "package_built_detail.html"
1469 if Build.objects.filter(pk=build_id).count() == 0 :
1470 return redirect(builds)
1471
1472 # follow convention for pagination w/ search although not used for this view
1473 queryset = Package_File.objects.filter(package_id__exact=package_id)
1474 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'path:+'};
1475 retval = _verify_parameters( request.GET, mandatory_parameters )
1476 if retval:
1477 return _redirect_parameters( 'package_built_detail', request.GET, mandatory_parameters, build_id = build_id, package_id = package_id)
1478
1479 (filter_string, search_term, ordering_string) = _search_tuple(request, Package_File)
1480 paths = _get_queryset(Package_File, queryset, filter_string, search_term, ordering_string, 'path')
1481
1482 package = Package.objects.filter(pk=package_id)[0]
1483 package.fullpackagespec = _get_fullpackagespec(package)
1484 context = {
1485 'build' : Build.objects.filter(pk=build_id)[0],
1486 'package' : package,
1487 'dependency_count' : _get_package_dependency_count(package, -1, False),
1488 'objects' : paths,
1489 'tablecols':[
1490 {
1491 'name':'File',
1492 'orderfield': _get_toggle_order(request, "path"),
1493 'ordericon':_get_toggle_order_icon(request, "path"),
1494 },
1495 {
1496 'name':'Size',
1497 'orderfield': _get_toggle_order(request, "size", True),
1498 'ordericon':_get_toggle_order_icon(request, "size"),
1499 'dclass': 'sizecol span2',
1500 },
1501 ]
1502 }
1503 if paths.all().count() < 2:
1504 context['disable_sort'] = True;
1505 return render(request, template, context)
1506
1507def package_built_dependencies(request, build_id, package_id):
1508 template = "package_built_dependencies.html"
1509 if Build.objects.filter(pk=build_id).count() == 0 :
1510 return redirect(builds)
1511
1512 package = Package.objects.filter(pk=package_id)[0]
1513 package.fullpackagespec = _get_fullpackagespec(package)
1514 dependencies = _get_package_dependencies(package_id)
1515 context = {
1516 'build' : Build.objects.filter(pk=build_id)[0],
1517 'package' : package,
1518 'runtime_deps' : dependencies['runtime_deps'],
1519 'other_deps' : dependencies['other_deps'],
1520 'dependency_count' : _get_package_dependency_count(package, -1, False)
1521 }
1522 return render(request, template, context)
1523
1524
1525def package_included_detail(request, build_id, target_id, package_id):
1526 template = "package_included_detail.html"
1527 if Build.objects.filter(pk=build_id).count() == 0 :
1528 return redirect(builds)
1529
1530
1531 # follow convention for pagination w/ search although not used for this view
1532 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'path:+'};
1533 retval = _verify_parameters( request.GET, mandatory_parameters )
1534 if retval:
1535 return _redirect_parameters( 'package_included_detail', request.GET, mandatory_parameters, build_id = build_id, target_id = target_id, package_id = package_id)
1536 (filter_string, search_term, ordering_string) = _search_tuple(request, Package_File)
1537
1538 queryset = Package_File.objects.filter(package_id__exact=package_id)
1539 paths = _get_queryset(Package_File, queryset, filter_string, search_term, ordering_string, 'path')
1540
1541 package = Package.objects.filter(pk=package_id)[0]
1542 package.fullpackagespec = _get_fullpackagespec(package)
1543 package.alias = _get_package_alias(package)
1544 target = Target.objects.filter(pk=target_id)[0]
1545 context = {
1546 'build' : Build.objects.filter(pk=build_id)[0],
1547 'target' : target,
1548 'package' : package,
1549 'reverse_count' : _get_package_reverse_dep_count(package, target_id),
1550 'dependency_count' : _get_package_dependency_count(package, target_id, True),
1551 'objects': paths,
1552 'tablecols':[
1553 {
1554 'name':'File',
1555 'orderfield': _get_toggle_order(request, "path"),
1556 'ordericon':_get_toggle_order_icon(request, "path"),
1557 },
1558 {
1559 'name':'Size',
1560 'orderfield': _get_toggle_order(request, "size", True),
1561 'ordericon':_get_toggle_order_icon(request, "size"),
1562 'dclass': 'sizecol span2',
1563 },
1564 ]
1565 }
1566 if paths.all().count() < 2:
1567 context['disable_sort'] = True;
1568 return render(request, template, context)
1569
1570def package_included_dependencies(request, build_id, target_id, package_id):
1571 template = "package_included_dependencies.html"
1572 if Build.objects.filter(pk=build_id).count() == 0 :
1573 return redirect(builds)
1574
1575 package = Package.objects.filter(pk=package_id)[0]
1576 package.fullpackagespec = _get_fullpackagespec(package)
1577 package.alias = _get_package_alias(package)
1578 target = Target.objects.filter(pk=target_id)[0]
1579
1580 dependencies = _get_package_dependencies(package_id, target_id)
1581 context = {
1582 'build' : Build.objects.filter(pk=build_id)[0],
1583 'package' : package,
1584 'target' : target,
1585 'runtime_deps' : dependencies['runtime_deps'],
1586 'other_deps' : dependencies['other_deps'],
1587 'reverse_count' : _get_package_reverse_dep_count(package, target_id),
1588 'dependency_count' : _get_package_dependency_count(package, target_id, True)
1589 }
1590 return render(request, template, context)
1591
1592def package_included_reverse_dependencies(request, build_id, target_id, package_id):
1593 template = "package_included_reverse_dependencies.html"
1594 if Build.objects.filter(pk=build_id).count() == 0 :
1595 return redirect(builds)
1596
1597 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'package__name:+'};
1598 retval = _verify_parameters( request.GET, mandatory_parameters )
1599 if retval:
1600 return _redirect_parameters( 'package_included_reverse_dependencies', request.GET, mandatory_parameters, build_id = build_id, target_id = target_id, package_id = package_id)
1601 (filter_string, search_term, ordering_string) = _search_tuple(request, Package_File)
1602
1603 queryset = Package_Dependency.objects.select_related('depends_on__name', 'depends_on__size').filter(depends_on=package_id, target_id=target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS)
1604 objects = _get_queryset(Package_Dependency, queryset, filter_string, search_term, ordering_string, 'package__name')
1605
1606 package = Package.objects.filter(pk=package_id)[0]
1607 package.fullpackagespec = _get_fullpackagespec(package)
1608 package.alias = _get_package_alias(package)
1609 target = Target.objects.filter(pk=target_id)[0]
1610 for o in objects:
1611 if o.package.version != '':
1612 o.package.version += '-' + o.package.revision
1613 o.alias = _get_package_alias(o.package)
1614 context = {
1615 'build' : Build.objects.filter(pk=build_id)[0],
1616 'package' : package,
1617 'target' : target,
1618 'objects' : objects,
1619 'reverse_count' : _get_package_reverse_dep_count(package, target_id),
1620 'dependency_count' : _get_package_dependency_count(package, target_id, True),
1621 'tablecols':[
1622 {
1623 'name':'Package',
1624 'orderfield': _get_toggle_order(request, "package__name"),
1625 'ordericon': _get_toggle_order_icon(request, "package__name"),
1626 },
1627 {
1628 'name':'Version',
1629 },
1630 {
1631 'name':'Size',
1632 'orderfield': _get_toggle_order(request, "package__size", True),
1633 'ordericon': _get_toggle_order_icon(request, "package__size"),
1634 'dclass': 'sizecol span2',
1635 },
1636 ]
1637 }
1638 if objects.all().count() < 2:
1639 context['disable_sort'] = True;
1640 return render(request, template, context)
1641
1642def image_information_dir(request, build_id, target_id, packagefile_id):
1643 # stubbed for now
1644 return redirect(builds)
1645