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

  @androidx.compose.Immutable public final class Constraints {
    ctor public Constraints(internal long value);
    method public androidx.ui.core.Constraints copy(int minWidth = this.minWidth, int maxWidth = this.maxWidth, int minHeight = this.minHeight, int maxHeight = this.maxHeight);
    method @androidx.compose.Immutable public androidx.ui.core.Constraints copy(long value);
    method public boolean getHasBoundedHeight();
    method public boolean getHasBoundedWidth();
    method public int getMaxHeight();
    method public int getMaxWidth();
    method public int getMinHeight();
    method public int getMinWidth();
    property public final boolean hasBoundedHeight;
    property public final boolean hasBoundedWidth;
    property public final int maxHeight;
    property public final int maxWidth;
    property public final int minHeight;
    property public final int minWidth;
    field public static final androidx.ui.core.Constraints.Companion Companion;
    field public static final int Infinity = 2147483647; // 0x7fffffff
  }

  public static final class Constraints.Companion {
    method @androidx.compose.Stable public androidx.ui.core.Constraints fixed(int width, int height);
    method @androidx.compose.Stable public androidx.ui.core.Constraints fixedHeight(int height);
    method @androidx.compose.Stable public androidx.ui.core.Constraints fixedWidth(int width);
  }

  public final class ConstraintsKt {
    method @androidx.compose.Stable public static androidx.ui.core.Constraints Constraints(int minWidth = 0, int maxWidth = 2147483647, int minHeight = 0, int maxHeight = 2147483647);
    method @androidx.compose.Stable public static androidx.ui.unit.IntSize constrain(androidx.ui.core.Constraints, androidx.ui.unit.IntSize size);
    method @androidx.compose.Stable public static int constrainHeight(androidx.ui.core.Constraints, int height);
    method @androidx.compose.Stable public static int constrainWidth(androidx.ui.core.Constraints, int width);
    method @androidx.compose.Stable public static androidx.ui.core.Constraints enforce(androidx.ui.core.Constraints, androidx.ui.core.Constraints otherConstraints);
    method public static boolean getHasFixedHeight(androidx.ui.core.Constraints);
    method public static boolean getHasFixedWidth(androidx.ui.core.Constraints);
    method public static boolean isZero(androidx.ui.core.Constraints);
    method @androidx.compose.Stable public static androidx.ui.core.Constraints offset(androidx.ui.core.Constraints, int horizontal = 0, int vertical = 0);
    method @androidx.compose.Stable public static boolean satisfiedBy(androidx.ui.core.Constraints, androidx.ui.unit.IntSize size);
  }

  public enum LayoutDirection {
    method public static androidx.ui.core.LayoutDirection valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.LayoutDirection[] values();
    enum_constant public static final androidx.ui.core.LayoutDirection Ltr;
    enum_constant public static final androidx.ui.core.LayoutDirection Rtl;
  }

}

package androidx.ui.unit {

  public final class AndroidDensityKt {
    method public static androidx.ui.unit.Density Density(android.content.Context context);
  }

  @androidx.compose.Immutable public final class Bounds {
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method @androidx.compose.Immutable public androidx.ui.unit.Bounds copy-rIHlIKc(float left, float top, float right, float bottom);
    method public float getBottom();
    method public float getLeft();
    method public float getRight();
    method public float getTop();
  }

  @androidx.compose.Immutable public interface Density {
    method public float getDensity();
    method public float getFontScale();
    method @androidx.compose.Stable public default float toDp(int);
    method @androidx.compose.Stable public default float toDp(float);
    method @androidx.compose.Stable public default float toDp-vVlMl6k(long);
    method @androidx.compose.Stable public default int toIntPx-ipo6vVg(float);
    method @androidx.compose.Stable public default int toIntPx-vVlMl6k(long);
    method @androidx.compose.Stable public default float toPx-ipo6vVg(float);
    method @androidx.compose.Stable public default float toPx-vVlMl6k(long);
    method @androidx.compose.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.ui.unit.Bounds);
    method @androidx.compose.Stable public default long toSp(int);
    method @androidx.compose.Stable public default long toSp(float);
    method @androidx.compose.Stable public default long toSp-ipo6vVg(float);
    property public abstract float density;
    property public abstract float fontScale;
  }

  public final class DensityKt {
    method @androidx.compose.Stable public static androidx.ui.unit.Density Density(float density, float fontScale = 1f);
  }

  @androidx.compose.Immutable public final inline class Dp implements java.lang.Comparable<androidx.ui.unit.Dp> {
    ctor public Dp();
    method @androidx.compose.Stable public operator int compareTo-ipo6vVg(float p);
    method @androidx.compose.Stable public static operator int compareTo-ipo6vVg(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, int other);
    method @androidx.compose.Stable public static inline operator float div-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float plus-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, int other);
    method @androidx.compose.Stable public static inline operator float times-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
    method @androidx.compose.Stable public static inline operator float unaryMinus-impl(float $this);
    field public static final androidx.ui.unit.Dp.Companion Companion;
  }

  public static final class Dp.Companion {
    method public float getHairline();
    method public float getInfinity();
    method public float getUnspecified();
    property public final float Hairline;
    property public final float Infinity;
    property public final float Unspecified;
  }

  @androidx.compose.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.ui.unit.DpCubed> {
    ctor public DpCubed();
    method @androidx.compose.Stable public operator int compareTo-JDqhs2g(float p);
    method @androidx.compose.Stable public static operator int compareTo-JDqhs2g(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-JDqhs2g(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-JDqhs2g(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-JDqhs2g(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class DpInverse implements java.lang.Comparable<androidx.ui.unit.DpInverse> {
    ctor public DpInverse();
    method @androidx.compose.Stable public operator int compareTo-_K2iRR8(float p);
    method @androidx.compose.Stable public static operator int compareTo-_K2iRR8(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-_K2iRR8(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-_K2iRR8(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-JDqhs2g(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  public final class DpKt {
    method @androidx.compose.Stable public static inline long Position-98Cn76g(float x, float y);
    method @androidx.compose.Stable public static inline float coerceAtLeast-98Cn76g(float, float minimumValue);
    method @androidx.compose.Stable public static inline float coerceAtMost-98Cn76g(float, float maximumValue);
    method @androidx.compose.Stable public static inline float coerceIn-x40Cv7w(float, float minimumValue, float maximumValue);
    method @androidx.compose.Stable public static inline operator float div-H0Zl2lQ(float, float other);
    method @androidx.compose.Stable public static inline operator float div-Y_YOLaE(double, float other);
    method @androidx.compose.Stable public static inline operator float div-hZ6b2Ic(int, float other);
    method @androidx.compose.Stable public static float getDistance-T8eBu-w(long);
    method public static inline float getDp(int);
    method public static inline float getDp(double);
    method public static inline float getDp(float);
    method public static inline float getHeight(androidx.ui.unit.Bounds);
    method public static inline float getWidth(androidx.ui.unit.Bounds);
    method @androidx.compose.Stable public static inline boolean isFinite-ipo6vVg(float);
    method @androidx.compose.Stable public static float lerp-3WSoJcA(float start, float stop, float fraction);
    method @androidx.compose.Stable public static long lerp-d5NHFfI(long start, long stop, float fraction);
    method @androidx.compose.Stable public static inline float max-98Cn76g(float a, float b);
    method @androidx.compose.Stable public static inline float min-98Cn76g(float a, float b);
    method @androidx.compose.Stable public static inline operator float times-H0Zl2lQ(float, float other);
    method @androidx.compose.Stable public static inline operator float times-Y_YOLaE(double, float other);
    method @androidx.compose.Stable public static inline operator float times-hZ6b2Ic(int, float other);
  }

  @androidx.compose.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.ui.unit.DpSquared> {
    ctor public DpSquared();
    method @androidx.compose.Stable public operator int compareTo-x8crYZs(float p);
    method @androidx.compose.Stable public static operator int compareTo-x8crYZs(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-JDqhs2g(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static inline operator float plus-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final class Duration implements java.lang.Comparable<androidx.ui.unit.Duration> {
    ctor public Duration(long nanoseconds);
    method @androidx.compose.Stable public int compareTo(androidx.ui.unit.Duration other);
    method public long component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Duration copy(long nanoseconds);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration div(int quotient);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration div(double quotient);
    method public long getNanoseconds();
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Duration other);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration plus(androidx.ui.unit.Duration other);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration times(int factor);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration times(double factor);
    field public static final androidx.ui.unit.Duration.Companion Companion;
  }

  public static final class Duration.Companion {
    method public androidx.ui.unit.Duration getZero();
    property public final androidx.ui.unit.Duration Zero;
  }

  public final class Durations {
    method public static androidx.ui.unit.Duration Duration(long days = 0, long hours = 0, long minutes = 0, long seconds = 0, long milliseconds = 0, long microseconds = 0, long nanoseconds = 0);
    method public static androidx.ui.unit.Duration getDays(long);
    method public static androidx.ui.unit.Duration getDays(int);
    method public static androidx.ui.unit.Duration getHours(long);
    method public static androidx.ui.unit.Duration getHours(int);
    method public static androidx.ui.unit.Duration getMicroseconds(long);
    method public static androidx.ui.unit.Duration getMicroseconds(int);
    method public static androidx.ui.unit.Duration getMilliseconds(long);
    method public static androidx.ui.unit.Duration getMilliseconds(int);
    method public static androidx.ui.unit.Duration getMinutes(long);
    method public static androidx.ui.unit.Duration getMinutes(int);
    method public static androidx.ui.unit.Duration getNanoseconds(long);
    method public static androidx.ui.unit.Duration getNanoseconds(int);
    method public static long getNanosecondsPerDay();
    method public static long getNanosecondsPerHour();
    method public static long getNanosecondsPerMillisecond();
    method public static long getNanosecondsPerMinute();
    method public static long getNanosecondsPerSecond();
    method public static androidx.ui.unit.Duration getSeconds(long);
    method public static androidx.ui.unit.Duration getSeconds(int);
    method public static long inDays(androidx.ui.unit.Duration);
    method public static long inHours(androidx.ui.unit.Duration);
    method public static long inMicroseconds(androidx.ui.unit.Duration);
    method public static long inMilliseconds(androidx.ui.unit.Duration);
    method public static long inMinutes(androidx.ui.unit.Duration);
    method public static long inSeconds(androidx.ui.unit.Duration);
    field public static final long HoursPerDay = 24L; // 0x18L
    field public static final long MicrosecondsPerMillisecond = 1000L; // 0x3e8L
    field public static final long MillisecondsPerSecond = 1000L; // 0x3e8L
    field public static final long MinutesPerHour = 60L; // 0x3cL
    field public static final long NanosecondsPerMicrosecond = 1000L; // 0x3e8L
    field public static final long SecondsPerMinute = 60L; // 0x3cL
  }

  @androidx.compose.Immutable public final class IntBounds {
    ctor public IntBounds(int left, int top, int right, int bottom);
    method public int component1();
    method public int component2();
    method public int component3();
    method public int component4();
    method @androidx.compose.Immutable public androidx.ui.unit.IntBounds copy(int left, int top, int right, int bottom);
    method public int getBottom();
    method public int getLeft();
    method public int getRight();
    method public int getTop();
  }

  public final class IntBoundsKt {
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntBounds IntBounds(androidx.ui.unit.IntOffset topLeft, androidx.ui.unit.IntSize size);
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntOffset center(androidx.ui.unit.IntBounds);
    method public static inline int getHeight(androidx.ui.unit.IntBounds);
    method public static inline int getWidth(androidx.ui.unit.IntBounds);
    method @androidx.compose.Stable public static androidx.ui.unit.IntBounds toBounds(androidx.ui.unit.IntSize);
    method @androidx.compose.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.ui.unit.IntBounds);
    method @androidx.compose.Stable public static androidx.ui.unit.IntSize toSize(androidx.ui.unit.IntBounds);
  }

  @androidx.compose.Immutable public final class IntOffset {
    ctor public IntOffset(internal long value);
    method @androidx.compose.Stable public inline operator int component1();
    method @androidx.compose.Stable public inline operator int component2();
    method public int getX();
    method public int getY();
    method @androidx.compose.Stable public inline operator androidx.ui.unit.IntOffset minus(androidx.ui.unit.IntOffset other);
    method @androidx.compose.Stable public inline operator androidx.ui.unit.IntOffset plus(androidx.ui.unit.IntOffset other);
    method @androidx.compose.Stable public inline operator androidx.ui.unit.IntOffset unaryMinus();
    property public final int x;
    property public final int y;
    field public static final androidx.ui.unit.IntOffset.Companion Companion;
  }

  public static final class IntOffset.Companion {
    method public androidx.ui.unit.IntOffset getOrigin();
    property public final androidx.ui.unit.IntOffset Origin;
  }

  public final class IntOffsetKt {
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntOffset IntOffset(int x, int y);
    method @androidx.compose.Stable public static androidx.ui.unit.IntOffset lerp(androidx.ui.unit.IntOffset start, androidx.ui.unit.IntOffset stop, float fraction);
    method @androidx.compose.Stable public static operator androidx.compose.ui.geometry.Offset minus(androidx.compose.ui.geometry.Offset, androidx.ui.unit.IntOffset offset);
    method @androidx.compose.Stable public static operator androidx.compose.ui.geometry.Offset minus(androidx.ui.unit.IntOffset, androidx.compose.ui.geometry.Offset offset);
    method @androidx.compose.Stable public static operator androidx.compose.ui.geometry.Offset plus(androidx.compose.ui.geometry.Offset, androidx.ui.unit.IntOffset offset);
    method @androidx.compose.Stable public static operator androidx.compose.ui.geometry.Offset plus(androidx.ui.unit.IntOffset, androidx.compose.ui.geometry.Offset offset);
    method @androidx.compose.Stable public static inline androidx.compose.ui.geometry.Offset toOffset(androidx.ui.unit.IntOffset);
  }

  @androidx.compose.Immutable public final class IntSize {
    ctor public IntSize(internal long packedValue);
    method @androidx.compose.Stable public inline operator int component1();
    method @androidx.compose.Stable public inline operator int component2();
    method @androidx.compose.Stable public operator androidx.ui.unit.IntSize div(int other);
    method public int getHeight();
    method public int getWidth();
    method @androidx.compose.Stable public operator androidx.ui.unit.IntSize times(int other);
    property public final int height;
    property public final int width;
    field public static final androidx.ui.unit.IntSize.Companion Companion;
  }

  public static final class IntSize.Companion {
    method public androidx.ui.unit.IntSize getZero();
    property public final androidx.ui.unit.IntSize Zero;
  }

  public final class IntSizeKt {
    method @androidx.compose.Stable public static androidx.ui.unit.IntSize IntSize(int width, int height);
    method public static androidx.ui.unit.IntOffset getCenter(androidx.ui.unit.IntSize);
    method @androidx.compose.Stable public static operator androidx.ui.unit.IntSize times(int, androidx.ui.unit.IntSize size);
    method @androidx.compose.Stable public static long toSize(androidx.ui.unit.IntSize);
  }

  @androidx.compose.Immutable public final inline class Position {
    ctor public Position();
    method public static long constructor-impl(internal long packedValue);
    method public static long copy-98Cn76g(long $this, float x = this.x, float y = this.y);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getX-impl(long $this);
    method public static float getY-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method @androidx.compose.Stable public static inline operator long minus-T8eBu-w(long $this, long other);
    method @androidx.compose.Stable public static inline operator long plus-T8eBu-w(long $this, long other);
    method @androidx.compose.Stable public static String toString-impl(long $this);
  }

  @androidx.compose.Immutable public final class PxBounds {
    ctor public PxBounds(float left, float top, float right, float bottom);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method @androidx.compose.Immutable public androidx.ui.unit.PxBounds copy(float left, float top, float right, float bottom);
    method public float getBottom();
    method public float getLeft();
    method public float getRight();
    method public float getTop();
  }

  @androidx.compose.Immutable public final inline class PxCubed implements java.lang.Comparable<androidx.ui.unit.PxCubed> {
    ctor public PxCubed();
    method @androidx.compose.Stable public operator int compareTo-bji3ab4(float p);
    method @androidx.compose.Stable public static operator int compareTo-bji3ab4(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-bji3ab4(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-bji3ab4(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-bji3ab4(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class PxInverse implements java.lang.Comparable<androidx.ui.unit.PxInverse> {
    ctor public PxInverse();
    method @androidx.compose.Stable public operator int compareTo-KGV0gLo(float p);
    method @androidx.compose.Stable public static operator int compareTo-KGV0gLo(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-KGV0gLo(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-KGV0gLo(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-bji3ab4(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  public final class PxKt {
    method @androidx.compose.Stable public static inline androidx.ui.unit.PxBounds PxBounds-MrV732k(androidx.compose.ui.geometry.Offset topLeft, long size);
    method @androidx.compose.Stable public static inline androidx.compose.ui.geometry.Offset center(androidx.ui.unit.PxBounds);
    method @androidx.compose.Stable public static androidx.compose.ui.geometry.Offset center-uvyYCjk(long);
    method public static inline float getHeight(androidx.ui.unit.PxBounds);
    method public static inline float getWidth(androidx.ui.unit.PxBounds);
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntOffset round(androidx.compose.ui.geometry.Offset);
    method @androidx.compose.Stable public static androidx.ui.unit.PxBounds toBounds-uvyYCjk(long);
    method @androidx.compose.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
    method @androidx.compose.Stable public static long toSize(androidx.ui.unit.PxBounds);
  }

  @androidx.compose.Immutable public final inline class PxSquared implements java.lang.Comparable<androidx.ui.unit.PxSquared> {
    ctor public PxSquared();
    method @androidx.compose.Stable public operator int compareTo-RjPF0Mw(float p);
    method @androidx.compose.Stable public static operator int compareTo-RjPF0Mw(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-RjPF0Mw(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-bji3ab4(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-RjPF0Mw(float $this, float other);
    method @androidx.compose.Stable public static inline operator float plus-RjPF0Mw(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class TextUnit {
    ctor public TextUnit();
    method public static inline operator int compareTo-vVlMl6k(long $this, long other);
    method public static long constructor-impl(long packedValue);
    method public static inline operator long div-impl(long $this, float other);
    method public static inline operator long div-impl(long $this, double other);
    method public static inline operator long div-impl(long $this, int other);
    method public static inline operator float div-vVlMl6k(long $this, long other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public long getPackedValue();
    method public static androidx.ui.unit.TextUnitType getType-impl(long $this);
    method public static float getValue-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static boolean isEm-impl(long $this);
    method public static boolean isInherit-impl(long $this);
    method public static boolean isSp-impl(long $this);
    method public static inline operator long minus-vVlMl6k(long $this, long other);
    method public static inline operator long plus-vVlMl6k(long $this, long other);
    method public static inline operator long times-impl(long $this, float other);
    method public static inline operator long times-impl(long $this, double other);
    method public static inline operator long times-impl(long $this, int other);
    method public static String toString-impl(long $this);
    method public static inline operator long unaryMinus-impl(long $this);
    field public static final androidx.ui.unit.TextUnit.Companion Companion;
  }

  public static final class TextUnit.Companion {
    method public long Em(int value);
    method public long Em(float value);
    method public long Em(double value);
    method public long Sp(int value);
    method public long Sp(float value);
    method public long Sp(double value);
    method public long getInherit();
    property public final long Inherit;
  }

  public final class TextUnitKt {
    method @androidx.compose.Stable public static inline long coerceAtLeast-gL_aCS0(long, long minimumValue);
    method @androidx.compose.Stable public static inline long coerceAtMost-gL_aCS0(long, long maximumValue);
    method @androidx.compose.Stable public static inline long coerceIn-Y2exRck(long, long minimumValue, long maximumValue);
    method public static long getEm(float);
    method public static long getEm(double);
    method public static long getEm(int);
    method public static long getSp(float);
    method public static long getSp(double);
    method public static long getSp(int);
    method @androidx.compose.Stable public static long lerp-SpZbbpo(long a, long b, float t);
    method @androidx.compose.Stable public static inline long max-gL_aCS0(long a, long b);
    method @androidx.compose.Stable public static inline long min-gL_aCS0(long a, long b);
    method @androidx.compose.Stable public static inline operator long times-GncdoDw(double, long other);
    method @androidx.compose.Stable public static inline operator long times-MVx5XBU(float, long other);
    method @androidx.compose.Stable public static inline operator long times-UlzjdM0(int, long other);
  }

  public enum TextUnitType {
    method public static androidx.ui.unit.TextUnitType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.unit.TextUnitType[] values();
    enum_constant public static final androidx.ui.unit.TextUnitType Em;
    enum_constant public static final androidx.ui.unit.TextUnitType Inherit;
    enum_constant public static final androidx.ui.unit.TextUnitType Sp;
  }

  @androidx.compose.Immutable public final class Uptime implements java.lang.Comparable<androidx.ui.unit.Uptime> {
    ctor public Uptime(long nanoseconds);
    method public int compareTo(androidx.ui.unit.Uptime other);
    method public long component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Uptime copy(long nanoseconds);
    method public long getNanoseconds();
    method public operator androidx.ui.unit.Uptime minus(androidx.ui.unit.Duration duration);
    method public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Uptime other);
    method public operator androidx.ui.unit.Uptime plus(androidx.ui.unit.Duration duration);
    field public static final androidx.ui.unit.Uptime.Companion Companion;
  }

  public static final class Uptime.Companion {
    method public androidx.ui.unit.Uptime getBoot();
    property public final androidx.ui.unit.Uptime Boot;
  }

  public final class UptimeKt {
    method public static operator androidx.ui.unit.Uptime plus(androidx.ui.unit.Duration, androidx.ui.unit.Uptime uptime);
  }

  @androidx.compose.Immutable public final class Velocity {
    ctor public Velocity(androidx.compose.ui.geometry.Offset pixelsPerSecond);
    method public androidx.compose.ui.geometry.Offset component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Velocity copy(androidx.compose.ui.geometry.Offset pixelsPerSecond);
    method public androidx.compose.ui.geometry.Offset getPixelsPerSecond();
    method public operator androidx.ui.unit.Velocity unaryMinus();
    field public static final androidx.ui.unit.Velocity.Companion Companion;
  }

  public static final class Velocity.Companion {
    method public androidx.ui.unit.Velocity getZero();
    property public final androidx.ui.unit.Velocity Zero;
  }

  public final class VelocityKt {
    method public static operator androidx.ui.unit.Velocity minus(androidx.ui.unit.Velocity, androidx.ui.unit.Velocity other);
    method public static operator androidx.ui.unit.Velocity plus(androidx.ui.unit.Velocity, androidx.ui.unit.Velocity other);
  }

}

