package Ġnl . j ste ge . ad vent of code . a oc 2 0 1 6 . days Ċ Ċ import Ġnl . j ste ge . ad vent of code . a oc common . days . Day Ċ import Ġnl . j ste ge . ad vent of code . a oc common . utils . extensions . sum By Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠJ elle ĠSte ge Ċ Ġ*/ Ċ class ĠDay 2 0 Ġ: ĠDay ( title Ġ= Ġ" Firewall ĠRules ") Ġ{ ĊĠĠĠ Ġprivate Ġcompanion Ġobject ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ ADDRESS Ġ= Ġ( 1 L Ġshl ĠInteger . SIZE ) Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfirst ( input : ĠSequence < String >): ĠAny Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġ. map ( Day 2 0 :: Ip Range ). optimize (). first ĊĠĠĠĠĠĠĠ Ġ. first (). end Ġ+ Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun Ġsecond ( input : ĠSequence < String >): ĠAny Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġ. map ( Day 2 0 :: Ip Range ). optimize (). second ĊĠĠĠĠĠĠĠ Ġ. sum By Ġ{ Ġit . end Ġ+ Ġ 1 Ġ- Ġit . start Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSequence < Ip Range >. optimize (): ĠPair < List < Ip Range >, ĠList < Ip Range >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblocked Ranges Ġ= Ġmutable ListOf < Ip Range >() ĊĠĠĠĠĠĠĠ Ġval Ġallowed Ranges Ġ= Ġmutable ListOf < Ip Range >() ĊĠĠĠĠĠĠĠ Ġval Ġtracked High Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . start Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( Pair ( 0 L , Ġ 0 L )) Ġ{ Ġ( tracked High , Ġtracked Low ), Ġ( start , Ġend ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ> Ġtracked High Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocked Ranges Ġ+= ĠIp Range ( tracked Low , Ġtracked High ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Ranges Ġ+= ĠIp Range ( tracked High Ġ+ Ġ 1 , Ġstart Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( end , Ġstart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Math . max ( tracked High , Ġend ), Ġtracked Low ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. first ĊĠĠĠĠĠĠĠ Ġif Ġ( tracked High Ġ< ĠMAX _ ADDRESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Ranges Ġ+= ĠIp Range ( tracked High Ġ+ Ġ 1 , ĠMAX _ ADDRESS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( blocked Ranges , Ġallowed Ranges ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠIp Range ( val Ġstart : ĠLong , Ġval Ġend : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( i : ĠList < Long >) Ġ: Ġthis ( i [ 0 ], Ġi [ 1 ]) ĊĠĠĠĠĠĠĠ Ġconstructor ( s : ĠString ) Ġ: Ġthis ( s . split ('- '). map ( String :: to Long ). sorted ()) ĊĠĠĠ Ġ} Ċ } Ċ