:- prompt(_, '').
:- use_module(library(readutil)).
cor(amarelo).
cor(azul).
cor(branco).
cor(verde).
cor(vermelho).
motorista(vinicius).
motorista(joao).
motorista(limao).
motorista(carol).
motorista(leo).
destino(amazonas).
destino(bahia).
destino(mato_grosso).
destino(minas_gerais).
destino(parana).
carga(adubo).
carga(carvao).
carga(enxofre).
carga(soda_caustica).
carga(trigo).
placa('AAA-1111').
placa('BBB-2222').
placa('CCC-3333').
placa('DDD-4444').
placa('EEE-5555').
km(50).
km(100).
km(150).
km(200).
km(250).
% Definindo alldiferent
alldifferent([]).
alldifferent([H|T]):- not(member(H,T)),
alldifferent(T).
start:- caminhoes([C1, C2, C3, C4,C5]),
writeln("\n CAMINHAO 1: ":C1),
writeln("\n CAMINHAO 2: ":C2),
writeln("\n CAMINHAO 3: ":C3),
writeln("\n CAMINHAO 4: ":C4),
writeln("\n CAMINHAO 5: ":C5).
caminhoes([(COR1, MOTORISTA1, DESTINO1, CARGA1, PLACA1, KM1),
(COR2, MOTORISTA2, DESTINO2, CARGA2, PLACA2, KM2),
(COR3, MOTORISTA3, DESTINO3, CARGA3, PLACA3, KM3),
(COR4, MOTORISTA4, DESTINO4, CARGA4, PLACA4, KM4),
(COR5, MOTORISTA5, DESTINO5, CARGA5, PLACA5, KM5)]):-
%%O número 1 fala que Jorge é o motorista do caminhão de placa DDD-4444.
(
(MOTORISTA1=limao,PLACA1='DDD-4444');
(MOTORISTA2=limao,PLACA2='DDD-4444');
(MOTORISTA3=limao,PLACA3='DDD-4444');
(MOTORISTA4=limao,PLACA4='DDD-4444');
(MOTORISTA5=limao,PLACA5='DDD-4444')
),
%%O número 15 fala que Stênio está dirigindo para Minas Gerais.
(
(MOTORISTA1=leo,DESTINO1=minas_gerais);
(MOTORISTA2=leo,DESTINO2=minas_gerais);
(MOTORISTA3=leo,DESTINO3=minas_gerais);
(MOTORISTA4=leo,DESTINO4=minas_gerais);
(MOTORISTA5=leo,DESTINO5=minas_gerais)
),
%%O 19 fala que Antônio é o motorista do caminhão de placa EEE-5555.
(
(MOTORISTA1=vinicius,PLACA1='EEE-5555');
(MOTORISTA2=vinicius,PLACA2='EEE-5555');
(MOTORISTA3=vinicius,PLACA3='EEE-5555');
(MOTORISTA4=vinicius,PLACA4='EEE-5555');
(MOTORISTA5=vinicius,PLACA5='EEE-5555')
),
%%O número 21 fala que Pedro está ao lado do caminhão que vai para
%%o Mato Grosso.
(
(MOTORISTA1=carol,DESTINO2=mato_grosso);
(MOTORISTA2=carol,(DESTINO1=mato_grosso;DESTINO3=mato_grosso));
(MOTORISTA3=carol,(DESTINO2=mato_grosso;DESTINO4=mato_grosso));
(MOTORISTA4=carol,(DESTINO3=mato_grosso;DESTINO5=mato_grosso));
(MOTORISTA5=carol,DESTINO4=mato_grosso)
),
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%O número 4 diz que o caminhão Vermelho está em algum lugar à esquerda
%%do caminhão que vai para o Amazonas.
(
(COR1=vermelho,(DESTINO2=amazonas;DESTINO3=amazonas;DESTINO4=amazonas;DESTINO5=amazonas));
(COR2=vermelho,(DESTINO3=amazonas;DESTINO4=amazonas;DESTINO5=amazonas));
(COR3=vermelho,(DESTINO4=amazonas;DESTINO5=amazonas));
(COR4=vermelho,DESTINO5=amazonas)
),
%%O número 6 fala que o caminhão Vermelho está em algum lugar entre o
%%caminhão que está carregando Enxofre e o caminhão Azul, nessa ordem.
(
(CARGA1=enxofre,COR3=azul,(COR2=vermelho));
(CARGA1=enxofre,COR4=azul,(COR2=vermelho;COR3=vermelho));
(CARGA1=enxofre,COR5=azul,(COR2=vermelho;COR3=vermelho;COR4=vermelho));
(CARGA2=enxofre,COR4=azul,(COR3=vermelho));
(CARGA2=enxofre,COR5=azul,(COR3=vermelho;COR4=vermelho));
(CARGA3=enxofre,COR5=azul,(COR4=vermelho))
),
%%O número 10 fala que o caminhão Branco está em algum lugar à direita do caminhão Verde.
(
(COR1=verde,(COR2=branco;COR3=branco;COR4=branco;COR5=branco));
(COR2=verde,(COR3=branco;COR4=branco;COR5=branco));
(COR3=verde,(COR4=branco;COR5=branco));
(COR4=verde,COR5=branco)
),
%%O número 13 fala que o caminhão Amarelo está exatamente à esquerda do
%%caminhão que tem 200 mil Km rodados.
(
(COR1=amarelo,KM2=200);
(COR2=amarelo,KM3=200);
(COR3=amarelo,KM4=200);
(COR4=amarelo,KM5=200)
),
%%O número 17 fala que o veículo Azul está em algum lugar à direita do
%%veículo de placa AAA-1111.
(
(PLACA1='AAA-1111',(COR2=azul;COR3=azul;COR4=azul;COR5=azul));
(PLACA2='AAA-1111',(COR3=azul;COR4=azul;COR5=azul));
(PLACA3='AAA-1111',(COR4=azul;COR5=azul));
(PLACA4='AAA-1111',COR5=azul)
),
%%O número 20 fala que o caminhão Azul está em algum lugar à
%%esquerda do caminhão Branco.
(
(COR5=branco,(COR4=azul;COR3=azul;COR2=azul;COR1=azul));
(COR4=branco,(COR3=azul;COR2=azul;COR1=azul));
(COR3=branco,(COR2=azul;COR1=azul));
(COR2=branco,COR1=azul)
),
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%O número 2 fala que na quarta posição está o caminhão que vai
%%para Belo Horizonte.
%%LEMBRANDO que Belo Horizonte fica em Minas Gerais.
DESTINO4=minas_gerais,
%%O número 5 fala que o veículo que vai para a região Centro-oeste
%% está ao lado do caminhão que já rodou 100 mil Km.
%%LEMBRANDO que o Mato Grosso fica no centro-oeste.
(
(DESTINO1=mato_grosso,KM2=100);
(DESTINO2=mato_grosso,(KM1=100;KM3=100));
(DESTINO3=mato_grosso,(KM2=100;KM4=100));
(DESTINO4=mato_grosso,(KM3=100;KM5=100));
(DESTINO5=mato_grosso,KM4=100)
),
%%O número 12 fala que quem vai para a região Nordeste está em
%%algum lugar à direita do caminhão Vermelho.
%%LEMBRANDO que a Bahia fica no nordeste.
(
(DESTINO2=bahia,COR1=vermelho);
(DESTINO3=bahia,(COR1=vermelho;COR2=vermelho));
(DESTINO4=bahia,(COR1=vermelho;COR2=vermelho;COR3=vermelho));
(DESTINO5=bahia,(COR1=vermelho;COR2=vermelho;COR3=vermelho;COR4=vermelho))
),
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%O número 9 fala que o caminhão de placa DDD-4444 está transportando Soda cáustica.
(
(PLACA1='DDD-4444',CARGA1=soda_caustica);
(PLACA2='DDD-4444',CARGA2=soda_caustica);
(PLACA3='DDD-4444',CARGA3=soda_caustica);
(PLACA4='DDD-4444',CARGA4=soda_caustica);
(PLACA5='DDD-4444',CARGA5=soda_caustica)
),
%%O número 16 fala que o caminhão com Adubo está em algum lugar entre o caminhão
%%que vai para Bahia e o caminhão com Carvão, nessa ordem.
(
(DESTINO1=bahia,CARGA3=carvao,(CARGA2=adubo));
(DESTINO1=bahia,CARGA4=carvao,(CARGA2=adubo;CARGA3=adubo));
(DESTINO1=bahia,CARGA5=carvao,(CARGA2=adubo;CARGA3=adubo;CARGA4=adubo));
(DESTINO2=bahia,CARGA4=carvao,(CARGA3=adubo));
(DESTINO2=bahia,CARGA5=carvao,(CARGA3=adubo;CARGA4=adubo));
(DESTINO3=bahia,CARGA5=carvao,(CARGA4=adubo))
),
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%O número 8 fala que em uma das pontas está o caminhão de placa AAA-1111.
(PLACA1='AAA-1111';PLACA5='AAA-1111'),
%%O número 11 fala que o veículo de placa BBB-2222 está ao lado
%%do veículo mais rodado.
(
(PLACA1='BBB-2222',KM2=250);
(PLACA2='BBB-2222',(KM1=250;KM3=250));
(PLACA3='BBB-2222',(KM2=250;KM4=250));
(PLACA4='BBB-2222',(KM3=250;KM5=250));
(PLACA5='BBB-2222',KM4=250)
),
%%O número 14 fala que o veículo de placa CCC-3333 está exatamente
%%à direita do veículo de placa DDD-4444.
(
(PLACA1='DDD-4444',PLACA2='CCC-3333');
(PLACA2='DDD-4444',PLACA3='CCC-3333');
(PLACA3='DDD-4444',PLACA4='CCC-3333');
(PLACA4='DDD-4444',PLACA5='CCC-3333')
),
%%O número 18 fala que o caminhão de placa DDD-4444 está ao lado do
%%caminhão que já rodou 100 mil Km.
(
(PLACA1='DDD-4444',KM2=100);
(PLACA2='DDD-4444',(KM1=100;KM3=100));
(PLACA3='DDD-4444',(KM2=100;KM4=100));
(PLACA4='DDD-4444',(KM3=100;KM5=100));
(PLACA5='DDD-4444',KM4=100)
),
%%O número 22 fala que em uma das pontas está o caminhão de placa EEE-5555.
(PLACA1='EEE-5555';PLACA5='EEE-5555'),
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%O número 3 diz que o caminhão menos rodado está transportando Carvão.
(
(KM1=50,CARGA1=carvao);
(KM2=50,CARGA2=carvao);
(KM3=50,CARGA3=carvao);
(KM4=50,CARGA4=carvao);
(KM5=50,CARGA5=carvao)
),
%%O número 7 diz que na primeira posição está o caminhão que
%%tem 150 mil Km rodados.
KM1=150,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Só no final unifica o que faltar
%%Vamos lidar com os motoristas
motorista(MOTORISTA1), motorista(MOTORISTA2), motorista(MOTORISTA3),
motorista(MOTORISTA4), motorista(MOTORISTA5),
alldifferent([MOTORISTA1, MOTORISTA2, MOTORISTA3, MOTORISTA4, MOTORISTA5]),
%%Vamos lidar com as cores
cor(COR1), cor(COR2), cor(COR3), cor(COR4), cor(COR5),
alldifferent([COR1, COR2, COR3, COR4, COR5]),
%%Vamos lidar com os destinos
destino(DESTINO1), destino(DESTINO2), destino(DESTINO3),
destino(DESTINO4), destino(DESTINO5),
alldifferent([DESTINO1, DESTINO2, DESTINO3, DESTINO4, DESTINO5]),
%%Vamos lidar com as cargas
carga(CARGA1), carga(CARGA2), carga(CARGA3), carga(CARGA4),
carga(CARGA5),
alldifferent([CARGA1, CARGA2, CARGA3, CARGA4, CARGA5]),
%%Vamos lidar com as placas
placa(PLACA1), placa(PLACA2), placa(PLACA3), placa(PLACA4),
placa(PLACA5),
alldifferent([PLACA1, PLACA2, PLACA3, PLACA4, PLACA5]),
%%Vamos lidar com as quilometragem
km(KM1), km(KM2), km(KM3), km(KM4), km(KM5),
alldifferent([KM1, KM2, KM3, KM4, KM5]),
main:-
start,
process:-
/* your code goes here */
:- main.
Oi0gc2V0X3Byb2xvZ19mbGFnKHZlcmJvc2Usc2lsZW50KS4KOi0gcHJvbXB0KF8sICcnKS4KOi0gdXNlX21vZHVsZShsaWJyYXJ5KHJlYWR1dGlsKSkuCgpjb3IoYW1hcmVsbykuCmNvcihhenVsKS4KY29yKGJyYW5jbykuCmNvcih2ZXJkZSkuCmNvcih2ZXJtZWxobykuCgptb3RvcmlzdGEodmluaWNpdXMpLgptb3RvcmlzdGEoam9hbykuCm1vdG9yaXN0YShsaW1hbykuCm1vdG9yaXN0YShjYXJvbCkuCm1vdG9yaXN0YShsZW8pLgoKZGVzdGlubyhhbWF6b25hcykuCmRlc3Rpbm8oYmFoaWEpLgpkZXN0aW5vKG1hdG9fZ3Jvc3NvKS4KZGVzdGlubyhtaW5hc19nZXJhaXMpLgpkZXN0aW5vKHBhcmFuYSkuCgpjYXJnYShhZHVibykuCmNhcmdhKGNhcnZhbykuCmNhcmdhKGVueG9mcmUpLgpjYXJnYShzb2RhX2NhdXN0aWNhKS4KY2FyZ2EodHJpZ28pLgoKcGxhY2EoJ0FBQS0xMTExJykuCnBsYWNhKCdCQkItMjIyMicpLgpwbGFjYSgnQ0NDLTMzMzMnKS4KcGxhY2EoJ0RERC00NDQ0JykuCnBsYWNhKCdFRUUtNTU1NScpLgoKa20oNTApLgprbSgxMDApLgprbSgxNTApLgprbSgyMDApLgprbSgyNTApLgoKJSBEZWZpbmluZG8gYWxsZGlmZXJlbnQgCmFsbGRpZmZlcmVudChbXSkuCmFsbGRpZmZlcmVudChbSHxUXSk6LSBub3QobWVtYmVyKEgsVCkpLAogICAgICAgICAgICAgICAgICAgICAgYWxsZGlmZmVyZW50KFQpLgoKCnN0YXJ0Oi0gY2FtaW5ob2VzKFtDMSwgQzIsIEMzLCBDNCxDNV0pLAogICAgICAgICB3cml0ZWxuKCJcbiBDQU1JTkhBTyAxOiAiOkMxKSwKICAgICAgICAgd3JpdGVsbigiXG4gQ0FNSU5IQU8gMjogIjpDMiksCiAgICAgICAgIHdyaXRlbG4oIlxuIENBTUlOSEFPIDM6ICI6QzMpLAogICAgICAgICB3cml0ZWxuKCJcbiBDQU1JTkhBTyA0OiAiOkM0KSwKICAgICAgICAgd3JpdGVsbigiXG4gQ0FNSU5IQU8gNTogIjpDNSkuCgoKY2FtaW5ob2VzKFsoQ09SMSwgTU9UT1JJU1RBMSwgREVTVElOTzEsIENBUkdBMSwgUExBQ0ExLCBLTTEpLAogICAgICAgICAoQ09SMiwgTU9UT1JJU1RBMiwgREVTVElOTzIsIENBUkdBMiwgUExBQ0EyLCBLTTIpLAogICAgICAgICAoQ09SMywgTU9UT1JJU1RBMywgREVTVElOTzMsIENBUkdBMywgUExBQ0EzLCBLTTMpLAogICAgICAgICAoQ09SNCwgTU9UT1JJU1RBNCwgREVTVElOTzQsIENBUkdBNCwgUExBQ0E0LCBLTTQpLAogICAgICAgICAoQ09SNSwgTU9UT1JJU1RBNSwgREVTVElOTzUsIENBUkdBNSwgUExBQ0E1LCBLTTUpXSk6LQoKICAgICUlTyBuw7ptZXJvIDEgZmFsYSBxdWUgSm9yZ2Ugw6kgbyBtb3RvcmlzdGEgZG8gY2FtaW5ow6NvIGRlIHBsYWNhIERERC00NDQ0LgooCihNT1RPUklTVEExPWxpbWFvLFBMQUNBMT0nRERELTQ0NDQnKTsKKE1PVE9SSVNUQTI9bGltYW8sUExBQ0EyPSdEREQtNDQ0NCcpOwooTU9UT1JJU1RBMz1saW1hbyxQTEFDQTM9J0RERC00NDQ0Jyk7CihNT1RPUklTVEE0PWxpbWFvLFBMQUNBND0nRERELTQ0NDQnKTsKKE1PVE9SSVNUQTU9bGltYW8sUExBQ0E1PSdEREQtNDQ0NCcpCiksCgogICAgJSVPIG7Dum1lcm8gMTUgZmFsYSBxdWUgU3TDqm5pbyBlc3TDoSBkaXJpZ2luZG8gcGFyYSBNaW5hcyBHZXJhaXMuCgooCihNT1RPUklTVEExPWxlbyxERVNUSU5PMT1taW5hc19nZXJhaXMpOwooTU9UT1JJU1RBMj1sZW8sREVTVElOTzI9bWluYXNfZ2VyYWlzKTsKKE1PVE9SSVNUQTM9bGVvLERFU1RJTk8zPW1pbmFzX2dlcmFpcyk7CihNT1RPUklTVEE0PWxlbyxERVNUSU5PND1taW5hc19nZXJhaXMpOwooTU9UT1JJU1RBNT1sZW8sREVTVElOTzU9bWluYXNfZ2VyYWlzKQopLAoKICAgICUlTyAxOSBmYWxhIHF1ZSBBbnTDtG5pbyDDqSBvIG1vdG9yaXN0YSBkbyBjYW1pbmjDo28gZGUgcGxhY2EgRUVFLTU1NTUuCgooCihNT1RPUklTVEExPXZpbmljaXVzLFBMQUNBMT0nRUVFLTU1NTUnKTsKKE1PVE9SSVNUQTI9dmluaWNpdXMsUExBQ0EyPSdFRUUtNTU1NScpOwooTU9UT1JJU1RBMz12aW5pY2l1cyxQTEFDQTM9J0VFRS01NTU1Jyk7CihNT1RPUklTVEE0PXZpbmljaXVzLFBMQUNBND0nRUVFLTU1NTUnKTsKKE1PVE9SSVNUQTU9dmluaWNpdXMsUExBQ0E1PSdFRUUtNTU1NScpCiksCgogICAgJSVPIG7Dum1lcm8gMjEgZmFsYSBxdWUgUGVkcm8gZXN0w6EgYW8gbGFkbyBkbyBjYW1pbmjDo28gcXVlIHZhaSBwYXJhIAogICAgJSVvIE1hdG8gR3Jvc3NvLgoKKAooTU9UT1JJU1RBMT1jYXJvbCxERVNUSU5PMj1tYXRvX2dyb3Nzbyk7CihNT1RPUklTVEEyPWNhcm9sLChERVNUSU5PMT1tYXRvX2dyb3NzbztERVNUSU5PMz1tYXRvX2dyb3NzbykpOwooTU9UT1JJU1RBMz1jYXJvbCwoREVTVElOTzI9bWF0b19ncm9zc287REVTVElOTzQ9bWF0b19ncm9zc28pKTsKKE1PVE9SSVNUQTQ9Y2Fyb2wsKERFU1RJTk8zPW1hdG9fZ3Jvc3NvO0RFU1RJTk81PW1hdG9fZ3Jvc3NvKSk7CihNT1RPUklTVEE1PWNhcm9sLERFU1RJTk80PW1hdG9fZ3Jvc3NvKQopLAoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQoKICAgICUlTyBuw7ptZXJvIDQgZGl6IHF1ZSBvIGNhbWluaMOjbyBWZXJtZWxobyBlc3TDoSBlbSBhbGd1bSBsdWdhciDDoCBlc3F1ZXJkYSAKICAgICUlZG8gY2FtaW5ow6NvIHF1ZSB2YWkgcGFyYSBvIEFtYXpvbmFzLgoKKAooQ09SMT12ZXJtZWxobywoREVTVElOTzI9YW1hem9uYXM7REVTVElOTzM9YW1hem9uYXM7REVTVElOTzQ9YW1hem9uYXM7REVTVElOTzU9YW1hem9uYXMpKTsKKENPUjI9dmVybWVsaG8sKERFU1RJTk8zPWFtYXpvbmFzO0RFU1RJTk80PWFtYXpvbmFzO0RFU1RJTk81PWFtYXpvbmFzKSk7CihDT1IzPXZlcm1lbGhvLChERVNUSU5PND1hbWF6b25hcztERVNUSU5PNT1hbWF6b25hcykpOwooQ09SND12ZXJtZWxobyxERVNUSU5PNT1hbWF6b25hcykKKSwKCiAgICAlJU8gbsO6bWVybyA2IGZhbGEgcXVlIG8gY2FtaW5ow6NvIFZlcm1lbGhvIGVzdMOhIGVtIGFsZ3VtIGx1Z2FyIGVudHJlIG8gCiAgICAlJWNhbWluaMOjbyBxdWUgZXN0w6EgY2FycmVnYW5kbyBFbnhvZnJlIGUgbyBjYW1pbmjDo28gQXp1bCwgbmVzc2Egb3JkZW0uCgooCihDQVJHQTE9ZW54b2ZyZSxDT1IzPWF6dWwsKENPUjI9dmVybWVsaG8pKTsKKENBUkdBMT1lbnhvZnJlLENPUjQ9YXp1bCwoQ09SMj12ZXJtZWxobztDT1IzPXZlcm1lbGhvKSk7CihDQVJHQTE9ZW54b2ZyZSxDT1I1PWF6dWwsKENPUjI9dmVybWVsaG87Q09SMz12ZXJtZWxobztDT1I0PXZlcm1lbGhvKSk7CihDQVJHQTI9ZW54b2ZyZSxDT1I0PWF6dWwsKENPUjM9dmVybWVsaG8pKTsKKENBUkdBMj1lbnhvZnJlLENPUjU9YXp1bCwoQ09SMz12ZXJtZWxobztDT1I0PXZlcm1lbGhvKSk7CihDQVJHQTM9ZW54b2ZyZSxDT1I1PWF6dWwsKENPUjQ9dmVybWVsaG8pKQopLAoKICAgICUlTyBuw7ptZXJvIDEwIGZhbGEgcXVlIG8gY2FtaW5ow6NvIEJyYW5jbyBlc3TDoSBlbSBhbGd1bSBsdWdhciDDoCBkaXJlaXRhIGRvIGNhbWluaMOjbyBWZXJkZS4KCigKKENPUjE9dmVyZGUsKENPUjI9YnJhbmNvO0NPUjM9YnJhbmNvO0NPUjQ9YnJhbmNvO0NPUjU9YnJhbmNvKSk7CihDT1IyPXZlcmRlLChDT1IzPWJyYW5jbztDT1I0PWJyYW5jbztDT1I1PWJyYW5jbykpOwooQ09SMz12ZXJkZSwoQ09SND1icmFuY287Q09SNT1icmFuY28pKTsKKENPUjQ9dmVyZGUsQ09SNT1icmFuY28pCiksCgogICAgJSVPIG7Dum1lcm8gMTMgZmFsYSBxdWUgbyBjYW1pbmjDo28gQW1hcmVsbyBlc3TDoSBleGF0YW1lbnRlIMOgIGVzcXVlcmRhIGRvIAogICAgJSVjYW1pbmjDo28gcXVlIHRlbSAyMDAgbWlsIEttIHJvZGFkb3MuCgooCihDT1IxPWFtYXJlbG8sS00yPTIwMCk7CihDT1IyPWFtYXJlbG8sS00zPTIwMCk7CihDT1IzPWFtYXJlbG8sS000PTIwMCk7CihDT1I0PWFtYXJlbG8sS001PTIwMCkKKSwKCiAgICAlJU8gbsO6bWVybyAxNyBmYWxhIHF1ZSBvIHZlw61jdWxvIEF6dWwgZXN0w6EgZW0gYWxndW0gbHVnYXIgw6AgZGlyZWl0YSBkbyAKICAgICUldmXDrWN1bG8gZGUgcGxhY2EgQUFBLTExMTEuCgooCihQTEFDQTE9J0FBQS0xMTExJywoQ09SMj1henVsO0NPUjM9YXp1bDtDT1I0PWF6dWw7Q09SNT1henVsKSk7CihQTEFDQTI9J0FBQS0xMTExJywoQ09SMz1henVsO0NPUjQ9YXp1bDtDT1I1PWF6dWwpKTsKKFBMQUNBMz0nQUFBLTExMTEnLChDT1I0PWF6dWw7Q09SNT1henVsKSk7CihQTEFDQTQ9J0FBQS0xMTExJyxDT1I1PWF6dWwpCiksCgogICAgJSVPIG7Dum1lcm8gMjAgZmFsYSBxdWUgbyBjYW1pbmjDo28gQXp1bCBlc3TDoSBlbSBhbGd1bSBsdWdhciDDoCAKICAgICUlZXNxdWVyZGEgZG8gY2FtaW5ow6NvIEJyYW5jby4KCigKKENPUjU9YnJhbmNvLChDT1I0PWF6dWw7Q09SMz1henVsO0NPUjI9YXp1bDtDT1IxPWF6dWwpKTsKKENPUjQ9YnJhbmNvLChDT1IzPWF6dWw7Q09SMj1henVsO0NPUjE9YXp1bCkpOwooQ09SMz1icmFuY28sKENPUjI9YXp1bDtDT1IxPWF6dWwpKTsKKENPUjI9YnJhbmNvLENPUjE9YXp1bCkKKSwKCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKCiAgICAlJU8gbsO6bWVybyAyIGZhbGEgcXVlIG5hIHF1YXJ0YSBwb3Npw6fDo28gZXN0w6EgbyBjYW1pbmjDo28gcXVlIHZhaSAKICAgICUlcGFyYSBCZWxvIEhvcml6b250ZS4KICAgICUlTEVNQlJBTkRPIHF1ZSBCZWxvIEhvcml6b250ZSBmaWNhIGVtIE1pbmFzIEdlcmFpcy4KCkRFU1RJTk80PW1pbmFzX2dlcmFpcywKCiAgICAlJU8gbsO6bWVybyA1IGZhbGEgcXVlIG8gdmXDrWN1bG8gcXVlIHZhaSBwYXJhIGEgcmVnacOjbyBDZW50cm8tb2VzdGUKICAgICUlIGVzdMOhIGFvIGxhZG8gZG8gY2FtaW5ow6NvIHF1ZSBqw6Egcm9kb3UgMTAwIG1pbCBLbS4KICAgICUlTEVNQlJBTkRPIHF1ZSBvIE1hdG8gR3Jvc3NvIGZpY2Egbm8gY2VudHJvLW9lc3RlLgoKKAooREVTVElOTzE9bWF0b19ncm9zc28sS00yPTEwMCk7CihERVNUSU5PMj1tYXRvX2dyb3NzbywoS00xPTEwMDtLTTM9MTAwKSk7CihERVNUSU5PMz1tYXRvX2dyb3NzbywoS00yPTEwMDtLTTQ9MTAwKSk7CihERVNUSU5PND1tYXRvX2dyb3NzbywoS00zPTEwMDtLTTU9MTAwKSk7CihERVNUSU5PNT1tYXRvX2dyb3NzbyxLTTQ9MTAwKQopLAoKICAgICUlTyBuw7ptZXJvIDEyIGZhbGEgcXVlIHF1ZW0gdmFpIHBhcmEgYSByZWdpw6NvIE5vcmRlc3RlIGVzdMOhIGVtIAogICAgJSVhbGd1bSBsdWdhciDDoCBkaXJlaXRhIGRvIGNhbWluaMOjbyBWZXJtZWxoby4KICAgICUlTEVNQlJBTkRPIHF1ZSBhIEJhaGlhIGZpY2Egbm8gbm9yZGVzdGUuCgooCihERVNUSU5PMj1iYWhpYSxDT1IxPXZlcm1lbGhvKTsKKERFU1RJTk8zPWJhaGlhLChDT1IxPXZlcm1lbGhvO0NPUjI9dmVybWVsaG8pKTsKKERFU1RJTk80PWJhaGlhLChDT1IxPXZlcm1lbGhvO0NPUjI9dmVybWVsaG87Q09SMz12ZXJtZWxobykpOwooREVTVElOTzU9YmFoaWEsKENPUjE9dmVybWVsaG87Q09SMj12ZXJtZWxobztDT1IzPXZlcm1lbGhvO0NPUjQ9dmVybWVsaG8pKQopLAoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQoKICAgICUlTyBuw7ptZXJvIDkgZmFsYSBxdWUgbyBjYW1pbmjDo28gZGUgcGxhY2EgRERELTQ0NDQgZXN0w6EgdHJhbnNwb3J0YW5kbyBTb2RhIGPDoXVzdGljYS4KCigKKFBMQUNBMT0nRERELTQ0NDQnLENBUkdBMT1zb2RhX2NhdXN0aWNhKTsKKFBMQUNBMj0nRERELTQ0NDQnLENBUkdBMj1zb2RhX2NhdXN0aWNhKTsKKFBMQUNBMz0nRERELTQ0NDQnLENBUkdBMz1zb2RhX2NhdXN0aWNhKTsKKFBMQUNBND0nRERELTQ0NDQnLENBUkdBND1zb2RhX2NhdXN0aWNhKTsKKFBMQUNBNT0nRERELTQ0NDQnLENBUkdBNT1zb2RhX2NhdXN0aWNhKQopLAoKICAgICUlTyBuw7ptZXJvIDE2IGZhbGEgcXVlIG8gY2FtaW5ow6NvIGNvbSBBZHVibyBlc3TDoSBlbSBhbGd1bSBsdWdhciBlbnRyZSBvIGNhbWluaMOjbwogICAgJSVxdWUgdmFpIHBhcmEgQmFoaWEgZSBvIGNhbWluaMOjbyBjb20gQ2FydsOjbywgbmVzc2Egb3JkZW0uCgooCihERVNUSU5PMT1iYWhpYSxDQVJHQTM9Y2FydmFvLChDQVJHQTI9YWR1Ym8pKTsKKERFU1RJTk8xPWJhaGlhLENBUkdBND1jYXJ2YW8sKENBUkdBMj1hZHVibztDQVJHQTM9YWR1Ym8pKTsKKERFU1RJTk8xPWJhaGlhLENBUkdBNT1jYXJ2YW8sKENBUkdBMj1hZHVibztDQVJHQTM9YWR1Ym87Q0FSR0E0PWFkdWJvKSk7CihERVNUSU5PMj1iYWhpYSxDQVJHQTQ9Y2FydmFvLChDQVJHQTM9YWR1Ym8pKTsKKERFU1RJTk8yPWJhaGlhLENBUkdBNT1jYXJ2YW8sKENBUkdBMz1hZHVibztDQVJHQTQ9YWR1Ym8pKTsKKERFU1RJTk8zPWJhaGlhLENBUkdBNT1jYXJ2YW8sKENBUkdBND1hZHVibykpCiksCgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCgogICAgJSVPIG7Dum1lcm8gOCBmYWxhIHF1ZSBlbSB1bWEgZGFzIHBvbnRhcyBlc3TDoSBvIGNhbWluaMOjbyBkZSBwbGFjYSBBQUEtMTExMS4KCihQTEFDQTE9J0FBQS0xMTExJztQTEFDQTU9J0FBQS0xMTExJyksCgogICAgJSVPIG7Dum1lcm8gMTEgZmFsYSBxdWUgbyB2ZcOtY3VsbyBkZSBwbGFjYSBCQkItMjIyMiBlc3TDoSBhbyBsYWRvCiAgICAlJWRvIHZlw61jdWxvIG1haXMgcm9kYWRvLgoKKAooUExBQ0ExPSdCQkItMjIyMicsS00yPTI1MCk7CihQTEFDQTI9J0JCQi0yMjIyJywoS00xPTI1MDtLTTM9MjUwKSk7CihQTEFDQTM9J0JCQi0yMjIyJywoS00yPTI1MDtLTTQ9MjUwKSk7CihQTEFDQTQ9J0JCQi0yMjIyJywoS00zPTI1MDtLTTU9MjUwKSk7CihQTEFDQTU9J0JCQi0yMjIyJyxLTTQ9MjUwKQopLAoKICAgICUlTyBuw7ptZXJvIDE0IGZhbGEgcXVlIG8gdmXDrWN1bG8gZGUgcGxhY2EgQ0NDLTMzMzMgZXN0w6EgZXhhdGFtZW50ZQogICAgJSXDoCBkaXJlaXRhIGRvIHZlw61jdWxvIGRlIHBsYWNhIERERC00NDQ0LgoKKAooUExBQ0ExPSdEREQtNDQ0NCcsUExBQ0EyPSdDQ0MtMzMzMycpOwooUExBQ0EyPSdEREQtNDQ0NCcsUExBQ0EzPSdDQ0MtMzMzMycpOwooUExBQ0EzPSdEREQtNDQ0NCcsUExBQ0E0PSdDQ0MtMzMzMycpOwooUExBQ0E0PSdEREQtNDQ0NCcsUExBQ0E1PSdDQ0MtMzMzMycpCiksCgogICAgJSVPIG7Dum1lcm8gMTggZmFsYSBxdWUgbyBjYW1pbmjDo28gZGUgcGxhY2EgRERELTQ0NDQgZXN0w6EgYW8gbGFkbyBkbwogICAgJSVjYW1pbmjDo28gcXVlIGrDoSByb2RvdSAxMDAgbWlsIEttLgoKKAooUExBQ0ExPSdEREQtNDQ0NCcsS00yPTEwMCk7CihQTEFDQTI9J0RERC00NDQ0JywoS00xPTEwMDtLTTM9MTAwKSk7CihQTEFDQTM9J0RERC00NDQ0JywoS00yPTEwMDtLTTQ9MTAwKSk7CihQTEFDQTQ9J0RERC00NDQ0JywoS00zPTEwMDtLTTU9MTAwKSk7CihQTEFDQTU9J0RERC00NDQ0JyxLTTQ9MTAwKQopLAoKICAgICUlTyBuw7ptZXJvIDIyIGZhbGEgcXVlIGVtIHVtYSBkYXMgcG9udGFzIGVzdMOhIG8gY2FtaW5ow6NvIGRlIHBsYWNhIEVFRS01NTU1LgoKKFBMQUNBMT0nRUVFLTU1NTUnO1BMQUNBNT0nRUVFLTU1NTUnKSwKCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKCiAgICAlJU8gbsO6bWVybyAzIGRpeiBxdWUgbyBjYW1pbmjDo28gbWVub3Mgcm9kYWRvIGVzdMOhIHRyYW5zcG9ydGFuZG8gQ2FydsOjby4KCigKKEtNMT01MCxDQVJHQTE9Y2FydmFvKTsKKEtNMj01MCxDQVJHQTI9Y2FydmFvKTsKKEtNMz01MCxDQVJHQTM9Y2FydmFvKTsKKEtNND01MCxDQVJHQTQ9Y2FydmFvKTsKKEtNNT01MCxDQVJHQTU9Y2FydmFvKQopLAoKICAgICUlTyBuw7ptZXJvIDcgZGl6IHF1ZSBuYSBwcmltZWlyYSBwb3Npw6fDo28gZXN0w6EgbyBjYW1pbmjDo28gcXVlIAogICAgJSV0ZW0gMTUwIG1pbCBLbSByb2RhZG9zLgoKS00xPTE1MCwKCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQoKJSUgU8OzIG5vIGZpbmFsIHVuaWZpY2EgbyBxdWUgZmFsdGFyCgogICAgJSVWYW1vcyBsaWRhciBjb20gb3MgbW90b3Jpc3RhcwoKICAgIG1vdG9yaXN0YShNT1RPUklTVEExKSwgbW90b3Jpc3RhKE1PVE9SSVNUQTIpLCBtb3RvcmlzdGEoTU9UT1JJU1RBMyksCiAgICBtb3RvcmlzdGEoTU9UT1JJU1RBNCksIG1vdG9yaXN0YShNT1RPUklTVEE1KSwgCiAgICBhbGxkaWZmZXJlbnQoW01PVE9SSVNUQTEsIE1PVE9SSVNUQTIsIE1PVE9SSVNUQTMsIE1PVE9SSVNUQTQsIE1PVE9SSVNUQTVdKSwKCiAgICAlJVZhbW9zIGxpZGFyIGNvbSBhcyBjb3JlcyAKCmNvcihDT1IxKSwgY29yKENPUjIpLCBjb3IoQ09SMyksIGNvcihDT1I0KSwgY29yKENPUjUpLCAKYWxsZGlmZmVyZW50KFtDT1IxLCBDT1IyLCBDT1IzLCBDT1I0LCBDT1I1XSksCgogICAgJSVWYW1vcyBsaWRhciBjb20gb3MgZGVzdGlub3MKCgpkZXN0aW5vKERFU1RJTk8xKSwgZGVzdGlubyhERVNUSU5PMiksIGRlc3Rpbm8oREVTVElOTzMpLCAKZGVzdGlubyhERVNUSU5PNCksIGRlc3Rpbm8oREVTVElOTzUpLCAKYWxsZGlmZmVyZW50KFtERVNUSU5PMSwgREVTVElOTzIsIERFU1RJTk8zLCBERVNUSU5PNCwgREVTVElOTzVdKSwKCiAgICAlJVZhbW9zIGxpZGFyIGNvbSBhcyBjYXJnYXMKCmNhcmdhKENBUkdBMSksIGNhcmdhKENBUkdBMiksIGNhcmdhKENBUkdBMyksIGNhcmdhKENBUkdBNCksIApjYXJnYShDQVJHQTUpLCAKYWxsZGlmZmVyZW50KFtDQVJHQTEsIENBUkdBMiwgQ0FSR0EzLCBDQVJHQTQsIENBUkdBNV0pLAoKICAgICUlVmFtb3MgbGlkYXIgY29tIGFzIHBsYWNhcwoKcGxhY2EoUExBQ0ExKSwgcGxhY2EoUExBQ0EyKSwgcGxhY2EoUExBQ0EzKSwgcGxhY2EoUExBQ0E0KSwgCnBsYWNhKFBMQUNBNSksIAoKYWxsZGlmZmVyZW50KFtQTEFDQTEsIFBMQUNBMiwgUExBQ0EzLCBQTEFDQTQsIFBMQUNBNV0pLAoKICAgICUlVmFtb3MgbGlkYXIgY29tIGFzIHF1aWxvbWV0cmFnZW0KCmttKEtNMSksIGttKEtNMiksIGttKEtNMyksIGttKEtNNCksIGttKEtNNSksIAoKYWxsZGlmZmVyZW50KFtLTTEsIEtNMiwgS00zLCBLTTQsIEtNNV0pLAoKdHJ1ZS4KCm1haW46LQoJc3RhcnQsCgloYWx0LgoKcHJvY2VzczotCgkvKiB5b3VyIGNvZGUgZ29lcyBoZXJlICovCgl0cnVlLgoKOi0gbWFpbi4=