Skip to main content

src/packkit@internal@brotli_transform.erl

-module(packkit@internal@brotli_transform).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/packkit/internal/brotli_transform.gleam").
-export([prefix_suffix_offset/1, prefix_id_of/1, suffix_id_of/1, op_of/1, apply/2]).
-export_type([op/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(false).

-type op() :: identity |
    {omit_last, integer()} |
    {omit_first, integer()} |
    uppercase_first |
    uppercase_all.

-file("src/packkit/internal/brotli_transform.gleam", 243).
?DOC(false).
-spec prefix_suffix_offset(integer()) -> integer().
prefix_suffix_offset(Id) ->
    case Id of
        0 ->
            0;

        1 ->
            2;

        2 ->
            5;

        3 ->
            14;

        4 ->
            19;

        5 ->
            22;

        6 ->
            24;

        7 ->
            30;

        8 ->
            35;

        9 ->
            37;

        10 ->
            42;

        11 ->
            45;

        12 ->
            47;

        13 ->
            50;

        14 ->
            52;

        15 ->
            58;

        16 ->
            62;

        17 ->
            69;

        18 ->
            71;

        19 ->
            78;

        20 ->
            85;

        21 ->
            90;

        22 ->
            92;

        23 ->
            99;

        24 ->
            104;

        25 ->
            109;

        26 ->
            114;

        27 ->
            119;

        28 ->
            122;

        29 ->
            124;

        30 ->
            128;

        31 ->
            131;

        32 ->
            136;

        33 ->
            140;

        34 ->
            142;

        35 ->
            145;

        36 ->
            151;

        37 ->
            159;

        38 ->
            165;

        39 ->
            169;

        40 ->
            173;

        41 ->
            178;

        42 ->
            183;

        43 ->
            189;

        44 ->
            194;

        45 ->
            199;

        46 ->
            202;

        47 ->
            207;

        48 ->
            213;

        49 ->
            216;

        _ ->
            0
    end.

-file("src/packkit/internal/brotli_transform.gleam", 307).
?DOC(false).
-spec prefix_id_of(integer()) -> integer().
prefix_id_of(Idx) ->
    case Idx of
        0 ->
            49;

        1 ->
            49;

        2 ->
            0;

        3 ->
            49;

        4 ->
            49;

        5 ->
            49;

        6 ->
            0;

        7 ->
            4;

        8 ->
            49;

        9 ->
            49;

        10 ->
            49;

        11 ->
            49;

        12 ->
            49;

        13 ->
            1;

        14 ->
            49;

        15 ->
            0;

        16 ->
            49;

        17 ->
            49;

        18 ->
            48;

        19 ->
            49;

        20 ->
            49;

        21 ->
            49;

        22 ->
            49;

        23 ->
            49;

        24 ->
            49;

        25 ->
            49;

        26 ->
            49;

        27 ->
            49;

        28 ->
            49;

        29 ->
            49;

        30 ->
            0;

        31 ->
            49;

        32 ->
            5;

        33 ->
            0;

        34 ->
            49;

        35 ->
            49;

        36 ->
            49;

        37 ->
            49;

        38 ->
            49;

        39 ->
            49;

        40 ->
            49;

        41 ->
            47;

        42 ->
            49;

        43 ->
            49;

        44 ->
            49;

        45 ->
            49;

        46 ->
            49;

        47 ->
            49;

        48 ->
            49;

        49 ->
            49;

        50 ->
            49;

        51 ->
            49;

        52 ->
            0;

        53 ->
            49;

        54 ->
            49;

        55 ->
            49;

        56 ->
            49;

        57 ->
            49;

        58 ->
            49;

        59 ->
            49;

        60 ->
            49;

        61 ->
            49;

        62 ->
            47;

        63 ->
            49;

        64 ->
            49;

        65 ->
            0;

        66 ->
            49;

        67 ->
            5;

        68 ->
            49;

        69 ->
            49;

        70 ->
            49;

        71 ->
            0;

        72 ->
            35;

        73 ->
            47;

        74 ->
            49;

        75 ->
            49;

        76 ->
            49;

        77 ->
            5;

        78 ->
            49;

        79 ->
            49;

        80 ->
            49;

        81 ->
            0;

        82 ->
            49;

        83 ->
            0;

        84 ->
            49;

        85 ->
            0;

        86 ->
            49;

        87 ->
            49;

        88 ->
            49;

        89 ->
            0;

        90 ->
            49;

        91 ->
            0;

        92 ->
            49;

        93 ->
            49;

        94 ->
            49;

        95 ->
            49;

        96 ->
            0;

        97 ->
            49;

        98 ->
            0;

        99 ->
            49;

        100 ->
            49;

        101 ->
            49;

        102 ->
            45;

        103 ->
            0;

        104 ->
            49;

        105 ->
            49;

        106 ->
            49;

        107 ->
            49;

        108 ->
            49;

        109 ->
            0;

        110 ->
            0;

        111 ->
            0;

        112 ->
            49;

        113 ->
            49;

        114 ->
            49;

        115 ->
            0;

        116 ->
            49;

        117 ->
            0;

        118 ->
            0;

        119 ->
            0;

        120 ->
            0;

        _ ->
            49
    end.

-file("src/packkit/internal/brotli_transform.gleam", 434).
?DOC(false).
-spec suffix_id_of(integer()) -> integer().
suffix_id_of(Idx) ->
    case Idx of
        0 ->
            49;

        1 ->
            0;

        2 ->
            0;

        3 ->
            49;

        4 ->
            0;

        5 ->
            47;

        6 ->
            49;

        7 ->
            0;

        8 ->
            3;

        9 ->
            49;

        10 ->
            6;

        11 ->
            49;

        12 ->
            49;

        13 ->
            0;

        14 ->
            1;

        15 ->
            0;

        16 ->
            7;

        17 ->
            9;

        18 ->
            0;

        19 ->
            8;

        20 ->
            5;

        21 ->
            10;

        22 ->
            11;

        23 ->
            49;

        24 ->
            13;

        25 ->
            14;

        26 ->
            49;

        27 ->
            49;

        28 ->
            15;

        29 ->
            16;

        30 ->
            49;

        31 ->
            12;

        32 ->
            49;

        33 ->
            1;

        34 ->
            49;

        35 ->
            18;

        36 ->
            17;

        37 ->
            19;

        38 ->
            20;

        39 ->
            49;

        40 ->
            49;

        41 ->
            49;

        42 ->
            49;

        43 ->
            22;

        44 ->
            49;

        45 ->
            23;

        46 ->
            24;

        47 ->
            25;

        48 ->
            49;

        49 ->
            26;

        50 ->
            27;

        51 ->
            28;

        52 ->
            12;

        53 ->
            29;

        54 ->
            49;

        55 ->
            49;

        56 ->
            49;

        57 ->
            21;

        58 ->
            1;

        59 ->
            49;

        60 ->
            31;

        61 ->
            32;

        62 ->
            3;

        63 ->
            49;

        64 ->
            49;

        65 ->
            1;

        66 ->
            8;

        67 ->
            21;

        68 ->
            0;

        69 ->
            10;

        70 ->
            30;

        71 ->
            5;

        72 ->
            49;

        73 ->
            2;

        74 ->
            17;

        75 ->
            36;

        76 ->
            33;

        77 ->
            0;

        78 ->
            21;

        79 ->
            5;

        80 ->
            37;

        81 ->
            30;

        82 ->
            38;

        83 ->
            0;

        84 ->
            39;

        85 ->
            49;

        86 ->
            34;

        87 ->
            8;

        88 ->
            12;

        89 ->
            21;

        90 ->
            40;

        91 ->
            12;

        92 ->
            41;

        93 ->
            42;

        94 ->
            17;

        95 ->
            43;

        96 ->
            5;

        97 ->
            10;

        98 ->
            34;

        99 ->
            33;

        100 ->
            44;

        101 ->
            5;

        102 ->
            49;

        103 ->
            33;

        104 ->
            30;

        105 ->
            30;

        106 ->
            46;

        107 ->
            1;

        108 ->
            34;

        109 ->
            33;

        110 ->
            30;

        111 ->
            1;

        112 ->
            33;

        113 ->
            21;

        114 ->
            12;

        115 ->
            5;

        116 ->
            34;

        117 ->
            12;

        118 ->
            30;

        119 ->
            34;

        120 ->
            34;

        _ ->
            49
    end.

-file("src/packkit/internal/brotli_transform.gleam", 561).
?DOC(false).
-spec op_of(integer()) -> op().
op_of(Idx) ->
    case Idx of
        0 ->
            identity;

        1 ->
            identity;

        2 ->
            identity;

        3 ->
            {omit_first, 1};

        4 ->
            uppercase_first;

        5 ->
            identity;

        6 ->
            identity;

        7 ->
            identity;

        8 ->
            identity;

        9 ->
            uppercase_first;

        10 ->
            identity;

        11 ->
            {omit_first, 2};

        12 ->
            {omit_last, 1};

        13 ->
            identity;

        14 ->
            identity;

        15 ->
            uppercase_first;

        16 ->
            identity;

        17 ->
            identity;

        18 ->
            identity;

        19 ->
            identity;

        20 ->
            identity;

        21 ->
            identity;

        22 ->
            identity;

        23 ->
            {omit_last, 3};

        24 ->
            identity;

        25 ->
            identity;

        26 ->
            {omit_first, 3};

        27 ->
            {omit_last, 2};

        28 ->
            identity;

        29 ->
            identity;

        30 ->
            uppercase_first;

        31 ->
            identity;

        32 ->
            identity;

        33 ->
            identity;

        34 ->
            {omit_first, 4};

        35 ->
            identity;

        36 ->
            identity;

        37 ->
            identity;

        38 ->
            identity;

        39 ->
            {omit_first, 5};

        40 ->
            {omit_first, 6};

        41 ->
            identity;

        42 ->
            {omit_last, 4};

        43 ->
            identity;

        44 ->
            uppercase_all;

        45 ->
            identity;

        46 ->
            identity;

        47 ->
            identity;

        48 ->
            {omit_last, 7};

        49 ->
            {omit_last, 1};

        50 ->
            identity;

        51 ->
            identity;

        52 ->
            identity;

        53 ->
            identity;

        54 ->
            {omit_first, 9};

        55 ->
            {omit_first, 7};

        56 ->
            {omit_last, 6};

        57 ->
            identity;

        58 ->
            uppercase_first;

        59 ->
            {omit_last, 8};

        60 ->
            identity;

        61 ->
            identity;

        62 ->
            identity;

        63 ->
            {omit_last, 5};

        64 ->
            {omit_last, 9};

        65 ->
            uppercase_first;

        66 ->
            uppercase_first;

        67 ->
            identity;

        68 ->
            uppercase_all;

        69 ->
            uppercase_first;

        70 ->
            identity;

        71 ->
            identity;

        72 ->
            identity;

        73 ->
            identity;

        74 ->
            uppercase_first;

        75 ->
            identity;

        76 ->
            identity;

        77 ->
            identity;

        78 ->
            uppercase_first;

        79 ->
            uppercase_first;

        80 ->
            identity;

        81 ->
            identity;

        82 ->
            identity;

        83 ->
            uppercase_all;

        84 ->
            identity;

        85 ->
            uppercase_all;

        86 ->
            identity;

        87 ->
            uppercase_all;

        88 ->
            uppercase_first;

        89 ->
            identity;

        90 ->
            identity;

        91 ->
            uppercase_first;

        92 ->
            identity;

        93 ->
            identity;

        94 ->
            uppercase_all;

        95 ->
            identity;

        96 ->
            uppercase_first;

        97 ->
            uppercase_all;

        98 ->
            identity;

        99 ->
            uppercase_first;

        100 ->
            identity;

        101 ->
            uppercase_all;

        102 ->
            identity;

        103 ->
            identity;

        104 ->
            uppercase_first;

        105 ->
            uppercase_all;

        106 ->
            identity;

        107 ->
            uppercase_all;

        108 ->
            uppercase_first;

        109 ->
            uppercase_first;

        110 ->
            uppercase_all;

        111 ->
            uppercase_all;

        112 ->
            uppercase_all;

        113 ->
            uppercase_all;

        114 ->
            uppercase_all;

        115 ->
            uppercase_all;

        116 ->
            uppercase_all;

        117 ->
            uppercase_all;

        118 ->
            uppercase_first;

        119 ->
            uppercase_all;

        120 ->
            uppercase_first;

        _ ->
            identity
    end.

-file("src/packkit/internal/brotli_transform.gleam", 744).
?DOC(false).
-spec uppercase_first(bitstring(), integer()) -> bitstring().
uppercase_first(Word, Len) ->
    case Word of
        <<>> ->
            <<>>;

        <<B, Rest/binary>> when B < 16#C0 ->
            New_b = case (B >= 16#61) andalso (B =< 16#7A) of
                true ->
                    erlang:'bxor'(B, 32);

                false ->
                    B
            end,
            <<New_b, Rest/bitstring>>;

        <<B@1, C, Rest@1/binary>> when B@1 < 16#E0 ->
            _ = Len,
            <<B@1, (erlang:'bxor'(C, 32)), Rest@1/bitstring>>;

        <<B@2, C@1, D, Rest@2/binary>> ->
            _ = Len,
            <<B@2, C@1, (erlang:'bxor'(D, 5)), Rest@2/bitstring>>;

        _ ->
            Word
    end.

-file("src/packkit/internal/brotli_transform.gleam", 779).
?DOC(false).
-spec uppercase_step(bitstring()) -> integer().
uppercase_step(Rest) ->
    case Rest of
        <<B, _/bitstring>> when B < 16#C0 ->
            1;

        <<B@1, _/bitstring>> when B@1 < 16#E0 ->
            2;

        _ ->
            3
    end.

-file("src/packkit/internal/brotli_transform.gleam", 766).
?DOC(false).
-spec uppercase_all(bitstring(), integer(), integer()) -> bitstring().
uppercase_all(Word, Taken, Total) ->
    case Taken >= Total of
        true ->
            Word;

        false ->
            Head@1 = case gleam_stdlib:bit_array_slice(Word, 0, Taken) of
                {ok, Head} -> Head;
                _assert_fail ->
                    erlang:error(#{gleam_error => let_assert,
                                message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                                file => <<?FILEPATH/utf8>>,
                                module => <<"packkit/internal/brotli_transform"/utf8>>,
                                function => <<"uppercase_all"/utf8>>,
                                line => 770,
                                value => _assert_fail,
                                start => 11497,
                                'end' => 11550,
                                pattern_start => 11508,
                                pattern_end => 11516})
            end,
            Tail@1 = case gleam_stdlib:bit_array_slice(
                Word,
                Taken,
                Total - Taken
            ) of
                {ok, Tail} -> Tail;
                _assert_fail@1 ->
                    erlang:error(#{gleam_error => let_assert,
                                message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                                file => <<?FILEPATH/utf8>>,
                                module => <<"packkit/internal/brotli_transform"/utf8>>,
                                function => <<"uppercase_all"/utf8>>,
                                line => 771,
                                value => _assert_fail@1,
                                start => 11557,
                                'end' => 11622,
                                pattern_start => 11568,
                                pattern_end => 11576})
            end,
            New_tail = uppercase_first(Tail@1, Total - Taken),
            Step = uppercase_step(Tail@1),
            uppercase_all(
                gleam_stdlib:bit_array_concat([Head@1, New_tail]),
                Taken + Step,
                Total
            )
    end.

-file("src/packkit/internal/brotli_transform.gleam", 715).
?DOC(false).
-spec apply_op(bitstring(), op()) -> bitstring().
apply_op(Word, Op) ->
    Len = erlang:byte_size(Word),
    case Op of
        identity ->
            Word;

        {omit_last, N} ->
            case N >= Len of
                true ->
                    <<>>;

                false ->
                    Slice@1 = case gleam_stdlib:bit_array_slice(
                        Word,
                        0,
                        Len - N
                    ) of
                        {ok, Slice} -> Slice;
                        _assert_fail ->
                            erlang:error(#{gleam_error => let_assert,
                                        message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                                        file => <<?FILEPATH/utf8>>,
                                        module => <<"packkit/internal/brotli_transform"/utf8>>,
                                        function => <<"apply_op"/utf8>>,
                                        line => 723,
                                        value => _assert_fail,
                                        start => 10192,
                                        'end' => 10248,
                                        pattern_start => 10203,
                                        pattern_end => 10212})
                    end,
                    Slice@1
            end;

        {omit_first, N@1} ->
            case N@1 >= Len of
                true ->
                    <<>>;

                false ->
                    Slice@3 = case gleam_stdlib:bit_array_slice(
                        Word,
                        N@1,
                        Len - N@1
                    ) of
                        {ok, Slice@2} -> Slice@2;
                        _assert_fail@1 ->
                            erlang:error(#{gleam_error => let_assert,
                                        message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                                        file => <<?FILEPATH/utf8>>,
                                        module => <<"packkit/internal/brotli_transform"/utf8>>,
                                        function => <<"apply_op"/utf8>>,
                                        line => 731,
                                        value => _assert_fail@1,
                                        start => 10375,
                                        'end' => 10431,
                                        pattern_start => 10386,
                                        pattern_end => 10395})
                    end,
                    Slice@3
            end;

        uppercase_first ->
            uppercase_first(Word, Len);

        uppercase_all ->
            uppercase_all(Word, 0, Len)
    end.

-file("src/packkit/internal/brotli_transform.gleam", 698).
?DOC(false).
-spec prefix_suffix_slice(integer()) -> bitstring().
prefix_suffix_slice(Id) ->
    Start = prefix_suffix_offset(Id),
    Len_bits@1 = case gleam_stdlib:bit_array_slice(
        <<1,
            32,
            2,
            44,
            32,
            8,
            32,
            111,
            102,
            32,
            116,
            104,
            101,
            32,
            4,
            32,
            111,
            102,
            32,
            2,
            115,
            32,
            1,
            46,
            5,
            32,
            97,
            110,
            100,
            32,
            4,
            32,
            105,
            110,
            32,
            1,
            34,
            4,
            32,
            116,
            111,
            32,
            2,
            34,
            62,
            1,
            10,
            2,
            46,
            32,
            1,
            93,
            5,
            32,
            102,
            111,
            114,
            32,
            3,
            32,
            97,
            32,
            6,
            32,
            116,
            104,
            97,
            116,
            32,
            1,
            39,
            6,
            32,
            119,
            105,
            116,
            104,
            32,
            6,
            32,
            102,
            114,
            111,
            109,
            32,
            4,
            32,
            98,
            121,
            32,
            1,
            40,
            6,
            46,
            32,
            84,
            104,
            101,
            32,
            4,
            32,
            111,
            110,
            32,
            4,
            32,
            97,
            115,
            32,
            4,
            32,
            105,
            115,
            32,
            4,
            105,
            110,
            103,
            32,
            2,
            10,
            9,
            1,
            58,
            3,
            101,
            100,
            32,
            2,
            61,
            34,
            4,
            32,
            97,
            116,
            32,
            3,
            108,
            121,
            32,
            1,
            44,
            2,
            61,
            39,
            5,
            46,
            99,
            111,
            109,
            47,
            7,
            46,
            32,
            84,
            104,
            105,
            115,
            32,
            5,
            32,
            110,
            111,
            116,
            32,
            3,
            101,
            114,
            32,
            3,
            97,
            108,
            32,
            4,
            102,
            117,
            108,
            32,
            4,
            105,
            118,
            101,
            32,
            5,
            108,
            101,
            115,
            115,
            32,
            4,
            101,
            115,
            116,
            32,
            4,
            105,
            122,
            101,
            32,
            2,
            194,
            160,
            4,
            111,
            117,
            115,
            32,
            5,
            32,
            116,
            104,
            101,
            32,
            2,
            101,
            32,
            0>>,
        Start,
        1
    ) of
        {ok, Len_bits} -> Len_bits;
        _assert_fail ->
            erlang:error(#{gleam_error => let_assert,
                        message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                        file => <<?FILEPATH/utf8>>,
                        module => <<"packkit/internal/brotli_transform"/utf8>>,
                        function => <<"prefix_suffix_slice"/utf8>>,
                        line => 700,
                        value => _assert_fail,
                        start => 9692,
                        'end' => 9764,
                        pattern_start => 9703,
                        pattern_end => 9715})
    end,
    Len = case Len_bits@1 of
        <<N>> ->
            N;

        _ ->
            0
    end,
    case Len of
        0 ->
            <<>>;

        _ ->
            Payload@1 = case gleam_stdlib:bit_array_slice(
                <<1,
                    32,
                    2,
                    44,
                    32,
                    8,
                    32,
                    111,
                    102,
                    32,
                    116,
                    104,
                    101,
                    32,
                    4,
                    32,
                    111,
                    102,
                    32,
                    2,
                    115,
                    32,
                    1,
                    46,
                    5,
                    32,
                    97,
                    110,
                    100,
                    32,
                    4,
                    32,
                    105,
                    110,
                    32,
                    1,
                    34,
                    4,
                    32,
                    116,
                    111,
                    32,
                    2,
                    34,
                    62,
                    1,
                    10,
                    2,
                    46,
                    32,
                    1,
                    93,
                    5,
                    32,
                    102,
                    111,
                    114,
                    32,
                    3,
                    32,
                    97,
                    32,
                    6,
                    32,
                    116,
                    104,
                    97,
                    116,
                    32,
                    1,
                    39,
                    6,
                    32,
                    119,
                    105,
                    116,
                    104,
                    32,
                    6,
                    32,
                    102,
                    114,
                    111,
                    109,
                    32,
                    4,
                    32,
                    98,
                    121,
                    32,
                    1,
                    40,
                    6,
                    46,
                    32,
                    84,
                    104,
                    101,
                    32,
                    4,
                    32,
                    111,
                    110,
                    32,
                    4,
                    32,
                    97,
                    115,
                    32,
                    4,
                    32,
                    105,
                    115,
                    32,
                    4,
                    105,
                    110,
                    103,
                    32,
                    2,
                    10,
                    9,
                    1,
                    58,
                    3,
                    101,
                    100,
                    32,
                    2,
                    61,
                    34,
                    4,
                    32,
                    97,
                    116,
                    32,
                    3,
                    108,
                    121,
                    32,
                    1,
                    44,
                    2,
                    61,
                    39,
                    5,
                    46,
                    99,
                    111,
                    109,
                    47,
                    7,
                    46,
                    32,
                    84,
                    104,
                    105,
                    115,
                    32,
                    5,
                    32,
                    110,
                    111,
                    116,
                    32,
                    3,
                    101,
                    114,
                    32,
                    3,
                    97,
                    108,
                    32,
                    4,
                    102,
                    117,
                    108,
                    32,
                    4,
                    105,
                    118,
                    101,
                    32,
                    5,
                    108,
                    101,
                    115,
                    115,
                    32,
                    4,
                    101,
                    115,
                    116,
                    32,
                    4,
                    105,
                    122,
                    101,
                    32,
                    2,
                    194,
                    160,
                    4,
                    111,
                    117,
                    115,
                    32,
                    5,
                    32,
                    116,
                    104,
                    101,
                    32,
                    2,
                    101,
                    32,
                    0>>,
                Start + 1,
                Len
            ) of
                {ok, Payload} -> Payload;
                _assert_fail@1 ->
                    erlang:error(#{gleam_error => let_assert,
                                message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                                file => <<?FILEPATH/utf8>>,
                                module => <<"packkit/internal/brotli_transform"/utf8>>,
                                function => <<"prefix_suffix_slice"/utf8>>,
                                line => 708,
                                value => _assert_fail@1,
                                start => 9867,
                                'end' => 9952,
                                pattern_start => 9878,
                                pattern_end => 9889})
            end,
            Payload@1
    end.

-file("src/packkit/internal/brotli_transform.gleam", 691).
?DOC(false).
-spec apply(bitstring(), integer()) -> bitstring().
apply(Word, Idx) ->
    Prefix = prefix_suffix_slice(prefix_id_of(Idx)),
    Suffix = prefix_suffix_slice(suffix_id_of(Idx)),
    Body = apply_op(Word, op_of(Idx)),
    gleam_stdlib:bit_array_concat([Prefix, Body, Suffix]).