Definition: [
    "autonomous agent",
    {
        "init": "{
        $_Registre = 'IW6DOUEPGHGQGTKLU6W6I2ILKZ562N6R';
        // Retorna el valor d'una entrada del _Registre
        $__dada = $refdada =>
            data_feed [[
                oracles = $_Registre,
                feed_name = $refdada,
                ifnone = 0
            ]];
        if ( $__dada( '_Portal' ) != trigger.address )
            bounce( 'Portal no reconegut' );
       // Principals
        $args = trigger.data;
        $adr__ = trigger.initial_address;
        $idgeto = trigger.output[[ asset != base ]].asset;
        $dades = $args.dades otherwise {};
       // Abreviacions
        $proces = $args.proces;
        $operacio = $args.operacio;
        $idprop = $args.idprop;
        $nova_idprop = $args.nova_idprop;
        $ref = $args.ref;
        $val = $args.val;
        $adr = $args.adr;
       // Obté valor argument requesta especificat o rebota
        $__arg = $arg =>
            $args[ $arg ] otherwise
            bounce( "Cal proporcionar el valor de: " || $arg );
       // Admin ísox
        if ( $proces == 'nova_isox' ) {
            $ord_isox = $__dada( 'ordinal_isox' ) + 1;
            $_actuant_es_isox_000 = $__dada( 'isox_000' ) == $adr__ ;
            $_estat_isox_actuant = $__dada( 'isox_' || $adr__ || '_estat' ) otherwise '';
            $autoritzacio = $_actuant_es_isox_000 OR $_estat_isox_actuant == 'habilitat';
            if ( ! $autoritzacio ) bounce( 'No autoritzada per a no ísox' );
            $index_baules_isox_actuant =
                $__dada( 'isox_' || $adr__ || '_index_baules' ) otherwise 1;
            $mitjana_index_baules =
                $__dada( 'mitjana_index_baules' ) otherwise 1;
            $factor_topall_index_baules =
                $__dada( 'Factor_Topall_Index_Baules' ) otherwise 1.5;
            if ( $index_baules_isox_actuant >
                    ( $mitjana_index_baules * $factor_topall_index_baules ) )
                bounce( 'No autoritzada per massa baules' );
            $estat_isox = $__dada( 'isox_' || $adr || '_estat') otherwise '';
            if ( $estat_isox == 'habilitat' )
                bounce( 'Ja hi consta una ísox habilitada amb aquesta adreça' );
            $_aspirant = $__dada( 'aspirant_' || $adr );
            if ( $_actuant_es_isox_000 ) {
                $index_baules_nova_isox =
                    $args.index_baules otherwise $mitjana_index_baules;
                $dades_alta =
                    [ 'isox_000', 'isox_000', 1, $index_baules_nova_isox ];
            } else {
                $nombre_avals =
                    $__dada( 'isox_' || $adr__ || '_aval_2' ) ? 2 :
                    $__dada( 'isox_' || $adr__ || '_aval_1' ) ? 1 :
                    0;
                if ( $nombre_avals == 2 ) bounce( "Ja n'has avalat 2" );
                if ( !! $_aspirant ) {
                    $_proposant = $__dada( 'aspirant_' || $adr || '_proposant' );
                    if ( $_proposant == $adr__ )
                        bounce( "Els dos avals han de provenir d'adreces diferents" );
                    $index_baules_proposant =
                        $__dada( 'isox_' || $_proposant || '_index_baules' );
                    $index_baules_nova_isox =
                        1 + round( ( $index_baules_proposant + $index_baules_isox_actuant ) / 2 );
                    $index_absolut =
                        $index_baules_nova_isox + ( $mitjana_index_baules * ( $ord_isox - 1 ) );
                    $nova_mitjana_index_baules =
                        round( $index_absolut / $ord_isox );
                    $dades[ 'isox_' || $adr__ || '_aval_' || ( $nombre_avals + 1 ) ] = $adr;
                    $dades_alta =
                        [
                            $_proposant,
                            $adr__,
                            $index_baules_nova_isox,
                            $nova_mitjana_index_baules
                        ];
                } else {
                    $dades[ 'aspirant_' || $adr ] = timestamp;
                    $dades[ 'aspirant_' || $adr || '_proposant' ] = $adr__;
                    $dades[ 'isox_' || $adr__ || '_aval_' || ( $nombre_avals + 1 ) ] = $adr;
                }
            }
            if ( !! $dades_alta[0] ) {
                $dades[ 'ordinal_isox' ] = $ord_isox;
                $dades[ 'isox_' || $ord_isox ] = $adr;
                $dades[ 'isox_' || $adr || '_ordinal' ] = 'isox_' || $ord_isox;
                $dades[ 'isox_' || $adr || '_proposant' ] = $dades_alta[0];
                $dades[ 'isox_' || $adr || '_confirmant' ] = $dades_alta[1];
                $dades[ 'isox_' || $adr || '_data' ] = timestamp;
                $dades[ 'isox_' || $adr || '_estat' ] = 'habilitat';
                $dades[ 'isox_' || $adr || '_index_baules' ] = $dades_alta[2];
                $dades[ 'mitjana_index_baules' ] = $dades_alta[3];
            }
        }
        if ( $proces == 'nou_estat_isox' ) {
            $_isox = $__dada( $idprop || '_adr' ) otherwise $adr;
            $nou_estat = $__dada( $idprop || '_estat' ) otherwise $args.estat;
            $estat_actual = $__dada( 'isox_' || $_isox || '_estat' ) otherwise '';
            if ( ! $estat_actual )
                bounce( 'No hi consta cap ísox amb aquesta adreça' );
            if ( $estat_actual == $nou_estat )
                bounce( "L'estat actual és el mateix que el proposat" );
            if ( $operacio == 'proposta' ) {
                $dades[ $nova_idprop || '_adr' ] = $adr;
                $dades[ $nova_idprop || '_estat' ] = $args.estat;
            }
            if ( $operacio == 'confirmacio' OR $operacio == 'drecera' )
                $dades[ 'isox_' || $adr || '_estat' ] = $nou_estat;
        }
       // Admin delegacions
        if ( $proces == 'nova_delegacio' OR $proces == 'final_delegacio' ) {
            $ref_entitat = 'entitat_' || $__arg( 'nom' );
            $estat_entitat = $__dada( $ref_entitat || '_estat' ) otherwise '';
            $adr_entitat = $__dada( $ref_entitat || '_adr' ) otherwise '';
            if ( $estat_entitat != 'operatiu' )
                bounce( 'Entitat inexistent o no operativa' );
            if ( $adr_entitat != $adr__ )
                bounce( "L'adreça de l'entitat no és l'actuant" );
            // $ords = [ "1", "2", "3", "4", "5" ];
            $ords = [ "1", "2", "3" ];  // per als TESTS
            $ord_delegada_trobada = [];
            $semiref_delegada = $ref_entitat || '_delegada_';
            $__troba_delegada = $o => {
                $adr_delegada = $__dada( $semiref_delegada || $o ) otherwise '';
                if (
                    ! $ord_delegada_trobada[0]
                    AND $adr_delegada == $adr
                )
                $ord_delegada_trobada[0] = $o;
            };
            //foreach( $ords, 5, $__troba_delegada );
            foreach( $ords, 3, $__troba_delegada );  // per als TESTS
            if ( $proces == 'nova_delegacio' ) {
                if ( !! $ord_delegada_trobada[0] )
                    bounce( 'Ja hi consta una delegada amb aquesta adreça' );
                $lloc_trobat = [];
                $__troba_lloc_lliure = $o => {
                    if (
                        ! $__dada( $semiref_delegada || $o ) AND
                        ! $lloc_trobat[0]
                    ) {
                        $dades[ $semiref_delegada || $o ] = $adr;
                        $lloc_trobat[0] = $o;
                    }
                };
                //$troba_lloc_lliure = map( $ords, 5, $__troba_lloc_lliure );
                $troba_lloc_lliure = map( $ords, 3, $__troba_lloc_lliure );  // per als TESTS
                if ( ! $lloc_trobat[0] )
                    bounce( 'Ja consten com a habilitades totes les delegacions possibles' );
            }
            if ( $proces == 'final_delegacio' ) {
                if ( ! $ord_delegada_trobada[0] )
                    bounce( 'No hi consta cap delegada amb aquesta adreça' );
                $dades[ $semiref_delegada || $ord_delegada_trobada[0] ] = '';
            }
        }
       // Admin vincles
        if ( $args.admin_vincles ) {
            $tipus_vincle = $__dada( $idprop || '_tipus' ) otherwise $__arg( 'tipus' );
            $nom_vincle = $__dada( $idprop || '_nom' ) otherwise $__arg( 'nom' );
            $ref_vincle = $tipus_vincle || '_' || $nom_vincle;
            $ord_vincle = $__dada( $ref_vincle ) otherwise '---';
            $nou_ord_vincle = $__dada( 'ordinal_' || $tipus_vincle ) + 1;
            if ( $proces == 'nou_vincle' ) {
                $_vincle = $__dada( $idprop || '_adr' ) otherwise $__arg( 'adr' );
                // No ha d'estar registrat
                if ( $ord_vincle != '---' )
                    bounce( "Ja n'hi ha un amb aquest nom" );
                // Adreça única
                $adr_registrada = $__dada( $ref_vincle || '_adr' );
                if ( !! $adr_registrada )
                    bounce( "Ja n'hi ha un amb aquesta adreça" );
                //...
                if ( $operacio == 'proposta' ) {
                    $dades[ $nova_idprop || '_adr' ] = $adr;
                    $dades[ $nova_idprop || '_nom' ] = $args.nom;
                }
                if ( $operacio == 'confirmacio' OR $operacio == 'drecera' ) {
                    $dades[ $ref_vincle ] = $tipus_vincle || '_' || $nou_ord_vincle;
                    $dades[ $ref_vincle || '_adr' ] = $_vincle;
                    $dades[ $ref_vincle || '_estat' ] = 'operatiu';
                    $dades[ $tipus_vincle || '_' || $nou_ord_vincle ] = $ref_vincle;
                    $dades[ 'ordinal_' || $tipus_vincle ] = $nou_ord_vincle;
                }
            }
            if ( $proces == 'nou_estat_vincle' ) {
                // Ha d'estar registrat
                $estat_actual = $__dada( $ref_vincle || '_estat' );
                if ( ! $estat_actual )
                    bounce( "Vincle desconegut" );
                //...
                if ( $operacio == 'proposta' ) {
                    $dades[ $nova_idprop || '_adr' ] = $adr;
                    $dades[ $nova_idprop || '_estat' ] = $args.estat;
                }
                if ( $operacio == 'confirmacio' OR $operacio == 'drecera' ) {
                    $nou_estat = $__dada( $idprop || '_estat' ) otherwise $args.estat;
                    $dades[ $ref_vincle || '_estat' ] = $nou_estat;
                    if ( $nou_estat == 'operatiu' ) {
                        $dades[ $ref_vincle ] = $nou_ord_vincle;
                        $dades[ $tipus_vincle || '_' || $nou_ord_vincle ] = $ref_vincle;
                    } else {
                        $dades[ $ref_vincle ] = '---';
                        $dades[ $tipus_vincle || '_' || $ord_vincle ] = '---';
                    }
                }
            }
        }
        $registre = {};
        $registre.dades = $dades;
    }",
        "messages": [
            {
                "app": "data",
                "payload": "{ $registre }"
            },
            {
                "app": "payment",
                "payload": {
                    "asset": "base",
                    "outputs": [
                        {
                            "address": "{ $args._Registre }",
                            "amount": "{ $__dada( 'Provisio' ) }"
                        }
                    ]
                }
            },
            {
                "app": "state",
                "state": "{
                if ( !! $nou_estat )
                    response[ 'Nou estat ' || $ref_vincle ] = $nou_estat;
                if ( $args.admin_vincles ) {
                    response[ 'Proposta' ] = $nova_idprop otherwise $ref otherwise 'drecera';
                    response[ 'operacio' ] = $operacio;
                }
                response[ 'proces' ] = $proces;
            }"
            }
        ]
    }
]