`, and ``.\n@font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base: @bd-base-font-family;\n\n@font-size-base: @bd-base-font-size; // 14px;\n@font-size-large: ceil(@font-size-base * 1.25); // ~18px\n@font-size-small: ceil(@font-size-base * 0.85); // ~12px\n\n@font-size-h1: @bd-headings-font-size-xlarge; // floor(@font-size-base * 2.6); // ~36px\n@font-size-h2: @bd-headings-font-size-large; // floor(@font-size-base * 2.15); // ~30px\n@font-size-h3: @bd-headings-font-size-medium; // ceil(@font-size-base * 1.7); // ~24px\n@font-size-h4: @bd-headings-font-size-small; // ceil(@font-size-base * 1.25); // ~18px\n@font-size-h5: @bd-headings-font-size-mini; // @font-size-base;\n@font-size-h6: @bd-headings-font-size-xsmall; // ceil(@font-size-base * 0.85); // ~12px\n\n@line-height-base: @bd-line-height-factor; // 1.428571429; // 20/14\n@line-height-computed: @bd-base-line-height; // floor(@font-size-base * @line-height-base); // ~20px\n\n//** By default, this inherits from the ``.\n@headings-font-family: @bd-headings-font-family; // inherit;\n@headings-font-weight: 500;\n@headings-line-height: 1.1;\n@headings-color: inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path: \"../fonts/\";\n@icon-font-name: \"glyphicons-halflings-regular\";\n@icon-font-svg-id: \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical: 6px;\n@padding-base-horizontal: 12px;\n\n@padding-large-vertical: 10px;\n@padding-large-horizontal: 16px;\n\n@padding-small-vertical: 5px;\n@padding-small-horizontal: 10px;\n\n@padding-xs-vertical: 1px;\n@padding-xs-horizontal: 5px;\n\n@line-height-large: 1.33;\n@line-height-small: 1.5;\n\n@border-radius-base: 4px;\n@border-radius-large: 6px;\n@border-radius-small: 3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color: #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg: @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base: 4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large: 5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ` | `s.\n@table-cell-padding: 8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding: 5px;\n\n@table-bg: @bd-table-bg; // overall background-color\n@table-bg-accent: @bd-table-bg-accent; // for striping\n@table-bg-hover: @bd-table-bg-hover;\n@table-bg-active: @bd-table-bg-active;\n\n@table-border-color: @bd-table-border-color; // table and cell border\n\n\n//** Border color for table and cell borders.\n@table-border-color: #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight: normal;\n\n@btn-default-color: #333;\n@btn-default-bg: #fff;\n@btn-default-border: #ccc;\n\n@btn-primary-color: #fff;\n@btn-primary-bg: @brand-primary;\n@btn-primary-border: darken(@btn-primary-bg, 5%);\n\n@btn-success-color: #fff;\n@btn-success-bg: @brand-success;\n@btn-success-border: darken(@btn-success-bg, 5%);\n\n@btn-info-color: #fff;\n@btn-info-bg: @brand-info;\n@btn-info-border: darken(@btn-info-bg, 5%);\n\n@btn-warning-color: #fff;\n@btn-warning-bg: @brand-warning;\n@btn-warning-border: darken(@btn-warning-bg, 5%);\n\n@btn-danger-color: #fff;\n@btn-danger-bg: @brand-danger;\n@btn-danger-border: darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color: @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n@input-bg: #fff;\n//** `` background color\n@input-bg-disabled: @gray-lighter;\n\n//** Text color for ``s\n@input-color: @gray;\n//** `` border color\n@input-border: #ccc;\n//** `` border radius\n@input-border-radius: @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus: #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder: @gray-light;\n\n//** Default `.form-control` height\n@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color: @gray-dark;\n@legend-border-color: #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg: @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg: #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border: rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border: #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg: #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color: @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color: darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg: #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color: @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg: @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color: @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color: @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color: #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar: 1000;\n@zindex-dropdown: 1000;\n@zindex-popover: 1010;\n@zindex-tooltip: 1030;\n@zindex-navbar-fixed: 1030;\n@zindex-modal-background: 1040;\n@zindex-modal: 1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs: 480px;\n@screen-xs-min: @screen-xs;\n@screen-phone: @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm: 768px;\n@screen-sm-min: @screen-sm;\n@screen-tablet: @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md: 992px;\n@screen-md-min: @screen-md;\n@screen-desktop: @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg: 1200px;\n@screen-lg-min: @screen-lg;\n@screen-lg-desktop: @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max: @bd-screen-xs-max;\n@screen-sm-max: @bd-screen-sm-max;\n@screen-md-max: @bd-screen-md-max;\n\n\n// Grid system\n// --------------------------------------------------\n\n// Number of columns in the grid system\n@grid-columns: @bd-grid-columns; //12;\n// Padding, to be divided by two and applied to the left and right of all columns\n@grid-gutter-width: @bd-grid-gutter-width; // 30px;\n\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint: @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet: ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm: @container-tablet;\n\n// Medium screen / desktop\n@container-desktop: ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md: @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop: ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg: @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height: 50px;\n@navbar-margin-bottom: @line-height-computed;\n@navbar-border-radius: @border-radius-base;\n@navbar-padding-horizontal: @bd-navbar-padding-horizontal; //floor(@grid-gutter-width / 2);\n@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height: 340px;\n\n@navbar-default-color: #777;\n@navbar-default-bg: #f8f8f8;\n@navbar-default-border: darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color: #777;\n@navbar-default-link-hover-color: #333;\n@navbar-default-link-hover-bg: transparent;\n@navbar-default-link-active-color: #555;\n@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color: #ccc;\n@navbar-default-link-disabled-bg: transparent;\n\n// Navbar brand label\n@navbar-default-brand-color: @navbar-default-link-color;\n@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg: transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg: #ddd;\n@navbar-default-toggle-icon-bar-bg: #888;\n@navbar-default-toggle-border-color: #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color: @gray-light;\n@navbar-inverse-bg: #222;\n@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color: @gray-light;\n@navbar-inverse-link-hover-color: #fff;\n@navbar-inverse-link-hover-bg: transparent;\n@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color: #444;\n@navbar-inverse-link-disabled-bg: transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color: @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color: #fff;\n@navbar-inverse-brand-hover-bg: transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg: #333;\n@navbar-inverse-toggle-icon-bar-bg: #fff;\n@navbar-inverse-toggle-border-color: #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding: 10px 15px;\n@nav-link-hover-bg: transparent;\n\n@nav-disabled-link-color: @gray-light;\n@nav-disabled-link-hover-color: @gray-light;\n\n@nav-open-link-hover-color: #fff;\n\n//== Tabs\n@nav-tabs-border-color: #ddd;\n\n@nav-tabs-link-hover-border-color: @gray-lighter;\n\n@nav-tabs-active-link-hover-bg: @body-bg;\n@nav-tabs-active-link-hover-color: @gray;\n@nav-tabs-active-link-hover-border-color: #ddd;\n\n@nav-tabs-justified-link-border-color: #ddd;\n@nav-tabs-justified-active-link-border-color: @body-bg;\n\n//== Pills\n@nav-pills-border-radius: @border-radius-base;\n@nav-pills-active-link-hover-bg: @component-active-bg;\n@nav-pills-active-link-hover-color: @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color: @link-color;\n@pagination-bg: #fff;\n@pagination-border: #ddd;\n\n@pagination-hover-color: @link-hover-color;\n@pagination-hover-bg: @gray-lighter;\n@pagination-hover-border: #ddd;\n\n@pagination-active-color: #fff;\n@pagination-active-bg: @brand-primary;\n@pagination-active-border: @brand-primary;\n\n@pagination-disabled-color: @gray-light;\n@pagination-disabled-bg: #fff;\n@pagination-disabled-border: #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg: @pagination-bg;\n@pager-border: @pagination-border;\n@pager-border-radius: 15px;\n\n@pager-hover-bg: @pagination-hover-bg;\n\n@pager-active-bg: @pagination-active-bg;\n@pager-active-color: @pagination-active-color;\n\n@pager-disabled-color: @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding: 30px;\n@jumbotron-color: inherit;\n@jumbotron-bg: @gray-lighter;\n@jumbotron-heading-color: inherit;\n@jumbotron-font-size: ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text: #3c763d;\n@state-success-bg: #dff0d8;\n@state-success-border: darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text: #31708f;\n@state-info-bg: #d9edf7;\n@state-info-border: darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text: #8a6d3b;\n@state-warning-bg: #fcf8e3;\n@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text: #a94442;\n@state-danger-bg: #f2dede;\n@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width: 200px;\n//** Tooltip text color\n@tooltip-color: #fff;\n//** Tooltip background color\n@tooltip-bg: #000;\n@tooltip-opacity: .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width: 5px;\n//** Tooltip arrow color\n@tooltip-arrow-color: @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg: #fff;\n//** Popover maximum width\n@popover-max-width: 276px;\n//** Popover border color\n@popover-border-color: rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color: #ccc;\n\n//** Popover title background color\n@popover-title-bg: darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width: 10px;\n//** Popover arrow color\n@popover-arrow-color: #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width: (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color: fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg: @gray-light;\n//** Primary label background color\n@label-primary-bg: @brand-primary;\n//** Success label background color\n@label-success-bg: @brand-success;\n//** Info label background color\n@label-info-bg: @brand-info;\n//** Warning label background color\n@label-warning-bg: @brand-warning;\n//** Danger label background color\n@label-danger-bg: @brand-danger;\n\n//** Default label text color\n@label-color: #fff;\n//** Default text color of a linked label\n@label-link-hover-color: #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding: 20px;\n\n//** Padding applied to the modal title\n@modal-title-padding: 15px;\n//** Modal title line-height\n@modal-title-line-height: @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg: #fff;\n//** Modal content border color\n@modal-content-border-color: rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color: #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg: #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity: .5;\n//** Modal header border color\n@modal-header-border-color: #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color: @modal-header-border-color;\n\n@modal-lg: 900px;\n@modal-md: 600px;\n@modal-sm: 300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding: 15px;\n@alert-border-radius: @border-radius-base;\n@alert-link-font-weight: bold;\n\n@alert-success-bg: @state-success-bg;\n@alert-success-text: @state-success-text;\n@alert-success-border: @state-success-border;\n\n@alert-info-bg: @state-info-bg;\n@alert-info-text: @state-info-text;\n@alert-info-border: @state-info-border;\n\n@alert-warning-bg: @state-warning-bg;\n@alert-warning-text: @state-warning-text;\n@alert-warning-border: @state-warning-border;\n\n@alert-danger-bg: @state-danger-bg;\n@alert-danger-text: @state-danger-text;\n@alert-danger-border: @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg: #f5f5f5;\n//** Progress bar text color\n@progress-bar-color: #fff;\n\n//** Default progress bar color\n@progress-bar-bg: @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg: @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg: @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg: @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg: @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg: #fff;\n//** `.list-group-item` border color\n@list-group-border: #ddd;\n//** List group border radius\n@list-group-border-radius: @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg: #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color: @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg: @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border: @list-group-active-bg;\n@list-group-active-text-color: lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color: #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg: #fff;\n@panel-body-padding: 15px;\n@panel-border-radius: @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border: #ddd;\n@panel-footer-bg: #f5f5f5;\n\n@panel-default-text: @gray-dark;\n@panel-default-border: #ddd;\n@panel-default-heading-bg: #f5f5f5;\n\n@panel-primary-text: #fff;\n@panel-primary-border: @brand-primary;\n@panel-primary-heading-bg: @brand-primary;\n\n@panel-success-text: @state-success-text;\n@panel-success-border: @state-success-border;\n@panel-success-heading-bg: @state-success-bg;\n\n@panel-info-text: @state-info-text;\n@panel-info-border: @state-info-border;\n@panel-info-heading-bg: @state-info-bg;\n\n@panel-warning-text: @state-warning-text;\n@panel-warning-border: @state-warning-border;\n@panel-warning-heading-bg: @state-warning-bg;\n\n@panel-danger-text: @state-danger-text;\n@panel-danger-border: @state-danger-border;\n@panel-danger-heading-bg: @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding: 4px;\n//** Thumbnail background color\n@thumbnail-bg: @body-bg;\n//** Thumbnail border color\n@thumbnail-border: #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius: @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color: @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding: 9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg: #f5f5f5;\n@well-border: darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color: #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color: #fff;\n@badge-bg: @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color: @link-color;\n//** Badge background color in active nav link\n@badge-active-bg: #fff;\n\n@badge-font-weight: bold;\n@badge-line-height: 1;\n@badge-border-radius: 10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical: 8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg: #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color: #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color: @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator: \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color: #fff;\n@carousel-control-width: 15%;\n@carousel-control-opacity: .5;\n@carousel-control-font-size: 20px;\n\n@carousel-indicator-active-bg: #fff;\n@carousel-indicator-border-color: #fff;\n\n@carousel-caption-color: #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight: bold;\n@close-color: #000;\n@close-text-shadow: 0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color: #c7254e;\n@code-bg: #f9f2f4;\n\n@kbd-color: #fff;\n@kbd-bg: #333;\n\n@pre-bg: #f5f5f5;\n@pre-color: @gray-dark;\n@pre-border-color: #ccc;\n@pre-scrollable-max-height: 340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted: @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color: @gray-light;\n//** Headings small color\n@headings-small-color: @gray-light;\n//** Blockquote small color\n@blockquote-small-color: @gray-light;\n//** Blockquote font size\n@blockquote-font-size: (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color: @gray-lighter;\n//** Page header border color\n@page-header-border-color: @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border: @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n\n\n// Container sizes\n// --------------------------------------------------\n\n// Small screen / tablet\n@container-sm: @bd-container-tablet;\n\n// Medium screen / desktop\n@container-md: @bd-container-desktop;\n\n// Large screen / wide desktop\n@container-lg: @bd-container-large-desktop;\n"
}
}
},
"BootstrapVariables.js": {
"type": "text",
"content": "/* exported BootstrapVariables */\n/*global FontScheme, ColorScheme, WrapperController, ControlTemplateController, SerializeController*/\n\nvar BootstrapVariables = (function () {\n 'use strict';\n\n function BootstrapVariables() {\n // Themler Variables\n this.fontScheme = new FontScheme();\n this.colorScheme = new ColorScheme();\n\n var self = this;\n\n // Palette\n // -------\n Object.defineProperty(this, 'linkColor', {\n enumerable: true,\n get: function () {\n return self.colorScheme.color2;\n },\n set: function (value) {\n self.colorScheme.color2 = value;\n }\n });\n\n Object.defineProperty(this, 'linkColorLighter', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? self.colorScheme.color3 : self.colorScheme.color1;\n },\n set: function (value) {\n var colorKey = !this.invertPalette ? 'color3' : 'color1';\n self.colorScheme[colorKey] = value;\n }\n });\n\n Object.defineProperty(this, 'linkColorDarker', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? self.colorScheme.color1 : self.colorScheme.color3;\n },\n set: function (value) {\n var colorKey = !this.invertPalette ? 'color1' : 'color3';\n self.colorScheme[colorKey] = value;\n }\n });\n\n var black ='#000000';\n var grayDarker = '#333333';\n var grayDark = '#555555';\n var gray = '#777777';\n var grayLight = '#dddddd';\n var grayLighter = '#f5f5f5';\n var white = '#ffffff';\n\n Object.defineProperty(this, 'black', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? black : white;\n },\n set: function(){}\n });\n\n Object.defineProperty(this, 'grayDarker', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? grayDarker : grayLighter;\n },\n set: function(){}\n });\n\n Object.defineProperty(this, 'grayDark', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? grayDark : grayLight;\n },\n set: function(){}\n });\n\n Object.defineProperty(this, 'gray', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? gray : gray;\n },\n set: function(){}\n });\n\n Object.defineProperty(this, 'grayLight', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? grayLight : grayDark;\n },\n set: function(){}\n });\n\n Object.defineProperty(this, 'grayLighter', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? grayLighter : grayDarker;\n },\n set: function(){}\n });\n\n Object.defineProperty(this, 'white', {\n enumerable: true,\n get: function () {\n return !this.invertPalette ? white : black;\n },\n set: function(){}\n });\n\n\n //\n // Bootstrap Variables\n // --------------------------------------------------\n // Global values\n // --------------------------------------------------\n\n this.makeColorDarker = function (color) {\n var action = (self.linkColorDarker.toString()).indexOf('darken') !== -1 ? 'darken' : 'lighten';\n return action + '(' + color + ', -25%)';\n };\n\n this.makeColorLighter = function (color) {\n var action = (self.linkColorDarker.toString()).indexOf('darken') !== -1 ? 'darken' : 'lighten';\n return action + '(' + color + ', 25%)';\n };\n\n this._lessVars = {};\n\n this.setDefaultValues = function () {\n this.invertPalette = false;\n\n this._lessVars.black = 'black';\n this._lessVars.white = 'white';\n\n // Grays\n // -------------------------\n\n this._lessVars.grayDarker = 'gray-darker';\n this._lessVars.grayDark = 'gray-dark';\n this._lessVars.gray = 'gray';\n this._lessVars.grayLight = 'gray-light';\n this._lessVars.grayLighter = 'gray-lighter';\n\n // Brand colors\n // -------------------------\n\n this.customColor1 = '#428bca';\n this._lessVars.customColor1 = 'custom-color1';\n\n this.customColor2 = '#5cb85c';\n this._lessVars.customColor2 = 'custom-color2';\n\n this.customColor3 = '#f0ad4e';\n this._lessVars.customColor3 = 'custom-color3';\n\n this.customColor4 = '#d9534f';\n this._lessVars.customColor4 = 'custom-color4';\n\n this.customColor5 = '#5bc0de';\n this._lessVars.customColor5 = 'custom-color5';\n\n this.customColor6 = '#ffffff';\n this._lessVars.customColor6 = 'custom-color6';\n\n this.customColor7 = '#ffffff';\n this._lessVars.customColor7 = 'custom-color7';\n\n this.customColor8 = '#ffffff';\n this._lessVars.customColor8 = 'custom-color8';\n\n\n // Accent colors // TODO: deprecated!\n // -------------------------\n this.blue = '#049cdb';\n this.blueDark = '#0064cd';\n this.green = '#46a546';\n this.red = '#9d261d';\n this.yellow = '#ffc40d';\n this.orange ='#f89406';\n this.pink = '#c3325f';\n this.purple = '#7a43b6';\n\n // Scaffolding\n // -------------------------\n this.textColor = '#555555';\n this._lessVars.textColor = 'text-color';\n\n // Links\n // -------------------------\n this._lessVars.linkColor = 'link-color';\n this._lessVars.linkColorDarker = 'link-color-darker';\n this._lessVars.linkColorLighter = 'link-color-lighter';\n\n this.linkColorHover = '@bd-link-color-darker';\n this._lessVars.linkColorHover = 'link-color-hover';\n\n // Typography\n // -------------------------\n\n this.baseFontFamily = '@bd-sans-font-family'; // New bootstrap value: @font-family-sans-serif\n this._lessVars.baseFontFamily = 'base-font-family';\n\n this.baseFontSize = '14px';\n this._lessVars.baseFontSize = 'base-font-size';\n\n\n this.headingsFontSizeXLarge = 'floor(@font-size-base * 2.6)'; // ~36px\n this._lessVars.headingsFontSizeXLarge = 'headings-font-size-xlarge';\n\n this.headingsFontSizeLarge = 'floor(@font-size-base * 2.15)'; // ~30px\n this._lessVars.headingsFontSizeLarge = 'headings-font-size-large';\n\n this.headingsFontSizeMedium = 'ceil(@font-size-base * 1.7)'; // ~24px\n this._lessVars.headingsFontSizeMedium = 'headings-font-size-medium';\n\n this.headingsFontSizeSmall = 'ceil(@font-size-base * 1.25)'; // ~18px\n this._lessVars.headingsFontSizeSmall = 'headings-font-size-small';\n\n this.headingsFontSizeMini = '@font-size-base'; // ~14px\n this._lessVars.headingsFontSizeMini = 'headings-font-size-mini';\n\n this.headingsFontSizeXSmall = 'ceil(@font-size-base * 0.85)'; // 12px\n this._lessVars.headingsFontSizeXSmall = 'headings-font-size-xsmall';\n\n\n this.contentFontSizeLarge = '@font-size-base * 1.25'; // ~18px\n this._lessVars.contentFontSizeLarge = 'content-font-size-large';\n\n this.contentFontSizeSmall = '@font-size-base * 0.85'; // ~12px\n this._lessVars.contentFontSizeSmall = 'content-font-size-small';\n\n\n this.lineHeightFactor = '1.428571429';\n this._lessVars.lineHeightFactor = 'line-height-factor';\n\n this.baseLineHeight = 'floor(@font-size-base * @line-height-base)'; //new Unit('20px');\n this._lessVars.baseLineHeight = 'base-line-height';\n\n\n // Grid system\n // --------------------------------------------------\n\n // Number of columns in the grid system\n this.gridColumns = '12'; // Bootstrap default value: 12\n this._lessVars.gridColumns = 'grid-columns';\n\n // Padding, to be divided by two and applied to the left and right of all columns\n this.gridGutterWidth = '10px'; // Bootstrap default value: 30\n this._lessVars.gridGutterWidth = 'grid-gutter-width';\n\n this.gridColumnWidth = '30px'; // TODO: REMOVE IT!\n\n // Designer Content !max-widths! for different responsive modes\n this.containerLarge = '((1160px + @grid-gutter-width))'; // 1200px\n this._lessVars.containerLarge = 'container-large-desktop';\n\n this.containerDesktop = '((960px + @grid-gutter-width))'; // 992px\n this._lessVars.containerDesktop = 'container-desktop';\n\n this.containerTablet = '((740px + @grid-gutter-width))'; // 768px\n this._lessVars.containerTablet = 'container-tablet';\n\n this.containerPhones = 'none'; // 480px\n this._lessVars.containerPhones = 'container-phones';\n\n // Bootstrap Responsive stops\n // containerLarge\n this.screenLarge = '@screen-lg-desktop';\n this._lessVars.screenLarge = 'screen-large';\n\n // sheetWidth768\n this.screenDesktop = '@screen-desktop';\n this._lessVars.screenDesktop = 'screen-desktop';\n\n this.screenMdMax = '(@screen-lg-min - 1)';\n this._lessVars.screenMdMax = 'screen-md-max';\n\n // sheetWidthSmall\n this.screenTablet = '@screen-tablet';\n this._lessVars.screenTablet = 'screen-tablet';\n\n this.screenSmMax = '(@screen-md-min - 1)';\n this._lessVars.screenSmMax = 'screen-sm-max';\n\n // sheetPhones\n this.screenPhone = '@screen-phone';\n this._lessVars.screenPhone = 'screen-phone';\n\n this.screenXsMax = '(@screen-sm-min - 1)';\n this._lessVars.screenXsMax = 'screen-xs-max';\n\n // table\n\n this.tableBackground = 'transparent'; // overall background-color\n this._lessVars.tableBackground = 'table-bg';\n\n this.tableBackgroundAccent = '#f9f9f9'; // for striping\n this._lessVars.tableBackgroundAccent = 'table-bg-accent';\n\n this.tableBackgroundHover = '#f5f5f5'; // for hover\n this._lessVars.tableBackgroundHover = 'table-bg-hover';\n\n this.tableBackgroundActive = '@bd-table-bg-hover';\n this._lessVars.tableBackgroundActive = 'table-bg-active';\n\n this.tableBorder = '#ddd'; // table and cell border\n this._lessVars.tableBorder = 'table-border-color';\n\n this.navbarPaddingHorizontal = '0';\n this._lessVars.navbarPaddingHorizontal = 'navbar-padding-horizontal';\n\n };\n\n this.setDefaultValues();\n\n this.toVar = function (variable) {\n if (!this._lessVars[variable])\n return variable;\n\n return this._lessVars[variable];\n };\n\n this.toString = function () {\n var vars = '';\n for (var variable in this) {\n if (this.hasOwnProperty(variable) &&\n ['constructorName'].indexOf(variable) === -1 &&\n ('string' === typeof this[variable] || 'object' === typeof this[variable] && this[variable].constructorName) &&\n '' !== this[variable].toString() &&\n SerializeController.isSerializable(this, variable)) {\n if ('object' === typeof this[variable] && !(this[variable].hasOwnProperty('toString') || Object.getPrototypeOf(this[variable]).hasOwnProperty('toString'))) {\n continue;\n }\n if (['fontScheme', 'colorScheme'].indexOf(variable) === -1) {\n vars += '@bd-' + this.toVar(variable) + ':' + this[variable] + '; \\r\\n';\n } else {\n vars += this[variable];\n }\n }\n }\n var template = ControlTemplateController.getTemplateForControl(this);\n vars += template.read('variables.less');\n return vars;\n };\n WrapperController.make(this, BootstrapVariables);\n\n this._resposiveWidths = {\n largeDevices: 1200,\n mediumDevices: 992,\n smallDevices: 768\n };\n\n this._rowClassName = 'row';\n this._columnPrefix = 'col-md-';\n }\n\n BootstrapVariables.prototype.toJSON = function () {\n var obj = $.extend(true, {}, this);\n delete obj.linkColorDarker;\n delete obj.linkColorLighter;\n return obj;\n };\n\n return BootstrapVariables;\n})();"
}
}
},
"ColorScheme": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"icons": {
"type": "dir",
"items": {
"icon.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ODc2RTQ2QTZGMzFFMzExOTdDNUVDNEI5RkJDMEMyMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFODMyRjQ0NjM1QTExMUUzQTJFQkFCOUJBMTAyMERGNyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFODMyRjQ0NTM1QTExMUUzQTJFQkFCOUJBMTAyMERGNyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZGQzRGQjQzQTEzNUUzMTE4NkY1ODRFMUU5ODhGQ0YzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjc4NzZFNDZBNkYzMUUzMTE5N0M1RUM0QjlGQkMwQzIxIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HhuQIQAAA+BJREFUeNq0V19sU1Uc/s659/bPunW01a1bRjc6CBQSNCP6SDQaEwjxQWNEX0T0AYWZKBCNLz74oomGBzBREt584FFHhoIxJEuIGpyJwhiksG5rcVtb1q693drb23s8tx3Sbf1zunVfcl7u+fWcr7/zne+7lzDG8MfldzDttMKlGu6om34ac5PXcjbiez02Da9zAcJgBORiP6AqlWZH+TjPx/eWL75dfPSQlhUcv7FXjk/20JOZFuLT+cyl1q1YylvECRAGFkhUm93Hx3d8pLVPjh1cQSDstB4P+uk5xpco/0XKQTCs+WGsfFwbu5J8VVarwtxzmJM4UOR85adjntG9Umz15uV4ZjaN/e2T4o241g3ca69XZvDhpHEX+bjW5ib+9LYhmHlCXAq7EyJlZifeoDEPPVx3QT5+bvfioW4XY9C5BHiyIpXv0kwLtopUagrBEN2GHKHN7MJTFA1g3iHhypIfTKS4PwVYCvWqbA0RMBF02XEj212/UOEa27EgJISGcd3lwVTBKXAMyc0hYN6fy1YfUqSOSW3JAd2Z5hMwschF+WPBD73OEmxPYnMImIg6FPxaqHOJfCrgyG8OARO3Wp34m9UwKVozHzZOwMQ1exdmqKN6wc6FqvlAw7OvgOXbNkSgwI18iPZikciVC1p0YFu6MoH55ABuhk5iNv4il7e8bhKqIuES+qomZ7VjKB4B4xvPxZ/D2MQpzCeeBRqJ3zJEbHaMkCom1cXfQdy52hrQ9VaE517GndAgMur2dZEYtblxR9oi3IWKIszlOnAvcgT3w0ehLXU2TOKq3IM4ta2dMK3ZtGjRW6Bm/BifOgFTqEYDQs1TblK0b21yVsgHgWtIYAr1VlGoLwgLNakoGJZ61yTn6pgW9oGSUJ/nQj0tLNSQ0orf5VVH6OJC7Mqs34h03VEU6t3QCajqjrr1vykdCEltVbuwbifM5jpxP/LWslA7ar7ODcs+JGlZcvbxfGjJN8eKS0IdRHimulBzlGJI6nucnKYt70qWppx5NbzxNOBCXRjAWOjDZaGu/TKKyVZcVXrKPKH4/fAP7U39exFNgmFYEOWOOh76aFmoKxs8LrfjL9nzOB8CiR9odyb6JQFjzSLBeDc0fhSRuUMITr7PhbpzxfyI0oUHUjE5GfNkL9CjRw49HIjeHkSTwfi/X8x6EXrwJiYib0PLlq5jgRM0RWmkLZ9ZDw7N0dJLy8w3+6JjHzSzE/8fC5OQVvtxd+o9LtRXYWhOtn1CPmV/+pfPV9+Csy9NX39yz3zwK5eWmqAo6M0iQWDo3nxsMhDRzgRGAp0H9p/7+tHcfwIMAP9Mc7+bWevsAAAAAElFTkSuQmCC"
},
"single-presets.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyRjQwQTBFNEFFNDdFMzExQjhFNUY0QUEzRjVENEQ4MSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozODEwRUUzRDQ3QjQxMUUzQTM3Qzg4OTE4QjNGRDA1NiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozODEwRUUzQzQ3QjQxMUUzQTM3Qzg4OTE4QjNGRDA1NiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMyNDBBMEU0QUU0N0UzMTFCOEU1RjRBQTNGNUQ0RDgxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjJGNDBBMEU0QUU0N0UzMTFCOEU1RjRBQTNGNUQ0RDgxIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+hN4WYwAABN9JREFUeNrsV1tPXFUU/vbZ58IMDAxouV9KuTQpSWnStEXaQryEmhgVqemDMS0hKn2Q9EVjmvgHfNAf4Isk1hjjA6bSpBqMl9TaEutDlSowkBnuDBRmYO7n5joDhYGZoUMxaqKTfJmTs/dZ61trfWvtc5hpmvgnf+xfQyDa+fzf6ljp/TL+L6bbMFkBjNQKyDZ0NEfnoWscTBMAdR0aI6xfB8nMivxIRFISGDzOcOMEx7KTQWACSu5HUZfnRVSXErdZHq0wQszjeBmf1Ongxq4JCNtvTFQC/WdETJUKiJKLgMTRZ69COKpgm1reJbQR2s1636VHcZ6SwPVnREQUCk81IZBHyTTgyZNxTT8Am6k+2FZMeGvjIRPv4Ik5R7wseyXgqaC0bwtGMUz84HwcY1oBRBZfvESwbWyI8UKzaaEH5l9AQOfp1GLgM7mGdMBlctOVtC5r3SgLCnsiQGVOr1bKwpQ9C9dQ3aGYWmGKjq5Eve/ZPRFYceycQonp+N5edNGNPHoweYCZB/3nd6uDLW3oy9ssO6GBcISwn1BCKCRR7uOi3vSpVIse9VfIRMhAgsOKYDuytUFE+CLdXqA7cwQ3YZhwh+DfmYAzbuwK4ZwVcCrGnCanW7HjK60CZ80xRFiCCY0paJk9hv5KS7lJ8iL0W22btgS+fN0aztnpnD/42ZiGb7JK4Wa5W0tBU9E86kWabuCp7G4hcDfcgWiw4nUwY5TBioClOUAodaKOz5UaaGSCJZKwEnJgNdVjLkLnjgTcOIzbv7+/ODP7wlOGKY6LYoBMpyZhlcIl5mCAl0M2ja1ZaFzENo2OEp4kLOxIYDnHBokH4Jq6MDXs7mkJBavu2eT5dImIl6JfrsQEc1B+EzxWBWgubJCyxNdCmHpoGy5lOcFo0smSD8v+I9O/uS6fnppr/0nhPiSNx/VSKFylUlRTKdgmT2cUyI9ZV1cJrevd8PA5EBKzNo1TdDEtd2ls8sLTd12XBwRKrcAjWMvtZkqkeCkcuMmLqfz6ptVDS73QWQddBXc1ipOGC4Twku949M7Ie1jxHQYXYoQQTFNYX7cOBRKkXI0Zlr1WCoNkeXRhBbqg7/osSPXywpjeGo6UYGj8bUzOvQhdt0NRFrcIVOY6rkj1UC2TFquC6HMoC8XJZEzAZCk3n6KVHEGIQjdkTMyexainG/7VQ7BLJOq10zHeFZOyHYPiPmp2w3pLqkHLTD3CPDMCmsDp/E/5UnFyYzOl3zRFLPiaMOZ5AzPeNjofQrDIrenBQJ+0HwGajoJO7Vjna4GsZ0YgJNqQGwuk2tO8RfkkTioJVkPVhmu68yP39Ct9quqMk+MUucoZesWDa8FwnKIDKjMCsq6iLOAl4SalrCGp/WD8TEROapqjyz17rmN8ouuMf7XhHhWcBKnCpeTiR6kExLMRjfczI5ClR/HS2ECceYxLiQIrStg/QjhPOEG4ZWWDU2vOLbV+Peq+2Li43Nyt6TaPRCSuy6VYQlYZisKZi/D0zC9om7gJmxahhQ09DBG+Jby6no2PARiJjSqJPoQiZdof7jc/pMFVH1Odr/kkfvuqrdIjxXb5YeK1P4bvyo9hqKAWXlsB/IqD3oztcRiM7TgxDFOBqjlQlH8DxeVfIHd1Hh/cGoY2WJT2w4T9/234nyfwpwADAJcw5Lw58afkAAAAAElFTkSuQmCC"
}
}
},
"editor.json": {
"type": "text",
"content": "{\"caption\":\"Color Scheme\"}"
},
"view.json": {
"type": "text",
"content": "[{\"name\":\"ColorSchema\",\"caption\":\"Colors\",\"widgets\":[{\"view\":\"ControlTitle\",\"helpText\":\"Based on Bootstrap Colors\"},{\"widget\":\"TabbedView\",\"style\":\"button\",\"provider\":{\"name\":\"Tabs\",\"stateId\":\"colors\",\"items\":[{\"caption\":\"Color Palette\",\"icon\":\"icons/single-presets.png\",\"value\":\"presets\",\"widgets\":[{\"view\":\"Title\",\"caption\":\"Base Colors\"},{\"widget\":\"Caption\",\"caption\":\"Palette\",\"placeholder\":[{\"view\":\"CustomColorDropDown\",\"showArrow\":false,\"allowLess\":false,\"hideCaption\":true,\"provider\":{\"attr\":\"color1\"}},{\"view\":\"CustomColorDropDown\",\"showArrow\":false,\"allowLess\":false,\"hideCaption\":true,\"provider\":{\"attr\":\"color2\"}},{\"view\":\"CustomColorDropDown\",\"showArrow\":false,\"allowLess\":false,\"hideCaption\":true,\"provider\":{\"attr\":\"color3\"}}]},{\"widget\":\"Switch\",\"caption\":\"Invert Palette\",\"provider\":{\"name\":\"InvertPalette\"}},{\"view\":\"Title\",\"caption\":\"Presets\"},{\"widget\":\"ListBox\",\"itemHeight\":\"47px\",\"itemWidth\":\"118px\",\"align\":\"none\",\"boxed\":false,\"topDistance\":\"192px\",\"cols\":\"2\",\"provider\":\"ColorSchema\"}]},{\"caption\":\"Options\",\"value\":\"editor\",\"icon\":\"UIIcons/edit-control-properties.png\",\"widgets\":[{\"view\":\"ColorOptions\"}]}]}}]},{\"name\":\"ColorOptions\",\"widgets\":[{\"widget\":\"Heading\",\"style\":\"large\",\"caption\":\"Color Palette\"},{\"view\":\"Title\",\"caption\":\"Base Colors\"},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Darker\",\"provider\":{\"attr\":\"color1\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Main\",\"provider\":{\"attr\":\"color2\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Lighter\",\"provider\":{\"attr\":\"color3\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Text\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"textColor\"}},{\"widget\":\"Separator\"},{\"widget\":\"Switch\",\"caption\":\"Invert Palette\",\"provider\":{\"name\":\"InvertPalette\"}},{\"view\":\"Title\",\"caption\":\"Additional Colors\"},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Primary\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor1\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Success\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor2\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Warning\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor3\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Danger\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor4\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Info\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor5\"}},{\"view\":\"Title\",\"caption\":\"Custom Colors\"},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Custom 1\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor6\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Custom 2\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor7\"}},{\"view\":\"CustomColor\",\"allowLess\":false,\"caption\":\"Custom 3\",\"provider\":{\"name\":\"VariablesColor\",\"attr\":\"customColor8\"}},{\"widget\":\"Button\",\"caption\":\"Save Preset\",\"provider\":{\"name\":\"ColorSchema\",\"provider\":{\"name\":\"Debug\",\"isLocal\":true}},\"style\":\"row\"}]}]"
}
}
},
"ColorScheme.js": {
"type": "text",
"content": "/*global Color, WrapperController, PropertyObserverController */\nvar ColorScheme;\nColorScheme = (function () {\n 'use strict';\n function ColorScheme() {\n var color1String = '#269CCB';\n var color2String = '#2DA0CE';\n var color3String = '#0a75a0';\n\n PropertyObserverController.defineProperty(this, 'color1', {\n enumerable: true,\n get: function () {\n return color1String;\n },\n set: function (value) {\n color1String = typeof(value) === 'string' ? value : value.toModel(\"Hex\");\n }\n });\n\n PropertyObserverController.defineProperty(this, 'color2', {\n enumerable: true,\n get: function () {\n return color2String;\n },\n set: function (value) {\n color2String = typeof(value) === 'string' ? value : value.toModel(\"Hex\");\n }\n });\n\n PropertyObserverController.defineProperty(this, 'color3', {\n enumerable: true,\n get: function () {\n return color3String;\n },\n set: function (value) {\n color3String = typeof(value) === 'string' ? value : value.toModel(\"Hex\");\n }\n });\n\n WrapperController.make(this, ColorScheme);\n }\n\n ColorScheme.prototype.toString = function () {\n var vars = '';\n for (var variable in this) {\n if (this.hasOwnProperty(variable) && this[variable] instanceof Color && '' !== this[variable].toString()) {\n vars += '@' + variable + ':' + this[variable] + '; \\r\\n';\n }\n }\n return vars;\n };\n\n return ColorScheme;\n})();"
}
}
},
"FontScheme": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"editor.json": {
"type": "text",
"content": "{\"caption\":\"Font Scheme\"}"
}
}
},
"FontScheme.js": {
"type": "text",
"content": "/*global FontFamily, WrapperController */\n\nfunction FontScheme() {\n 'use strict';\n this.sansFontFamily = new FontFamily('Open Sans');\n this.headingsFontFamily = new FontFamily('Open Sans'); // empty to use BS default, @baseFontFamily\n WrapperController.make(this, FontScheme);\n\n this._lessVars = {\n 'sansFontFamily' : 'sans-font-family',\n 'headingsFontFamily' : 'headings-font-family'\n };\n}\n\nFontScheme.prototype.toString = function() {\n 'use strict';\n var vars = '';\n for (var variable in this){\n if (this.hasOwnProperty(variable) && this[variable] instanceof FontFamily && '' !== this[variable].toString()) {\n vars += '@bd-' + this._lessVars[variable] + ':' + this[variable] + '; \\r\\n';\n }\n }\n return vars;\n};\n"
}
}
},
"TableStyles": {
"type": "dir",
"items": {
"TableStyles.js": {
"type": "text",
"content": "/*exported TableStyles*/\n/*global WrapperController */\n\nfunction TableStyles() {\n 'use strict';\n\n this.toString = function () {\n return this.css.toString();\n };\n\n WrapperController.make(this, TableStyles);\n}\n"
}
}
}
}
},
"ContainerInner": {
"type": "dir",
"items": {
"template": {
"type": "dir",
"items": {
"style.css": {
"type": "text",
"content": ".boxed-styles(~\".@containerInner\");\n\n.@containerInner\n{\n position: relative;\n}\n\n.@containerInner,\n.bd-page-width .bd-background-width > .@containerInner {\n height: 100%;\n}\n\n@if (parseInt(css('padding-left'), 10) > 0) {\n .bd-slider .bd-left-button, .bd-slider .bd-right-button,\n .bd-margins > p, .bd-margins > div:not(.bd-own-margins) > p,\n .bd-margins > h1, .bd-margins > div:not(.bd-own-margins) > h1,\n .bd-margins > h2, .bd-margins > div:not(.bd-own-margins) > h2,\n .bd-margins > h3, .bd-margins > div:not(.bd-own-margins) > h3,\n .bd-margins > h4, .bd-margins > div:not(.bd-own-margins) > h4,\n .bd-margins > h5, .bd-margins > div:not(.bd-own-margins) > h5,\n .bd-margins > h6, .bd-margins > div:not(.bd-own-margins) > h6,\n .bd-margins > img, .bd-margins > div:not(.bd-own-margins) > img,\n .bd-margins > ul, .bd-margins > div:not(.bd-own-margins) > ul,\n .bd-margins > ol, .bd-margins > div:not(.bd-own-margins) > ol,\n .bd-margins > .bd-own-margins, .bd-margins > div > .bd-own-margins,\n .bd-margins > div:not(.bd-own-margins) > .@(containerInner) > *:not(.bd-no-margins):not(section),\n .bd-margins > div:not(.bd-own-margins) > .@(containerInner) > .bd-no-margins > .@(containerInner) > *:not(.bd-no-margins):not(section),\n .bd-margins > div:not(.bd-own-margins) > div:not(.bd-own-margins) > .@(containerInner) > *:not(.bd-no-margins):not(section),\n .bd-margins > div:not(.bd-own-margins) > div:not(.bd-own-margins) > .@(containerInner) > .bd-no-margins > .@(containerInner) > *:not(.bd-no-margins):not(section),\n .bd-margins > div:not(.bd-own-margins) > div:not(.bd-own-margins) > .bd-no-margins > .@(containerInner) > *:not(.bd-no-margins):not(section)\n {\n margin-left: @(css('padding-left'));\n margin-right: @(css('padding-right'));\n }\n /* Content & Sidebars */\n .bd-sheetstyles:not(.bd-page-width) .bd-contentlayout-offset > aside:not(.bd-no-margins),\n .bd-sheetstyles.bd-page-width .bd-contentlayout-offset > aside:not(.bd-no-margins) > .bd-margins,\n div:not(.bd-sheetstyles).bd-page-width .bd-contentlayout-offset section:not(.bd-no-margins),\n .bd-sheetstyles:not(.bd-page-width) > .bd-contentlayout-offset > *:not(aside) section:not(.bd-no-margins),\n .bd-sheetstyles:not(.bd-page-width) .bd-contentlayout-offset > section:not(.bd-no-margins) {\n margin-left: -@(css('padding-left'));\n margin-right: -@(css('padding-right'));\n }\n}\n\n.bd-container-inner-wrapper\n{\n position: relative;\n width: 100%;\n height: 100%;\n}"
}
}
},
"ContainerInner.js": {
"type": "text",
"content": "/*exported ContainerInner*/\n/*global WrapperController, _$ */\n\nfunction ContainerInner() {\n 'use strict';\n\n Object.defineProperty(this, '_gridPadding', {\n enumerable: true,\n configurable: true,\n set: function (value) {\n _$(this).css('padding-left', value);\n _$(this).css('padding-right', value);\n },\n get: function () {\n if (_$(this).css('padding-left') === '') {\n return '0px';\n }\n return _$(this).css('padding-left');\n }\n });\n\n WrapperController.make(this, ContainerInner);\n}\n\n\n\n\n"
}
}
},
"Css": {
"type": "dir",
"items": {
"FontFamily": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"providers": {
"type": "dir",
"items": {
"UIPFontFamilyMain.js": {
"type": "text",
"content": "/*exported UIPFontFamilyMain */\n/*global FontFamilyController, Utils, UIProvider, koObservableController, FontFamilyController, CssFontNameValidator */\n/**\n *\n * @param {ProviderData} data\n * @constructor\n */\nfunction UIPFontFamilyMain(data) {\n 'use strict';\n\n UIPFontFamilyMain.superclass.constructor.call(this, data);\n\n this.validator = new CssFontNameValidator();\n\n this.value.dispose();\n this.value = ko.computed({\n read: function () {\n if (!this._valueChangeNotifier) {\n this._valueChangeNotifier = koObservableController.koBind(this.control(), 'family', function (family) {\n return family.toString();\n }.bind(this));\n }\n var fontFamily = FontFamilyController.getFamilyName(this._valueChangeNotifier());\n return fontFamily;\n },\n write: function (value) {\n this.control().prop('family', FontFamilyController.getFamilyNameWithAlt(value));\n },\n owner: this,\n deferEvaluation: true\n });\n\n this.getItems = function (callback) {\n var categoriesArray = this.options.categories ? this.options.categories.split(',') : [];\n var categories = [];\n var variants = ['standardFonts', 'googleFonts', 'systemFonts'];\n for (var i = 0; i < variants.length; i++)\n if (!categoriesArray.length || categoriesArray.indexOf(variants[i]) !== -1)\n categories.push(variants[i]);\n callback(null, FontFamilyController.getUIFontItems(categories, undefined));\n }.bind(this);\n\n this.trySetValue = function (value) {\n this.value(value);\n return value;\n }.bind(this);\n}\n\nUtils.extend(UIPFontFamilyMain, UIProvider);"
},
"UIPFontFamilyMainVisible.js": {
"type": "text",
"content": "/**\r\n * Created by oksana on 04.08.2015.\r\n */\r\n/*exported UIPFontFamilyMainVisible*/\r\n/*global FontFamilyController, Utils, UIProvider, FontFamilyController */\r\n/**\r\n *\r\n * @param {ProviderData} data\r\n * @constructor\r\n */\r\nfunction UIPFontFamilyMainVisible(data) {\r\n 'use strict';\r\n\r\n UIPFontFamilyMainVisible.superclass.constructor.call(this, data);\r\n\r\n// from UIPFontFamilyMain\r\n this.fixVisible = function () {\r\n var categoriesArray = this.options.categories ? this.options.categories.split(',') : [];\r\n var categories = [];\r\n var variants = ['standardFonts', 'googleFonts', 'systemFonts'];\r\n for (var i = 0; i < variants.length; i++)\r\n if (!categoriesArray.length || categoriesArray.indexOf(variants[i]) !== -1)\r\n categories.push(variants[i]);\r\n var items = FontFamilyController.getUIFontItems(categories, undefined);\r\n if (items.length === 0 && categories.length === 1 && categories[0] === 'systemFonts'){\r\n this.visible(false);\r\n }\r\n }.bind(this);\r\n this.fixVisible();\r\n}\r\n\r\nUtils.extend(UIPFontFamilyMainVisible, UIProvider);"
}
}
}
}
},
"FontFamily.js": {
"type": "text",
"content": "/*global WrapperController, PropertyObserverController, GoogleFontsController */\n/*global WrongSetterError, _$*/\nfunction FontFamily(family) {\n 'use strict';\n PropertyObserverController.defineProperty(this, 'family',{\n enumerable:true,\n configurable:true,\n set: function (value){\n GoogleFontsController.updateFamily(value, this._family);\n this._family = 'undefined' === typeof value ? '' : value;\n },\n get: function (){\n return 'undefined' === typeof this._family ? '' : this._family;\n }\n });\n WrapperController.make(this, FontFamily);\n this._family = '';\n if ('undefined' !== typeof family) {\n _$(this).prop('family', family);\n }\n}\n\nFontFamily.prototype.setValue = function(family){\n 'use strict';\n\n if('string' !== typeof family) {\n throw new TypeError('Unit can be set only by string or FontFamily');\n }\n\n if ('string' !== typeof family && _$(family).prop('constructorName') === 'FontFamily'){\n throw new WrongSetterError('FontFamily can be set only by string');\n }\n\n _$(this).prop('family', family);\n};\nFontFamily.prototype.toString = function(){\n 'use strict';\n return _$(this).prop('family');\n};\n"
}
}
}
}
},
"FormControls": {
"type": "dir",
"items": {
"CustomCheckbox": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"defaultStyle.json": {
"type": "text",
"content": "{\"constructorName\":\"CustomCheckbox\",\"input\":{\"icon\":\"icon-mark\",\"style\":\"icon\",\"unchecked\":{\"inner\":{\"css\":{\"color\":\"#09ad7e\",\"opacity\":\"0\"}},\"outer\":{\"css\":{\"border-width\":\"1px\",\"border-style\":\"solid\",\"border-color\":\"#aaa\",\"background-color\":\"#f8f8f8\"}}},\"checked\":{\"inner\":{\"css\":{\"opacity\":\"1\"}},\"outer\":{\"css\":{}}},\"focus\":{\"inner\":{\"css\":{}},\"outer\":{\"css\":{}}},\"disabled\":{\"inner\":{\"css\":{}},\"outer\":{\"css\":{}}}}}"
},
"editor.json": {
"type": "text",
"content": "{\"canSaveAsStyle\":false,\"caption\":\"Custom Checkbox\",\"communityTag\":\"Custom Checkbox\",\"rotate\":true,\"selectable\":true,\"showOnStylingPage\":false,\"typeCategory\":\"checkbox\"}"
},
"view.json": {
"type": "text",
"content": "[{\"name\":\"Ribbon\",\"defaults\":{},\"widgets\":[{\"widget\":\"Group\",\"caption\":\"Preset\",\"columns\":[{\"widgets\":[{\"widget\":\"DropDownListBox\",\"caption\":\"Type\",\"provider\":{\"name\":\"StyleSelect\",\"hideIfOneItem\":true}}]}]},{\"view\":\"RibbonChooseControlOrMixin\"},{\"view\":\"\",\"data\":\"input\"}]}]"
}
}
},
"template": {
"type": "dir",
"items": {
"page.html": {
"type": "text",
"content": ""
},
"style.css": {
"type": "text",
"content": "@if (_parentSelector){ @_parentSelector, }\r\n@selector\r\n{\r\n @input\r\n}"
}
}
},
"CustomCheckbox.js": {
"type": "text",
"content": "/* exported CustomCheckbox */\r\n/* global CustomFormControl, WrapperController, Style, CssNamesController */\r\n\r\nfunction CustomCheckbox() {\r\n 'use strict';\r\n\r\n this.input = new CustomFormControl();\r\n this.label = new Style('Label');\r\n\r\n WrapperController.make(this, CustomCheckbox);\r\n\r\n Object.defineProperty(this, 'classNames', {\r\n enumerable: true,\r\n get: function () {\r\n return CssNamesController.getClass(this, false) + ' bd-formcontrol-checkbox' +\r\n ' bd-formcontrol-checkbox-' + this.input.size +\r\n ' bd-formcontrol-checkbox-' + this.input.style;\r\n }\r\n });\r\n}\r\n"
}
}
},
"CustomFormControl": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"editor.json": {
"type": "text",
"content": "{\"canSaveAsStyle\":false,\"caption\":\"FormControl\",\"communityTag\":\"FormControl\",\"selectable\":true}"
},
"view.json": {
"type": "text",
"content": "[{\"name\":\"Ribbon\",\"defaults\":{},\"widgets\":[{\"widget\":\"Group\",\"caption\":\"Styles\",\"columns\":[{\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Size\",\"popupWidth\":\"100px\",\"popupRight\":true,\"style\":\"small\",\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"auto\",\"provider\":{\"attr\":\"size\",\"items\":[{\"caption\":\"Small\",\"value\":\"small\"},{\"caption\":\"Medium\",\"value\":\"medium\"},{\"caption\":\"Large\",\"value\":\"large\"},{\"caption\":\"XLarge\",\"value\":\"xlarge\"}]}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Style\",\"popupWidth\":\"100px\",\"popupRight\":true,\"style\":\"small\",\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"auto\",\"provider\":{\"attr\":\"style\",\"items\":[{\"caption\":\"Simple\",\"value\":\"simple\"},{\"caption\":\"Icon\",\"value\":\"icon\"},{\"caption\":\"Switch\",\"value\":\"switch\"}]}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Icon\",\"popupWidth\":\"100px\",\"popupRight\":true,\"style\":\"small\",\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"IconLists\",\"icons\":[\"icon-mark\",\"icon-box-small\",\"icon-rhomb\",\"icon-starlet\",\"icon-starlet-alt\",\"icon-heartlet\"],\"attr\":\"icon\",\"hideNoIcon\":true}]}]}]},{\"widget\":\"Group\",\"caption\":\"State\",\"columns\":[{\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Default\",\"popupWidth\":\"100px\",\"popupRight\":true,\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Inner\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"unchecked.inner\",\"fontVisible\":true}]},{\"widget\":\"DropDownButton\",\"caption\":\"Outer\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"unchecked.outer\"}]}]},{\"widget\":\"DropDownButton\",\"caption\":\"Checked\",\"popupWidth\":\"100px\",\"popupRight\":true,\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Inner\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"checked.inner\",\"fontVisible\":true}]},{\"widget\":\"DropDownButton\",\"caption\":\"Outer\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"checked.outer\"}]}]}]},{\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Focused\",\"popupWidth\":\"100px\",\"popupRight\":true,\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Inner\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"focus.inner\",\"fontVisible\":true}]},{\"widget\":\"DropDownButton\",\"caption\":\"Outer\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"focus.outer\"}]}]},{\"widget\":\"DropDownButton\",\"caption\":\"Disabled\",\"popupWidth\":\"100px\",\"popupRight\":true,\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Inner\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"disabled.inner\",\"fontVisible\":true}]},{\"widget\":\"DropDownButton\",\"caption\":\"Outer\",\"popupWidth\":\"150px\",\"popupRight\":true,\"icon\":\"UIIcons/button-passive.png\",\"widgets\":[{\"view\":\"FormControlState\",\"dataAttr\":\"disabled.outer\"}]}]}]}]}]},{\"name\":\"FormControlStateFont\",\"defaults\":{\"dataAttr\":\"\"},\"widgets\":[{\"view\":\"Title\",\"caption\":\"Font\",\"optionsVisible\":false},{\"view\":\"Color\",\"caption\":\"Color\",\"data\":\"%dataAttr%\",\"provider\":{\"attr\":\"color\"},\"hideInput\":true,\"showInput\":false,\"canEditTransparency\":true}]},{\"name\":\"FormControlState\",\"defaults\":{\"dataAttr\":\"\",\"fontVisible\":false},\"widgets\":[{\"view\":\"FormControlStateFont\",\"dataAttr\":\"%dataAttr%\",\"provider\":{\"visible\":\"%fontVisible%\"}},{\"view\":\"ShapeExpanded\",\"data\":\"%dataAttr%\",\"optionsVisible\":false}]}]"
}
}
},
"template": {
"type": "dir",
"items": {
"style.css": {
"type": "text",
"content": "input + label\r\n{\r\n @unchecked\r\n}\r\n\r\ninput:checked + label\r\n{\r\n @if (icon && style === 'icon') {\r\n .@icon;\r\n }\r\n @checked\r\n}\r\n\r\ninput:focus + label\r\n{\r\n @focus\r\n}\r\n\r\ninput:disabled + label\r\n{\r\n @disabled\r\n}"
}
}
},
"CustomFormControl.js": {
"type": "text",
"content": "/* exported CustomFormControl */\r\n/* global CommonController, ControlRender, WrapperController, FormControlState, FormControlCore, ControlTemplateController */\r\n\r\nfunction CustomFormControl() {\r\n 'use strict';\r\n\r\n this.unchecked = new FormControlState();\r\n this.checked = new FormControlState();\r\n this.focus = new FormControlState();\r\n this.disabled = new FormControlState();\r\n\r\n this.icon = '';\r\n this.size = 'medium'; // small, medium, large, xlarge\r\n this.style = 'simple'; // simple, icon, switch\r\n\r\n this.toString = function toString(){\r\n var template = ControlTemplateController.getTemplateForControl(this);\r\n return ControlRender.processContent(template.read('style.css'), $.extend({}, this));\r\n };\r\n\r\n WrapperController.make(this, CustomFormControl);\r\n}\r\n\r\n$(document).one('controlDefined', function () {\r\n 'use strict';\r\n\r\n CommonController.setCommon(CustomFormControl, FormControlCore);\r\n});"
}
}
},
"CustomRadioButton": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"defaultStyle.json": {
"type": "text",
"content": "{\"constructorName\":\"CustomRadioButton\",\"input\":{\"icon\":\"\",\"style\":\"simple\",\"unchecked\":{\"inner\":{\"css\":{\"border-radius\":\"50%\",\"background-color\":\"#09ad7e\",\"opacity\":\"0\"}},\"outer\":{\"css\":{\"border-radius\":\"50%\",\"border-width\":\"1px\",\"border-style\":\"solid\",\"border-color\":\"#aaa\",\"background-color\":\"#f8f8f8\"}}},\"checked\":{\"inner\":{\"css\":{\"opacity\":\"1\"}},\"outer\":{\"css\":{}}},\"focus\":{\"inner\":{\"css\":{}},\"outer\":{\"css\":{}}},\"disabled\":{\"inner\":{\"css\":{}},\"outer\":{\"css\":{}}}}}"
},
"editor.json": {
"type": "text",
"content": "{\"canSaveAsStyle\":false,\"caption\":\"Custom RadioButton\",\"communityTag\":\"Custom RadioButton\",\"rotate\":true,\"selectable\":true,\"showOnStylingPage\":false,\"typeCategory\":\"radiobutton\"}"
},
"view.json": {
"type": "text",
"content": "[{\"name\":\"Ribbon\",\"defaults\":{},\"widgets\":[{\"widget\":\"Group\",\"caption\":\"Preset\",\"columns\":[{\"widgets\":[{\"widget\":\"DropDownListBox\",\"caption\":\"Type\",\"provider\":{\"name\":\"StyleSelect\",\"hideIfOneItem\":true}}]}]},{\"view\":\"RibbonChooseControlOrMixin\"},{\"view\":\"\",\"data\":\"input\"}]}]"
}
}
},
"template": {
"type": "dir",
"items": {
"page.html": {
"type": "text",
"content": ""
},
"style.css": {
"type": "text",
"content": "@if (_parentSelector){ @_parentSelector, }\r\n@selector\r\n{\r\n @input\r\n}"
}
}
},
"CustomRadioButton.js": {
"type": "text",
"content": "/* exported CustomRadioButton */\r\n/* global WrapperController, CustomFormControl, Style, CssNamesController */\r\n\r\nfunction CustomRadioButton() {\r\n 'use strict';\r\n\r\n this.input = new CustomFormControl();\r\n this.label = new Style('Label');\r\n\r\n WrapperController.make(this, CustomRadioButton);\r\n\r\n Object.defineProperty(this, 'classNames', {\r\n enumerable: true,\r\n get: function () {\r\n return CssNamesController.getClass(this, false) + ' bd-formcontrol-radio' +\r\n ' bd-formcontrol-radio-' + this.input.size +\r\n ' bd-formcontrol-radio-' + this.input.style;\r\n }\r\n });\r\n}"
}
}
},
"FormControlCore": {
"type": "dir",
"items": {
"template": {
"type": "dir",
"items": {
"style.css": {
"type": "text",
"content": "@@bd-formcontrol-small : 12px;\r\n@@bd-formcontrol-medium : 16px;\r\n@@bd-formcontrol-large : 20px;\r\n@@bd-formcontrol-xlarge : 24px;\r\n\r\n.bd-formcontrol-size(@@caption, @@size) {\r\n .bd-formcontrol-checkbox-@@{caption} [type=\"checkbox\"] + label,\r\n .bd-formcontrol-radio-@@{caption} [type=\"radio\"] + label\r\n {\r\n padding-left: @@size + 4px;\r\n }\r\n\r\n .bd-formcontrol-checkbox-@@{caption}.bd-formcontrol-checkbox-icon [type=\"checkbox\"] + label,\r\n .bd-formcontrol-radio-@@{caption}.bd-formcontrol-radio-icon [type=\"radio\"] + label\r\n {\r\n &:before{\r\n font-size: @@size;\r\n }\r\n }\r\n\r\n .bd-formcontrol-checkbox-@@{caption}.bd-formcontrol-checkbox-simple [type=\"checkbox\"] + label,\r\n .bd-formcontrol-radio-@@{caption}.bd-formcontrol-radio-simple [type=\"radio\"] + label\r\n {\r\n &:before {\r\n height: @@size / 2;\r\n width: @@size / 2;\r\n left: @@size / 4;\r\n }\r\n }\r\n\r\n .bd-formcontrol-checkbox-@@{caption} [type=\"checkbox\"] + label,\r\n .bd-formcontrol-radio-@@{caption} [type=\"radio\"] + label\r\n {\r\n &:after\r\n {\r\n height: @@size;\r\n width: @@size;\r\n }\r\n }\r\n}\r\n\r\n.bd-formcontrol-checkbox .bd-form-checkbox.checkbox,\r\n.bd-formcontrol-radio .bd-form-radiobutton.radio\r\n{\r\n padding: 0;\r\n}\r\n\r\n.bd-formcontrol-checkbox [type=\"checkbox\"],\r\n.bd-formcontrol-radio [type=\"radio\"]\r\n{\r\n position: fixed;\r\n left: -9999px;\r\n display: none;\r\n\r\n + label\r\n {\r\n display: inline-block;\r\n position: relative;\r\n cursor: pointer;\r\n\r\n .bd-icon-core();\r\n\r\n &:before,\r\n &:after\r\n {\r\n display: block;\r\n position: absolute;\r\n content: '';\r\n left: 0;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n line-height: 1;\r\n }\r\n\r\n &:before\r\n {\r\n z-index: 1;\r\n }\r\n\r\n &:after\r\n {\r\n z-index: 0;\r\n }\r\n }\r\n}\r\n\r\n.bd-formcontrol-size(~'small', @@bd-formcontrol-small);\r\n.bd-formcontrol-size(~'medium', @@bd-formcontrol-medium);\r\n.bd-formcontrol-size(~'large', @@bd-formcontrol-large);\r\n.bd-formcontrol-size(~'xlarge', @@bd-formcontrol-xlarge);"
}
}
},
"FormControlCore.js": {
"type": "text",
"content": "/* exported FormControlCore */\r\n/* global WrapperController */\r\n\r\nfunction FormControlCore() {\r\n 'use strict';\r\n\r\n WrapperController.make(this, FormControlCore);\r\n}"
}
}
},
"FormControlState": {
"type": "dir",
"items": {
"template": {
"type": "dir",
"items": {
"style.css": {
"type": "text",
"content": "&:before\r\n{\r\n @inner\r\n}\r\n\r\n&:after\r\n{\r\n @outer\r\n}\r\n"
}
}
},
"FormControlState.js": {
"type": "text",
"content": "/* exported FormControlState */\r\n/* global WrapperController, ItemStateStyles, ControlTemplateController, ControlRender */\r\n\r\nfunction FormControlState() {\r\n 'use strict';\r\n \r\n this.inner = new ItemStateStyles();\r\n this.outer = new ItemStateStyles();\r\n\r\n this.toString = function toString(){\r\n var template = ControlTemplateController.getTemplateForControl(this);\r\n return ControlRender.processContent(template.read('style.css'), $.extend({}, this));\r\n };\r\n\r\n WrapperController.make(this, FormControlState);\r\n}"
}
}
}
}
},
"GoogleFonts": {
"type": "dir",
"items": {
"template": {
"type": "dir",
"items": {
"head.html": {
"type": "text",
"content": "@if( (families !== '' || _families !== '') ){\r\n\r\n}"
},
"page.html": {
"type": "text",
"content": "@if( (families !== '' || _families !== '') ){\r\n\r\n}"
}
}
},
"GoogleFonts.js": {
"type": "text",
"content": "/*exported GoogleFonts*/\n/*global GoogleFontsController, WrapperController */\n\nvar GoogleFonts = (function (){\n 'use strict';\n\n var instance = null;\n function GoogleFonts(){\n if (instance === null){\n instance = this;\n } else {\n return instance;\n }\n this.subset = 'latin';\n this.families = '';\n WrapperController.make(this, GoogleFonts);\n Object.defineProperty(this, \"_families\",{\n enumerable:true,\n configurable: true,\n get: function (){\n return GoogleFontsController.getFamilies();\n }\n });\n }\n return GoogleFonts;\n})();\n"
}
}
},
"Grid": {
"type": "dir",
"items": {
"Grid": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"icons": {
"type": "dir",
"items": {
"icon.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpDMTYyMjg4NDU2NUVFMzExQkE5MDg2NTQzNUU5RjRBOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERUQ0OTg0NUFGMzExMUUzQjU0M0U0MjZDMDAzNjg5OSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERUQ0OTg0NEFGMzExMUUzQjU0M0U0MjZDMDAzNjg5OSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJGMkUxMzFCMzFBRkUzMTFCMDFEOTJCOUMzOTAzRUUxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMxNjIyODg0NTY1RUUzMTFCQTkwODY1NDM1RTlGNEE5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KxRfvgAAARhJREFUeNrsV00OwUAY/Tp6CdyChj2xcQguQGwQsbcQsZEeAHdgZ09alyC4BOF7yVdpEBZqxmJe8tJmvnTe6/y85HMWwZpiyDFbzDIzS8niwFwxJ8xtNKjkmWIOmSGz9gNxkjkxdyBa0CRXigNml/TAEa0rs4cVyGsUjwOaHgw0xZVuQLOBLag8Vqpe8eUXy3CTSD2GElYgQ+aQVmQWrmkD9GRAOe/P47f1zwbU+0X5tv50FTiKr3+1BdpP4atBjTlA/3cLrAGbAzYHbA5YA5pz4AwDR4M5cEIOTPmlbmgHZrDrS5eiG9D0lfSDIwMGoBlGQdSXTqWtoUvCn49F834LLtKrFZhz5g4nNEFRzLWXuaHREU26CTAAln5JutHwt/EAAAAASUVORK5CYII="
}
}
},
"editor.json": {
"type": "text",
"content": "{\"caption\":\"Grid\",\"selectable\":\"asChild\"}"
},
"savePreset.js": {
"type": "text",
"content": "/* global $ */\n(function () {\n 'use strict';\n return {\n updateCss: function () {\n return '';\n },\n updateHtml: function () {\n return $('')\n .css('width', '80px')\n .css('text-align', 'center');\n }\n };\n})();"
},
"view.json": {
"type": "text",
"content": "[{\"widgets\":[{\"view\":\"BoxCollapsed\"},{\"view\":\"\",\"data\":\"items.0\",\"showColumns\":false,\"showIconTab\":false}]},{\"name\":\"Ribbon\",\"widgets\":[{\"view\":\"RibbonBoxCollapsed\"},{\"view\":\"Ribbon\",\"data\":\"items.0\",\"showColumns\":false,\"showIconTab\":false}]},{\"name\":\"RibbonGridWidget\",\"widgets\":[{\"view\":\"BoxCollapsed\",\"style\":\"ribbon\",\"popupRight\":false}]}]"
}
}
},
"template": {
"type": "dir",
"items": {
"page.html": {
"type": "text",
"content": "\r\n \r\n \r\n @for(var i = 0; i < items.length; i++) {\r\n @include(\"items/\" + i + \"/layoutIcon\")\r\n }\r\n @include(\"items\")\r\n \r\n \r\n "
},
"style.css": {
"type": "text",
"content": "@if (_parentSelector) {@_parentSelector } @selector {\n @css\n}\n\n@selector > .container-fluid {\n padding-left: 0;\n padding-right: 0;\n}"
}
}
},
"Grid.js": {
"type": "text",
"content": "/* exported Grid */\n/* global WrapperController, GridItems, CommonController, GridCore */\n\nfunction Grid() {\n\t'use strict';\n this.items = new GridItems();\n WrapperController.make(this, Grid);\n}\n\n$(document).one('controlDefined', function () {\n 'use strict';\n\n CommonController.setCommon(Grid, GridCore);\n});"
}
}
},
"GridCore": {
"type": "dir",
"items": {
"template": {
"type": "dir",
"items": {
"script.js": {
"type": "text",
"content": "(function SeparatedGrid($) {\r\n 'use strict';\r\n var row = [],\r\n getOffset = function getOffset(el) {\r\n var isInline = false;\r\n el.css('position', 'relative');\r\n if (el.css('display') === 'inline') {\r\n el.css('display', 'inline-block');\r\n isInline = true;\r\n }\r\n var offset = el.position().top;\r\n if (isInline) {\r\n el.css('display', 'inline');\r\n }\r\n return offset;\r\n },\r\n getCollapsedMargin = function getCollapsedMargin(el) {\r\n if (el.css('display') === 'block') {\r\n var m0 = parseFloat(el.css('margin-top'));\r\n if (m0 > 0) {\r\n var p = el.prev();\r\n var prop = 'margin-bottom';\r\n if (p.length < 1) {\r\n p = el.parent();\r\n prop = 'margin-top';\r\n }\r\n if (p.length > 0 && p.css('display') === 'block') {\r\n var m = parseFloat(p.css(prop));\r\n if (m > 0) {\r\n return Math.min(m0, m);\r\n }\r\n }\r\n }\r\n }\r\n return 0;\r\n },\r\n classRE = new RegExp('.*(bd-\\\\S+[-\\\\d]*).*'),\r\n childFilter = function childFilter() {\r\n return classRE.test(this.className);\r\n },\r\n getDeeper = function (roots) {\r\n while (roots.length && roots.length === roots.children().length) {\r\n roots = roots.children();\r\n }\r\n return roots;\r\n },\r\n calcOrder = function calcOrder(items) {\r\n var roots = getDeeper(items);\r\n var childrenClasses = [];\r\n var childrenWeights = {};\r\n var getNextWeight = function getNextWeight(children, i, l) {\r\n for (var j = i + 1; j < l; j++) {\r\n var cls = children[j].className.replace(classRE, '$1');\r\n if (childrenClasses.indexOf(cls) !== -1) {\r\n return childrenWeights[cls];\r\n }\r\n }\r\n return 100; //%\r\n };\r\n roots.each(function calcWeight(i, root) {\r\n var children = $(root).children().filter(childFilter);\r\n var previousWeight = 0;\r\n for (var c = 0, l = children.length; c < l; c++) {\r\n var cls = children[c].className.replace(classRE, '$1');\r\n if (!cls || cls.length < 1) {\r\n continue;\r\n }\r\n if (childrenClasses.indexOf(cls) === -1) {\r\n var nextWeight = getNextWeight(children, c, l);\r\n childrenWeights[cls] = previousWeight + (nextWeight - previousWeight) / 10; //~max unique child\r\n childrenClasses.push(cls);\r\n }\r\n previousWeight = childrenWeights[cls];\r\n }\r\n });\r\n childrenClasses.sort(function sortWeight(a, b) {\r\n return childrenWeights[a] > childrenWeights[b];\r\n });\r\n return childrenClasses;\r\n };\r\n var calcRow = function calcRow(helpNodes, last, order) {\r\n\r\n $(row).css({'overflow': 'visible', 'height': 'auto'}).toggleClass('last-row', last);\r\n\r\n if (row.length > 0) {\r\n var roots = $(row);\r\n roots.removeClass('last-col').last().addClass('last-col');\r\n roots = getDeeper(roots);\r\n\r\n var createHelpNode = function createHelpNode(fix) {\r\n var helpNode = document.createElement('div');\r\n helpNode.setAttribute('style', 'height:' + fix + 'px');\r\n helpNode.className = 'bd-empty-grid-item';\r\n helpNodes.push(helpNode);\r\n return helpNode;\r\n };\r\n var cls = '';\r\n var maxOffset = 0;\r\n var calcMaxOffsets = function calcMaxOffsets(i, root) {\r\n var el = $(root).children('.' + cls + ':visible:first');\r\n if (el.length < 1 || el.css('position') === 'absolute') {\r\n return;\r\n }\r\n var offset = getOffset(el);\r\n if (offset > maxOffset) {\r\n maxOffset = offset;\r\n }\r\n };\r\n var setMaxOffsets = function setMaxOffsets(i, root) {\r\n var el = $(root).children('.' + cls + ':visible:first');\r\n if (el.length < 1 || el.css('position') === 'absolute') {\r\n return;\r\n }\r\n var offset = getOffset(el);\r\n var fix = maxOffset - offset - getCollapsedMargin(el);\r\n if (fix > 0) {\r\n el.before(createHelpNode(fix));\r\n }\r\n };\r\n for (var c = 0; c < order.length; c++) {\r\n maxOffset = 0;\r\n cls = order[c];\r\n roots.each(calcMaxOffsets);\r\n maxOffset = Math.ceil(maxOffset);\r\n roots.each(setMaxOffsets);\r\n }\r\n var hMax = 0;\r\n $.each(roots, function calcMaxHeight(i, e) {\r\n var h = $(e).outerHeight();\r\n if (hMax < h) {\r\n hMax = h;\r\n }\r\n });\r\n hMax = Math.ceil(hMax);\r\n $.each(roots, function setMaxHeight(i, e) {\r\n var el = $(e);\r\n var fix = hMax - el.outerHeight();\r\n if (fix > 0) {\r\n el.append(createHelpNode(fix));\r\n }\r\n });\r\n\r\n $(row).css('min-height', (hMax + 1) + 'px');\r\n }\r\n row = [];\r\n };\r\n var itemsRE = new RegExp('.*(separated-item[^\\\\s]+).*'),\r\n resize = function resize() {\r\n var grid = $('.separated-grid');\r\n grid.each(function eachGrid(i, gridElement) {\r\n var g = $(gridElement);\r\n if (!g.is(':visible')) {\r\n return;\r\n }\r\n if (!gridElement._item || !gridElement._item.length || !gridElement._item.is(':visible')) {\r\n gridElement._item = g.find('div[class*=separated-item]:visible:first');\r\n if (!gridElement._item.length) {\r\n return;\r\n }\r\n gridElement._items = g.find(\r\n 'div.' + gridElement._item.attr('class').replace(itemsRE, '$1')\r\n ).filter(function () {\r\n return $(this).parents('.separated-grid')[0] === gridElement;\r\n });\r\n }\r\n var items = gridElement._items;\r\n if (!items.length) {\r\n return;\r\n }\r\n var h = 0;\r\n for (var k = 0; k < items.length; k++) {\r\n var el = $(items[k]);\r\n var _h = el.height();\r\n if (el.is('.first-col')) {\r\n h = _h;\r\n }\r\n if (h !== _h) {\r\n gridElement._height = 0;\r\n }\r\n }\r\n\r\n\r\n if (g.innerHeight() === gridElement._height && g.innerWidth() === gridElement._width) {\r\n return;\r\n }\r\n\r\n var windowScrollTop = $(window).scrollTop();\r\n items.css({'overflow': 'hidden', 'height': '10px', 'min-height': ''}).removeClass('last-row');\r\n if (gridElement._helpNodes) {\r\n $(gridElement._helpNodes).remove();\r\n }\r\n gridElement._helpNodes = [];\r\n var firstLeft = items.position().left;\r\n var order = calcOrder(items);\r\n var notDisplayed = [];\r\n var lastItem = null;\r\n items.each(function eachItems(i, gridItem) {\r\n var item = $(gridItem);\r\n var p = item;\r\n do {\r\n if (p.css('display') === 'none') {\r\n p.data('style', p.attr('style')).css('display', 'block');\r\n notDisplayed.push(p[0]);\r\n }\r\n p = p.parent();\r\n\r\n } while (p.length > 0 && p[0] !== gridElement && !item.is(':visible'));\r\n var first = firstLeft >= item.position().left;\r\n if (first && row.length > 0) {\r\n calcRow(gridElement._helpNodes, lastItem && lastItem.parentNode !== gridItem.parentNode, order);\r\n }\r\n row.push(gridItem);\r\n item.toggleClass('first-col', first);\r\n if (i === items.length - 1) {\r\n calcRow(gridElement._helpNodes, true, order);\r\n }\r\n lastItem = gridItem;\r\n });\r\n $(notDisplayed).each(function eachHidden(i, e) {\r\n var el = $(e);\r\n var css = el.data('style');\r\n el.removeData('style');\r\n if ('undefined' !== typeof css) {\r\n el.attr('style', css);\r\n } else {\r\n el.removeAttr('style');\r\n }\r\n });\r\n gridElement._width = g.innerWidth();\r\n gridElement._height = g.innerHeight();\r\n $(window).scrollTop(windowScrollTop);\r\n $(window).off('resize', lazy);\r\n $(window).resize();\r\n $(window).on('resize', lazy);\r\n });\r\n },\r\n timeoutLazy,\r\n lazy = function lazy(e, param) {\r\n clearTimeout(timeoutLazy);\r\n if (param && param.force) {\r\n resize();\r\n } else {\r\n timeoutLazy = setTimeout(resize, 100);\r\n }\r\n },\r\n interval = function interval() {\r\n lazy();\r\n setTimeout(interval, 1000);\r\n };\r\n $(window).resize(lazy);\r\n $(interval);\r\n $(document).bind('force-grids-update', resize);\r\n $(document).bind('force-grid-update', function (event, grid) {\r\n if (grid && grid.length) {\r\n grid.each(function (i, gridElement) {\r\n delete gridElement._height;\r\n delete gridElement._width;\r\n delete gridElement._helpNodes;\r\n });\r\n grid.find('.bd-empty-grid-item').remove();\r\n resize();\r\n }\r\n });\r\n})(jQuery);"
},
"style.css": {
"type": "text",
"content": ".bd-empty-grid-item\r\n{\r\n clear: both;\r\n}"
}
}
},
"GridCore.js": {
"type": "text",
"content": "/* exported GridCore */\r\n/* global WrapperController */\r\n\r\nfunction GridCore() {\r\n 'use strict';\r\n\r\n WrapperController.make(this, GridCore);\r\n}"
}
}
},
"GridItem": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"icons": {
"type": "dir",
"items": {
"Frame.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvgAADr4B6kKxwAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xYuj2fAAAAKFJREFUWEftls0JgDAMRjud0DHcxhW6mjc9uEZsQgJVqxXtj0IefAdT8uUdNcoeAKiSA9FhQQ73PiXgnLM+iw9kCnZZridSAjmPSxauJ1ICtISzHJE+ridwviEc3BUQYm9hXgvMQw9PIvsqoAIqoAIqoAL/FziLEHsLU0zgbp4IlPglm7ieSAl0PmOw/DbY1XE9cSlQg809/GiRpjQX+AjGrGI7j8vctfYnAAAAAElFTkSuQmCC"
},
"Items.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvwAADr8BOAVTJAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xYuj2fAAAAIJJREFUWEftkgEKgDAMA/dVf+M7/UhlsEAsbRVliJKDw0JTCWITwmNmY3qJXmC2JaeB2XABbh0Joh0LeE7xB9u6WOaIlRkVUAEVeFygEkQ7FvCc4g8qQbRjAc8p/iD6rHDEfv4PRC+FI6YCKjC3QCWIdizgOeVS6CbfKtCfMxTiSGs7yENCwzNAWCMAAAAASUVORK5CYII="
},
"Separators.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvwAADr8BOAVTJAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xYuj2fAAAALtJREFUWEftku0JwzAMBb1qt+kKXq+LuCj4QMiSP36ElqCDBzK5yC+QkiQerbVbAnoemD40nLhgywycFjgtsVWAfN6vFkXcWmuTyOw5RF/I7hAEibeMiJsFssDzC8yiXT1HAXse0C/xhV66frFy2YfL7IIg8ZaRrl+sXHkO7A5BWMXiOTpgzwP6Je+HIuLyhTJ7DtEXsjsEQeItI+JmgSzw/AKzaFfPUcCeXZZCZ9fTbBW4k59envwhpXwBXnMUzD5CM/YAAAAASUVORK5CYII="
}
}
},
"editor.json": {
"type": "text",
"content": "{\"caption\":\"Grid Item\",\"DefineHooks\":\"LayoutRow\",\"canPositionAbsolute\":false,\"canPositionLayout\":false,\"canSaveAsStyle\":false,\"childrenPositions\":\"layout\",\"selectable\":\"asChild\",\"showChildren\":\"whenVisible\",\"layoutZones\":{\"horizontal\":false,\"vertical\":false}}"
},
"view.json": {
"type": "text",
"content": "[{\"name\":\"GridLayout\",\"defaults\":{\"showColumns\":true,\"showIconTab\":true},\"widgets\":[{\"widget\":\"Switch\",\"caption\":\"Collapse Spacing\",\"icon\":\"UIIcons/collapse-spacing.png\",\"provider\":{\"attr\":\"collapseGutter\"}},{\"view\":\"IconStatesPopup\",\"caption\":\"Icon\",\"icon\":\"UIIcons/icon.png\",\"data\":\"layoutIcon\",\"provider\":{\"visible\":\"%showIconTab%\"}},{\"widget\":\"Category\",\"caption\":\"Number of Columns\",\"provider\":{\"visible\":\"%showColumns%\"}},{\"view\":\"GridColumnWidth\",\"attr\":\"width_lg\",\"icon\":\"UIIcons/responsive-desktops.png\",\"caption\":\"Desktops\",\"label\":\"\"},{\"view\":\"GridColumnWidth\",\"attr\":\"width\",\"icon\":\"UIIcons/responsive-laptops.png\",\"caption\":\"Laptops\"},{\"view\":\"GridColumnWidth\",\"attr\":\"width_sm\",\"icon\":\"UIIcons/responsive-tablets.png\",\"caption\":\"Tablets\"},{\"view\":\"GridColumnWidth\",\"attr\":\"width_xs\",\"icon\":\"UIIcons/responsive-phones.png\",\"caption\":\"Phones\"},{\"widget\":\"Category\",\"helpText\":\"#JoomlaBlogColumns\",\"provider\":{\"name\":\"CMS\",\"cms\":\"Joomla\",\"provider\":{\"visible\":\"%showColumns%\"}}},{\"widget\":\"Row\",\"widgets\":[{\"widget\":\"Button\",\"caption\":\"Learn More\",\"style\":\"link\",\"provider\":{\"name\":\"URL\",\"href\":\"http://answers.themler.io/articles/4181\",\"provider\":{\"name\":\"CMS\",\"cms\":\"Joomla\",\"provider\":{\"visible\":\"%showColumns%\"}}}}]},{\"widget\":\"Category\",\"caption\":\"Separators\"},{\"widget\":\"DropDownButton\",\"caption\":\"Vertical Separators\",\"icon\":\"UIIcons/vertical-separator.png\",\"popupRight\":true,\"popupWidth\":\"200px\",\"data\":\"separator\",\"widgets\":[{\"widget\":\"Category\",\"caption\":\"Vertical\"},{\"widget\":\"DropDownButton\",\"popupRight\":true,\"caption\":\"Width\",\"icon\":\"UIIcons/border-width.png\",\"popupWidth\":\"160px\",\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"auto\",\"itemHeight\":\"24px\",\"category\":\"Width\",\"provider\":{\"name\":\"BorderWidth\",\"attr\":\"left\"}}],\"placeholder\":[{\"widget\":\"Html\",\"provider\":{\"name\":\"BorderWidth\",\"attr\":\"left\"}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Style\",\"icon\":\"UIIcons/border-style.png\",\"popupRight\":true,\"popupWidth\":\"120px\",\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"auto\",\"itemHeight\":\"25px\",\"category\":\"Style\",\"provider\":{\"name\":\"BorderStyle\",\"attr\":\"left\"}}],\"placeholder\":[{\"widget\":\"Html\",\"provider\":{\"name\":\"BorderStyle\",\"attr\":\"left\"}}]},{\"view\":\"ColorWithTransparency\",\"provider\":{\"name\":\"BorderColor\",\"attr\":\"left\"}},{\"widget\":\"DropDownButton\",\"caption\":\"Indent\",\"icon\":\"UIIcons/separator-vindent.png\",\"popupRight\":true,\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"130px\",\"category\":\"Indent\",\"provider\":{\"attr\":\"right\",\"items\":[{\"value\":\"\",\"caption\":\"No Value\"},{\"value\":\"0px\",\"caption\":\"@value\"},{\"value\":\"5px\",\"caption\":\"@value\"},{\"value\":\"10px\",\"caption\":\"@value\"},{\"value\":\"20px\",\"caption\":\"@value\"}]}}],\"placeholder\":[{\"widget\":\"Input\",\"isPopup\":true,\"type\":\"number\",\"provider\":{\"attr\":\"right\"},\"limits\":{\"px\":{\"min\":\"0\",\"max\":\"50\"}}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Offset\",\"icon\":\"UIIcons/separator-voffset.png\",\"popupRight\":true,\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"130px\",\"category\":\"Offset\",\"provider\":{\"attr\":\"left\",\"items\":[{\"value\":\"\",\"caption\":\"No Value\"},{\"value\":\"-20px\",\"caption\":\"@value\"},{\"value\":\"-10px\",\"caption\":\"@value\"},{\"value\":\"-5px\",\"caption\":\"@value\"},{\"value\":\"0px\",\"caption\":\"@value\"},{\"value\":\"5px\",\"caption\":\"@value\"},{\"value\":\"10px\",\"caption\":\"@value\"},{\"value\":\"20px\",\"caption\":\"@value\"}]}}],\"placeholder\":[{\"widget\":\"Input\",\"isPopup\":true,\"type\":\"number\",\"provider\":{\"attr\":\"left\"},\"limits\":{\"px\":{\"min\":\"-50\",\"max\":\"50\"}}}]}],\"placeholder\":[{\"widget\":\"Html\",\"provider\":{\"name\":\"BorderWidth\",\"attr\":\"left\"}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Horizontal Separators\",\"popupRight\":true,\"popupWidth\":\"200px\",\"icon\":\"UIIcons/horizontal-separator.png\",\"data\":\"separator\",\"widgets\":[{\"widget\":\"Category\",\"caption\":\"Horizontal\"},{\"widget\":\"DropDownButton\",\"popupRight\":true,\"caption\":\"Width\",\"icon\":\"UIIcons/border-width.png\",\"popupWidth\":\"160px\",\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"auto\",\"itemHeight\":\"24px\",\"category\":\"Width\",\"provider\":{\"name\":\"BorderWidth\",\"attr\":\"top\"}}],\"placeholder\":[{\"widget\":\"Html\",\"provider\":{\"name\":\"BorderWidth\",\"attr\":\"top\"}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Style\",\"icon\":\"UIIcons/border-style.png\",\"popupRight\":true,\"popupWidth\":\"120px\",\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"auto\",\"itemHeight\":\"25px\",\"category\":\"Style\",\"provider\":{\"name\":\"BorderStyle\",\"attr\":\"top\"}}],\"placeholder\":[{\"widget\":\"Html\",\"provider\":{\"name\":\"BorderStyle\",\"attr\":\"top\"}}]},{\"view\":\"ColorWithTransparency\",\"provider\":{\"name\":\"BorderColor\",\"attr\":\"top\"}},{\"widget\":\"DropDownButton\",\"caption\":\"Indent\",\"icon\":\"UIIcons/separator-hindent.png\",\"popupRight\":true,\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"130px\",\"category\":\"Indent\",\"provider\":{\"attr\":\"bottom\",\"items\":[{\"value\":\"\",\"caption\":\"No Value\"},{\"value\":\"0px\",\"caption\":\"@value\"},{\"value\":\"5px\",\"caption\":\"@value\"},{\"value\":\"10px\",\"caption\":\"@value\"},{\"value\":\"20px\",\"caption\":\"@value\"}]}}],\"placeholder\":[{\"widget\":\"Input\",\"isPopup\":true,\"type\":\"number\",\"provider\":{\"attr\":\"bottom\"},\"limits\":{\"px\":{\"min\":\"0\",\"max\":\"50\"}}}]},{\"widget\":\"DropDownButton\",\"caption\":\"Offset\",\"icon\":\"UIIcons/separator-hoffset.png\",\"popupRight\":true,\"widgets\":[{\"widget\":\"ListBox\",\"isPopup\":true,\"width\":\"130px\",\"category\":\"Offset\",\"provider\":{\"attr\":\"top\",\"items\":[{\"value\":\"\",\"caption\":\"No Value\"},{\"value\":\"-20px\",\"caption\":\"@value\"},{\"value\":\"-10px\",\"caption\":\"@value\"},{\"value\":\"-5px\",\"caption\":\"@value\"},{\"value\":\"0px\",\"caption\":\"@value\"},{\"value\":\"5px\",\"caption\":\"@value\"},{\"value\":\"10px\",\"caption\":\"@value\"},{\"value\":\"50px\",\"caption\":\"@value\"}]}}],\"placeholder\":[{\"widget\":\"Input\",\"isPopup\":true,\"type\":\"number\",\"provider\":{\"attr\":\"top\"},\"limits\":{\"px\":{\"min\":\"-50\",\"max\":\"50\"}}}]}],\"placeholder\":[{\"widget\":\"Html\",\"provider\":{\"name\":\"BorderWidth\",\"attr\":\"top\"}}]}]},{\"name\":\"GridInResponsive\",\"defaults\":{\"icon\":\"UIIcons/responsive-desktops.png\",\"caption\":\"\",\"viewName\":\"ColumnWidthBase\",\"attr\":\"width\",\"labelWidth\":\"50px\"},\"widgets\":[{\"widget\":\"Row\",\"widgets\":[{\"widget\":\"Caption\",\"description\":\"%caption%\",\"isPopup\":true,\"labelWidth\":\"%labelWidth%\",\"labelMinWidth\":\"%labelWidth%\",\"icon\":\"%icon%\"},{\"widget\":\"Caption\",\"caption\":\"\",\"provider\":{\"visible\":\"%showColumns%\"},\"placeholder\":[{\"view\":\"ColumnWidth\",\"attr\":\"width\"}]}]}]},{\"name\":\"ItemsSmall\",\"defaults\":{\"style\":\"row\",\"popupRight\":true,\"icon\":\"\",\"showColumns\":true,\"showIconTab\":true,\"layoutDropDown\":true,\"layoutCollapsed\":false},\"widgets\":[{\"widget\":\"DropDownButton\",\"caption\":\"Layout\",\"icon\":\"%icon%\",\"style\":\"%style%\",\"popupWidth\":\"250px\",\"popupRight\":\"%popupRight%\",\"widgets\":[{\"widget\":\"Category\",\"caption\":\"Layout\",\"provider\":{\"visible\":\"%showColumns%\"}},{\"view\":\"GridLayout\",\"showColumns\":\"%showColumns%\",\"showIconTab\":\"%showIconTab%\"}],\"provider\":{\"visible\":\"%layoutDropDown%\"}},{\"view\":\"GridLayout\",\"showColumns\":\"%showColumns%\",\"showIconTab\":\"%showIconTab%\",\"provider\":{\"visible\":\"%layoutCollapsed%\"}},{\"widget\":\"Separator\",\"provider\":{\"visible\":\"%layoutCollapsed%\"}},{\"view\":\"BoxCollapsed\",\"caption\":\"Item\",\"icon\":\"%icon%\",\"data\":\"passiveItem\",\"popupRight\":\"%popupRight%\",\"style\":\"%style%\"},{\"view\":\"BoxCollapsed\",\"caption\":\"Hover\",\"icon\":\"%icon%\",\"data\":\"hoveredItem\",\"popupRight\":\"%popupRight%\",\"style\":\"%style%\"}]},{\"name\":\"Ribbon\",\"defaults\":{\"showColumns\":true,\"showIconTab\":false},\"widgets\":[{\"widget\":\"Group\",\"caption\":\"Grid Item\",\"columns\":[{\"widgets\":[{\"view\":\"ItemsSmall\",\"style\":\"small\",\"popupRight\":false}]}]}]},{\"name\":\"GridColumnWidth\",\"defaults\":{\"labelWidth\":\"50px\",\"labelMinWidth\":\"50px\",\"icon\":\"\",\"showColumns\":true,\"caption\":\"\",\"label\":\"and up\"},\"widgets\":[{\"widget\":\"Caption\",\"caption\":\"%caption%\",\"provider\":{\"visible\":\"%showColumns%\"},\"icon\":\"%icon%\",\"placeholder\":[{\"widget\":\"Caption\",\"description\":\"%label%\",\"isPopup\":true,\"labelWidth\":\"%labelWidth%\",\"labelMinWidth\":\"%labelWidth%\"},{\"view\":\"ColumnWidth\",\"attr\":\"%attr%\"}]}]},{\"name\":\"ColumnWidth\",\"defaults\":{\"icon\":\"\",\"showIconTab\":false,\"showColumns\":true,\"caption\":\"\"},\"widgets\":[{\"widget\":\"DropDownListBox\",\"isPopup\":true,\"width\":\"54px\",\"rows\":\"12\",\"provider\":{\"attr\":\"%attr%\",\"items\":\" ,;1,1;2,2;3,3;4,4;6,6;12,12\"}}]}]"
}
}
},
"template": {
"type": "dir",
"items": {
"page.html": {
"type": "text",
"content": ""
},
"style.css": {
"type": "text",
"content": "@{\n function fromPx(val) {\n return val !== '' && val !== undefined ? parseInt(val) : 0;\n }\n function toPx(val) {\n return val === 0 ? '0' : val + 'px';\n }\n\n var _selector = '.separated-item-' + id;\n\n var hOffset = (fromPx(passiveItem.css('margin-top')) + fromPx(passiveItem.css('margin-bottom'))) / 2;\n var vOffset = (fromPx(passiveItem.css('margin-left')) + fromPx(passiveItem.css('margin-right'))) / 2;\n\n var leftOffset = fromPx(separator.css('left'));\n var topOffset = fromPx(separator.css('top'));\n var verticalCrop = fromPx(separator.css('right'));\n var horizontalCrop = fromPx(separator.css('bottom'));\n\n var verticalTop = toPx(verticalCrop + topOffset);\n var verticalBottom = toPx(verticalCrop - topOffset);\n var horizontalLeft = toPx(horizontalCrop + leftOffset);\n var horizontalRight = toPx(horizontalCrop - leftOffset);\n var bottomOffset = toPx(-topOffset + hOffset - fromPx(separator.css('border-top-width')) / 2);\n var leftOffset = toPx(leftOffset + vOffset - fromPx(separator.css('border-left-width')) / 2);\n}\n\n@if(selector+passiveItem !== '') {\n @selector\n {\n @passiveItem\n }\n}\n\n@if(selector+hoveredItem !== '') {\n @selector:hover\n {\n @hoveredItem\n }\n}\n\n\n@_selector\n{\n position:relative;\n z-index: 0;\n}\n\n@_selector:before, @_selector:after\n{\n content:\"\";\n position:absolute;\n z-index: 10;\n}\n\n@_selector:before\n{\n top: @verticalTop;\n bottom: @verticalBottom;\n left: @leftOffset;\n @separator.css.filter('border-left-width,border-left-style,border-left-color');\n}\n\n@_selector:after\n{\n left: @horizontalLeft;\n right: @horizontalRight;\n bottom: @bottomOffset;\n @separator.css.filter('border-top-width,border-top-style,border-top-color');\n .first-col&\n {\n left: @horizontalLeft + @@grid-gutter-width / 2;\n }\n .last-col&\n {\n right: @horizontalRight + @@grid-gutter-width / 2;\n }\n}\n\n@(_selector).first-col:before, @(_selector).last-row:after\n{\n content: none;\n}\n\n\n@if (collapseGutter) {\n .separated-item-@id\n {\n &:not(.first-col)\n {\n padding-left: 0;\n }\n &:not(.last-col)\n {\n padding-right: 0;\n }\n }\n}"
}
}
},
"GridItem.js": {
"type": "text",
"content": "/*exported GridItem*/\n/*global ItemStateStyles, WrapperController, LayoutItems, Icon, ItemSeparator */\n\nfunction GridItem() {\n 'use strict';\n this.passiveItem = new ItemStateStyles();\n this.hoveredItem = new ItemStateStyles();\n this.layoutName = '';\n this.items = new LayoutItems();\n this.layoutIcon = new Icon();\n\n this.width_lg = '';\n this.width = '1';\n this.width_sm = '';\n this.width_xs = '';\n\n this.isActive = false;\n this.separator = new ItemSeparator();\n this.collapseGutter = false;\n WrapperController.make(this, GridItem);\n}\n\nGridItem.prototype.beforeBuild = function () {\n 'use strict';\n\n var itemClass = 'separated-item-' + this.prop('id');\n\n if (this.prop('width_lg')) {\n itemClass += ' col-lg-' + _convertColumns(this.prop('width_lg'));\n }\n if (this.prop('width')) {\n itemClass += ' col-md-' + _convertColumns(this.prop('width'));\n }\n if (this.prop('width_sm')) {\n itemClass += ' col-sm-' + _convertColumns(this.prop('width_sm'));\n }\n if (this.prop('width_xs')) {\n itemClass += ' col-xs-' + _convertColumns(this.prop('width_xs'));\n }\n itemClass += ' ' + this.prop('layoutName');\n\n this.prop('_itemClass', itemClass);\n};\n\nfunction _convertColumns(cols) {\n 'use strict';\n return Math.round(12 / Math.min(12, Math.max(1, parseInt(cols, 10))));\n}"
}
}
},
"GridItems": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"editor.json": {
"type": "text",
"content": "{\"caption\":\"Grid Items\",\"canPositionAbsolute\":false,\"canPositionLayout\":false,\"canDuplicate\":false,\"canSaveAsStyle\":false,\"childrenPositions\":\"layout\",\"selectable\":false,\"layoutZones\":{\"horizontal\":false,\"vertical\":false}}"
}
}
},
"template": {
"type": "dir",
"items": {
"page.html": {
"type": "text",
"content": " @for(var i = 0; i < control.length; i++) {\n @if('string' === typeof control[i]) {\n @include(control[i])\n } else {\n @include(i)\n }\n }"
}
}
},
"GridItems.js": {
"type": "text",
"content": "/*global Collection, WrapperController, ControlsCollection, PropertyObserverController */\n\nfunction GridItems() {\n 'use strict';\n\tPropertyObserverController.defineProperty(this, 'length', PropertyObserverController.getOwnPropertyDescriptor(Collection.prototype, 'length'));\n Collection.performanceFix(this);\n WrapperController.make(this, GridItems);\n this.types = 'GridItem';\n}\n\n$(document).one('controlDefined', function () {\n 'use strict';\n GridItems.prototype = Object.create(ControlsCollection.prototype, {\n constructor: {\n value: GridItems,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n GridItems.prototype.validator = Collection.prototype.validator;\n});\n\n\n"
}
}
},
"ItemSeparator": {
"type": "dir",
"items": {
"ItemSeparator.js": {
"type": "text",
"content": "/*exported ItemSeparator*/\n/*global WrapperController, ControlRender, ControlTemplateController */\n\nfunction ItemSeparator() {\n\t'use strict';\n this.toString = function() {\n var template = ControlTemplateController.getTemplateForControl(this);\n return ControlRender.processContent(template.read('style.css'), $.extend({}, this));\n };\n WrapperController.make(this, ItemSeparator);\n}"
}
}
}
}
},
"ImageLink": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"icons": {
"type": "dir",
"items": {
"frame.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEJBMDY3MTE4MURDMTFFM0E1NDZGRkMyRjA0NzMxNDAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEJBMDY3MTI4MURDMTFFM0E1NDZGRkMyRjA0NzMxNDAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowQkEwNjcwRjgxREMxMUUzQTU0NkZGQzJGMDQ3MzE0MCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowQkEwNjcxMDgxREMxMUUzQTU0NkZGQzJGMDQ3MzE0MCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjKjk+gAAAE0SURBVHjaYolZ+MyTgYFhLhBLMlAXPAfiZCYaGc4ANXMuC5LhjFS24D/IbCYGGgMWHOJKQOwDxC+AeA0Q/6OmBXJAfA6I+aH8qUCcQ64F2IIoFMlwEEikJIiwWXAPjX+X2hZsAOIJQPwJiK9S6gNGYEb7T8NkykBJMuUF4gQgFicnmRICoESwH4gNgfgyEBsD8W9i44AYMBtqOAjoAnEqKZEMAyDvc2IRj4cmZWRQiis0cFlgB8TzgXgRWuTLA/FELOoVgDiAFAuyoXQIEFdD2dxAvBotE2LTQzCSJdFc0whNKVZAbIQnSB2AWAuIrxHyQRgQs6GpySFgOAyEExNEbBTkjT/EWLCezPIHpGc5MXFwB4hVqFVe0LxGY4LW/rDCiZoYBB4xQXPsbRo4HmRmKkCAAQD+vkKSUdNAwQAAAABJRU5ErkJggg=="
},
"hyperlink.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEVEMzdFOTE4MURDMTFFMzg5OUM4M0MzQzQzMzkyRTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEVEMzdFOTI4MURDMTFFMzg5OUM4M0MzQzQzMzkyRTgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRUQzN0U4RjgxREMxMUUzODk5QzgzQzNDNDMzOTJFOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRUQzN0U5MDgxREMxMUUzODk5QzgzQzNDNDMzOTJFOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkQrpXgAAAH5SURBVHjanJZLKIRRFMfHECuhCAtCCGtFStKkKJTnQkrYSGyIlQWyUIhYyKM8NmRISZJHXsWKlAXGlBLymoWNKK//rfPV6TTzNfe79Wu+c787/3Pvnf+5dwJq5x5tFls46AblIBbcgEkwBn6MQUEWxePALkhhfelgGDhAJfhSnXYL4vFgX4jzVgxWQYiVBDFgDyRR/AnqQBqJGq0ILIFA3QQzQrwMzINrUA2cbGwpaNVJoIQLhfgme/8NasAK62vQSZBqIs6TdLE4WSfBGxPfAh1gHESLcdns+UXHpmf04x2CaVBP/crzLfRcAibYd5w6K/j1Im6jAjPEl0EwxZegz9cKEqhwPOCUZhkIpoS4qtxRcoyTibtAAXiXK1AlvwFu6fMA5JqIN9HMpXg+eJCFplxyQvvM3XJkIu4Q4msgDzzKsyiTZhwlxLdNxP+oqnNABLgC93KvVYJEsAPCvPi800TccNCpmTPUFvX6ELdRcm/b4rf7glj520iAV2gPzVZZcYROSmXFLHDub4JQFp+I90+g2YvPI/1dgV3MpJ8sKZssIpdOgiEWq/1fEDddqRBfB3c6CZSPB1lfFVgEGaBR+NytjmCdC8SYaQcla6O4guDtmYrwVScBt1s7GPAxzkNni1v3Apd+7qQtOgYf5KJZqvQLK38//gUYAFkefKcXdEIUAAAAAElFTkSuQmCC"
},
"icon.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5MEExNDJEQjExMzdFMzExOEI2RDhBRDIxNDFCRDNDRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0RTZBNEQ3NzUwMkIxMUUzQjBEOUY2ODU2NEQ0QkUzOCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0RTZBNEQ3NjUwMkIxMUUzQjBEOUY2ODU2NEQ0QkUzOCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNCNkU2MTQ3MkI1MEUzMTFBQjgzRTA1QkRBNzU2MzQ2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjkwQTE0MkRCMTEzN0UzMTE4QjZEOEFEMjE0MUJEM0NFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+RR3SwQAABWlJREFUeNq8V3tsU2UU/93e7vaxtV3bwdayh3vDIIYN8MGCKMMAOmT4ICYm/mGUfxzBhJeZIBplBsQEJxIwEA1MgkQgKD4QeYiCTASByYhj4NhAVsfazXVt1/XhuY+1q+3umm1ykpO23739fr/vnO/8zvcx5buDGGAl5EvJy8jHYXTtFvlR8hryc/2DCumTJV9P/iv58/8DOKQ5+bnPSlg8JpTSw3XkK3F3jJGw+NC/ykdgyl0EH2g85lSewBKJ1aBmTOhAquovKJm+0Y5EJZ+CR2M/DWJe6j5UpNXCor4pjPUG1PjJPhs7W1+G3TtmNEjMYqgKgrHAl+a+ibKUQzH/Ze9LwZorW9DizhkpAZ8i1ujcsfsHBefNlHAHy/JWE9HASAkoYxJYaNk15D9ztI2YbPhlxDlQ/ncghbOFcj6UFeku4reuB2I+eywfWFAIWHWkQN3AgSvA4WtxEFCz7rjZa9iemFv7JSrs+QUDFIhIVN4HZBiA7ecj349Kwd+9VngCmrgItLqzZcHvuEh7rwMuqXr5iLxYMgQBb4DDKXvZkOA8yTOOmRFj5QVhcD7sy78DNtUBVdQBnN4wibl5MgR4E+qcSk3OPmlZgq4+U8TqF00Mg79GoB1SNq85gNXHALcUiYXjhyDAi0xVw0e47iqIXrlfi63NK/GVbVHEeCIHJKujwfuNJ3G6VfxuSZLZhKHe6cnEK/W1KDbUYYLuEtQKF1o92ahzPBSx8n7rodU1dgDVPwLZRuCtWWL+912RqksLFFvE77edA/ZNLCUcdk2zAUwb58Gq6SqwDIub3QFUfuOFUaVGNRGy6MT3PqSG/G2TTAri7SRJXLiLqVR2PF26h8A5AdxHIrn9nAIWgxPvzPaHwA/+EQaXTYEc8Hzayc8UiTm/agfWnrKh4v6DeGrMCwSuFMDfPgm0dPvw7hwlzBwbAt9xfgghkjMFoVdOo/aZG97t6whoslURBV7f7sP75XcIPA0OTwB7LytwqDEOJeQtQdENs+oi/EE1HN4imlQrdI2VpcCD6ZGlVpj6D5ZNMwlh7wuIhM7bfJg4aRM+tTeg6fe1aLNngeM6kZpWD1vbDHkCGqUNxeZqcIpOsV8S+A3nE5iRMy8KvNvficVTewlcHwK/1C6Cm0wXhXcL7l2DHB8tQCnKNsME0HZ7ZmwdUDJuTDLWhMDFfulCrn4PHs9zhuSVB+/qc6F4yuu47PmBCPlCOa+hsBuNlwfMGgyB85abVwuNxhZNgIEfE001SFTG7oQ6lVb4vNBGQuXxo4TAVSoH6pxfYn3DfrR7bdg4x4l0TRoaL70x6CmPZT0oHL9NiEQEgXxDLYxcw6AbsL1HJFaaQYJyTxPUA1ZRlH0a1WUMTFwyOmnD2RxZ8PkGb2h6w1VkZB4KE0hPPAyr9phsBZz+c79wjtYkACtKCqDzThcjw5rxrLkKyexY4fdntNs5rovC7pKdLyvrAJKSbvjY6c8tWFyYvEPHQF4QHe42tPcaUJiSDRXLoChxKgxMNh4xVEDPio3r66vA7nqS4py90Omvy+sJpUBvaLylmJC89UhcZztKaaPqY3ze8rNAVZvAoFhfjCTWKEaIGs02unBZrUdhHXckLl1JTLx5TMEyns3SLUXWgmZ6RQU0J2zBjqbv0UQKGAiKVcGvesMpOqymnEVu/s54dY3H3MxsPM5f14S72qC3o6A2iGBGJEd7x2Q0Nz+JHqcoMmmWE8jM+oJC64+XwIYVll2r+oWoSqqb5VH1QzIetEQHyGS+IPgwjJ/sPQkTyhZnOcZqzvjVbAdFILhXuqo9TG6lGlEGMgLDaFnRFxD+GEB+nPyDkyd28bdwkHbhXwEGAI3703GgH+mqAAAAAElFTkSuQmCC"
},
"image.png": {
"type": "data",
"content": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTFDODJEODE4MURDMTFFM0IxMTFFNjY3MTI2RDUyNTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTFDODJEODI4MURDMTFFM0IxMTFFNjY3MTI2RDUyNTgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxMUM4MkQ3RjgxREMxMUUzQjExMUU2NjcxMjZENTI1OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxMUM4MkQ4MDgxREMxMUUzQjExMUU2NjcxMjZENTI1OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PugZlUYAAAFYSURBVHjaYoxZ+MyTgYFhLhBLMlAXPAfiZCYaGc4ANXMuE5rhu4HYHYgtgbgDiP9QagkLEucAEIOC6y+UfwKIHwHxNEpsYEJiT0cyHAZAwfeDWhZ8wSL/G4h/UcuCcCzyoPjgo5YFcUDcD8RSQMwCtXAJpUmJBY1fAMVUA0wMNAaUWjAFiKWBOAWI/1HbgolAnAvEz6DJeSI1LTgKxCVoYo1A/IEYC74D8X88hn+Gpjj0YuQjtlyPzQJQOeSMJweDguUeDrkJ6BkT3QJQeXQRiPcDcSYWA5YD8UI8vnsNxCvwWTAVib0AiCch8W/hsBQdTMeV0Z4C8QY0xcVAzA7EsqDKAxrOhACoFD4LxMboPpiJJeJA/Awg9gbiFySksmnYgugAFTPwLWwW8FHRAn5sFlQCsRoVDAeZUYEcyc+h9bI1EN+kcln3COSDBCC+TYOCFGRmKkCAAQCmPkQvh0FDVwAAAABJRU5ErkJggg=="
}
}
},
"providers": {
"type": "dir",
"items": {
"ImageLinkResizeProvider.js": {
"type": "text",
"content": "/* exported ImageLinkResizeProvider */\r\n/* global ConstraintsResizeProvider, Utils, PubSubController, Channels */\r\nfunction ImageLinkResizeProvider() {\r\n 'use strict';\r\n this._outerDom = $();\r\n}\r\n\r\nUtils.extend(ImageLinkResizeProvider, ConstraintsResizeProvider);\r\n\r\nImageLinkResizeProvider.prototype.resize = function (control, dom, args) {\r\n 'use strict';\r\n var $dom = $(control.prop('selector'), dom);\r\n if (!$dom.length) {\r\n $dom = dom;\r\n }\r\n this.constructor.superclass.resize(control, $dom, args);\r\n this.constructor.superclass.resize(control, dom, args);\r\n\r\n this.postResize($dom);\r\n this._dom = $dom;\r\n this._outerDom = dom;\r\n};\r\n\r\nImageLinkResizeProvider.prototype.reset = function reset() {\r\n 'use strict';\r\n if (this._dom) {\r\n this._dom.css('width', '');\r\n this._dom.css('height', '');\r\n }\r\n\r\n if (this._outerDom) {\r\n this._outerDom.css('width', '');\r\n this._outerDom.css('height', '');\r\n }\r\n};\r\n\r\nImageLinkResizeProvider.prototype.apply = function apply(control, args) {\r\n 'use strict';\r\n this.constructor.superclass.apply(control, args);\r\n this.postApply(control);\r\n var dom = this._dom;\r\n PubSubController.once(Channels.history.requireCleanHtml, (function () {\r\n this._dom = dom;\r\n this.reset();\r\n this._dom = null;\r\n this._outerDom = null;\r\n }).bind(this));\r\n};"
}
}
},
"defaultContent.json": {
"type": "text",
"content": "{\"image\":{\"fileName\":\"{images}defaultImage.jpg\"}}"
},
"editor.json": {
"type": "text",
"content": "{\"canPositionFixed\":true,\"canSaveAsStyle\":false,\"caption\":\"Image\",\"communityTag\":\"Image\",\"picture\":\"image\",\"preserveAspectRatio\":true,\"resize\":{\"left\":true,\"right\":true,\"top\":true,\"bottom\":true},\"resizeProvider\":\"ImageLinkResizeProvider\",\"view\":{\"allowBackgroundEditing\":false,\"allowBorderEditing\":false,\"allowCornersEditing\":false,\"widthWidth\":\"122px\",\"widthHeight\":\"158px\",\"ribbonSizeProcessor\":\"ProportionalResizeProcessor\",\"imageProvider\":{\"resolveData\":true,\"data\":\"image\"}},\"resizeToContainer\":true,\"rotate\":true,\"UICategory\":\"Main\",\"showHomeTab\":true}"
},
"view.json": {
"type": "text",
"content": "[{\"widgets\":[{\"view\":\"SelectPicture\",\"category\":\"\",\"subCategory\":\"\",\"href\":\"\",\"style\":\"button\",\"data\":\"image\"},{\"widget\":\"Row\",\"widgets\":[{\"widget\":\"Button\",\"icon\":\"UIIcons/edit.png\",\"caption\":\"Edit Image\",\"provider\":\"AviaryEditor\",\"style\":\"button\",\"data\":\"image\"}]},{\"view\":\"ImageFilters\",\"style\":\"medium\",\"data\":\"image\"},{\"widget\":\"Input\",\"disableValidation\":true,\"caption\":\"Alt\",\"width\":\"200px\",\"provider\":{\"attr\":\"alt\"}},{\"view\":\"Opacity\"},{\"view\":\"HyperlinkDropDown\"},{\"view\":\"Image\"}]},{\"name\":\"Ribbon\",\"defaults\":{\"category\":\"\",\"subCategory\":\"\"},\"widgets\":[{\"view\":\"RibbonChangePicture\",\"data\":\"image\"},{\"view\":\"RibbonImageEffects\"},{\"view\":\"RibbonLinkTextSettings\"},{\"view\":\"RibbonArrange\",\"style\":\"responsive-1200\",\"sizeStyle\":\"responsive-1400\",\"processor\":\"ProportionalResizeProcessor\"}]}]"
}
}
},
"export": {
"type": "dir",
"items": {
"Joomla": {
"type": "dir",
"items": {}
},
"ShortCode": {
"type": "dir",
"items": {
"page.html": {
"type": "text",
"content": "@{\r\n var isBootstrapImage = imageStyle.constructorName === 'BootstrapImage';\r\n}\r\n[image @shortcode_attributes({\r\n \"href\": [href],\r\n \"target\": [target],\r\n \"screen_tip\": [screenTip],\r\n \"alt\": [alt],\r\n\r\n \"image_style\": [isBootstrapImage ? imageStyle.shape.replace('img-', '') : imageStyle.mixinName],\r\n \"type\": [\"bootstrap\", isBootstrapImage],\r\n \"responsive\": [imageStyle.responsive, isBootstrapImage && imageStyle.responsive],\r\n \"image\": [image.fileName, image.toString('url')]\r\n}, shortcode_css())][/image]"
}
}
},
"WordPress": {
"type": "dir",
"items": {}
}
}
},
"imageStyle": {
"type": "dir",
"items": {
"editor": {
"type": "dir",
"items": {
"editor.json": {
"type": "text",
"content": "{\"selectable\":false,\"resize\":{\"left\":false,\"right\":false,\"top\":false,\"bottom\":false}}"
}
}
}
}
},
"template": {
"type": "dir",
"items": {
"ImageLink.css": {
"type": "text",
"content": "@if (href) {\n\n @selector {\n display:inline-block;\n @css.filter('positioning,transform,margin,float')\n @if(!!image.fileName) {\n @css.filter('size')\n }\n }\n\n @selector img {\n display:inline-block;\n width: 100%;\n height: 100%;\n @if(!image.fileName) {\n @css.filter('!positioning,!transform,!margin,!float')\n } else {\n @css.filter('!positioning,!transform,!size,!margin,!float')\n }\n }\n\n} else {\n @selector {\n @css\n }\n}"
},
"ImageLink.html": {
"type": "text",
"content": "@if (href) {\n\n\n\n} else {\n\n}"
}
}
},
"ImageLink.js": {
"type": "text",
"content": "/* exported ImageLink */\n/* global Picture, Style, WrapperController, ShortcodesEditor, _$, SerializeController, ShortcodesEditorHelper */\n\nfunction ImageLink() {\n 'use strict';\n this.imageStyle = new Style(\"Image\");\n \n this.image = new Picture();\n this.href = '';\n this.target = '';\n this.screenTip = '';\n this.alt = '';\n\n WrapperController.make(this, ImageLink);\n\n this._aClassNames = '';\n this._imgClassNames = '';\n}\n\nShortcodesEditor.register(\n 'image',\n 'ImageLink',\n false,\n function(dom, control) {\n 'use strict';\n\n var c = _$(control),\n styleClass = c.find('imageStyle').prop('classNames'),\n styleSelector = c.find('imageStyle').prop('selector'),\n styleEditor = c.find('imageStyle').prop('editorClass');\n\n dom.addClass([c.prop('editorClass'), c.prop('classNames')].join(' '));\n\n var img = dom.find('img'),\n imgParent = img.parent();\n\n if (imgParent.length && !imgParent.is(c.prop('selector') + styleSelector)) {\n img.addClass([styleClass, styleEditor].join(' '));\n }\n\n dom.filter('img').addClass(styleClass);\n\n return dom;\n },\n {\n css: '',\n href: 'href',\n link: 'href',\n target: 'target',\n screen_tip: 'screenTip',\n alt: 'alt',\n image: function(control, value) {\n 'use strict';\n if (value)\n control.image = new Picture('', value);\n },\n type: function(control, value, atts) {\n 'use strict';\n var image_style = atts.image_style,\n image_responsive = atts.responsive;\n\n if (value === 'bootstrap') {\n _$(control).find(\"imageStyle\").replaceWith(SerializeController.fillFromObject(_$(control).find(\"imageStyle\"), {constructorName: 'BootstrapImage'}, null, true));\n switch (image_style) {\n case 'rounded':\n case 'circle':\n case 'thumbnail':\n _$(control).find(\"imageStyle\").prop(\"shape\", 'img-' + image_style);\n break;\n }\n _$(control).find(\"imageStyle\").prop(\"responsive\", ShortcodesEditorHelper.parseBooleanAttribute(image_responsive));\n } else {\n _$(control).find(\"imageStyle\").replaceWith(ShortcodesEditorHelper.getStyle(image_style, 'Image'));\n }\n }\n },\n {\n 'additional-class-': 'classNames'\n }\n);\n"
}
}
},
"JQueryLibrary": {
"type": "dir",
"items": {
"template": {
"type": "dir",
"items": {
"head.html": {
"type": "text",
"content": ""
},
"jquery.js": {
"type": "text",
"content": "//@*--\n/*!\n * jQuery JavaScript Library v1.11.1\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-05-01T17:42Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper window is present,\n\t\t// execute the factory and get jQuery\n\t\t// For environments that do not inherently posses a window with a document\n\t\t// (such as Node.js), expose a jQuery-making factory as module.exports\n\t\t// This accentuates the need for the creation of a real window\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\n\nvar deletedIds = [];\n\nvar slice = deletedIds.slice;\n\nvar concat = deletedIds.concat;\n\nvar push = deletedIds.push;\n\nvar indexOf = deletedIds.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"1.11.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1, IE<9\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: deletedIds.sort,\n\tsplice: deletedIds.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\treturn !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1, IE<9\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\twhile ( j < len ) {\n\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\n\t\tif ( len !== len ) {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: function() {\n\t\treturn +( new Date() );\n\t},\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v1.10.19\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-04-18\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== strundefined && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", function() {\n\t\t\t\tsetDocument();\n\t\t\t}, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", function() {\n\t\t\t\tsetDocument();\n\t\t\t});\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowclip^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\n\t\t\t\t\t} else if ( !(--remaining) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * Clean-up method for dom ready events\n */\nfunction detach() {\n\tif ( document.addEventListener ) {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t} else {\n\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\twindow.detachEvent( \"onload\", completed );\n\t}\n}\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\tdetach();\n\t\tjQuery.ready();\n\t}\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n\nvar strundefined = typeof undefined;\n\n\n\n// Support: IE<9\n// Iteration over object's inherited properties before its own\nvar i;\nfor ( i in jQuery( support ) ) {\n\tbreak;\n}\nsupport.ownLast = i !== \"0\";\n\n// Note: most support tests are defined in their respective modules.\n// false until the test is run\nsupport.inlineBlockNeedsLayout = false;\n\n// Execute ASAP in case we need to set body.style.zoom\njQuery(function() {\n\t// Minified: var a,b,c,d\n\tvar val, div, body, container;\n\n\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\tif ( !body || !body.style ) {\n\t\t// Return for frameset docs that don't have a body\n\t\treturn;\n\t}\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\tbody.appendChild( container ).appendChild( div );\n\n\tif ( typeof div.style.zoom !== strundefined ) {\n\t\t// Support: IE<8\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\tdiv.style.cssText = \"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\";\n\n\t\tsupport.inlineBlockNeedsLayout = val = div.offsetWidth === 3;\n\t\tif ( val ) {\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t// Support: IE<8\n\t\t\tbody.style.zoom = 1;\n\t\t}\n\t}\n\n\tbody.removeChild( container );\n});\n\n\n\n\n(function() {\n\tvar div = document.createElement( \"div\" );\n\n\t// Execute the test only if not already executed in another module.\n\tif (support.deleteExpando == null) {\n\t\t// Support: IE<9\n\t\tsupport.deleteExpando = true;\n\t\ttry {\n\t\t\tdelete div.test;\n\t\t} catch( e ) {\n\t\t\tsupport.deleteExpando = false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n})();\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( elem ) {\n\tvar noData = jQuery.noData[ (elem.nodeName + \" \").toLowerCase() ],\n\t\tnodeType = +elem.nodeType || 1;\n\n\t// Do not set data on non-element DOM nodes because it will not be cleared (#8335).\n\treturn nodeType !== 1 && nodeType !== 9 ?\n\t\tfalse :\n\n\t\t// Nodes accept data unless otherwise specified; rejection can be conditional\n\t\t!noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n};\n\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements (space-suffixed to avoid Object.prototype collisions)\n\t// throw uncatchable exceptions if you attempt to set expando properties\n\tnoData: {\n\t\t\"applet \": true,\n\t\t\"embed \": true,\n\t\t// ...but Flash objects (which have this classid) *can* handle expandos\n\t\t\"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[0],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlength = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n};\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\t// Minified: var a,b,c\n\tvar input = document.createElement( \"input\" ),\n\t\tdiv = document.createElement( \"div\" ),\n\t\tfragment = document.createDocumentFragment();\n\n\t// Setup\n\tdiv.innerHTML = \" a\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName( \"tbody\" ).length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone =\n\t\tdocument.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav>\";\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tinput.type = \"checkbox\";\n\tinput.checked = true;\n\tfragment.appendChild( input );\n\tsupport.appendChecked = input.checked;\n\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\t// Support: IE6-IE11+\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tfragment.appendChild( div );\n\tdiv.innerHTML = \"\";\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tsupport.noCloneEvent = true;\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Execute the test only if not already executed in another module.\n\tif (support.deleteExpando == null) {\n\t\t// Support: IE<9\n\t\tsupport.deleteExpando = true;\n\t\ttry {\n\t\t\tdelete div.test;\n\t\t} catch( e ) {\n\t\t\tsupport.deleteExpando = false;\n\t\t}\n\t}\n})();\n\n\n(function() {\n\tvar i, eventName,\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\teventName = \"on\" + i;\n\n\t\tif ( !(support[ i + \"Bubbles\" ] = eventName in window) ) {\n\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\t\t\tdiv.setAttribute( eventName, \"t\" );\n\t\t\tsupport[ i + \"Bubbles\" ] = div.attributes[ eventName ].expando === false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n})();\n\n\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG |