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

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

  public interface Density {
    method public float getDensity();
    method public float getFontScale();
    method public default androidx.ui.unit.Dp toDp(float);
    method public default androidx.ui.unit.Dp toDp(int);
    method public default androidx.ui.unit.Dp toDp-NgWp0Z8(float);
    method public default androidx.ui.unit.Dp toDp-gshw56o(int);
    method public default androidx.ui.unit.Dp toDp-vVlMl6k(long);
    method public default int toIntPx(androidx.ui.unit.Dp);
    method public default int toIntPx-vVlMl6k(long);
    method public default float toPx(androidx.ui.unit.Dp);
    method public default androidx.ui.unit.PxSize toPx-kAYDl8w(long);
    method public default float toPx-vVlMl6k(long);
    method public default androidx.ui.geometry.Rect toRect(androidx.ui.unit.Bounds);
    method public default long toSp(androidx.ui.unit.Dp);
    method public default long toSp(float);
    method public default long toSp(int);
    method public default long toSp-NgWp0Z8(float);
    method public default long toSp-gshw56o(int);
    property public abstract float density;
    property public abstract float fontScale;
  }

  public final class DensityKt {
    method public static androidx.ui.unit.Density Density(android.content.Context context);
    method public static androidx.ui.unit.Density Density(float density, float fontScale = 1f);
  }

  @androidx.compose.Immutable public final class Dp implements java.lang.Comparable<androidx.ui.unit.Dp> {
    ctor public Dp(float value);
    method public operator int compareTo(androidx.ui.unit.Dp other);
    method public float component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Dp copy(float value);
    method public inline operator androidx.ui.unit.Dp div(float other);
    method public inline operator androidx.ui.unit.Dp div(int other);
    method public inline operator float div(androidx.ui.unit.Dp other);
    method public inline operator float div-x8crYZs(float other);
    method public float getValue();
    method public inline operator androidx.ui.unit.Dp minus(androidx.ui.unit.Dp other);
    method public inline operator androidx.ui.unit.Dp plus(androidx.ui.unit.Dp other);
    method public inline operator androidx.ui.unit.Dp times(float other);
    method public inline operator androidx.ui.unit.Dp times(int other);
    method public inline operator float times(androidx.ui.unit.Dp other);
    method public inline operator float times-x8crYZs(float other);
    method public inline operator androidx.ui.unit.Dp unaryMinus();
    field public static final androidx.ui.unit.Dp.Companion Companion;
  }

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

  @androidx.compose.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.ui.unit.DpCubed> {
    ctor public DpCubed();
    method public operator int compareTo-JDqhs2g(float p);
    method public static operator int compareTo-JDqhs2g(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-JDqhs2g(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method public static inline operator float div-impl(float $this, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp 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 public static inline operator float minus-JDqhs2g(float $this, float dimension);
    method public static inline operator float plus-JDqhs2g(float $this, float dimension);
    method public static inline operator float times-impl(float $this, float other);
    method 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 public operator int compareTo-_K2iRR8(float p);
    method public static operator int compareTo-_K2iRR8(float $this, float other);
    method public static float constructor-impl(float value);
    method 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 public static inline operator float minus-_K2iRR8(float $this, float dimension);
    method public static inline operator float plus-_K2iRR8(float $this, float dimension);
    method public static inline operator float times-JDqhs2g(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static inline operator float times-impl(float $this, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp times-x8crYZs(float $this, float other);
    method public static String toString-impl(float $this);
  }

  public final class DpKt {
    method public static inline long Position(androidx.ui.unit.Dp x, androidx.ui.unit.Dp y);
    method public static inline long Size(androidx.ui.unit.Dp width, androidx.ui.unit.Dp height);
    method public static long center-kAYDl8w(long);
    method public static inline androidx.ui.unit.Dp coerceAtLeast(androidx.ui.unit.Dp, androidx.ui.unit.Dp minimumValue);
    method public static inline androidx.ui.unit.Dp coerceAtMost(androidx.ui.unit.Dp, androidx.ui.unit.Dp maximumValue);
    method public static inline androidx.ui.unit.Dp coerceIn(androidx.ui.unit.Dp, androidx.ui.unit.Dp minimumValue, androidx.ui.unit.Dp maximumValue);
    method public static inline operator float div(float, androidx.ui.unit.Dp other);
    method public static inline operator float div(double, androidx.ui.unit.Dp other);
    method public static inline operator float div(int, androidx.ui.unit.Dp other);
    method public static androidx.ui.unit.Dp getDistance-T8eBu-w(long);
    method public static inline androidx.ui.unit.Dp getDp(int);
    method public static inline androidx.ui.unit.Dp getDp(double);
    method public static inline androidx.ui.unit.Dp getDp(float);
    method public static inline androidx.ui.unit.Dp getHeight(androidx.ui.unit.Bounds);
    method public static inline androidx.ui.unit.Dp getWidth(androidx.ui.unit.Bounds);
    method public static inline boolean isFinite(androidx.ui.unit.Dp);
    method public static androidx.ui.unit.Dp lerp(androidx.ui.unit.Dp start, androidx.ui.unit.Dp stop, float fraction);
    method public static long lerp-d5NHFfI(long start, long stop, float fraction);
    method public static inline androidx.ui.unit.Dp max(androidx.ui.unit.Dp a, androidx.ui.unit.Dp b);
    method public static inline androidx.ui.unit.Dp min(androidx.ui.unit.Dp a, androidx.ui.unit.Dp b);
    method public static inline operator androidx.ui.unit.Dp times(float, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp times(double, androidx.ui.unit.Dp other);
    method public static inline operator androidx.ui.unit.Dp times(int, androidx.ui.unit.Dp other);
    method public static inline operator long times--D0i1nw(float, long size);
    method public static inline operator long times-DdskrAE(int, long size);
    method public static inline operator long times-l9Tz9ww(double, long size);
    method public static androidx.ui.unit.Bounds toBounds-kAYDl8w(long);
    method public static inline long toSize(androidx.ui.unit.Bounds);
  }

  @androidx.compose.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.ui.unit.DpSquared> {
    ctor public DpSquared();
    method public operator int compareTo-x8crYZs(float p);
    method public static operator int compareTo-x8crYZs(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-JDqhs2g(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method public static inline operator androidx.ui.unit.Dp div-impl(float $this, androidx.ui.unit.Dp other);
    method 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 public static inline operator float minus-x8crYZs(float $this, float other);
    method public static inline operator float plus-x8crYZs(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static inline operator float times-impl(float $this, androidx.ui.unit.Dp other);
    method public static String toString-impl(float $this);
  }

  public final class Duration implements java.lang.Comparable<androidx.ui.unit.Duration> {
    ctor public Duration(long nanoseconds);
    method public int compareTo(androidx.ui.unit.Duration other);
    method public long component1();
    method public androidx.ui.unit.Duration copy(long nanoseconds);
    method public operator androidx.ui.unit.Duration div(int quotient);
    method public operator androidx.ui.unit.Duration div(double quotient);
    method public long getNanoseconds();
    method public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Duration other);
    method public operator androidx.ui.unit.Duration plus(androidx.ui.unit.Duration other);
    method public operator androidx.ui.unit.Duration times(int factor);
    method 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 inline class IntPx implements java.lang.Comparable<androidx.ui.unit.IntPx> {
    ctor public IntPx();
    method public static inline operator int compareTo-NgWp0Z8(int $this, float other);
    method public operator int compareTo-gshw56o(int p);
    method public static operator int compareTo-gshw56o(int $this, int other);
    method public static int constructor-impl(int value);
    method public static operator int div-impl(int $this, float other);
    method public static operator int div-impl(int $this, double other);
    method public static operator int div-impl(int $this, int other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(int p, Object? p1);
    method public static boolean equals-impl0(int p1, int p2);
    method public int getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(int p);
    method public static operator int minus-gshw56o(int $this, int other);
    method public static operator int plus-gshw56o(int $this, int other);
    method public static inline operator int rem-impl(int $this, int other);
    method public static operator int times-impl(int $this, float other);
    method public static operator int times-impl(int $this, double other);
    method public static operator int times-impl(int $this, int other);
    method public static String toString-impl(int $this);
    method public static operator int unaryMinus-impl(int $this);
    field public static final androidx.ui.unit.IntPx.Companion Companion;
  }

  public static final class IntPx.Companion {
    method public int getInfinity();
    method public int getZero();
    property public final int Infinity;
    property public final int Zero;
  }

  public final class IntPxBounds {
    method public int component1();
    method public int component2();
    method public int component3();
    method public int component4();
    method public androidx.ui.unit.IntPxBounds copy-Q13GOEE(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 IntPxKt {
    method public static inline androidx.ui.unit.IntPxPosition IntPxPosition-rRMsBxU(int x, int y);
    method public static inline androidx.ui.unit.IntPxSize IntPxSize-rRMsBxU(int width, int height);
    method public static inline androidx.ui.unit.PxPosition PxPosition-rRMsBxU(int x, int y);
    method public static inline androidx.ui.unit.PxSize PxSize-rRMsBxU(int width, int height);
    method public static inline int ceil-NgWp0Z8(float);
    method public static androidx.ui.unit.IntPxPosition center(androidx.ui.unit.IntPxSize);
    method public static inline androidx.ui.unit.IntPxPosition center(androidx.ui.unit.IntPxBounds);
    method public static inline int coerceAtLeast-rRMsBxU(int, int minimumValue);
    method public static inline int coerceAtMost-rRMsBxU(int, int maximumValue);
    method public static inline int coerceIn-qx1LT1w(int, int minimumValue, int maximumValue);
    method public static inline int getHeight(androidx.ui.unit.IntPxBounds);
    method public static inline int getIpx(int);
    method public static inline int getWidth(androidx.ui.unit.IntPxBounds);
    method public static inline boolean isFinite-gshw56o(int);
    method @kotlin.PublishedApi internal static inline int keepInfinity-qx1LT1w(int, int other, int noInfinityValue);
    method @kotlin.PublishedApi internal static inline int keepInfinity-rRMsBxU(int, int noInfinityValue);
    method public static androidx.ui.unit.IntPxPosition lerp(androidx.ui.unit.IntPxPosition start, androidx.ui.unit.IntPxPosition stop, float fraction);
    method public static int lerp-9BbVZj8(int start, int stop, float fraction);
    method public static inline int max-rRMsBxU(int a, int b);
    method public static inline int min-rRMsBxU(int a, int b);
    method public static inline int round-NgWp0Z8(float);
    method public static inline operator androidx.ui.unit.IntPxSize times(int, androidx.ui.unit.IntPxSize size);
    method public static inline operator int times--Vi_IPY(float, int other);
    method public static inline operator int times-9kGzznM(int, int other);
    method public static inline operator int times-tHVXE4c(double, int other);
    method public static inline float toPx-gshw56o(int);
    method public static inline androidx.ui.unit.PxPosition toPxPosition(androidx.ui.unit.IntPxPosition);
    method public static inline androidx.ui.unit.PxSize toPxSize(androidx.ui.unit.IntPxSize);
    method public static inline androidx.ui.unit.IntPxSize toSize(androidx.ui.unit.IntPxBounds);
  }

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

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

  @androidx.compose.Immutable public final class IntPxSize {
    ctor @kotlin.PublishedApi internal IntPxSize(internal long value);
    method @androidx.compose.Immutable public androidx.ui.unit.IntPxSize copy(long value);
    method public inline operator androidx.ui.unit.IntPxSize div(int other);
    method public inline int getHeight();
    method public inline int getWidth();
    method public inline operator androidx.ui.unit.IntPxSize times(int other);
    property public final inline int height;
    property public final inline int width;
  }

  @androidx.compose.Immutable public final inline class IntSize {
    ctor public IntSize();
    method public static long constructor-impl(internal long value);
    method public static operator long div-impl(long $this, int 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 static int getHeight-impl(long $this);
    method public static int getWidth-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static operator long times-impl(long $this, int other);
    method public static String toString-impl(long $this);
  }

  public final class IntSizeKt {
    method public static long IntSize(int width, int height);
    method public static operator long times-twsQOwo(int, long size);
  }

  @androidx.compose.Immutable public final inline class Position {
    ctor public Position();
    method public static long constructor-impl(internal long value);
    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 androidx.ui.unit.Dp getX-impl(long $this);
    method public static androidx.ui.unit.Dp getY-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static inline operator long minus-T8eBu-w(long $this, long other);
    method public static inline operator long plus-T8eBu-w(long $this, long other);
    method public static String toString-impl(long $this);
  }

  @androidx.compose.Immutable public final inline class Px implements java.lang.Comparable<androidx.ui.unit.Px> {
    ctor public Px();
    method public operator int compareTo-NgWp0Z8(float p);
    method public static operator int compareTo-NgWp0Z8(float $this, float other);
    method public static inline operator int compareTo-gshw56o(float $this, int other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-NgWp0Z8(float $this, float other);
    method public static inline operator float div-RjPF0Mw(float $this, float other);
    method public static inline operator float div-impl(float $this, float other);
    method public static inline operator float div-impl(float $this, int 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 public static inline operator float minus-NgWp0Z8(float $this, float other);
    method public static inline operator float minus-gshw56o(float $this, int other);
    method public static inline operator float plus-NgWp0Z8(float $this, float other);
    method public static inline operator float plus-gshw56o(float $this, int other);
    method public static inline operator float times-NgWp0Z8(float $this, float other);
    method public static inline operator float times-RjPF0Mw(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static inline operator float times-impl(float $this, int other);
    method public static String toString-impl(float $this);
    method public static inline operator float unaryMinus-impl(float $this);
    field public static final androidx.ui.unit.Px.Companion Companion;
  }

  public static final class Px.Companion {
    method public float getInfinity();
    method public float getZero();
    property public final float Infinity;
    property public final float Zero;
  }

  @androidx.compose.Immutable public final class PxBounds {
    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-wHlpFhg(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 public operator int compareTo-bji3ab4(float p);
    method public static operator int compareTo-bji3ab4(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-NgWp0Z8(float $this, float other);
    method public static inline operator float div-RjPF0Mw(float $this, float other);
    method public static inline operator float div-bji3ab4(float $this, float other);
    method 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 public static inline operator float minus-bji3ab4(float $this, float dimension);
    method public static inline operator float plus-bji3ab4(float $this, float dimension);
    method public static inline operator float times-impl(float $this, float other);
    method 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 public operator int compareTo-KGV0gLo(float p);
    method public static operator int compareTo-KGV0gLo(float $this, float other);
    method public static float constructor-impl(float value);
    method 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 public static inline operator float minus-KGV0gLo(float $this, float dimension);
    method public static inline operator float plus-KGV0gLo(float $this, float dimension);
    method public static inline operator float times-NgWp0Z8(float $this, float other);
    method public static inline operator float times-RjPF0Mw(float $this, float other);
    method public static inline operator float times-bji3ab4(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static String toString-impl(float $this);
  }

  public final class PxKt {
    method public static inline androidx.ui.unit.PxBounds PxBounds(androidx.ui.unit.PxPosition topLeft, androidx.ui.unit.PxSize size);
    method public static inline androidx.ui.unit.PxPosition PxPosition-qHcltEY(float x, float y);
    method public static inline androidx.ui.unit.PxSize PxSize-qHcltEY(float width, float height);
    method public static inline float abs-NgWp0Z8(float x);
    method public static androidx.ui.unit.PxPosition center(androidx.ui.unit.PxSize);
    method public static inline androidx.ui.unit.PxPosition center(androidx.ui.unit.PxBounds);
    method public static inline float coerceAtLeast-qHcltEY(float, float minimumValue);
    method public static inline float coerceAtMost-qHcltEY(float, float maximumValue);
    method public static inline float coerceIn-HXvnt1Q(float, float minimumValue, float maximumValue);
    method public static inline operator float div-78fIwVY(double, float other);
    method public static inline operator float div-Ndu7NvY(int, float other);
    method public static inline operator float div-kxDXtn8(float, float other);
    method public static float getDistance(androidx.ui.unit.PxPosition);
    method public static inline float getHeight(androidx.ui.unit.PxBounds);
    method public static float getMinDimension(androidx.ui.unit.PxSize);
    method public static inline float getPx(int);
    method public static inline float getPx(double);
    method public static inline float getPx(float);
    method public static inline float getWidth(androidx.ui.unit.PxBounds);
    method public static androidx.ui.unit.PxPosition lerp(androidx.ui.unit.PxPosition start, androidx.ui.unit.PxPosition stop, float fraction);
    method public static float lerp-g-Fs4Ag(float start, float stop, float fraction);
    method public static inline float max-qHcltEY(float a, float b);
    method public static inline float min-qHcltEY(float a, float b);
    method public static inline androidx.ui.unit.IntPxPosition round(androidx.ui.unit.PxPosition);
    method public static inline operator androidx.ui.unit.PxSize times(int, androidx.ui.unit.PxSize size);
    method public static inline operator androidx.ui.unit.PxSize times(float, androidx.ui.unit.PxSize size);
    method public static inline operator androidx.ui.unit.PxSize times(double, androidx.ui.unit.PxSize size);
    method public static inline operator float times-78fIwVY(double, float other);
    method public static inline operator float times-Ndu7NvY(int, float other);
    method public static inline operator float times-kxDXtn8(float, float other);
    method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
    method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
    method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
    method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
    method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
  }

  @androidx.compose.Immutable public final class PxPosition {
    ctor @kotlin.PublishedApi internal PxPosition(internal long value);
    method @androidx.compose.Immutable public androidx.ui.unit.PxPosition copy(long value);
    method public inline float getX();
    method public inline float getY();
    method public inline operator androidx.ui.unit.PxPosition minus(androidx.ui.unit.PxPosition other);
    method public inline operator androidx.ui.unit.PxPosition minus(androidx.ui.unit.IntPxPosition other);
    method public inline operator androidx.ui.unit.PxPosition plus(androidx.ui.unit.PxPosition other);
    method public inline operator androidx.ui.unit.PxPosition plus(androidx.ui.unit.IntPxPosition other);
    method public inline operator androidx.ui.unit.PxPosition unaryMinus();
    property public final inline float x;
    property public final inline float y;
    field public static final androidx.ui.unit.PxPosition.Companion Companion;
  }

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

  @androidx.compose.Immutable public final class PxSize {
    ctor @kotlin.PublishedApi internal PxSize(internal long value);
    method @androidx.compose.Immutable public androidx.ui.unit.PxSize copy(long value);
    method public inline operator androidx.ui.unit.PxSize div(int other);
    method public inline operator androidx.ui.unit.PxSize div(float other);
    method public inline operator androidx.ui.unit.PxSize div(double other);
    method public inline float getHeight();
    method public inline float getWidth();
    method public inline operator androidx.ui.unit.PxSize times(int other);
    method public inline operator androidx.ui.unit.PxSize times(float other);
    method public inline operator androidx.ui.unit.PxSize times(double other);
    property public final inline float height;
    property public final inline float width;
    field public static final androidx.ui.unit.PxSize.Companion Companion;
  }

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

  @androidx.compose.Immutable public final inline class PxSquared implements java.lang.Comparable<androidx.ui.unit.PxSquared> {
    ctor public PxSquared();
    method public operator int compareTo-RjPF0Mw(float p);
    method public static operator int compareTo-RjPF0Mw(float $this, float other);
    method public static float constructor-impl(float value);
    method public static inline operator float div-NgWp0Z8(float $this, float other);
    method public static inline operator float div-RjPF0Mw(float $this, float other);
    method public static inline operator float div-bji3ab4(float $this, float other);
    method 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 public static inline operator float minus-RjPF0Mw(float $this, float other);
    method public static inline operator float plus-RjPF0Mw(float $this, float other);
    method public static inline operator float times-NgWp0Z8(float $this, float other);
    method public static inline operator float times-impl(float $this, float other);
    method public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class Size {
    ctor public Size();
    method public static long constructor-impl(internal long value);
    method public static inline operator long div-impl(long $this, int other);
    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 @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 androidx.ui.unit.Dp getHeight-impl(long $this);
    method public static androidx.ui.unit.Dp getWidth-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static inline operator long times-impl(long $this, int 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 String toString-impl(long $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 @kotlin.PublishedApi internal static inline <T> T! checkArithmetic-2fUAro8(long a, long b, long c, kotlin.jvm.functions.Function0<? extends T> block);
    method @kotlin.PublishedApi internal static inline <T> T! checkArithmetic-G_x5Bg4(long a, kotlin.jvm.functions.Function0<? extends T> block);
    method @kotlin.PublishedApi internal static inline <T> T! checkArithmetic-JyO0NBI(long a, long b, kotlin.jvm.functions.Function0<? extends T> block);
    method public static inline long coerceAtLeast-gL_aCS0(long, long minimumValue);
    method public static inline long coerceAtMost-gL_aCS0(long, long maximumValue);
    method 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 public static long lerp-SpZbbpo(long a, long b, float t);
    method public static inline long max-gL_aCS0(long a, long b);
    method public static inline long min-gL_aCS0(long a, long b);
    method @kotlin.PublishedApi internal static inline long pack(long unitType, float v);
    method public static inline operator long times-GncdoDw(double, long other);
    method public static inline operator long times-MVx5XBU(float, long other);
    method 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);
  }

  public final class Velocity {
    ctor public Velocity(androidx.ui.unit.PxPosition pixelsPerSecond);
    method public androidx.ui.unit.PxPosition component1();
    method public androidx.ui.unit.Velocity copy(androidx.ui.unit.PxPosition pixelsPerSecond);
    method public androidx.ui.unit.PxPosition 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);
  }

}

