// Signature format: 3.0
package androidx.ui.foundation {

  @androidx.compose.Immutable public final class Border {
    method public float component1();
    method public androidx.ui.graphics.Brush component2();
    method @androidx.compose.Immutable public androidx.ui.foundation.Border copy-HIF-_f0(float size, androidx.ui.graphics.Brush brush);
    method public androidx.ui.graphics.Brush getBrush();
    method public float getSize();
  }

  public final class BorderKt {
    method @androidx.compose.Stable public static androidx.ui.foundation.Border Border-YSZAjy0(float size, long color);
  }

  public final class BoxKt {
    method @androidx.compose.Composable public static void Box-TInkGdk(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, long backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, float padding = elvis {
    var var41190d7f: androidx.ui.unit.Dp = border?.size
    if (var41190d7f != null) var41190d7f else 0.dp
}, float paddingStart = Dp.Unspecified, float paddingTop = Dp.Unspecified, float paddingEnd = Dp.Unspecified, float paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
  }

  public final class CanvasKt {
    method @androidx.compose.Composable public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> onCanvas);
  }

  public final class ClickableKt {
    method @androidx.compose.Composable public static androidx.ui.core.Modifier clickable(androidx.ui.core.Modifier, boolean enabled = true, String? onClickLabel = null, androidx.ui.foundation.InteractionState interactionState = remember({ 
    return <init>()
}), androidx.ui.foundation.Indication? indication = IndicationAmbient.invoke(), kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick = null, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
  }

  public final class ClickableTextKt {
    method @androidx.compose.Composable public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
  }

  public final class ContentColorKt {
    method @androidx.compose.Composable public static long contentColor();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
  }

  public final class DarkThemeKt {
    method @androidx.compose.Composable public static boolean isSystemInDarkTheme();
  }

  public final class DeterminateProgressIndicatorKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier determinateProgressIndicator(androidx.ui.core.Modifier, @FloatRange(from=0.0, to=1.0) float progress);
  }

  public final class DialogKt {
    method @androidx.compose.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onCloseRequest, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DrawBackgroundKt {
    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
    method public static androidx.ui.core.Modifier drawBackground-a_xWPtA(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
  }

  public final class DrawBorder implements androidx.ui.core.DrawModifier {
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

  public final class DrawBorderKt {
    method @Deprecated @androidx.compose.Composable public static androidx.ui.core.Modifier DrawBorder(androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method @Deprecated @androidx.compose.Composable public static androidx.ui.foundation.DrawBorder DrawBorder-3vYgddY(float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
    method @Deprecated @androidx.compose.Composable public static androidx.ui.core.Modifier DrawBorder-Wounw_8(float size, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder(androidx.ui.core.Modifier, androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder-ik3FbJE(androidx.ui.core.Modifier, float size, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
  }

  public final class IconKt {
    method @androidx.compose.Composable public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
    method @androidx.compose.Composable public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
    method @androidx.compose.Composable public static void Icon-smRaMnI(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
  }

  public final class ImageKt {
    method @androidx.compose.Composable public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method @androidx.compose.Composable public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method @androidx.compose.Composable public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
  }

  @androidx.compose.Stable public interface Indication {
    method public androidx.ui.foundation.IndicationInstance createInstance();
  }

  public interface IndicationInstance {
    method public void drawIndication(androidx.ui.core.ContentDrawScope, androidx.ui.foundation.InteractionState interactionState);
    method public default void onDispose();
  }

  public final class IndicationKt {
    method public static androidx.compose.ProvidableAmbient<kotlin.jvm.functions.Function0<androidx.ui.foundation.Indication>> getIndicationAmbient();
    method public static androidx.ui.core.Modifier indication(androidx.ui.core.Modifier, androidx.ui.foundation.InteractionState interactionState, androidx.ui.foundation.Indication? indication = null);
  }

  public interface Interaction {
  }

  public static final class Interaction.Dragged implements androidx.ui.foundation.Interaction {
    field public static final androidx.ui.foundation.Interaction.Dragged INSTANCE;
  }

  public static final class Interaction.Pressed implements androidx.ui.foundation.Interaction {
    field public static final androidx.ui.foundation.Interaction.Pressed INSTANCE;
  }

  @androidx.compose.Stable public final class InteractionState implements androidx.compose.State<java.util.Set<? extends androidx.ui.foundation.Interaction>> {
    ctor public InteractionState();
    method public void addInteraction(androidx.ui.foundation.Interaction interaction, androidx.ui.geometry.Offset? position = null);
    method public operator boolean contains(androidx.ui.foundation.Interaction interaction);
    method public java.util.Set<androidx.ui.foundation.Interaction> getValue();
    method public androidx.ui.geometry.Offset? interactionPositionFor(androidx.ui.foundation.Interaction interaction);
    method public void removeInteraction(androidx.ui.foundation.Interaction interaction);
    property public java.util.Set<androidx.ui.foundation.Interaction> value;
  }

  public final class ScrollerKt {
    method @androidx.compose.Composable public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function1<? super androidx.ui.layout.RowScope,kotlin.Unit> children);
    method @androidx.compose.Composable public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f, boolean isReversed = false);
    method @androidx.compose.Composable public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function1<? super androidx.ui.layout.ColumnScope,kotlin.Unit> children);
  }

  @androidx.compose.Stable public final class ScrollerPosition {
    ctor public ScrollerPosition(androidx.ui.foundation.animation.FlingConfig flingConfig, float initial, internal boolean isReversed, androidx.animation.AnimationClockObservable animationClock);
    method public float getMaxPosition();
    method public float getValue();
    method public boolean isAnimating();
    method public void scrollBy(float value);
    method public void scrollTo(float value);
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void smoothScrollTo(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    property public final boolean isAnimating;
    property public final float maxPosition;
    property public final float value;
    field public static final androidx.ui.foundation.ScrollerPosition.Companion Companion;
  }

  public static final class ScrollerPosition.Companion {
    method @androidx.compose.Composable public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.ScrollerPosition,?> Saver(androidx.ui.foundation.animation.FlingConfig flingConfig, boolean isReversed, androidx.animation.AnimationClockObservable animationClock);
  }

  public final class Strings {
    method public String getChecked();
    method public String getInProgress();
    method public String getIndeterminate();
    method public String getNotSelected();
    method public String getSelected();
    method public String getTemplatePercent();
    method public String getUnchecked();
    property public final String Checked;
    property public final String InProgress;
    property public final String Indeterminate;
    property public final String NotSelected;
    property public final String Selected;
    property public final String TemplatePercent;
    property public final String Unchecked;
    field public static final androidx.ui.foundation.Strings INSTANCE;
  }

  public final class TemporaryKt {
    method @Deprecated @androidx.compose.Composable public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
  }

  public final class TextFieldKt {
    method @androidx.compose.Composable public static void TextField-63P0bO0(androidx.ui.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.input.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
    method @Deprecated @androidx.compose.Composable public static void TextField-DBcCkQs(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation visualTransformation = VisualTransformation.None, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
  }

  @Deprecated @androidx.compose.Immutable public final class TextFieldValue {
    ctor @Deprecated public TextFieldValue(String text, androidx.ui.text.TextRange selection);
    ctor @Deprecated public TextFieldValue();
    method @Deprecated public String component1();
    method @Deprecated public androidx.ui.text.TextRange component2();
    method @Deprecated @androidx.compose.Immutable public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
    method @Deprecated public androidx.ui.text.TextRange getSelection();
    method @Deprecated public String getText();
    field @Deprecated public static final androidx.ui.foundation.TextFieldValue.Companion Companion;
  }

  @Deprecated public static final class TextFieldValue.Companion {
    method @Deprecated public androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> getSaver();
    property @Deprecated public final androidx.ui.savedinstancestate.Saver<androidx.ui.foundation.TextFieldValue,java.lang.Object> Saver;
  }

  public final class TextKt {
    method @androidx.compose.Composable public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Text-0VOI5ok(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, androidx.ui.text.TextStyle style = currentTextStyle());
    method @androidx.compose.Composable public static void Text-GyNEQHM(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, long fontSize = TextUnit.Inherit, androidx.ui.text.font.FontStyle? fontStyle = null, androidx.ui.text.font.FontWeight? fontWeight = null, androidx.ui.text.font.FontFamily? fontFamily = null, long letterSpacing = TextUnit.Inherit, androidx.ui.text.style.TextDecoration? textDecoration = null, androidx.ui.text.style.TextAlign? textAlign = null, long lineHeight = TextUnit.Inherit, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, boolean softWrap = true, int maxLines = 2147483647, java.util.Map<java.lang.String,androidx.ui.text.InlineTextContent> inlineContent = mapOf(), kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, androidx.ui.text.TextStyle style = currentTextStyle());
    method @androidx.compose.Composable public static androidx.ui.text.TextStyle currentTextStyle();
  }

}

package androidx.ui.foundation.animation {

  public final class AndroidFlingCalculator {
    ctor public AndroidFlingCalculator(androidx.ui.unit.Density density);
    method public float flingDistance(float velocity);
    method public long flingDuration(float velocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo flingInfo(float velocity);
    method public androidx.ui.unit.Density getDensity();
  }

  public static final class AndroidFlingCalculator.FlingInfo {
    ctor public AndroidFlingCalculator.FlingInfo(float initialVelocity, float distance, long duration);
    method public float component1();
    method public float component2();
    method public long component3();
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo copy(float initialVelocity, float distance, long duration);
    method public float getDistance();
    method public long getDuration();
    method public float getInitialVelocity();
    method public float position(long time);
    method public float velocity(long time);
  }

  public final class AndroidFlingCalculatorKt {
  }

  public final class AndroidFlingDecaySpec implements androidx.animation.FloatDecayAnimationSpec {
    ctor public AndroidFlingDecaySpec(androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator);
    method public float getAbsVelocityThreshold();
    method public long getDurationMillis(float start, float startVelocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator getFlingCalculator();
    method public float getTarget(float start, float startVelocity);
    method public float getValue(long playTime, float start, float startVelocity);
    method public float getVelocity(long playTime, float start, float startVelocity);
    property public float absVelocityThreshold;
    property public final androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator;
  }

  public final class AndroidFlingSpline {
    method public double deceleration(float velocity, float friction);
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult flingPosition(float time);
    field public static final androidx.ui.foundation.animation.AndroidFlingSpline INSTANCE;
  }

  public static final class AndroidFlingSpline.FlingResult {
    ctor public AndroidFlingSpline.FlingResult(float distanceCoefficient, float velocityCoefficient);
    method public float component1();
    method public float component2();
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult copy(float distanceCoefficient, float velocityCoefficient);
    method public float getDistanceCoefficient();
    method public float getVelocityCoefficient();
  }

  public final class AndroidFlingSplineKt {
  }

  @androidx.compose.Immutable public final class FlingConfig {
    ctor public FlingConfig(androidx.animation.FloatDecayAnimationSpec decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public androidx.animation.FloatDecayAnimationSpec component1();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? component2();
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
    method @androidx.compose.Immutable public androidx.ui.foundation.animation.FlingConfig copy(androidx.animation.FloatDecayAnimationSpec decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
    method public androidx.animation.FloatDecayAnimationSpec getDecayAnimation();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? getOnAnimationEnd();
  }

  public final class FlingConfigKt {
    method public static androidx.ui.foundation.animation.FlingConfig AnchorsFlingConfig(java.util.List<java.lang.Float> anchors, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder = androidx.animation.PhysicsBuilder(), kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, androidx.animation.FloatDecayAnimationSpec decayAnimation = androidx.animation.ExponentialDecay());
    method @androidx.compose.Composable public static androidx.ui.foundation.animation.FlingConfig FlingConfig(kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget = { return null });
    method public static void fling(androidx.animation.AnimatedFloat, androidx.ui.foundation.animation.FlingConfig config, float startVelocity);
  }

}

package androidx.ui.foundation.gestures {

  public abstract sealed class DragDirection {
  }

  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal INSTANCE;
  }

  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical INSTANCE;
  }

  public final class DraggableKt {
    method public static androidx.ui.core.Modifier draggable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.DragDirection dragDirection, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit> onDragStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDragStopped = {}, boolean enabled = true, androidx.ui.foundation.InteractionState? interactionState = null, boolean startDragImmediately = false, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onDragDeltaConsumptionRequested);
  }

  public final class ScrollableKt {
    method @androidx.compose.Composable public static androidx.ui.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested);
    method public static androidx.ui.core.Modifier scrollable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.DragDirection dragDirection, androidx.ui.foundation.gestures.ScrollableState scrollableState, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit> onScrollStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onScrollStopped = {}, boolean enabled = true);
  }

  public final class ScrollableState {
    ctor public ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested, androidx.ui.foundation.animation.FlingConfig flingConfig, androidx.animation.AnimationClockObservable animationClock);
    method public androidx.ui.foundation.animation.FlingConfig getFlingConfig();
    method public kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Float> getOnScrollDeltaConsumptionRequested();
    method public boolean isAnimating();
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void stopAnimation();
    property public final boolean isAnimating;
  }

  public final class ZoomableKt {
    method @androidx.compose.Composable public static androidx.ui.foundation.gestures.ZoomableState ZoomableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onZoomDelta);
    method @androidx.compose.Composable public static androidx.ui.core.Modifier zoomable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.ZoomableState zoomableState, kotlin.jvm.functions.Function0<kotlin.Unit>? onZoomStopped = null);
    method @androidx.compose.Composable public static androidx.ui.core.Modifier zoomable(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit>? onZoomStopped = null, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onZoomDelta);
  }

  public final class ZoomableState {
    ctor public ZoomableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onZoomDelta, androidx.animation.AnimationClockObservable animationClock);
    method public kotlin.jvm.functions.Function1<java.lang.Float,kotlin.Unit> getOnZoomDelta();
    method public void smoothScaleBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit>? onEnd = null);
  }

}

package androidx.ui.foundation.lazy {

  public final class LazyItemsKt {
    method @androidx.compose.Composable public static <T> void LazyColumnItems(java.util.List<? extends T> items, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemContent);
    method @androidx.compose.Composable public static <T> void LazyRowItems(java.util.List<? extends T> items, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemContent);
  }

}

package androidx.ui.foundation.selection {

  public final class SelectableKt {
    method @androidx.compose.Composable public static androidx.ui.core.Modifier selectable(androidx.ui.core.Modifier, boolean selected, boolean enabled = true, boolean inMutuallyExclusiveGroup = true, androidx.ui.foundation.InteractionState interactionState = remember({ 
    return <init>()
}), androidx.ui.foundation.Indication? indication = IndicationAmbient.invoke(), kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
  }

  public final class ToggleableKt {
    method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
    method @androidx.compose.Composable public static androidx.ui.core.Modifier toggleable(androidx.ui.core.Modifier, boolean value, boolean enabled = true, androidx.ui.foundation.InteractionState interactionState = remember({ 
    return <init>()
}), androidx.ui.foundation.Indication? indication = IndicationAmbient.invoke(), kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
    method @androidx.compose.Composable public static androidx.ui.core.Modifier triStateToggleable(androidx.ui.core.Modifier, androidx.ui.foundation.selection.ToggleableState state, boolean enabled = true, androidx.ui.foundation.InteractionState interactionState = remember({ 
    return <init>()
}), androidx.ui.foundation.Indication? indication = IndicationAmbient.invoke(), kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
  }

  public enum ToggleableState {
    method public static androidx.ui.foundation.selection.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.foundation.selection.ToggleableState[] values();
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Indeterminate;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Off;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState On;
  }

}

package androidx.ui.foundation.semantics {

  public final class FoundationSemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getInMutuallyExclusiveGroup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsDialog();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> getToggleableState();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> InMutuallyExclusiveGroup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsDialog;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> ToggleableState;
    field public static final androidx.ui.foundation.semantics.FoundationSemanticsProperties INSTANCE;
  }

  public final class FoundationSemanticsPropertiesKt {
    method public static boolean getDialog(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.foundation.selection.ToggleableState getToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void setDialog(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setSelected(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.foundation.selection.ToggleableState p);
  }

}

package androidx.ui.foundation.shape {

  public final class GenericShape implements androidx.ui.graphics.Shape {
    ctor public GenericShape(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.geometry.Size,kotlin.Unit> builder);
    method public androidx.ui.foundation.shape.GenericShape copy(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.geometry.Size,kotlin.Unit> builder);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.geometry.Size size, androidx.ui.unit.Density density);
  }

}

package androidx.ui.foundation.shape.corner {

  public abstract class CornerBasedShape implements androidx.ui.graphics.Shape {
    ctor public CornerBasedShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public abstract androidx.ui.foundation.shape.corner.CornerBasedShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft = topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight = topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight = bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft = bottomLeft);
    method public final androidx.ui.foundation.shape.corner.CornerBasedShape copy(androidx.ui.foundation.shape.corner.CornerSize all);
    method public final androidx.ui.graphics.Outline createOutline(androidx.ui.geometry.Size size, androidx.ui.unit.Density density);
    method public abstract androidx.ui.graphics.Outline createOutline(androidx.ui.geometry.Size size, float topLeft, float topRight, float bottomRight, float bottomLeft);
    method public final androidx.ui.foundation.shape.corner.CornerSize getBottomLeft();
    method public final androidx.ui.foundation.shape.corner.CornerSize getBottomRight();
    method public final androidx.ui.foundation.shape.corner.CornerSize getTopLeft();
    method public final androidx.ui.foundation.shape.corner.CornerSize getTopRight();
  }

  @androidx.compose.Immutable public interface CornerSize {
    method public float toPx(androidx.ui.geometry.Size shapeSize, androidx.ui.unit.Density density);
  }

  public final class CornerSizeKt {
    method @androidx.compose.Stable public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(float size);
    method @androidx.compose.Stable public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(@IntRange(from=0, to=50) int percent);
    method @androidx.compose.Stable public static androidx.ui.foundation.shape.corner.CornerSize CornerSize-ipo6vVg(float size);
    method public static androidx.ui.foundation.shape.corner.CornerSize getZeroCornerSize();
  }

  public final class CutCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.CutCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.geometry.Size size, float topLeft, float topRight, float bottomRight, float bottomLeft);
  }

  public final class CutCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(float size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(float topLeft = 0.0f, float topRight = 0.0f, float bottomRight = 0.0f, float bottomLeft = 0.0f);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape-ipo6vVg(float size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape-rIHlIKc(float topLeft = 0.dp, float topRight = 0.dp, float bottomRight = 0.dp, float bottomLeft = 0.dp);
  }

  public final class RoundedCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.RoundedCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.geometry.Size size, float topLeft, float topRight, float bottomRight, float bottomLeft);
  }

  public final class RoundedCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(float size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(float topLeft = 0.0f, float topRight = 0.0f, float bottomRight = 0.0f, float bottomLeft = 0.0f);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape-ipo6vVg(float size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape-rIHlIKc(float topLeft = 0.dp, float topRight = 0.dp, float bottomRight = 0.dp, float bottomLeft = 0.dp);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape getCircleShape();
  }

}

