define( [

"./core",
"./var/pnum",
"./core/access",
"./core/camelCase",
"./var/document",
"./var/rcssNum",
"./css/var/rnumnonpx",
"./css/var/cssExpand",
"./css/var/getStyles",
"./css/var/swap",
"./css/curCSS",
"./css/adjustCSS",
"./css/addGetHookIf",
"./css/support",

"./core/init",
"./core/ready",
"./selector" // contains

], function( jQuery, pnum, access, camelCase, document, rcssNum, rnumnonpx, cssExpand,

getStyles, swap, curCSS, adjustCSS, addGetHookIf, support ) {

“use strict”;

var

// Swappable if display is none or starts with table
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
        letterSpacing: "0",
        fontWeight: "400"
},

cssPrefixes = [ "Webkit", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style;

// Return a css property mapped to a potentially vendor prefixed property function vendorPropName( name ) {

// Shortcut for names that are not vendor prefixed
if ( name in emptyStyle ) {
        return name;
}

// Check for vendor prefixed names
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
        i = cssPrefixes.length;

while ( i-- ) {
        name = cssPrefixes[ i ] + capName;
        if ( name in emptyStyle ) {
                return name;
        }
}

}

// Return a property mapped along what jQuery.cssProps suggests or to // a vendor prefixed property. function finalPropName( name ) {

var ret = jQuery.cssProps[ name ];
if ( !ret ) {
        ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
}
return ret;

}

function setPositiveNumber( elem, value, subtract ) {

// Any relative (+/-) values have already been
// normalized at this point
var matches = rcssNum.exec( value );
return matches ?

        // Guard against undefined "subtract", e.g., when used as in cssHooks
        Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
        value;

}

function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {

var i = dimension === "width" ? 1 : 0,
        extra = 0,
        delta = 0;

// Adjustment may not be necessary
if ( box === ( isBorderBox ? "border" : "content" ) ) {
        return 0;
}

for ( ; i < 4; i += 2 ) {

        // Both box models exclude margin
        if ( box === "margin" ) {
                delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
        }

        // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
        if ( !isBorderBox ) {

                // Add padding
                delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );

                // For "border" or "margin", add border
                if ( box !== "padding" ) {
                        delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );

                // But still keep track of it otherwise
                } else {
                        extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
                }

        // If we get here with a border-box (content + padding + border), we're seeking "content" or
        // "padding" or "margin"
        } else {

                // For "content", subtract padding
                if ( box === "content" ) {
                        delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
                }

                // For "content" or "padding", subtract border
                if ( box !== "margin" ) {
                        delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
                }
        }
}

// Account for positive content-box scroll gutter when requested by providing computedVal
if ( !isBorderBox && computedVal >= 0 ) {

        // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
        // Assuming integer scroll gutter, subtract the rest and round down
        delta += Math.max( 0, Math.ceil(
                elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
                computedVal -
                delta -
                extra -
                0.5
        ) );
}

return delta;

}

function getWidthOrHeight( elem, dimension, extra ) {

// Start with computed style
var styles = getStyles( elem ),
        val = curCSS( elem, dimension, styles ),
        isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
        valueIsBorderBox = isBorderBox;

// Support: Firefox <=54
// Return a confounding non-pixel value or feign ignorance, as appropriate.
if ( rnumnonpx.test( val ) ) {
        if ( !extra ) {
                return val;
        }
        val = "auto";
}

// Check for style in case a browser which returns unreliable values
// for getComputedStyle silently falls back to the reliable elem.style
valueIsBorderBox = valueIsBorderBox &&
        ( support.boxSizingReliable() || val === elem.style[ dimension ] );

// Fall back to offsetWidth/offsetHeight when value is "auto"
// This happens for inline elements with no explicit setting (gh-3571)
// Support: Android <=4.1 - 4.3 only
// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
if ( val === "auto" ||
        !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {

        val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];

        // offsetWidth/offsetHeight provide border-box values
        valueIsBorderBox = true;
}

// Normalize "" and auto
val = parseFloat( val ) || 0;

// Adjust for the element's box model
return ( val +
        boxModelAdjustment(
                elem,
                dimension,
                extra || ( isBorderBox ? "border" : "content" ),
                valueIsBorderBox,
                styles,

                // Provide the current computed size to request scroll gutter calculation (gh-3589)
                val
        )
) + "px";

}

jQuery.extend( {

// Add in style property hooks for overriding the default
// behavior of getting and setting a style property
cssHooks: {
        opacity: {
                get: function( elem, computed ) {
                        if ( computed ) {

                                // We should always get a number back from opacity
                                var ret = curCSS( elem, "opacity" );
                                return ret === "" ? "1" : ret;
                        }
                }
        }
},

// Don't automatically add "px" to these possibly-unitless properties
cssNumber: {
        "animationIterationCount": true,
        "columnCount": true,
        "fillOpacity": true,
        "flexGrow": true,
        "flexShrink": true,
        "fontWeight": true,
        "lineHeight": true,
        "opacity": true,
        "order": true,
        "orphans": true,
        "widows": true,
        "zIndex": true,
        "zoom": true
},

// Add in properties whose names you wish to fix before
// setting or getting the value
cssProps: {},

// Get and set the style property on a DOM Node
style: function( elem, name, value, extra ) {

        // Don't set styles on text and comment nodes
        if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
                return;
        }

        // Make sure that we're working with the right name
        var ret, type, hooks,
                origName = camelCase( name ),
                isCustomProp = rcustomProp.test( name ),
                style = elem.style;

        // Make sure that we're working with the right name. We don't
        // want to query the value if it is a CSS custom property
        // since they are user-defined.
        if ( !isCustomProp ) {
                name = finalPropName( origName );
        }

        // Gets hook for the prefixed version, then unprefixed version
        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

        // Check if we're setting a value
        if ( value !== undefined ) {
                type = typeof value;

                // Convert "+=" or "-=" to relative numbers (#7345)
                if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
                        value = adjustCSS( elem, name, ret );

                        // Fixes bug #9237
                        type = "number";
                }

                // Make sure that null and NaN values aren't set (#7116)
                if ( value == null || value !== value ) {
                        return;
                }

                // If a number was passed in, add the unit (except for certain CSS properties)
                if ( type === "number" ) {
                        value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
                }

                // background-* props affect original clone's values
                if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
                        style[ name ] = "inherit";
                }

                // If a hook was provided, use that value, otherwise just set the specified value
                if ( !hooks || !( "set" in hooks ) ||
                        ( value = hooks.set( elem, value, extra ) ) !== undefined ) {

                        if ( isCustomProp ) {
                                style.setProperty( name, value );
                        } else {
                                style[ name ] = value;
                        }
                }

        } else {

                // If a hook was provided get the non-computed value from there
                if ( hooks && "get" in hooks &&
                        ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {

                        return ret;
                }

                // Otherwise just get the value from the style object
                return style[ name ];
        }
},

css: function( elem, name, extra, styles ) {
        var val, num, hooks,
                origName = camelCase( name ),
                isCustomProp = rcustomProp.test( name );

        // Make sure that we're working with the right name. We don't
        // want to modify the value if it is a CSS custom property
        // since they are user-defined.
        if ( !isCustomProp ) {
                name = finalPropName( origName );
        }

        // Try prefixed name followed by the unprefixed name
        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

        // If a hook was provided get the computed value from there
        if ( hooks && "get" in hooks ) {
                val = hooks.get( elem, true, extra );
        }

        // Otherwise, if a way to get the computed value exists, use that
        if ( val === undefined ) {
                val = curCSS( elem, name, styles );
        }

        // Convert "normal" to computed value
        if ( val === "normal" && name in cssNormalTransform ) {
                val = cssNormalTransform[ name ];
        }

        // Make numeric if forced or a qualifier was provided and val looks numeric
        if ( extra === "" || extra ) {
                num = parseFloat( val );
                return extra === true || isFinite( num ) ? num || 0 : val;
        }

        return val;
}

} );

jQuery.each( [ “height”, “width” ], function( i, dimension ) {

jQuery.cssHooks[ dimension ] = {
        get: function( elem, computed, extra ) {
                if ( computed ) {

                        // Certain elements can have dimension info if we invisibly show them
                        // but it must have a current display style that would benefit
                        return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&

                                // Support: Safari 8+
                                // Table columns in Safari have non-zero offsetWidth & zero
                                // getBoundingClientRect().width unless display is changed.
                                // Support: IE <=11 only
                                // Running getBoundingClientRect on a disconnected node
                                // in IE throws an error.
                                ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
                                        swap( elem, cssShow, function() {
                                                return getWidthOrHeight( elem, dimension, extra );
                                        } ) :
                                        getWidthOrHeight( elem, dimension, extra );
                }
        },

        set: function( elem, value, extra ) {
                var matches,
                        styles = getStyles( elem ),
                        isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
                        subtract = extra && boxModelAdjustment(
                                elem,
                                dimension,
                                extra,
                                isBorderBox,
                                styles
                        );

                // Account for unreliable border-box dimensions by comparing offset* to computed and
                // faking a content-box to get border and padding (gh-3699)
                if ( isBorderBox && support.scrollboxSize() === styles.position ) {
                        subtract -= Math.ceil(
                                elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
                                parseFloat( styles[ dimension ] ) -
                                boxModelAdjustment( elem, dimension, "border", false, styles ) -
                                0.5
                        );
                }

                // Convert to pixels if value adjustment is needed
                if ( subtract && ( matches = rcssNum.exec( value ) ) &&
                        ( matches[ 3 ] || "px" ) !== "px" ) {

                        elem.style[ dimension ] = value;
                        value = jQuery.css( elem, dimension );
                }

                return setPositiveNumber( elem, value, subtract );
        }
};

} );

jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,

function( elem, computed ) {
        if ( computed ) {
                return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
                        elem.getBoundingClientRect().left -
                                swap( elem, { marginLeft: 0 }, function() {
                                        return elem.getBoundingClientRect().left;
                                } )
                        ) + "px";
        }
}

);

// These hooks are used by animate to expand properties jQuery.each( {

margin: "",
padding: "",
border: "Width"

}, function( prefix, suffix ) {

jQuery.cssHooks[ prefix + suffix ] = {
        expand: function( value ) {
                var i = 0,
                        expanded = {},

                        // Assumes a single number if not a string
                        parts = typeof value === "string" ? value.split( " " ) : [ value ];

                for ( ; i < 4; i++ ) {
                        expanded[ prefix + cssExpand[ i ] + suffix ] =
                                parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
                }

                return expanded;
        }
};

if ( prefix !== "margin" ) {
        jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
}

} );

jQuery.fn.extend( {

css: function( name, value ) {
        return access( this, function( elem, name, value ) {
                var styles, len,
                        map = {},
                        i = 0;

                if ( Array.isArray( name ) ) {
                        styles = getStyles( elem );
                        len = name.length;

                        for ( ; i < len; i++ ) {
                                map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
                        }

                        return map;
                }

                return value !== undefined ?
                        jQuery.style( elem, name, value ) :
                        jQuery.css( elem, name );
        }, name, value, arguments.length > 1 );
}

} );

return jQuery; } );