/system script remove [find name="wm-ipv6"];/system script add name=wm-ipv6 source=":if\_([:len [/system script job find script=\"wm-ipv6\"]] = 1) do={:local pd [:parse \":local b [:parse \\\":local r 1;:if ((bt) != (bi)) do={:for i from=(bt) to=((bi)-1) do={:set r ((r) * 2);};};:return (r);\\\"];:local n [:parse \\\":local i (ip);:return [:tonum (\\\\\\\"0x\\\\\\\".[:pick (i) 10 14].[:pick (i) 15 19])];\\\"];:local h [:parse \\\":local i (d);:local p (ip);:local\_n;:while ((i) != 0) do={:local t [:toa \\\\\\\"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F\\\\\\\"];:local f ((i) / 16);:local q ((f) * 16);:local s 0;:if (q != (i)) d={:set s ((i) - q);};:set n ([:pic (t) (s)].(n));:set i (f);};:while ([:len (n)] < 8) do={:set n (\\\\\\\"0\\\\\\\".(n));};:set n ([:pick (p) 0 10].[:pick (n) 0 4].\\\\\\\":\\\\\\\".[:pick (n) 4 8].\\\\\\\"::\\\\\\\");:return (n);\\\"];:local ie [:parse \\\":local i (ip);:local b [:find (i) \\\\\\\"/\\\\\\\"];:local n;:if ([:tostr (b)] = \\\\\\\"\\\\\\\") do={:set b [:len\_(i)];} else={:set n [:pick (i) (b) [:len (i)]];};:set i [:pick (i) 0 (b)];:local c 0;:while ([:tostr [:find (i) \\\\\\\":\\\\\\\"]] != \\\\\\\"\\\\\\\") do={:set i ([:pick (i) 0 [:find (i) \\\\\\\":\\\\\\\"]].\\\\\\\",\\\\\\\".[:pick (i) ([:find (i) \\\\\\\":\\\\\\\"]+1) [:len (i)]]);:set c ((c)+1);};:local v [:find (i) \\\\\\\",,\\\\\\\"];:if ([:tostr (v)] != \\\\\\\"\\\\\\\") do={:local e \\\\\\\",\\\\\\\";:if ([:tostr [:pick (i) ((v)-1)]] = \\\\\\\"\\\\\\\") do={:set e ((e).\\\\\\\"0,\\\\\\\");};:if ([:tostr [:pick (i) ((v)+2)]] = \\\\\\\"\\\\\\\") do={:set e ((e).\\\\\\\"0,\\\\\\\");};:for p\_from=0 to=(7-(c)) do={:set e ((e).\\\\\\\"0,\\\\\\\");};:set i ([:pick (i)\_0 (v)].(e).[:pick (i) ((v)+2) [:len (i)]]);};:set i [:toarray (i)];:local ie;:foreach z in=(i) do={:set z [:tostr (z)];:while ([:len (z)] < 4) do={:set z (\\\\\\\"0\\\\\\\".(z));};:set ie ((ie).(z).\\\\\\\":\\\\\\\");};:set ie\_([:pick (ie) 0 ([:len (ie)]-1)].(n));:return (ie);\\\"];:local z [:parse \\\":local n (c);:while ((n) ~ \\\\\\\"^0\\\\\\\") do={:set n [:pick (n) 1 [:len (n)]];};:return (n);\\\"];:local sc (m);:if ((sc) = \\\"p\\\") do={:set\_sc 0;} else={:set sc 3;};:local pd [:toarray [/system scheduler get [find name=wm-ipv6] comment]];:local in [(ie) ip=[:pick (pd) (sc)]];:local pd1 [:pick (in) 0 4];:local pd2 [:pick (in) 5 9];:local pd0 ([(z) c=(pd1)] . \\\":\\\" . [(z) c=(pd2)]);:local ipv6;:local ll [:toarray \\\"\\\"];:if ((sc) = 0) do={:foreach ii in=[/ppp secret find service=pppoe remote-ipv6-prefix~(\\\"^\\\" . (pd0))] do={:local p [:tostr [/ppp secret get (ii) remote-ipv6-prefix]];:local m [:tonum [:pick (p) ([:find (p) \\\"/\\\"]+1) [:len (p)]]];:if\_((m) > 31 && (m) < 65) do={:local pr [(ie) ip=(p)];:set pr [:pick (pr) 0 20];:local ipp [(n) ip=(pr)];:local bc [(b) bt=(m) bi=64];:local bcp ((ipp)+((bc)-1));:set ll ((ll)+[:toarray (ipp)]+[:toarray (bcp)]);};};} else={:foreach ii in=[/ipv6 pool find dynamic=no prefix~(\\\"^\\\" . (pd0))] do={:local p [:tostr [/ipv6 pool get (ii) prefix]];:local m [:tonum [:pick (p) ([:find (p) \\\"/\\\"]+1) [:len (p)]]];:if ((m) > 31 && (m) < 65) do={:local pr [(ie) ip=(p)];:set pr [:pick (pr) 0 20];:local ipp [(n) ip=(pr)];:local bc [(b) bt=(m) bi=64];:local bcp ((ipp)+((bc)-1));:set ll ((ll)+[:toarray (ipp)]+[:toarray (bcp)]);};};};:local r [(b) bt=[:pick (pd) ((sc)+1)] bi=64];:local e [(b) bt=[:pick (pd) ((sc)+2)] bi=64];:local m 1;:local l [:toarray (m)];:while ((r) != (m)) do={:set m ((m) *2);:set l ([:toarray (m)]+(l));};:local p [:toarray \\\"\\\"];:local i 0;:local nf true;:while ([:len (p)] != ((r)/(e))\_&& (nf)) do={:local c [:pick (l) (i)];:local f 0;:local s [:toarray \\\"\\\"];:while ((f) != (r) && (nf)) do={:if ([:tostr [:find (p) (f)]] = \\\"\\\") do={:set s ((s)+[:toarray (f)]);:local il ([(n) ip=(in)]+(f));:local ip [(h) d=(il) ip=(in)];:if ([:tostr [:find (ll) (il)]] = \\\"\\\") do={:local lb\_true;:local ib ((il)+((e)-1));:local bc [(h) d=(ib) ip=(ip)];:for ii from=0 to=(([:len (ll)]/2)-1) do={:local i1 [:pick (ll) ((ii)*2)];:local i2 [:pick (ll) (((ii)*2)+1)];:if ((i1) < (il) && (il) < (i2) || (il) < (i1) && (i1) < (ib)) do={:set lb false;};};:if (lb) do={:put ((ip).\\\"/\\\".(bc));:if ([:tostr (ip)] != \\\"\\\") do={:set ipv6 ((ip).\\\"/\\\".[:pick (pd) ((sc)+2)]);};:set nf false;};};};:set f ((c)+(f));};:set p ((p)+(s));:set i ((i)+1);};:return (ipv6);\"];:foreach i in=[/ppp secret find service=pppoe remote-ipv6-prefix=[:toid \"\"]] do={:local pp [(pd) m=p];/ppp secret set (i) remote-ipv6-prefix=(pp);:local dd [(pd) m=d];:local u [/ppp secret get (i) name];:local n [:tostr [:toip6 [:pick (dd) 0 [:find (dd) \"/\"]]]];:local l [:pick (dd) ([:find (dd) \"/\"]+1) [:len (dd)]];:local nl ((n).\"/\".(l));:local c (\"\");:local in pppoe;:if ([:tostr [/interface pppoe-server\_server find]] != \"\") do={:set in [:tostr [/interface pppoe-server server\_get [:pick [find] 0] service-name]];};/interface pppoe-server remove [find\_name=(c) || user=(u) && service=(in)];\t/interface pppoe-server add name=(c) user=(u) service=(in);/ipv6 dhcp-server binding remove [find address=(nl)\_|| server=(c)];:if ([:tostr [/ipv6 pool find name=(c)]] = \"\") do={/ipv6 pool add name=(c) prefix=(nl) prefix-length=(l);};/ipv6 dhcp-server remove [find name=(c) || interface=(c)];/ipv6 dhcp-server add name=(c) interface=(c)\_address-pool=(c) lease-time=1d;};};";/system scheduler remove [find name="wm-ipv6"];/system scheduler add comment=2001:0db8::,48,64,2001:db9::,48,60 interval=5s start-time=startup name=wm-ipv6 on-event=wm-ipv6;