diff --git a/Build-Instructions/Build-Manual-0.md b/Build-Instructions/Build-Manual-0.md index ef5c2af..d8f5ad4 100644 --- a/Build-Instructions/Build-Manual-0.md +++ b/Build-Instructions/Build-Manual-0.md @@ -32,7 +32,7 @@ | Privacy film | 25x25 cm at least | https://www.aliexpress.com/item/32967449727.html | | Copper tape | 1 | https://www.aliexpress.com/item/1005002822966859.html | | Plexiglass 20x20cm (recommend buying spare) | 1 + 1 spare | https://www.aliexpress.com/item/32833660352.html | -| Servo 9g | 1 | https://www.amazon.ca/-/fr/Servo-num%C3%A9rique-Micro-Metal-mod%C3%A8le/dp/B07FPJYM5T | I tried cheap one but they proved to be problematic, one died suddently and the other draw too much current sometime. You may have to invest in something better. +| Servo 9g | 1 | https://www.amazon.ca/-/fr/Servo-num%C3%A9rique-Micro-Metal-mod%C3%A8le/dp/B07FPJYM5T | We tried cheap one but they proved to be problematic, one died suddently and the other draw too much current sometime. You may have to invest in something better. | M2 screws kit | 1 | https://www.amazon.ca/-/fr/Hilitchi-Assortiment-hexagonale-acier-inoxydable/dp/B014ONS02S | You needs several lengths | M3 screws kit | 1 | https://www.amazon.ca/Assortiment-cruciformes-cylindrique-acier-inoxydable/dp/B075RCVVYN/ | You needs several lengths @@ -44,7 +44,7 @@ ## Recommendations -Parts are printed are very high resolution (by FDM standard) and last for several days in some case, it's very important to have a good way to ensure it stick in place. +Parts are printed at very high resolution (by FDM standard) and printing require for several days in some case. It's very important to have a good way to ensure it sticks in place. | Description | Quantity | URL |---|---|---| @@ -64,12 +64,12 @@ Parts are printed are very high resolution (by FDM standard) and last for severa ## Required plastics -Basically color is up to you, but you will probably needs at least 3 colors. -Nothing prevent you from painting parts if you can't find the right plastic color. If you do I suggest using dark PLA before painting for the ring, to be sure it doesn't have light leaking. +Basically color is up to you, but you will probably needs at least 3 colors.
+Nothing prevent you from painting parts if you can't find the right plastic color. If you do it, we suggest using dark PLA before painting over the ring, to be sure lights do not leak. | Color | Used for | Comments |---|---|---| -| Dark gray or black PLA | Ring | The ring in the serie is almost black if not black. The one I made was gray but not dark enough, if I could do it again I would likely make it black | -| Transparent PLA | Ring | Used for chevron illumination and light diffusion. It may be possible to use white instead but I suggest you to test it before commiting yourself. -| White PLA | Ring/Base | Used for reflector but can be used for any parts that is not visible. (example, bearing module, inner ring, alignment block etc ...) -| Sand PLA | Base | Sand like color, yes I realise there are many possible color for sand so let's say the same color as egypt pyramid? +| Dark gray or black PLA | Ring | The ring in the serie is almost black if not black. The one we made was gray but not dark enough, if we could do it again we would likely make it black | +| Transparent PLA | Ring | Used for chevron illumination and light diffusion. It may be possible to use white instead but we suggest you to test it before commiting yourself. +| White PLA | Ring/Base | Used for reflectors but can be used for any parts that is not visible. (example, bearing module, inner ring, alignment block etc ...) +| Sand PLA | Base | Sand like color, yes we realise there are many possible color for sand so let's say the same color as pyramid of egypt? diff --git a/Build-Instructions/Build-Manual-1.md b/Build-Instructions/Build-Manual-1.md index df2e857..4e3e98d 100644 --- a/Build-Instructions/Build-Manual-1.md +++ b/Build-Instructions/Build-Manual-1.md @@ -2,7 +2,7 @@ ## Before printing -We provide "TestPart-Stargate-Front.stl" part to test printing 1/9 of the front stargate part. +We provide "TestPart-Stargate-Front.stl" part to test printing 1/9 of the front stargate part.
It allows you to test material or print settings before doing the big part. We recommend you to print these parts using the color or plastic of your choice : @@ -12,9 +12,9 @@ We recommend you to print these parts using the color or plastic of your choice - symbol-light-guide_0.2mm-x36.stl - symbol-template1_0.2mm-x1.stl -It is better if you also have one WS2812B to test the chevron and symbol lightning. -The LED shouldn't be at full power to test symbols, only 10/255 PWM is enough to see it clearly. -It could be higher for chevron but your don't gain anything going further than 220/255 except excessive power loss. +It is better if you also have one WS2812B to test the chevron and symbol lightning.
+The LED shouldn't be at full power to test symbols, only 5/255 PWM is enough to see it clearly.
+It could be higher for chevron but your don't gain anything going beyond 160/255 except excessive power loss.
If you want to use a resin printer for symbols you can, but you will likely have to paint them because resin transparency is not adequate in our experience. diff --git a/Build-Instructions/Build-Manual-Base-1.md b/Build-Instructions/Build-Manual-Base-1.md index 66791f9..35d4ee3 100644 --- a/Build-Instructions/Build-Manual-Base-1.md +++ b/Build-Instructions/Build-Manual-Base-1.md @@ -1,16 +1,16 @@ # Base assembly -Don't worry about the ringmotor assembly, it could be inserted later. -It is designed to be easily dismantlable. +Don't worry about the ringmotor assembly, it could be inserted later.
+It is designed to be easy to disassemble. - - You need a lot of small clamp if you want to do a decent job. I have found them at dollar store and they worth every penny. + - You need a lot of small clamp if you want to do a decent job. we have found them at dollar store and they worth every penny. - Gorilla glue or canopy glue ![](./Assets/Outer-assembly-part-clamp-example.png) ## Glue base parts #1 -Glue all those parts together, use the picture to guide you. +Glue all those parts together, use the picture to guide you.
You needs those part to continue: - Outer-bottom-plate_4mm-x1.stl @@ -31,7 +31,7 @@ Glue Outer-back-plate_4mm-x1.stl to the existing base part #1. You needs to ensure "Bottom-plate-v2_4mm-x1.stl" is in place, IT SHOULDN'T BE GLUED! The part is designed to be removable. It's only there to use as a guide when "Mechanic-Anchor-L_4mm-x1.stl" and "Mechanic-Anchor-R_4mm-x1.stl" get glued. -Ensure to not accidentally glue anything else, don't put too much glue. +Ensure to not accidentally glue anything else, don't put too much glue.
Use clamps to hold these parts in place. To be glued to "Outer-bottom-plate_4mm-x1.stl" @@ -52,14 +52,14 @@ It should looks like this once once you remove "Mechanic-Archor-p2-L_4mm-x1.stl" ## Install M2 screws -You needs two M2 nuts and a soldering iron or a ligher. -You need to push heated M2 nuts into designated holes. Be careful to now overheat. +You need two M2 nuts and a soldering iron or a ligher.
+You need to push heated M2 nuts into their designated holes. Be careful to not overheat. ![](./Assets/Outer-assembly-part6.png) ## Glue base parts #4 -Glue side covers, you needs to use clamp and maybe tape. Use painter tape where clamps are not a good option. +Glue side covers, you needs to use clamp and maybe tape. You can use painter tape where clamps are not a good option. - Side-back-cover-L_4mm-x1.stl - Side-back-cover-R_4mm-x1.stl @@ -68,15 +68,15 @@ Glue side covers, you needs to use clamp and maybe tape. Use painter tape where ![](./Assets/Outer-assembly-part5.png) -Overcovers are not mandatory, they correct a mistake I made on the side cover STL. -I could have corrected it but I feared I would introduce more errors. +Overcovers are not mandatory, they correct a mistake we made on the side cover STL.
+we could have corrected it but we feared it could introduce more errors. ![](./Assets/install-overcovers-x2.png) ## Install RingMotor assembly in place -You can install the ring motor assembly if you want. -All you have to do is insert the assembly where it should go then slide these parts: +You can install the ring motor assembly if you want.
+All you have to do is insert the assembly where it should go then slide these parts:
- Mechanic-Archor-p2-L_4mm-x1.stl - Mechanic-Archor-p2-R_4mm-x1.stl @@ -87,9 +87,9 @@ You can use an M3x25 screws to secure it in place but friction should be enough. ![](./Assets/base-with-ring-install1.png) -## Install the reinforcement. +## Install the reinforcement -You can install "Outer-back-plate-reinforcement_4mm-x1.stl" using two M2x12 screws (not exactly sure about the length). +You can install "Outer-back-plate-reinforcement_4mm-x1.stl" using two M2x12 screws (not exactly sure about the length).
The base is designed to allow the mecanism to be removed freely. ![](./Assets/Outer-back-plate-reinforcement-1.png) @@ -98,9 +98,9 @@ The base is designed to allow the mecanism to be removed freely. ## Install back-cover (Outer-back-cover_4mm-x1.stl) -This part is designed to accommodate pretty much any barel jack or connector. -But you have to design it yourself, use "Outer-back-cover-plug_4mm-x1.stl" as a template. -You can glue it to "Outer-back-cover_4mm-x1.stl" using gorilla glue. -The back cover is designed to hold using M2x15 screws. It is screwed into plastic because it doesn't needs real structural integrity. +This part is designed to accommodate pretty much any barel jack or connector.
+But you have to design it yourself, use "Outer-back-cover-plug_4mm-x1.stl" as a template.
+You can glue it to "Outer-back-cover_4mm-x1.stl" using gorilla glue.
+The back cover is designed to hold in place using M2x15 screws. It is screwed into plastic because it doesn't needs real structural integrity. -![](./Assets/Outer-back-cover_4mm-x1-install1.png) \ No newline at end of file +![](./Assets/Outer-back-cover_4mm-x1-install1.png) diff --git a/Build-Instructions/Build-Manual-Base-2.md b/Build-Instructions/Build-Manual-Base-2.md index 87ea26e..0220112 100644 --- a/Build-Instructions/Build-Manual-Base-2.md +++ b/Build-Instructions/Build-Manual-Base-2.md @@ -4,7 +4,7 @@ "ramp-light-guide_4mm-x2.stl" are meant to be printed using transparent PLA. -Insert "ramp-light-guide_4mm-x2.stl" into their locations on "Ramp_4mm-x1.stl", use canopy glue because gorilla glue may have white residues. +Insert "ramp-light-guide_4mm-x2.stl" into their locations on "Ramp_4mm-x1.stl", use canopy glue because gorilla glue may have white residues.
The ramp is designed to be removed easily at will. You can add magnets into it if you want, there are holes for it but it's not necessary. ![](./Assets/ramp-light-guide_4mm-install.png) @@ -28,7 +28,7 @@ If they hold by themselves just by friction then don't glue them, it's covenient - You need to cut a 12 white led strip into two 18 cm strips. - Wire them in parallel and add a connector to it. -- Glue led strip under "ramp-light-guide_4mm-x2.stl", use clamp to hold them in place during curing +- Glue led strip under "ramp-light-guide_4mm-x2.stl", use clamp to hold them in place during the the curing process. - Add electrical black tape to prevent light from leaking elsewhere ![](./Assets/ramp-light-install.png) \ No newline at end of file diff --git a/Build-Instructions/Build-Manual-Base-3.md b/Build-Instructions/Build-Manual-Base-3.md index ac92abb..fe300d2 100644 --- a/Build-Instructions/Build-Manual-Base-3.md +++ b/Build-Instructions/Build-Manual-Base-3.md @@ -1,15 +1,27 @@ # Base electronic -You can use almost any ESP32 breakout variant, we tried node MCU but it proven to be not reliable, but it could have been caused by a bad quality one of. -We used the Lolin32 then. +We use the Lolin32. Former attempt using NodeMCU didn't go well. Likely a bad copy. - - You can use JST connector anything else as long as it suit your needs. You can also just solder everything to the board but it's not recommended. + - You can use JST connector or anything else as long as it suit your needs. You can also just solder everything to the board but it's not recommended. Knowns issues: + - We used 1A 12v to 5v regulator from dollar store, it proved to be unsufficient in some situation like when the servo motor move or the board starts. So 3A or more should be better. ![](./Assets/Schematic_SGU-Base.png) +# WS2812B + +Based on empirical measurements, there is the average power consumption for WS2812B.
+It needs ~1 mA at 0 PWM. + +| Channel | Power usage at 255 (mA) | +|-------------|----------| +| RED | 13.14084507 | +| GREEN | 13.01408451 | +| BLUE | 13.16901408 | +| RGB (White) | 35.38 | + ## Stepper Driver (DRV8825) We use a DRV8825 but you can use anything else. diff --git a/Build-Instructions/Build-Manual-Fails-1.md b/Build-Instructions/Build-Manual-Fails-1.md index eae937f..b8aceca 100644 --- a/Build-Instructions/Build-Manual-Fails-1.md +++ b/Build-Instructions/Build-Manual-Fails-1.md @@ -1,12 +1,12 @@ # Failed prototypes -Many attempt were made before making a functional version. There is a small list of failed prototypes in case you are curious. +Many attempts were made before making a functional version. There is a small list of failed prototypes in case you are curious. ## Slip ring attempt -The first attempt used an home made slip ring with 3 tracks, one for GROUND, one for POSITIVE, one for SIGNAL. -It used cooper tape for conductive track, the middle track is also used to guide bearings. -It didn't work because it created too much friction, I tried make my own brushes by cutting graphite but it was a fail. Also conductive glue is surprizingly hard to find or ridiculously expensive so my attempt to make my own conductive glue as also a failure. +The first attempt used an home made slip ring with 3 tracks, one for GROUND, one for POSITIVE, one for SIGNAL.
+It used cooper tape for conductive track, the middle track is also used to guide bearings.
+It didn't work because it created too much friction, I tried make my own brushes by cutting graphite but it was a fail. Also conductive glue is
surprizingly hard to find or ridiculously expensive so my attempt to make my own conductive glue as also a failure.
![](./Assets/failed-proto-slipring1.png) @@ -20,7 +20,7 @@ We successfully lighted up a LED for a few minute then it stopped and never work ## Friction wheel -Because I couldn't resolve myself to deface the back of the gate by putting a visible gear there I tried using different friction material with a wheel. +Because I couldn't resolve myself to deface the back of the gate by putting a visible gear there I tried using different friction materials with a wheel. Using TPU: @@ -38,14 +38,14 @@ This one is an epic fail, it could barely hold itself and was ridiculously shack ## Use a DC motor -The motor had backlash and not enough mechanical stiffness. Also the encoder didn't have required resolution. +The motor had backlash and not enough mechanical stiffness. Also the encoder didn't have a good resolution.
Stepper with 1/16 steps does a better job. ![](./Assets/failed-dc-motor-1.jpg) ## Plunger inside the gate -I wasn't willing to have visible power contact on the backside so I wanted to be able to power recharge using an hidden plunger that connect to the electrical contact hidden inside the ring. +I wasn't willing to have visible power contact on the backside so I wanted to be able to power recharge using an hidden plunger that connect to the electrical contact hidden inside the ring. In the end I betrayed my conviction after it proved too difficult. @@ -58,4 +58,4 @@ Still it got replaced by a Lolin32. ## Servo-Motor -I used cheap servo motor for the mecanism but it burned out after a few use. It got replaced by another cheap of the same kind because I didn't have anything else. \ No newline at end of file +I used cheap servo motor for the mecanism but it burned out after a few use. It got replaced by another cheap of the same kind because I didn't have anything else. Months later it still hold. diff --git a/Build-Instructions/Build-Manual-Ring-1.md b/Build-Instructions/Build-Manual-Ring-1.md index 5cc2c54..0f94733 100644 --- a/Build-Instructions/Build-Manual-Ring-1.md +++ b/Build-Instructions/Build-Manual-Ring-1.md @@ -10,7 +10,7 @@ ![](./Assets/Stargate-Back.png) -- Print "Light-chevron-0.2mm_x18" 18 times using 0.2 mm nozzle +- Print "Light-chevron-0.2mm_x18" 18 times using 0.2 mm nozzle ![](./Assets/Light-chevron-0.2mm_x18.png) @@ -66,19 +66,24 @@ You can use a resin printer to print them and get better resolution, but resin i ## Assemble alignment block and chevrons light diffuser -Use this picture as reference: +Use this picture as reference: ![](./Assets/stargate-front-inserts.png) # Lightning diffuser for chevrons -- Insert "Light-Chevron" into place on "Stargate-Front" and "Stargate-Back". You may need a hammer and a big metal part to force it. Be gentle to now destroy the parts. You can print "Chevron-insert-tool.stl" too to help. + +- Insert "Light-Chevron" into place on "Stargate-Front" and "Stargate-Back".
+You may need a hammer and a big metal part to force it.
+Be gentle to not destroy the parts. You can print "Chevron-insert-tool.stl" too to help. # Alignment blocks -- Insert "Alignment-block" into place on the "Stargate-Front" part. + +- Insert "Alignment-block" into place on the "Stargate-Front" part. Ensure the holes are clear and everything fit. Then glue them in place, pour gorilla glue into the hole then install the alignment blocks. - Use a sharpie and mark a chevron as being the "master chevron" on both side. Doesn't matter which one it is but it should have a master chevron. It's labelled M.C on the picture above, use the same pattern. # Test + - Try to assemble "Stargate-Front" and "Stargate-Back" together to ensure alignment block are meshing together. ![](./Assets/stargate-front-back-assemble.png) @@ -86,9 +91,9 @@ Ensure the holes are clear and everything fit. Then glue them in place, pour gor # Assemble bearing modules - Ordered bearing comes with not so great grease, put some WD40 or Jig-A-Loo into bearings. Be careful, Jig-A-Loo attack PLA a little bit, if you clean the part with a towel the color of the PLA stain the paper so ... -- Modules are made of two part meant to mesh together and hold the bearing in sandwitch. +- Modules are made of two parts meant to mesh together and hold the bearing in sandwitch. The part is printed 18 times so you will have 9 modules. -So the tolerance are very tight, you will have to use a lot of force to insert the bearing. If it's not hard to insert then something is wrong and you may need to change the design of the part or trying print it with lower resolution. We suggest you to use a wrench or c-clamp to force two part together. +Tolerances are very tight, you will have to use a lot of force to insert the bearing. If it's not hard to insert then something is wrong and you may need to change the design of the part or trying print it with lower resolution. We suggest you to use a wrench or c-clamp to force two part together. - Use gorilla glue to glue both part together and use clamp to hold parts ![](./Assets/Module-With_wheel-0.2mm_x18-2.png) @@ -104,7 +109,7 @@ So the tolerance are very tight, you will have to use a lot of force to insert t # Assemble symbols -Tolerance are so tight that you will need a hammer to insert symbols in place and you need to put something behind the gate to avoid destroying it. +Tolerances are so tight that you will need a hammer to insert symbols in place and you need to put something behind the gate to avoid destroying it. You don't need glue. It may be possible you need to sand a bit to insert symbols. - Put each "symbol-light-guide_0.2mm-x36" (36 of them) into symbol holes. You can try lighting up a LED behind to ensure they diffuse light correctly. @@ -131,7 +136,7 @@ The master chevron LED data input should be where the microcontroller will be co ![](./Assets/Light-chevron-cover.png) -- Add tape over symbol LEDs to project from accidental short circuit. +- Add tape over symbols LEDs to project from accidental short circuit. - Add a 3 pins connector on the master chevron LED. Servo motor connector or JST can do the job. One ground, one positive and the WS2812B led data input. ![](./Assets/light-tape-chevron.png) @@ -153,7 +158,7 @@ You needs those parts: ### Power collector -- Use two "Stargate-Back-TransWindow-0.2mm-x10-12", wrap them using cooper tape. +- Use two "Stargate-Back-TransWindow-0.2mm-x10-12", wrap them using cooper tape. ** Warning: ** The back of the cooper tape is not conductor at all, ensure both side are covered by the same piece. - Glue them in place using gorilla glue - Use a sharpy to mark the positive and the negative inside the ring. @@ -178,8 +183,8 @@ Hall sensor are sensitive to polarity, so you need to test it before attempting # Magnetic ring Odd position magnets should not have the same polarity as even magnets. -**WARNING** Recomment to install the magnet ring into the "stargate-front" part and glue it in place before installing magnets. -Don't glue it too hard, just tacking is good enough as long as magnet don't move outside. +**WARNING** We recommend to install the magnet ring into the "stargate-front" part and glue it in place before installing magnets. +Don't glue it too hard, just tacking is good enough as long as the magnets cannot move outside. - Use the stack of magnets and put them in place starting from the top most magnets, skip one position every time. - Flip the stack of magnets and put reverted polarity magnet into remaining holes. diff --git a/Build-Instructions/Build-Manual-Ring-2.md b/Build-Instructions/Build-Manual-Ring-2.md index 08bd774..c8fbcd3 100644 --- a/Build-Instructions/Build-Manual-Ring-2.md +++ b/Build-Instructions/Build-Manual-Ring-2.md @@ -10,28 +10,30 @@ ![](./Assets/battery-installation.png) -- Assemble electronic according to this picture: (You are under no obligatoire to position parts this way, but ensure to balance weight as much as possible) +- Assemble the electronic according to this picture: (You have no obligation to position the parts this way, but ensure to balance weight as much as possible) ** Warning: ** Unfortunately there are not a lot of picture of this part. Earlier you installed a connector for WS2812B leds, you will have to soldier the other half of the connector according to the plan. ![](./Assets/interior-electronic.png) ![](./Assets/Schematic_SGU-Ring.png) +## Prime the gate + +To start, the gate ring to receive power from power collector (DON'T REVERSE POLARITY!) at least to start, then the ESP32 can hold it's own power using the MOSFET. But if you power it using the programmer it will stay powered. + ## Program the M5Stamp Pico ***Warning:*** This chapter won't explain how to program an ESP32, there are plenty of existing tutorial to explain it. -To start, the gate needs to receive power from power collector (DON'T REVERSE POLARITY!) at least to start, then the ESP32 can hold it's own power using the MOSFET. But if you power it using the programmer it will stay powered. +You need to use the ESP-IDF 5.1 toolkit to compile and program the 'ring-factory' software into the M5Stamp. The software allows to upload the real firmware over the air without using any electronical connection. + +It wouldn't be very practical if it was required to dissamble the ring everytime a firmware upgrade is necessary. + +The bootloader of the factory app is programmed to automatically erase the last firmware if you hold the button for 5s after startup. +You can disconnect the battery using the toggle switch, hold the button, then prime the gate. - You need to connect the M5Stamp pico programmer to the M5Stamp pico. - Flash "ring-factory" app into it. - Prime the ring or let it connected to the programmer, chevron should blink with a nice pattern. - Connect to "SGU-Ring-Fact-XXXXXX" Wi-Fi access point without password. -- To flash with the new firmware, you should send the firmware "ring-fw.bin" to 192.168.66.1:8888 using any program that will just send the content of the bin using TCP socket. - - Example: using netcat: nc 192.168.66.1 8888 < ring-fw.bin - **Note:** Yes it sucks, but hopefully there will be a new version that support using an HTTP browser for update. I should also create 2 OTA partitions and use the factory-app only as an emergency measure. - -## Program again - -The bootloader of the factory app is programmed to automatically erase the last firmware if you hold the button for 5s after startup. -You can disconnect the battery using the toggle switch, hold the button, then prime the gate. \ No newline at end of file +- To flash it with the real firmware (ring-fw), use a browser and reach this address : http://192.168.66.1 . A webpage allows you to upload a new binary directly without hassle. diff --git a/Build-Instructions/Build-Manual-Ring-3.md b/Build-Instructions/Build-Manual-Ring-3.md index 2eec98d..31eb6a8 100644 --- a/Build-Instructions/Build-Manual-Ring-3.md +++ b/Build-Instructions/Build-Manual-Ring-3.md @@ -7,21 +7,21 @@ the slighest flaw will make it works badly. ![](./Assets/Inner-ring.png) -## Glue the cradle +## Glue the bridge - You will need gorilla glue, clamp and 10 mm M3 screw. M3 screw are only used for alignment, glue is what matter to hold parts together. ![](./Assets/Lower-bridge.png) -- It will looks like this once glued: +- It will look like this once glued: ![](./Assets/inner-ring+lowerbridge.png) -- Once the glue is set, you can remove M3 screw and fill the hole with more glue. +- Once the glue is set, you can remove M3 screw and fill the hole with more glue. ## Install the inner ring into the ring -- Install the inner ring into the center, ensure it's in the ring direction relative to the outer ring. +- Install the inner ring into the center, ensure it's in the right ring direction relative to the outer ring. - Install bearing modules in place - Number bearing module with sharpie starting from the master chevron as #1, go counter-clockwise. Mark again the master chevron anywhere it could help. @@ -48,7 +48,7 @@ It should looks like this: ## Install screws -This step is necessary to ensure the gate spin correctly before going further. +This step is necessary to ensure the gate spin correctly before going further. You will need to screw both halves in place using M2x15 screws (shorter can do it too). There are 9 screws that fit in the back of the gate. @@ -60,4 +60,4 @@ There are 9 screws that fit in the back of the gate. Try to make it spins freely, if required sand again the inner-ring or the edge of the outer-ring. If everything is fine, continue to next step but you will need to remove screw later. -![](./Assets/assembled-ring.png) \ No newline at end of file +![](./Assets/assembled-ring.png) diff --git a/Build-Instructions/Build-Manual-RingMotor-1.md b/Build-Instructions/Build-Manual-RingMotor-1.md index d55f5f6..eb8d091 100644 --- a/Build-Instructions/Build-Manual-RingMotor-1.md +++ b/Build-Instructions/Build-Manual-RingMotor-1.md @@ -12,7 +12,7 @@ Use Gorilla Glue, it's a structural part. ## Install the ring to the base -Use nuts to install the ring to the base. It allow to easily remove the ring later if necessary. +Use nuts to install the ring to the base. It allows to easily remove the ring later if necessary. ### Required parts @@ -29,14 +29,14 @@ Use nuts to install the ring to the base. It allow to easily remove the ring lat ## Install hidden nuts This part is tricky because it may be required to use a lighter to insert M3 nuts into place. -If M3 nuts fit you can just fit them with force, but if it doesn't you can use the longest possible M3 screw you can find, install the M3 nuts to it, then use a lighter to heat the nut then push very hard on the plastic part to force it to enter. It will make the nuts fit perfectly and stay in place without using glue. +If M3 nuts fit you can just fit them with force, but if it doesn't you can use the longest possible M3 screw you can find, install the M3 nuts to it, then use a lighter to heat the nut then push very hard on the plastic part to force it to enter. It will make the nuts fit perfectly and stay in place without using glue.
You can also use a soldering iron to push on the nut but you need to be careful to not overheat. ![](./Assets/stepper-mount-1-bottom-view.png) ## Glue to the bottom plate -Using Gorilla Glue, glue "Stepper-mount-1_4mm-x1.stl" to the "Bottom-plate-v2_4mm-x1.stl". +Using Gorilla Glue, glue "Stepper-mount-1_4mm-x1.stl" to the "Bottom-plate-v2_4mm-x1.stl".
Use clamp to hold the part in place and ensure glue won't go into the nuts. ![](./Assets/base-stepper-mount-1.png) @@ -47,7 +47,7 @@ Use clamp to hold the part in place and ensure glue won't go into the nuts. ## Install "Stepper-bracket_4mm-x1.stl" on NEMA14 stepper -Use 4x M3x10 screws to install the stepper bracket on the stepper. +Use 4x M3x10 screws to install the stepper bracket on the stepper. ![](./Assets/Stepper-bracket.png) @@ -55,7 +55,7 @@ Use 4x M3x10 screws to install the stepper bracket on the stepper. ## Install "Stepper-mount-1_4mm-x1.stl" to "Stepper-mount-2_4mm-x1.stl" -Use 4x M2x15 screw and 4x M2 nuts to install to hold both parts together. +Use 4x M2x15 screw and 4x M2 nuts to install to hold both parts together.
This part allows to adjust the bracket by loosing nuts. ![](./Assets/Stepper-mount-2_on_Stepper-mount-1.png) @@ -64,14 +64,14 @@ This part allows to adjust the bracket by loosing nuts. ## Prepare the magnetic gear -Use 4x2 mm magnet, push them into place using a screwdriver. Magnet should stay there by themselves, there is a small nudge to hold them. +Use 4x2 mm magnet, push them into place using a screwdriver. Magnet should stay there by themselves, there is a small nudge to hold them.
Odd position magnet and even position magnet shall have different polarity or it's not going to work. If you make a mistake there are hole behind the gear to push magnet out. If magnet have difficulty to hold in place you can drip some canopy glue or hot glue into the holes. ![](./Assets/magnet-gear-on-shaft.png) ## Install the magnetic gear on the stepper -You may need to hammer the back of the shaft of the stepper until the gear press-fit into place. You may have to reajust later if it's not correct but the stepper can easily be removed to work on it. +You may need to hammer the back of the shaft of the stepper until the gear press-fit into place. You may have to reajust later if it's not correct but the stepper can easily be removed to work on it.
***WARNING:*** Hit the shaft, not the back of the stepper or you risk damaging to the stepper. ![](./Assets/stepper-hit-place.png) diff --git a/Build-Instructions/Build-Manual-RingMotor-2.md b/Build-Instructions/Build-Manual-RingMotor-2.md index 238e4aa..ca16b2e 100644 --- a/Build-Instructions/Build-Manual-RingMotor-2.md +++ b/Build-Instructions/Build-Manual-RingMotor-2.md @@ -20,7 +20,7 @@ Glue "Back-plunger-bar_4mm-x1.stl" and "Back-plunger-Higher-spring_4mm-x1.stl" t ## Assemble "Back-plunger-arm_4mm-x1.stl" -- You needs to wrap each contactor with cooper tape. +- You needs to wrap each contactor with cooper tape. - The left side (relative to the view on the picture) should be soldered to the ground, on a black wire if possible. The wire should be flexible, sillicon is the best. - The right side should be soldered to positive (+5v). The wire should be flexible, sillicon is the best. @@ -32,7 +32,7 @@ Glue "Back-plunger-Higher-spring_4mm-x1.stl" to "Back-plunger-arm_4mm-x1.stl" us ![](./Assets/Back-plunger-arm-highspring-part.png) -Install a 4 mm by 30 mm spring, I used one coming from a pen. If it's too long you can cut it. +Install a 4 mm by 30 mm spring, we used one coming from a pen. If it's too long you can cut it. ## Install the arm diff --git a/Build-Instructions/Build-Manual-Software-1.md b/Build-Instructions/Build-Manual-Software-1.md index 9172d03..89a8ae2 100644 --- a/Build-Instructions/Build-Manual-Software-1.md +++ b/Build-Instructions/Build-Manual-Software-1.md @@ -10,7 +10,7 @@ ## About-OTA -Give system informations and allow to upload over-the-air (OTA) update +Give system informations and it allows to upload over-the-air (OTA) update ## Settings @@ -23,7 +23,7 @@ DF Robot Mini Pro (DF1201S). It has it's own USB drive so you can plug it to a c ![](./Assets/DF1201S.png) -The only way I found to play a specific file (the provided command for playing by name doesn't work) is +The only way we have found to play a specific file (the provided command for playing by name doesn't work) is to use the file number. It is defined by copy order on the USB drive. To add sound FX to the mp3 player: @@ -34,7 +34,7 @@ To add sound FX to the mp3 player: ![](./Assets/edit-copy-mp3.png) - Execute it. -- Ensure all file were copied on the USB drive. If you screw the order you can format it and do the procedure again. +- Ensure all files were copied on the USB drive. If you screw the order you can format it and do the procedure again. ![](./Assets/file-explorer-mp3.png) diff --git a/Build-Instructions/Build-Manual-Wormhole-1.md b/Build-Instructions/Build-Manual-Wormhole-1.md index 9855918..0444071 100644 --- a/Build-Instructions/Build-Manual-Wormhole-1.md +++ b/Build-Instructions/Build-Manual-Wormhole-1.md @@ -2,7 +2,7 @@ ## Cut the plexiglass -You need a 2 mm sheet of plexiglass. Be carefull with compass, it could leave horrible trace. +You need a 2 mm sheet of plexiglass. Be carefull with compass, it could leave horrible traces. You need to cut circle of 161.5 mm into a plexiglass sheet. You will need to cut the lower part at the right height using a dremel or use "Plexgliass-Template-Dummy.stl" as template for laser cut. @@ -14,7 +14,7 @@ You will need to cut the lower part at the right height using a dremel or use "P Remove the plastic protection on the mirror film, it could be a nightmare to find but it's there. You cannot apply it directly to the plexiglass, it won't work it will just create something horrible full of bubble and ruin your nice work. You can check on youtube there are several tutorial about how to apply it but basically you need: -- Cut the film, it should be 1 inch bigger on every side. Ensure you get a nice spot, sometime the film could be slighly damaged. Inspect just to be sure. +- Cut the film, it should be 1 inch bigger on every side. Ensure you get a nice spot, sometime the film could be slighly damaged. Inspect just to be sure. - Apply water mixed with soap using a spray bottle over the plexiglass - Remove the protection film from the mirror film - Stick the mirror film over the plexiglass, use a ruler to push water bubble ouside @@ -57,7 +57,7 @@ Example of ruined filter: ## Glue "Wormhole-outer-rim.stl" Glue it using gorilla glue on the outside part of the "Wormhole-outer-rim.stl". -Use clamp to be sure it hold in place until glue is completely cured. +Use clamp to be sure it hold in place until glue is completely cured. ![](./Assets/install-wormhole-outer-rim.png) diff --git a/Build-Instructions/Extra-Settings.md b/Build-Instructions/Extra-Settings.md deleted file mode 100644 index d33b0b2..0000000 --- a/Build-Instructions/Extra-Settings.md +++ /dev/null @@ -1,21 +0,0 @@ -# Settings - -| Key | Value | Min | Max | Type | Description | -|-------------------|-------|------------|------------|--------|------------------------------------------------------| -| Clamp.LockedPWM | 1250 | 1000 | 2000 | int32 | Servo motor locked PWM | -| Clamp.ReleasPWM | 1050 | 1000 | 2000 | int32 | Servo motor released PWM | -| Ring.HomeOffset | -50 | -500 | 500 | int32 | Offset relative to home sensor | -| Ring.SymBright | 15 | 3 | 50 | int32 | Symbol brightness | -| StepPerRot | 14667 | 0 | 64000 | int32 | How many step per rotation | -| TimePerRot | 8537 | 0 | 120000 | int32 | Time to do a rotation | -| GateTimeoutS | 300 | 10 | 2520 | int32 | Timeout (s) before the gate close | -| Ramp.LightOn | 10 | 0 | 100 | int32 | Ramp illumination ON (percent) | -| WH.MaxBright | 180 | 0 | 255 | int32 | Maximum brightness for wormhole leds. (Warning: can cause voltage drop) | -| WH.Type | 1 | 0 | 2 | int32 | 0: SGU, 1: SG1, 2: Hell | -| WSTA.IsActive | 1 | 0 | 1 | int32 | Wifi is active | -| WSTA.SSID | Stargate-Command | | | string | WiFi (SSID) | -| WSTA.Pass | uma-thurman | | | string | WiFi password | -| Dial.anim1 | 750 | 0 | 6000 | int32 | Delay before locking the chevron (ms) | -| Dial.anim2 | 1250 | 0 | 6000 | int32 | Delay after locking the chevron (ms) | -| Dial.anim3 | 2500 | 0 | 10000 | int32 | Delay before starting to dial (ms) | -| sound.vol | 15 | 0 | 30 | int32 | Get Mp3 player volume | \ No newline at end of file diff --git a/Doc/Datasheet_DRV8825.pdf b/Doc/Datasheet_DRV8825.pdf new file mode 100644 index 0000000..48f9482 Binary files /dev/null and b/Doc/Datasheet_DRV8825.pdf differ diff --git a/Dockerfile b/Dockerfile index 42218ad..f354e32 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM espressif/idf:release-v5.0 +FROM espressif/idf:release-v5.1 WORKDIR /app diff --git a/Readme.md b/Readme.md index 59ed0a3..5504f4f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,5 +1,5 @@ **Warning**: This project contains several hundred parts to print and hundreds hours of print. -If you decide to take this path you will suffer a lot, you may lost some compatriot in the battle. +If you decide to take this path you will suffer a lot, you may lose some compatriot in the battle. You will no longer be the same after that, it could also cause hair loss. # Stargate Universe diff --git a/Schematic-EasyEDA/Gerber_PCB_SGU-Base-v2.zip b/Schematic-EasyEDA/Gerber_PCB_SGU-Base-v2.zip new file mode 100644 index 0000000..f6627bb Binary files /dev/null and b/Schematic-EasyEDA/Gerber_PCB_SGU-Base-v2.zip differ diff --git a/Source/base-fw/dependencies.lock b/Source/base-fw/dependencies.lock index 7a46da1..add085d 100644 --- a/Source/base-fw/dependencies.lock +++ b/Source/base-fw/dependencies.lock @@ -1,9 +1,15 @@ dependencies: + espressif/led_strip: + component_hash: c240f82567a37357bef313f76b0df93cb2da025835e525006096ea7e0fd61b4f + source: + service_url: https://api.components.espressif.com/ + type: service + version: 2.4.3 idf: component_hash: null source: type: idf - version: 4.4.4 -manifest_hash: dcf4d39b94252de130019eadceb989d72b0dbc26b552cfdcbb50f6da531d2b92 + version: 5.1.1 +manifest_hash: 1e23ce33a87e2e6bf01e970cf1cbdf4cf98a4898d8855f3af2a1322206852abc target: esp32 version: 1.0.0 diff --git a/Source/base-fw/main/FWConfig.h b/Source/base-fw/main/FWConfig.h index 0dfd4e6..1b8f7f2 100644 --- a/Source/base-fw/main/FWConfig.h +++ b/Source/base-fw/main/FWConfig.h @@ -3,8 +3,11 @@ #include "driver/gpio.h" +#define FWCONFIG_MAINTASK_PRIORITY_DEFAULT (tskIDLE_PRIORITY+1) +#define FWCONFIG_WEBSERVERTASK_PRIORITY_DEFAULT (tskIDLE_PRIORITY+2) + #define FWCONFIG_GATECONTROL_STACKSIZE 4500 -#define FWCONFIG_GATECONTROL_PRIORITY_DEFAULT (tskIDLE_PRIORITY+1) +#define FWCONFIG_GATECONTROL_PRIORITY_DEFAULT (tskIDLE_PRIORITY+3) #define FWCONFIG_GATECONTROL_COREID 1 // Soft access point diff --git a/Source/base-fw/main/GPIO.c b/Source/base-fw/main/GPIO.c index 176c52e..537840a 100644 --- a/Source/base-fw/main/GPIO.c +++ b/Source/base-fw/main/GPIO.c @@ -20,7 +20,7 @@ #define TAG "GPIO" -static led_strip_t* m_strip = NULL; +static led_strip_handle_t led_strip; static SSD1306_handle m_ssd1306; void GPIO_Init() @@ -49,7 +49,7 @@ void GPIO_Init() // Initialize motor driver mcpwm_gpio_init(MCPWM_UNIT_1, MCPWM1A, HWCONFIG_SERVOMOTOR_PIN); mcpwm_config_t servo_config; - servo_config.frequency = 50; // Frequency = 1000Hz, + servo_config.frequency = 50; // Frequency = 50Hz, servo_config.cmpr_a = 0; // Duty cycle of PWMxA = 0 servo_config.cmpr_b = 0; // Duty cycle of PWMxb = 0 servo_config.counter_mode = MCPWM_UP_COUNTER; @@ -87,23 +87,17 @@ void GPIO_Init() gpio_set_direction(HWCONFIG_HOMESENSOR_PIN, GPIO_MODE_INPUT); gpio_pullup_en(HWCONFIG_HOMESENSOR_PIN); - // Initialize LED drivers - rmt_config_t config = RMT_DEFAULT_CONFIG_TX(HWCONFIG_WORMHOLELEDS_PIN, HWCONFIG_WORMHOLELEDS_RMTCHANNEL); - // set counter clock to 40MHz - config.clk_div = 2; - - ESP_ERROR_CHECK(rmt_config(&config)); - ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0)); - - // ----------------------- - // install ws2812 driver - led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(HWCONFIG_WORMHOLELEDS_LEDCOUNT, (led_strip_dev_t)config.channel); - m_strip = led_strip_new_rmt_ws2812(&strip_config); - if (!m_strip) { - ESP_LOGE(TAG, "install WS2812 driver failed"); - } - // Clear LED strip (turn off all LEDs) - ESP_ERROR_CHECK(m_strip->clear(m_strip, 100)); + /* LED strip initialization with the GPIO and pixels number*/ + led_strip_config_t strip_config = { + .strip_gpio_num = HWCONFIG_WORMHOLELEDS_PIN, + .max_leds = HWCONFIG_WORMHOLELEDS_LEDCOUNT, // sanity LED + at least one LED on board + }; + led_strip_rmt_config_t rmt_config = { + .resolution_hz = 10 * 1000 * 1000, // 10MHz + }; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); #ifndef WHITEBOX_SOUNDFX_DEACTIVATE // ===================== @@ -232,17 +226,17 @@ void GPIO_SetSanityLEDStatus(bool bIsLightUp) void GPIO_SetPixel(uint32_t u32Index, uint8_t u8Red, uint8_t u8Green, uint8_t u8Blue) { - ESP_ERROR_CHECK(m_strip->set_pixel(m_strip, u32Index, u8Red, u8Green, u8Blue)); + led_strip_set_pixel(led_strip, u32Index, u8Red, u8Green, u8Blue); } void GPIO_ClearAllPixels() { - ESP_ERROR_CHECK(m_strip->clear(m_strip, 50)); + led_strip_clear(led_strip); } void GPIO_RefreshPixels() { - ESP_ERROR_CHECK(m_strip->refresh(m_strip, 100)); + led_strip_refresh(led_strip); } #ifdef HWCONFIG_OLED_ISPRESENT diff --git a/Source/base-fw/main/GateControl.c b/Source/base-fw/main/GateControl.c index 8925c59..93a0a29 100644 --- a/Source/base-fw/main/GateControl.c +++ b/Source/base-fw/main/GateControl.c @@ -1,3 +1,7 @@ +#include +#include +#include +#include "HelperMacro.h" #include "GateControl.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -16,8 +20,6 @@ #include "GateControl.h" #include "GateStepper.h" #include "SoundFX.h" -#include -#include #define TAG "GateControl" @@ -269,6 +271,7 @@ static bool AutoCalibrate(const SProcCycle* psProcCycle) // Move until it's outside GPIO_StartStepper(); GPIO_ReleaseClamp(); + SOUNDFX_Stop(); const int32_t s32AttemptCount = 10; int32_t s32StepCount = 0; @@ -364,6 +367,7 @@ static bool DoHoming(const SProcCycle* psProcCycle) m_bIsHomingCompleted = false; + SOUNDFX_Stop(); GPIO_StartStepper(); GPIO_ReleaseClamp(); ESP_LOGI(TAG, "[DoHoming] Started"); @@ -497,25 +501,31 @@ static bool DoHoming(const SProcCycle* psProcCycle) void GATECONTROL_AnimRampLight(bool bIsActive) { const float fltPWMOn = (float)NVSJSON_GetValueInt32(&g_sSettingHandle, SETTINGS_EENTRY_RampOnPercent) / 100.0f; - const float fltInc = (fltPWMOn / 50.0f); + const float fltInc = 0.01f; if (bIsActive) - for(float flt = 0.0f; flt < fltPWMOn; flt += fltInc) + { + for(float flt = 0.0f; flt <= 1.0f; flt += fltInc) { - GPIO_SetRampLightPerc(flt); + // Log corrected + GPIO_SetRampLightPerc(HELPERMACRO_LEDLOGADJ(flt, fltPWMOn)); vTaskDelay(pdMS_TO_TICKS(5)); } + } else - for(float flt = fltPWMOn; flt >= 0.0f; flt -= fltInc) + { + for(float flt = 1.0f; flt >= 0.0f; flt -= fltInc) { - GPIO_SetRampLightPerc(flt); + GPIO_SetRampLightPerc(HELPERMACRO_LEDLOGADJ(flt, fltPWMOn)); vTaskDelay(pdMS_TO_TICKS(5)); } + } } static bool DoDialSequence(const GATECONTROL_SDialArg* psDialArg, const SProcCycle* psProcCycle) { const char* szErrorString = "unknown"; + bool bIsCancelled = false; if (!m_bIsHomingCompleted) { @@ -537,17 +547,23 @@ static bool DoDialSequence(const GATECONTROL_SDialArg* psDialArg, const SProcCyc const int32_t s32StepPerRotation = NVSJSON_GetValueInt32(&g_sSettingHandle, SETTINGS_EENTRY_StepPerRotation); const uint32_t u32SymbBright = (uint32_t)NVSJSON_GetValueInt32(&g_sSettingHandle, SETTINGS_EENTRY_RingSymbolBrightness); + #define CHECK_CANCEL_JUMP \ + do { \ + if (m_bIsStop) \ + { \ + bIsCancelled = true; \ + szErrorString = "cancelled"; \ + goto ERROR; \ + } \ + } while(0) + for(int i = 0; i < psDialArg->u8SymbolCount; i++) { - if (m_bIsStop) - { - szErrorString = "cancelled"; - goto ERROR; - } - const uint8_t u8SymbolIndex = psDialArg->u8Symbols[i]; int32_t s32TicksTarget = GetAbsoluteSymbolTarget(u8SymbolIndex, s32StepPerRotation); + CHECK_CANCEL_JUMP; + ESP_LOGI(TAG, "Go Home - Symbol: %d, previous target: %d, new target: %d, current: %d", /*0*/(int)u8SymbolIndex, /*1*/(int)m_s32Count, /*2*/(int)s32TicksTarget, /*3*/(int)m_s32Count); int32_t s32Move = (s32TicksTarget - m_s32Count); @@ -562,6 +578,7 @@ static bool DoDialSequence(const GATECONTROL_SDialArg* psDialArg, const SProcCyc SOUNDFX_StartRollingSound(); vTaskDelay(pdMS_TO_TICKS(250)); MoveRelative(s32Move); + CHECK_CANCEL_JUMP; SOUNDFX_Stop(); vTaskDelay(pdMS_TO_TICKS(150)); SOUNDFX_EngageChevron(); @@ -596,7 +613,8 @@ static bool DoDialSequence(const GATECONTROL_SDialArg* psDialArg, const SProcCyc GPIO_StopStepper(); SOUNDFX_Fail(); GATECONTROL_AnimRampLight(false); - SGUBRCOMM_ChevronLightning(&g_sSGUBRCOMMHandle, SGUBRPROTOCOL_ECHEVRONANIM_ErrorToOff); + const SGUBRPROTOCOL_ECHEVRONANIM eChevronAnim = (bIsCancelled ? SGUBRPROTOCOL_ECHEVRONANIM_FadeOut : SGUBRPROTOCOL_ECHEVRONANIM_ErrorToOff); + SGUBRCOMM_ChevronLightning(&g_sSGUBRCOMMHandle, eChevronAnim); return false; } diff --git a/Source/base-fw/main/GateStepper.c b/Source/base-fw/main/GateStepper.c index 1dd4ed4..057b825 100644 --- a/Source/base-fw/main/GateStepper.c +++ b/Source/base-fw/main/GateStepper.c @@ -1,4 +1,5 @@ #include "GateStepper.h" +#include "HelperMacro.h" #include "HWConfig.h" #include "esp_timer.h" #include "esp_log.h" @@ -8,9 +9,6 @@ #define TAG "GateStepper" -#define MIN(a,b) (((a)<(b))?(a):(b)) -#define MAX(a,b) (((a)>(b))?(a):(b)) - static void tmr_signal_callback(void* arg); #define STEPEND_BIT 0x01 @@ -91,8 +89,8 @@ static IRAM_ATTR void tmr_signal_callback(void* arg) gpio_set_level(HWCONFIG_STEPPER_STEP_PIN, m_bPeriodAlternate); if (m_bPeriodAlternate) { - const int32_t s32 = MIN(abs(m_s32Count) , abs(m_s32Target - m_s32Count)); - + const int32_t s32 = HELPERMACRO_MIN(abs(m_s32Count) , abs(m_s32Target - m_s32Count)); + /* Former code if (s32 < 50*2) m_s32Period = 2000/2; else if (s32 < 100*2) @@ -110,7 +108,25 @@ static IRAM_ATTR void tmr_signal_callback(void* arg) else if (s32 < 700*2) m_s32Period = 600/2; else - m_s32Period = 400/2; + m_s32Period = 400/2;*/ + /* I just did some tests until I was satisfied */ + /* #1 (100, 1000), (1400, 300) + a = -0.53846153846153846153846153846154 + b = 1053.84 */ + /* #2 (100, 700), (1400, 200) + a = -0.3846 + b = 738.44 */ + const int32_t a = -461; + const int32_t b = 946840; + m_s32Period = (a * s32 + b)/1000; + + // I hoped it would reduce jitter. + m_s32Period = (m_s32Period / 50) * 50; + + if (m_s32Period < 300) + m_s32Period = 300; + if (m_s32Period > 700) + m_s32Period = 700; // Count every two m_s32Count++; diff --git a/Source/base-fw/main/Main.c b/Source/base-fw/main/Main.c index 1b643ee..922a8e3 100644 --- a/Source/base-fw/main/Main.c +++ b/Source/base-fw/main/Main.c @@ -77,19 +77,19 @@ static void wifistation_event_handler(void* arg, esp_event_base_t event_base, in { if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { esp_wifi_connect(); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + } + else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED ) { + ESP_LOGI(TAG, "Connected to the AP"); + esp_netif_create_ip6_linklocal(m_pWifiSTA); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { esp_wifi_connect(); - ESP_LOGI(TAG, "retry to connect to the AP"); - ESP_LOGI(TAG,"connect to the AP fail"); + ESP_LOGI(TAG, "connect to the AP faile, retry to connect to the AP"); } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); - - /*if (!m_bIsWebServerInit) - { - m_bIsWebServerInit = true; - WEBSERVER_Init(); - }*/ + } else if (event_base == IP_EVENT && event_id == IP_EVENT_GOT_IP6) { + ip_event_got_ip6_t *event = (ip_event_got_ip6_t *)event_data; + ESP_LOGI(TAG, "Got IPv6 address " IPV6STR, IPV62STR(event->ip6_info.ip)); } } @@ -157,16 +157,23 @@ static void wifi_init_all(void) esp_event_handler_instance_t instance_any_id; esp_event_handler_instance_t instance_got_ip; + esp_event_handler_instance_t instance_got_ip6; ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifistation_event_handler, NULL, &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifistation_event_handler, NULL, &instance_got_ip)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_GOT_IP6, + &wifistation_event_handler, + NULL, + &instance_got_ip6)); wifi_config_t wifi_configSTA; memset(&wifi_configSTA, 0, sizeof(wifi_configSTA)); @@ -191,6 +198,8 @@ static void wifi_init_all(void) void app_main(void) { + vTaskPrioritySet( NULL, FWCONFIG_MAINTASK_PRIORITY_DEFAULT); + //Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -252,6 +261,10 @@ void app_main(void) ESP_LOGI(TAG, "vTaskList: \r\n\r\n%s", szAllTask); free(szAllTask); + // Small delay to be sure the Mp3 player doesn't play random things before being started up. + vTaskDelay(pdMS_TO_TICKS(500)); + SOUNDFX_Stop(); + while(true) { #ifdef HWCONFIG_OLED_ISPRESENT @@ -316,6 +329,13 @@ void MAIN_GetWiFiSTAIP(esp_netif_ip_info_t* pIPInfo) esp_netif_get_ip_info(m_pWifiSTA, pIPInfo); } +int32_t MAIN_GetWiFiSTAIPv6(esp_ip6_addr_t if_ip6[CONFIG_LWIP_IPV6_NUM_ADDRESSES]) +{ + if (m_pWifiSTA != NULL) + return esp_netif_get_all_ip6(m_pWifiSTA, if_ip6); + return 0; +} + void MAIN_GetWiFiSoftAPIP(esp_netif_ip_info_t* pIPInfo) { if (m_pWifiSoftAP != NULL) diff --git a/Source/base-fw/main/Main.h b/Source/base-fw/main/Main.h index a2abcc1..713d993 100644 --- a/Source/base-fw/main/Main.h +++ b/Source/base-fw/main/Main.h @@ -7,6 +7,8 @@ extern SGUBRCOMM_SHandle g_sSGUBRCOMMHandle; void MAIN_GetWiFiSTAIP(esp_netif_ip_info_t* pIPInfo); +int32_t MAIN_GetWiFiSTAIPv6(esp_ip6_addr_t if_ip6[CONFIG_LWIP_IPV6_NUM_ADDRESSES]); + void MAIN_GetWiFiSoftAPIP(esp_netif_ip_info_t* pIPInfo); void MAIN_RequestReboot(); diff --git a/Source/base-fw/main/Settings.c b/Source/base-fw/main/Settings.c index 8e7a734..0054746 100644 --- a/Source/base-fw/main/Settings.c +++ b/Source/base-fw/main/Settings.c @@ -25,8 +25,8 @@ static NVSJSON_SSettingEntry m_sConfigEntries[SETTINGS_EENTRY_Count] = [SETTINGS_EENTRY_RampOnPercent] = NVSJSON_INITINT32_RNG("Ramp.LightOn", "Ramp illumination ON (percent)", 30, 0, 100, NVSJSON_EFLAGS_None), - [SETTINGS_EENTRY_WormholeMaxBrightness] = NVSJSON_INITINT32_RNG("WH.MaxBright", "Maximum brightness for wormhole leds. (Warning: can cause voltage drop)", 220, 0, 255, NVSJSON_EFLAGS_None), - [SETTINGS_EENTRY_WormholeType] = NVSJSON_INITINT32_RNG("WH.Type", "0: SGU, 1: SG1, 2: Hell", (int)WORMHOLE_ETYPE_NormalSGU, 0, (int)WORMHOLE_ETYPE_Count-1, NVSJSON_EFLAGS_None), + [SETTINGS_EENTRY_WormholeMaxBrightness] = NVSJSON_INITINT32_RNG("WH.MaxBright", "Maximum brightness for wormhole leds. (Warning: can cause voltage drop)", 200, 0, 255, NVSJSON_EFLAGS_None), + [SETTINGS_EENTRY_WormholeType] = NVSJSON_INITINT32_RNG("WH.Type", "0: SGU, 1: SG1, 2: Hell, 3: Blackhole, 4: Strobe, 5: Glitch", (int)WORMHOLE_ETYPE_NormalSGU, 0, (int)WORMHOLE_ETYPE_Count-1, NVSJSON_EFLAGS_None), // WiFi Station related [SETTINGS_EENTRY_WSTAIsActive] = NVSJSON_INITINT32_RNG("WSTA.IsActive", "Wi-Fi is active", 0, 0, 1, NVSJSON_EFLAGS_NeedsReboot), diff --git a/Source/base-fw/main/SoundFX.c b/Source/base-fw/main/SoundFX.c index 42a5e60..9fcf43b 100644 --- a/Source/base-fw/main/SoundFX.c +++ b/Source/base-fw/main/SoundFX.c @@ -22,7 +22,7 @@ _Static_assert((sizeof(m_sFiles)/sizeof(m_sFiles[0])) == SOUNDFX_EFILE_Count, "d void SOUNDFX_Init() { - SOUNDFX_Stop(); + // SOUNDFX_Stop(); } const SOUNDFX_SFile* SOUNDFX_GetFile(SOUNDFX_EFILE eFile) @@ -95,8 +95,8 @@ void SOUNDFX_Stop() // We don't know when it is playing and there is no explicit STOP command. It just toggle // so the trick is to play something then immediately put it on pause. GPIO_SendMp3PlayerCMD("AT+PLAYMODE=3\r\n"); - vTaskDelay(pdMS_TO_TICKS(25)); + vTaskDelay(pdMS_TO_TICKS(35)); GPIO_SendMp3PlayerCMD("AT+PLAYNUM=6\r\n"); - vTaskDelay(pdMS_TO_TICKS(25)); + vTaskDelay(pdMS_TO_TICKS(35)); GPIO_SendMp3PlayerCMD("AT+PLAY=PP\r\n"); } diff --git a/Source/base-fw/main/Wormhole.c b/Source/base-fw/main/Wormhole.c index 5addc38..8ae0636 100644 --- a/Source/base-fw/main/Wormhole.c +++ b/Source/base-fw/main/Wormhole.c @@ -7,6 +7,7 @@ #include "FWConfig.h" #include "Settings.h" #include "SoundFX.h" +#include "HelperMacro.h" typedef struct { @@ -28,9 +29,6 @@ static const int m_pRing1[] = { 9, 10, 11, 12, 20, 21, 22, 23, 24, 25, 26, 27, 3 static const int m_pRing2[] = { 37, 38, 39, 40, 28, 29, 30, 42, 43 }; static const int m_pRing3[] = { 41, 44, 45, 46 }; -#define MIN(X,Y) (((X) < (Y)) ? (X) : (Y)) -#define MAX(X,Y) (((X) > (Y)) ? (X) : (Y)) - static SLedEffect m_sLedEffects[HWCONFIG_WORMHOLELEDS_LEDCOUNT]; static WORMHOLE_SArg m_sArg = {0}; @@ -67,21 +65,14 @@ void WORMHOLE_Run(volatile bool* pIsCancelled) { const uint32_t u32MaxBrightness = NVSJSON_GetValueInt32(&g_sSettingHandle, SETTINGS_EENTRY_WormholeMaxBrightness); - const float minF = 0.10f; - const float maxF = 0.25f; - - for(int i = 0; i < HWCONFIG_WORMHOLELEDS_LEDCOUNT; i++) - { - m_sLedEffects[i].fOne = (float)(esp_random() % 100) * 0.01f * maxF; - m_sLedEffects[i].bUp = false; - } - // Wait until we get stop command or timeout reached. TickType_t xStartTicks = xTaskGetTickCount(); const uint32_t u32OpenTimeS = NVSJSON_GetValueInt32(&g_sSettingHandle, SETTINGS_EENTRY_GateOpenedTimeout); m_bIsIdlingSoundPlaying = false; + bool bIsInitalized = false; + int32_t s32GlitchTempActCount = 0; while(!*pIsCancelled && (m_sArg.bNoTimeLimit || (xTaskGetTickCount() - xStartTicks) < pdMS_TO_TICKS(1000*u32OpenTimeS))) { @@ -91,37 +82,91 @@ void WORMHOLE_Run(volatile bool* pIsCancelled) SOUNDFX_WormholeIdling(); } - if (m_sArg.eType == WORMHOLE_ETYPE_Blackhole) + int32_t s32Speed = 20; + + if (m_sArg.eType == WORMHOLE_ETYPE_Strobe) + { + static bool bInvert = false; + + for(int i = 0; i < HWCONFIG_WORMHOLELEDS_LEDCOUNT; i++) + { + if (bInvert) + GPIO_SetPixel(i, 200, 200, 200); + else + GPIO_SetPixel(i, 0, 0, 0); + } + + bInvert = !bInvert; + } + else if (m_sArg.eType == WORMHOLE_ETYPE_Blackhole) { static int32_t ix = 0; + const uint32_t u32MaxBrightness2 = 80; + for(int ppp = 0; ppp < 3; ppp++) { int32_t ix2 = (ix + ppp*16) % HWCONFIG_WORMHOLELEDS_LEDCOUNT; for(int j = 1; j < 5; j++) { - int z = 85 - j*20; - int zzz = (ix2-j); - if (zzz < 0) - zzz = HWCONFIG_WORMHOLELEDS_LEDCOUNT + zzz; + int32_t ledIndex = (ix2-j); + if (ledIndex < 0) + ledIndex = HWCONFIG_WORMHOLELEDS_LEDCOUNT + ledIndex; + const int32_t z = 5 + (int32_t)(0.2d*(4-j) * u32MaxBrightness2); - GPIO_SetPixel(zzz, z, 0, z); + GPIO_SetPixel(ledIndex, z, 0, z); } for(int j = 0; j < 5; j++) { - int z = 85 - j*20; - GPIO_SetPixel( (ix2+j) % HWCONFIG_WORMHOLELEDS_LEDCOUNT, z, 0, z); + const int32_t ledIndex = (ix2+j) % HWCONFIG_WORMHOLELEDS_LEDCOUNT; + const int32_t z = 5 + (int32_t)(0.25d*j * u32MaxBrightness2); + GPIO_SetPixel( ledIndex, z, 0, z); } } ix = (ix + 1) % HWCONFIG_WORMHOLELEDS_LEDCOUNT; - - GPIO_RefreshPixels(); - vTaskDelay(pdMS_TO_TICKS(20)); + s32Speed = 40; } - else + else if (m_sArg.eType == WORMHOLE_ETYPE_NormalSGU || + m_sArg.eType == WORMHOLE_ETYPE_NormalSG1 || + m_sArg.eType == WORMHOLE_ETYPE_Hell || + m_sArg.eType == WORMHOLE_ETYPE_Glitch) { + float minF = 0.10f; + float maxF = 0.35f; + + if (!bIsInitalized) + { + for(int i = 0; i < HWCONFIG_WORMHOLELEDS_LEDCOUNT; i++) + { + m_sLedEffects[i].fOne = (float)(esp_random() % 100) * 0.01f * maxF; + m_sLedEffects[i].bUp = false; + } + bIsInitalized = true; + } + + if (m_sArg.eType == WORMHOLE_ETYPE_Glitch) + { + if (s32GlitchTempActCount > 0) + { + // Lowest threshold to create a glitched effect + minF = 0.0f; + maxF = 0.1f; + s32Speed = 20; + s32GlitchTempActCount--; + if (s32GlitchTempActCount == 0) + { + bIsInitalized = false; + } + } + else if (esp_random() % 200 == 0) + { + s32GlitchTempActCount = 25 + (esp_random() % 25); + bIsInitalized = false; + } + } + for(int i = 0; i < HWCONFIG_WORMHOLELEDS_LEDCOUNT; i++) { SLedEffect* psLedEffect = &m_sLedEffects[i]; @@ -145,12 +190,13 @@ void WORMHOLE_Run(volatile bool* pIsCancelled) break; } - if (m_sArg.eType == WORMHOLE_ETYPE_NormalSGU) - GPIO_SetPixel(i, MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255), MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255), MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255)); + if (m_sArg.eType == WORMHOLE_ETYPE_NormalSGU || + m_sArg.eType == WORMHOLE_ETYPE_Glitch) + GPIO_SetPixel(i, HELPERMACRO_MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255), HELPERMACRO_MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255), HELPERMACRO_MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255)); else if (m_sArg.eType == WORMHOLE_ETYPE_NormalSG1) - GPIO_SetPixel(i, MAX(psLedEffect->fOne*u32MaxBrightness * fFactor, 16), MAX(psLedEffect->fOne*u32MaxBrightness * fFactor, 16), 16+MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255-16)); + GPIO_SetPixel(i, HELPERMACRO_MAX(psLedEffect->fOne*u32MaxBrightness * fFactor, 16), HELPERMACRO_MAX(psLedEffect->fOne*u32MaxBrightness * fFactor, 16), 16+HELPERMACRO_MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255-16)); else if (m_sArg.eType == WORMHOLE_ETYPE_Hell) - GPIO_SetPixel(i, MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255), 1, 1); + GPIO_SetPixel(i, HELPERMACRO_MIN(psLedEffect->fOne*u32MaxBrightness * fFactor, 255), 1, 1); const float fInc = 0.005f + ( 0.01f * (esp_random() % 100) ) * 0.001f; @@ -173,7 +219,7 @@ void WORMHOLE_Run(volatile bool* pIsCancelled) } GPIO_RefreshPixels(); - vTaskDelay(pdMS_TO_TICKS(20)); + vTaskDelay(pdMS_TO_TICKS(s32Speed)); } } diff --git a/Source/base-fw/main/Wormhole.h b/Source/base-fw/main/Wormhole.h index b136976..a729824 100644 --- a/Source/base-fw/main/Wormhole.h +++ b/Source/base-fw/main/Wormhole.h @@ -11,7 +11,8 @@ typedef enum WORMHOLE_ETYPE_NormalSG1 = 1, WORMHOLE_ETYPE_Hell = 2, WORMHOLE_ETYPE_Blackhole = 3, - /* WORMHOLE_ETYPE_Glitch = 4 */ + WORMHOLE_ETYPE_Strobe = 4, + WORMHOLE_ETYPE_Glitch = 5, WORMHOLE_ETYPE_Count } WORMHOLE_ETYPE; diff --git a/Source/base-fw/main/idf_component.yml b/Source/base-fw/main/idf_component.yml new file mode 100644 index 0000000..fbf50c7 --- /dev/null +++ b/Source/base-fw/main/idf_component.yml @@ -0,0 +1,17 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: "*" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/Source/base-fw/main/webserver/EmbeddedFiles.c b/Source/base-fw/main/webserver/EmbeddedFiles.c index 8276c17..efb8701 100644 --- a/Source/base-fw/main/webserver/EmbeddedFiles.c +++ b/Source/base-fw/main/webserver/EmbeddedFiles.c @@ -1,7 +1,7 @@ #include "EmbeddedFiles.h" /*! @brief Total size: 178 KB, Packed size: 178 KB */ -const EF_SFile EF_g_sFiles[EF_EFILE_COUNT] = +const EF_SFile EF_g_sFiles[EF_EFILE_COUNT] = { [EF_EFILE_ABOUT_OTA_HTML] = { "about-ota.html", 1255, EF_EFLAGS_None, &EF_g_u8Blobs[0]},/* packed size: 1 KB, original size: 1 KB */ [EF_EFILE_CONFIG_JSON] = { "config.json", 18648, EF_EFLAGS_None, &EF_g_u8Blobs[1260]},/* packed size: 18 KB, original size: 18 KB */ @@ -20,12 +20,12 @@ const EF_SFile EF_g_sFiles[EF_EFILE_COUNT] = [EF_EFILE_FONT_COPYRIGHTS_STARGATEUNIVERSE_README_TXT] = { "font/copyrights/stargateuniverse-readme.txt", 1894, EF_EFLAGS_None, &EF_g_u8Blobs[77932]},/* packed size: 2 KB, original size: 2 KB */ [EF_EFILE_IMG_HOME_SVG] = { "img/home.svg", 1529, EF_EFLAGS_None, &EF_g_u8Blobs[79828]},/* packed size: 1 KB, original size: 1 KB */ [EF_EFILE_JS_ABOUT_OTA_JS] = { "js/about-ota.js", 1248, EF_EFLAGS_None, &EF_g_u8Blobs[81360]},/* packed size: 1 KB, original size: 1 KB */ - [EF_EFILE_JS_APP_JS] = { "js/app.js", 5176, EF_EFLAGS_None, &EF_g_u8Blobs[82612]},/* packed size: 5 KB, original size: 5 KB */ - [EF_EFILE_JS_SETTINGS_JS] = { "js/settings.js", 311, EF_EFLAGS_None, &EF_g_u8Blobs[87792]},/* packed size: 316 B, original size: 311 B */ - [EF_EFILE_JS_VUE_MIN_JS] = { "js/vue.min.js", 94158, EF_EFLAGS_None, &EF_g_u8Blobs[88108]},/* packed size: 92 KB, original size: 92 KB */ + [EF_EFILE_JS_APP_JS] = { "js/app.js", 5102, EF_EFLAGS_None, &EF_g_u8Blobs[82612]},/* packed size: 5 KB, original size: 5 KB */ + [EF_EFILE_JS_SETTINGS_JS] = { "js/settings.js", 311, EF_EFLAGS_None, &EF_g_u8Blobs[87716]},/* packed size: 316 B, original size: 311 B */ + [EF_EFILE_JS_VUE_MIN_JS] = { "js/vue.min.js", 94158, EF_EFLAGS_None, &EF_g_u8Blobs[88032]},/* packed size: 92 KB, original size: 92 KB */ }; -const uint8_t EF_g_u8Blobs[] = +const uint8_t EF_g_u8Blobs[] = "\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x68\x74\x6d\x6c\x3e\x0d\x0a\x3c\x68\x74\x6d\x6c\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x68\x65\x61\x64\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x21\x2d\x2d\x20\x52\x65\x71\x75\x69\x72\x65\x64\x20\x6d\x65\x74\x61\x20\x74\x61\x67\x73\x20\x2d\x2d\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x6d\x65\x74\x61\x20\x63\x68\x61\x72\x73\x65\x74\x3d\x22\x75\x74\x66" "\x2d\x38\x22\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x6d\x65\x74\x61\x20\x6e\x61\x6d\x65\x3d\x22\x76\x69\x65\x77\x70\x6f\x72\x74\x22\x20\x63\x6f\x6e\x74\x65\x6e\x74\x3d\x22\x77\x69\x64\x74\x68\x3d\x64\x65\x76\x69\x63\x65\x2d\x77\x69\x64\x74\x68\x2c\x20\x69\x6e\x69\x74\x69\x61\x6c\x2d\x73\x63\x61\x6c\x65\x3d\x31\x2c\x20\x73\x68\x72\x69\x6e\x6b\x2d\x74\x6f\x2d\x66\x69\x74\x3d\x6e\x6f\x22\x3e" "\x0d\x0a\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x6c\x69\x6e\x6b\x20\x72\x65\x6c\x3d\x22\x73\x74\x79\x6c\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x20\x68\x72\x65\x66\x3d\x22\x63\x73\x73\x2f\x63\x6f\x6e\x74\x65\x6e\x74\x2e\x63\x73\x73\x22\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x74\x69\x74\x6c\x65\x3e\x44\x65\x73\x74\x69\x6e\x79\x20\x63" @@ -880,972 +880,971 @@ const uint8_t EF_g_u8Blobs[] = "\x20\x33\x33\x2c\x20\x69\x6d\x67\x66\x69\x6c\x65\x3a\x20\x22\x69\x6d\x67\x2f\x67\x6c\x79\x70\x68\x2f\x33\x33\x2e\x70\x6e\x67\x22\x2c\x20\x74\x78\x74\x3a\x20\x27\x5c\x75\x30\x30\x33\x37\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x69\x64\x3a\x20\x33\x34\x2c\x20\x69\x6d\x67\x66\x69\x6c\x65\x3a\x20\x22\x69\x6d\x67\x2f\x67\x6c\x79\x70\x68\x2f\x33\x34\x2e\x70\x6e\x67\x22\x2c\x20\x74\x78\x74\x3a\x20\x27\x5c" "\x75\x30\x30\x33\x38\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x69\x64\x3a\x20\x33\x35\x2c\x20\x69\x6d\x67\x66\x69\x6c\x65\x3a\x20\x22\x69\x6d\x67\x2f\x67\x6c\x79\x70\x68\x2f\x33\x35\x2e\x70\x6e\x67\x22\x2c\x20\x74\x78\x74\x3a\x20\x27\x5c\x75\x30\x30\x33\x39\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x69\x64\x3a\x20\x33\x36\x2c\x20\x69\x6d\x67\x66\x69\x6c\x65\x3a\x20\x22\x69\x6d\x67\x2f\x67\x6c\x79\x70" "\x68\x2f\x33\x36\x2e\x70\x6e\x67\x22\x2c\x20\x74\x78\x74\x3a\x20\x27\x5c\x75\x30\x30\x33\x30\x27\x20\x7d\x2c\x0d\x0a\x5d\x3b\x0d\x0a\x0d\x0a\x6c\x65\x74\x20\x61\x6c\x6c\x61\x64\x64\x72\x65\x73\x73\x65\x73\x20\x3d\x20\x5b\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x30\x2c\x20\x31\x35\x2c\x20\x32\x30\x2c\x20\x32\x36\x2c\x20\x32\x38\x2c\x20\x31\x33\x2c" -"\x20\x31\x38\x2c\x20\x33\x32\x2c\x20\x33\x30\x5d\x2c\x20\x6e\x61\x6d\x65\x3a\x20\x27\x45\x61\x72\x74\x68\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x33\x2c\x20\x33\x34\x2c\x20\x31\x32\x2c\x20\x37\x2c\x20\x31\x39\x2c\x20\x36\x2c\x20\x32\x39\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4a\x75\x6e\x67" -"\x6c\x65\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x37\x2c\x20\x38\x2c\x20\x31\x34\x2c\x20\x31\x37\x2c\x20\x33\x32\x2c\x20\x32\x33\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x44\x65\x73\x65\x72\x74\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20" -"\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x35\x2c\x20\x33\x35\x2c\x20\x38\x2c\x20\x33\x30\x2c\x20\x33\x31\x2c\x20\x32\x39\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x48\x6f\x74\x68\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x2c\x20\x33\x34\x2c\x20\x31" -"\x32\x2c\x20\x37\x2c\x20\x32\x35\x2c\x20\x33\x32\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x47\x72\x61\x76\x65\x20\x50\x69\x74\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x30\x2c\x20\x31\x32\x2c\x20\x31\x34\x2c\x20\x32\x33\x2c\x20\x33\x32\x2c\x20\x32\x33" -"\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x52\x75\x69\x6e\x73\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x34\x2c\x20\x32\x30\x2c\x20\x32\x33\x2c\x20\x32\x38\x2c\x20\x36\x2c\x20\x31\x31\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d" -"\x65\x3a\x20\x27\x46\x6f\x67\x67\x79\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x34\x2c\x20\x31\x37\x2c\x20\x32\x33\x2c\x20\x33\x32\x2c\x20\x33\x35\x2c\x20\x38\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x44\x65\x70\x6f\x72\x74\x61\x74\x69\x6f\x6e\x20\x50\x6c" -"\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x33\x2c\x20\x31\x33\x2c\x20\x31\x37\x2c\x20\x31\x39\x2c\x20\x31\x2c\x20\x33\x35\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x43\x6c\x6f\x76\x65\x72\x64\x61\x6c\x65\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b" -"\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x32\x2c\x20\x31\x34\x2c\x20\x31\x38\x2c\x20\x32\x33\x2c\x20\x33\x30\x2c\x20\x35\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4d\x61\x6c\x69\x63\x65\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b" -"\x35\x2c\x20\x31\x37\x2c\x20\x32\x33\x2c\x20\x32\x35\x2c\x20\x31\x2c\x20\x32\x38\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4e\x6f\x76\x75\x73\x20\x43\x6f\x6c\x6f\x6e\x79\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x36\x2c\x20\x32\x36\x2c\x20\x32\x38\x2c\x20" -"\x31\x30\x2c\x20\x33\x31\x2c\x20\x31\x32\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4c\x61\x73\x74\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x35\x2c\x20\x31\x33\x2c\x20\x33\x34\x2c\x20\x31\x38\x2c\x20\x33\x31\x2c\x20\x37\x2c\x20\x34\x5d\x2c\x20\x20\x20\x20\x20" -"\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x57\x6f\x72\x6d\x68\x6f\x6c\x65\x27\x2c\x20\x77\x6f\x72\x6d\x68\x6f\x6c\x65\x3a\x20\x33\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x32\x2c\x20\x31\x30\x2c\x20\x33\x35\x2c\x20\x39\x2c\x20\x32\x39\x2c\x20\x32\x33\x2c\x20\x31\x35\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61" -"\x6d\x65\x3a\x20\x27\x48\x65\x6c\x6c\x27\x2c\x20\x77\x6f\x72\x6d\x68\x6f\x6c\x65\x3a\x20\x32\x20\x7d\x2c\x0d\x0a\x20\x20\x2f\x2f\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x2c\x20\x33\x36\x2c\x20\x32\x2c\x20\x33\x35\x2c\x20\x33\x2c\x20\x33\x34\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x54\x65\x73\x74\x20" -"\x23\x31\x27\x20\x7d\x2c\x0d\x0a\x5d\x3b\x0d\x0a\x0d\x0a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x65\x74\x53\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x28\x53\x79\x6d\x62\x6f\x6c\x4f\x6e\x65\x42\x61\x73\x65\x64\x29\x0d\x0a\x7b\x0d\x0a\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x61\x6c\x6c\x73\x79\x6d\x62\x6f\x6c\x73\x5b\x53\x79\x6d\x62\x6f\x6c\x4f\x6e\x65\x42\x61\x73\x65\x64\x2d\x31\x5d\x3b\x0d\x0a\x7d\x0d" -"\x0a\x0d\x0a\x6c\x65\x74\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x20\x3d\x0d\x0a\x7b\x0d\x0a\x20\x20\x73\x79\x6d\x62\x6f\x6c\x73\x3a\x20\x61\x6c\x6c\x73\x79\x6d\x62\x6f\x6c\x73\x2c\x0d\x0a\x20\x20\x61\x6c\x6c\x61\x64\x64\x72\x65\x73\x73\x65\x73\x3a\x20\x61\x6c\x6c\x61\x64\x64\x72\x65\x73\x73\x65\x73\x2c\x0d\x0a\x0d\x0a\x20\x20\x73\x74\x61\x74\x75\x73\x3a\x20\x7b\x0d\x0a\x20\x20\x20\x20\x74" -"\x65\x78\x74\x3a\x20\x22\x22\x2c\x0d\x0a\x20\x20\x20\x20\x63\x61\x6e\x63\x65\x6c\x5f\x72\x65\x71\x75\x65\x73\x74\x3a\x20\x66\x61\x6c\x73\x65\x2c\x0d\x0a\x20\x20\x20\x20\x74\x69\x6d\x65\x5f\x68\x6f\x75\x72\x3a\x20\x30\x2c\x20\x74\x69\x6d\x65\x5f\x6d\x69\x6e\x3a\x20\x30\x0d\x0a\x20\x20\x7d\x2c\x0d\x0a\x20\x20\x69\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x3a\x20\x66\x61\x6c\x73\x65\x2c\x0d\x0a\x20" -"\x20\x69\x73\x5f\x61\x64\x76\x5f\x6d\x6f\x64\x65\x3a\x20\x66\x61\x6c\x73\x65\x0d\x0a\x7d\x3b\x0d\x0a\x0d\x0a\x76\x61\x72\x20\x63\x75\x72\x72\x65\x6e\x74\x41\x70\x70\x20\x3d\x20\x6e\x65\x77\x20\x56\x75\x65\x28\x7b\x0d\x0a\x20\x20\x65\x6c\x3a\x20\x27\x23\x61\x70\x70\x27\x2c\x0d\x0a\x20\x20\x64\x61\x74\x61\x3a\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x0d\x0a\x7d\x29\x0d\x0a\x0d\x0a\x61\x73\x79" -"\x6e\x63\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x28\x29\x20\x7b\x0d\x0a\x0d\x0a\x20\x20\x2f\x2f\x20\x47\x65\x74\x20\x73\x79\x73\x74\x65\x6d\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\x73\x0d\x0a\x20\x20\x61\x77\x61\x69\x74\x20\x66\x65\x74\x63\x68\x28\x27\x2f\x61\x70\x69\x2f\x67\x65\x74\x73\x74\x61\x74\x75\x73\x27\x29\x0d\x0a\x20\x20\x20\x20\x20" -"\x20\x2e\x74\x68\x65\x6e\x28\x28\x72\x65\x73\x70\x6f\x6e\x73\x65\x29\x20\x3d\x3e\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x72\x65\x73\x70\x6f\x6e\x73\x65\x2e\x6f\x6b\x29\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77\x20\x6e\x65\x77\x20\x45\x72\x72\x6f\x72\x28\x27\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x67\x65\x74\x20" -"\x73\x74\x61\x74\x75\x73\x27\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x72\x65\x73\x70\x6f\x6e\x73\x65\x2e\x6a\x73\x6f\x6e\x28\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x7d\x29\x0d\x0a\x20\x20\x20\x20\x20\x20\x2e\x74\x68\x65\x6e\x28\x28\x64\x61\x74\x61\x29\x20\x3d\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x7b\x0d" -"\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x6c\x6f\x67\x28\x22\x64\x61\x74\x61\x3a\x20\x22\x2c\x20\x64\x61\x74\x61\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x2e\x73\x74\x61\x74\x75\x73\x20\x3d\x20\x64\x61\x74\x61\x2e\x73\x74\x61\x74\x75\x73\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74" -"\x61\x2e\x69\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x20\x3d\x20\x74\x72\x75\x65\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x2c\x20\x35\x30\x30\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x7d\x29\x0d\x0a\x20\x20\x20\x20\x20\x20\x2e\x63\x61\x74\x63\x68\x28\x28\x65\x78\x29\x20\x3d\x3e\x0d\x0a\x20\x20\x20\x20" -"\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x2c\x20\x35\x30\x30\x30\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x2e\x69\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x20\x3d\x20\x66\x61\x6c\x73\x65\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20" -"\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x65\x72\x72\x6f\x72\x28\x27\x67\x65\x74\x73\x74\x61\x74\x75\x73\x27\x2c\x20\x65\x78\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x7d\x29\x3b\x0d\x0a\x7d\x0d\x0a\x0d\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x0d\x0a\x20\x20\x22\x6c\x6f\x61\x64\x22\x2c\x0d\x0a\x20\x20\x28\x65\x76\x65\x6e\x74\x29\x20\x3d" -"\x3e\x20\x7b\x0d\x0a\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x6c\x6f\x67\x28\x22\x70\x61\x67\x65\x20\x69\x73\x20\x66\x75\x6c\x6c\x79\x20\x6c\x6f\x61\x64\x65\x64\x22\x29\x3b\x0d\x0a\x20\x20\x20\x20\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x2c\x20\x35\x30\x30\x29\x3b\x0d\x0a\x7d\x29\x3b\x0d\x0a\x00\x00\x00\x00\x0d\x0a\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x20\x41\x70\x70\x4c\x6f\x61\x64\x65\x64\x28\x29\x0d\x0a\x7b\x0d\x0a\x20\x20\x66\x65\x74\x63\x68\x28\x27\x2e\x2f\x61\x70\x69\x2f\x67\x65\x74\x73\x65\x74\x74\x69\x6e\x67\x73\x6a\x73\x6f\x6e\x27\x29\x0d\x0a\x20\x20\x20\x20\x2e\x74\x68\x65\x6e\x28\x28\x72\x65\x73\x70\x6f\x6e\x73\x65\x29\x20\x3d\x3e\x20\x72\x65\x73\x70\x6f\x6e\x73\x65\x2e\x6a\x73\x6f\x6e\x28\x29\x29\x0d\x0a\x20\x20\x20\x20\x2e" -"\x74\x68\x65\x6e\x28\x28\x64\x61\x74\x61\x29\x20\x3d\x3e\x0d\x0a\x20\x20\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x6c\x6f\x67\x28\x64\x61\x74\x61\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x41\x70\x70\x2e\x65\x6e\x74\x72\x69\x65\x73\x20\x3d\x20\x64\x61\x74\x61\x2e\x65\x6e\x74\x72\x69\x65\x73\x3b\x0d\x0a\x20\x20\x20\x20\x7d\x29\x3b\x0d\x0a" -"\x7d\x0d\x0a\x0d\x0a\x76\x61\x72\x20\x63\x75\x72\x72\x65\x6e\x74\x41\x70\x70\x20\x3d\x20\x6e\x65\x77\x20\x56\x75\x65\x28\x7b\x0d\x0a\x20\x20\x20\x20\x65\x6c\x3a\x20\x27\x23\x61\x70\x70\x27\x2c\x0d\x0a\x20\x20\x20\x20\x64\x61\x74\x61\x3a\x0d\x0a\x20\x20\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x65\x6e\x74\x72\x69\x65\x73\x3a\x20\x5b\x5d\x2c\x0d\x0a\x20\x20\x20\x20\x7d\x0d\x0a\x20\x20\x7d" -"\x29\x0d\x0a\x00\x00\x00\x00\x00\x2f\x2a\x21\x0d\x0a\x20\x2a\x20\x56\x75\x65\x2e\x6a\x73\x20\x76\x32\x2e\x36\x2e\x31\x34\x0d\x0a\x20\x2a\x20\x28\x63\x29\x20\x32\x30\x31\x34\x2d\x32\x30\x32\x31\x20\x45\x76\x61\x6e\x20\x59\x6f\x75\x0d\x0a\x20\x2a\x20\x52\x65\x6c\x65\x61\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74\x68\x65\x20\x4d\x49\x54\x20\x4c\x69\x63\x65\x6e\x73\x65\x2e\x0d\x0a\x20\x2a\x2f\x0d\x0a" -"\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x78\x70\x6f\x72\x74\x73\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x6d\x6f\x64\x75\x6c\x65\x3f\x6d\x6f\x64\x75\x6c\x65\x2e\x65\x78\x70\x6f\x72\x74\x73\x3d\x74\x28\x29\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74" -"\x79\x70\x65\x6f\x66\x20\x64\x65\x66\x69\x6e\x65\x26\x26\x64\x65\x66\x69\x6e\x65\x2e\x61\x6d\x64\x3f\x64\x65\x66\x69\x6e\x65\x28\x74\x29\x3a\x28\x65\x3d\x65\x7c\x7c\x73\x65\x6c\x66\x29\x2e\x56\x75\x65\x3d\x74\x28\x29\x7d\x28\x74\x68\x69\x73\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x22\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74\x22\x3b\x76\x61\x72\x20\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x66\x72" -"\x65\x65\x7a\x65\x28\x7b\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x21\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x30\x3d\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x20\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7c\x7c\x22\x6e\x75\x6d\x62\x65\x72\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7c\x7c\x22\x73\x79\x6d\x62\x6f\x6c\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7c\x7c\x22\x62\x6f\x6f\x6c\x65\x61\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7d\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x20\x6f\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x21\x3d\x3d\x65\x26\x26\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7d\x76\x61\x72\x20\x61\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x73\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5b\x6f\x62" -"\x6a\x65\x63\x74\x20\x4f\x62\x6a\x65\x63\x74\x5d\x22\x3d\x3d\x3d\x61\x2e\x63\x61\x6c\x6c\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x70\x61\x72\x73\x65\x46\x6c\x6f\x61\x74\x28\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3e\x3d\x30\x26\x26\x4d\x61\x74\x68\x2e\x66\x6c\x6f\x6f\x72\x28\x74\x29\x3d\x3d\x3d\x74\x26\x26" -"\x69\x73\x46\x69\x6e\x69\x74\x65\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x65\x29\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x2e\x74\x68\x65\x6e\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x2e\x63\x61\x74\x63\x68\x7d\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x20\x6c\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x65\x3f\x22\x22\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x7c\x7c\x73\x28\x65\x29\x26\x26\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x3d\x3d\x3d\x61\x3f\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x65\x2c\x6e\x75\x6c\x6c\x2c\x32\x29\x3a\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x7d\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x70\x61\x72\x73\x65\x46\x6c\x6f\x61\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x73\x4e\x61\x4e\x28\x74\x29\x3f\x65\x3a\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72" -"\x3d\x65\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x22\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x6e\x5b\x72\x5b\x69\x5d\x5d\x3d\x21\x30\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x5b\x65\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x5d\x7d\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e" -"\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x5b\x65\x5d\x7d\x7d\x76\x61\x72\x20\x64\x3d\x70\x28\x22\x73\x6c\x6f\x74\x2c\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x22\x2c\x21\x30\x29\x2c\x76\x3d\x70\x28\x22\x6b\x65\x79\x2c\x72\x65\x66\x2c\x73\x6c\x6f\x74\x2c\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x2c\x69\x73\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65" -"\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3b\x69\x66\x28\x6e\x3e\x2d\x31\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x70\x6c\x69\x63\x65\x28\x6e\x2c\x31\x29\x7d\x7d\x76\x61\x72\x20\x6d\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x68\x61\x73\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79\x3b\x66\x75\x6e\x63" -"\x74\x69\x6f\x6e\x20\x79\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6d\x2e\x63\x61\x6c\x6c\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x5b\x6e" -"\x5d\x7c\x7c\x28\x74\x5b\x6e\x5d\x3d\x65\x28\x6e\x29\x29\x7d\x7d\x76\x61\x72\x20\x5f\x3d\x2f\x2d\x28\x5c\x77\x29\x2f\x67\x2c\x62\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x5f\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x74\x2e\x74\x6f\x55\x70\x70\x65\x72\x43\x61" -"\x73\x65\x28\x29\x3a\x22\x22\x7d\x29\x7d\x29\x2c\x24\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2e\x74\x6f\x55\x70\x70\x65\x72\x43\x61\x73\x65\x28\x29\x2b\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x7d\x29\x2c\x77\x3d\x2f\x5c\x42\x28\x5b\x41\x2d\x5a\x5d\x29\x2f\x67\x2c\x43\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x77\x2c\x22\x2d\x24\x31\x22\x29\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x7d\x29\x3b\x76\x61\x72\x20\x78\x3d\x46\x75\x6e\x63\x74\x69\x6f\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x62\x69\x6e\x64\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e" -"\x62\x69\x6e\x64\x28\x74\x29\x7d\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x3f\x72\x3e\x31\x3f\x65\x2e\x61\x70\x70\x6c\x79\x28\x74\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x3a\x65\x2e\x63\x61\x6c\x6c" -"\x28\x74\x2c\x6e\x29\x3a\x65\x2e\x63\x61\x6c\x6c\x28\x74\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x6c\x65\x6e\x67\x74\x68\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x6e\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x28\x65\x2c\x74\x29\x7b\x74\x3d\x74\x7c\x7c\x30\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x74\x2c\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79" -"\x28\x6e\x29\x3b\x6e\x2d\x2d\x3b\x29\x72\x5b\x6e\x5d\x3d\x65\x5b\x6e\x2b\x74\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x65\x5b\x6e\x5d\x3d\x74\x5b\x6e\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61" -"\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x65\x5b\x6e\x5d\x26\x26\x41\x28\x74\x2c\x65\x5b\x6e\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x7d\x76\x61\x72\x20\x54\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x31" -"\x7d\x2c\x4e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x3d\x3d\x3d\x74\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x76\x61\x72\x20\x6e\x3d\x6f\x28\x65\x29\x2c\x72\x3d\x6f\x28\x74\x29\x3b\x69\x66\x28\x21\x6e\x7c\x7c\x21\x72\x29\x72\x65\x74\x75\x72\x6e\x21\x6e\x26\x26\x21\x72" -"\x26\x26\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x3d\x3d\x3d\x53\x74\x72\x69\x6e\x67\x28\x74\x29\x3b\x74\x72\x79\x7b\x76\x61\x72\x20\x69\x3d\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x2c\x61\x3d\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x3b\x69\x66\x28\x69\x26\x26\x61\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x3d\x3d\x74\x2e\x6c\x65" -"\x6e\x67\x74\x68\x26\x26\x65\x2e\x65\x76\x65\x72\x79\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x45\x28\x65\x2c\x74\x5b\x6e\x5d\x29\x7d\x29\x3b\x69\x66\x28\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x44\x61\x74\x65\x26\x26\x74\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x44\x61\x74\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x67\x65\x74\x54" -"\x69\x6d\x65\x28\x29\x3d\x3d\x3d\x74\x2e\x67\x65\x74\x54\x69\x6d\x65\x28\x29\x3b\x69\x66\x28\x69\x7c\x7c\x61\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x76\x61\x72\x20\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x63\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x3d\x3d\x63\x2e\x6c\x65\x6e\x67\x74" -"\x68\x26\x26\x73\x2e\x65\x76\x65\x72\x79\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x45\x28\x65\x5b\x6e\x5d\x2c\x74\x5b\x6e\x5d\x29\x7d\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67" -"\x74\x68\x3b\x6e\x2b\x2b\x29\x69\x66\x28\x45\x28\x65\x5b\x6e\x5d\x2c\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x3b\x72\x65\x74\x75\x72\x6e\x2d\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x21\x31\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x7c\x7c\x28\x74\x3d\x21\x30\x2c\x65\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73" -"\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x29\x7d\x7d\x76\x61\x72\x20\x4c\x3d\x22\x64\x61\x74\x61\x2d\x73\x65\x72\x76\x65\x72\x2d\x72\x65\x6e\x64\x65\x72\x65\x64\x22\x2c\x49\x3d\x5b\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x22\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x22\x2c\x22\x66\x69\x6c\x74\x65\x72\x22\x5d\x2c\x4d\x3d\x5b\x22\x62\x65\x66\x6f\x72\x65\x43\x72\x65\x61\x74\x65\x22\x2c\x22\x63" -"\x72\x65\x61\x74\x65\x64\x22\x2c\x22\x62\x65\x66\x6f\x72\x65\x4d\x6f\x75\x6e\x74\x22\x2c\x22\x6d\x6f\x75\x6e\x74\x65\x64\x22\x2c\x22\x62\x65\x66\x6f\x72\x65\x55\x70\x64\x61\x74\x65\x22\x2c\x22\x75\x70\x64\x61\x74\x65\x64\x22\x2c\x22\x62\x65\x66\x6f\x72\x65\x44\x65\x73\x74\x72\x6f\x79\x22\x2c\x22\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x22\x2c\x22\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x2c\x22\x64\x65" -"\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x2c\x22\x65\x72\x72\x6f\x72\x43\x61\x70\x74\x75\x72\x65\x64\x22\x2c\x22\x73\x65\x72\x76\x65\x72\x50\x72\x65\x66\x65\x74\x63\x68\x22\x5d\x2c\x46\x3d\x7b\x6f\x70\x74\x69\x6f\x6e\x4d\x65\x72\x67\x65\x53\x74\x72\x61\x74\x65\x67\x69\x65\x73\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x73\x69\x6c\x65\x6e\x74\x3a\x21\x31\x2c" -"\x70\x72\x6f\x64\x75\x63\x74\x69\x6f\x6e\x54\x69\x70\x3a\x21\x31\x2c\x64\x65\x76\x74\x6f\x6f\x6c\x73\x3a\x21\x31\x2c\x70\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x3a\x21\x31\x2c\x65\x72\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x3a\x6e\x75\x6c\x6c\x2c\x77\x61\x72\x6e\x48\x61\x6e\x64\x6c\x65\x72\x3a\x6e\x75\x6c\x6c\x2c\x69\x67\x6e\x6f\x72\x65\x64\x45\x6c\x65\x6d\x65\x6e\x74\x73\x3a\x5b\x5d\x2c\x6b\x65" -"\x79\x43\x6f\x64\x65\x73\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3a\x54\x2c\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x41\x74\x74\x72\x3a\x54\x2c\x69\x73\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x3a\x54\x2c\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x3a\x53\x2c\x70\x61\x72" -"\x73\x65\x50\x6c\x61\x74\x66\x6f\x72\x6d\x54\x61\x67\x4e\x61\x6d\x65\x3a\x4e\x2c\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x3a\x54\x2c\x61\x73\x79\x6e\x63\x3a\x21\x30\x2c\x5f\x6c\x69\x66\x65\x63\x79\x63\x6c\x65\x48\x6f\x6f\x6b\x73\x3a\x4d\x7d\x2c\x50\x3d\x2f\x61\x2d\x7a\x41\x2d\x5a\x5c\x75\x30\x30\x42\x37\x5c\x75\x30\x30\x43\x30\x2d\x5c\x75\x30\x30\x44\x36\x5c\x75\x30\x30\x44\x38\x2d\x5c\x75\x30" -"\x30\x46\x36\x5c\x75\x30\x30\x46\x38\x2d\x5c\x75\x30\x33\x37\x44\x5c\x75\x30\x33\x37\x46\x2d\x5c\x75\x31\x46\x46\x46\x5c\x75\x32\x30\x30\x43\x2d\x5c\x75\x32\x30\x30\x44\x5c\x75\x32\x30\x33\x46\x2d\x5c\x75\x32\x30\x34\x30\x5c\x75\x32\x30\x37\x30\x2d\x5c\x75\x32\x31\x38\x46\x5c\x75\x32\x43\x30\x30\x2d\x5c\x75\x32\x46\x45\x46\x5c\x75\x33\x30\x30\x31\x2d\x5c\x75\x44\x37\x46\x46\x5c\x75\x46\x39\x30\x30" -"\x2d\x5c\x75\x46\x44\x43\x46\x5c\x75\x46\x44\x46\x30\x2d\x5c\x75\x46\x46\x46\x44\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x7b\x76\x61\x6c\x75\x65\x3a\x6e\x2c\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x21\x72\x2c\x77\x72\x69\x74\x61\x62\x6c\x65" -"\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x7d\x29\x7d\x76\x61\x72\x20\x48\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5b\x5e\x22\x2b\x50\x2e\x73\x6f\x75\x72\x63\x65\x2b\x22\x2e\x24\x5f\x5c\x5c\x64\x5d\x22\x29\x3b\x76\x61\x72\x20\x42\x2c\x55\x3d\x22\x5f\x5f\x70\x72\x6f\x74\x6f\x5f\x5f\x22\x69\x6e\x7b\x7d\x2c\x56\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64" -"\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x77\x69\x6e\x64\x6f\x77\x2c\x7a\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x57\x58\x45\x6e\x76\x69\x72\x6f\x6e\x6d\x65\x6e\x74\x26\x26\x21\x21\x57\x58\x45\x6e\x76\x69\x72\x6f\x6e\x6d\x65\x6e\x74\x2e\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2c\x4b\x3d\x7a\x26\x26\x57\x58\x45\x6e\x76\x69\x72\x6f\x6e\x6d\x65\x6e\x74\x2e\x70\x6c" -"\x61\x74\x66\x6f\x72\x6d\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x4a\x3d\x56\x26\x26\x77\x69\x6e\x64\x6f\x77\x2e\x6e\x61\x76\x69\x67\x61\x74\x6f\x72\x2e\x75\x73\x65\x72\x41\x67\x65\x6e\x74\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x71\x3d\x4a\x26\x26\x2f\x6d\x73\x69\x65\x7c\x74\x72\x69\x64\x65\x6e\x74\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x2c\x57\x3d\x4a\x26\x26" -"\x4a\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x6d\x73\x69\x65\x20\x39\x2e\x30\x22\x29\x3e\x30\x2c\x5a\x3d\x4a\x26\x26\x4a\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x65\x64\x67\x65\x2f\x22\x29\x3e\x30\x2c\x47\x3d\x28\x4a\x26\x26\x4a\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x61\x6e\x64\x72\x6f\x69\x64\x22\x29\x2c\x4a\x26\x26\x2f\x69\x70\x68\x6f\x6e\x65\x7c\x69\x70\x61\x64\x7c\x69\x70\x6f\x64\x7c\x69\x6f" -"\x73\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x7c\x7c\x22\x69\x6f\x73\x22\x3d\x3d\x3d\x4b\x29\x2c\x58\x3d\x28\x4a\x26\x26\x2f\x63\x68\x72\x6f\x6d\x65\x5c\x2f\x5c\x64\x2b\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x2c\x4a\x26\x26\x2f\x70\x68\x61\x6e\x74\x6f\x6d\x6a\x73\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x2c\x4a\x26\x26\x4a\x2e\x6d\x61\x74\x63\x68\x28\x2f\x66\x69\x72\x65\x66\x6f\x78\x5c\x2f\x28\x5c\x64\x2b\x29" -"\x2f\x29\x29\x2c\x59\x3d\x7b\x7d\x2e\x77\x61\x74\x63\x68\x2c\x51\x3d\x21\x31\x3b\x69\x66\x28\x56\x29\x74\x72\x79\x7b\x76\x61\x72\x20\x65\x65\x3d\x7b\x7d\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x65\x2c\x22\x70\x61\x73\x73\x69\x76\x65\x22\x2c\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x51\x3d\x21\x30\x7d\x7d\x29\x2c\x77\x69" -"\x6e\x64\x6f\x77\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x74\x65\x73\x74\x2d\x70\x61\x73\x73\x69\x76\x65\x22\x2c\x6e\x75\x6c\x6c\x2c\x65\x65\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d\x76\x61\x72\x20\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x42\x26\x26\x28\x42\x3d\x21\x56\x26\x26" -"\x21\x7a\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x67\x6c\x6f\x62\x61\x6c\x26\x26\x28\x67\x6c\x6f\x62\x61\x6c\x2e\x70\x72\x6f\x63\x65\x73\x73\x26\x26\x22\x73\x65\x72\x76\x65\x72\x22\x3d\x3d\x3d\x67\x6c\x6f\x62\x61\x6c\x2e\x70\x72\x6f\x63\x65\x73\x73\x2e\x65\x6e\x76\x2e\x56\x55\x45\x5f\x45\x4e\x56\x29\x29\x2c\x42\x7d\x2c\x6e\x65\x3d\x56\x26\x26\x77\x69" -"\x6e\x64\x6f\x77\x2e\x5f\x5f\x56\x55\x45\x5f\x44\x45\x56\x54\x4f\x4f\x4c\x53\x5f\x47\x4c\x4f\x42\x41\x4c\x5f\x48\x4f\x4f\x4b\x5f\x5f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x65\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26\x26\x2f\x6e\x61\x74\x69\x76\x65\x20\x63\x6f\x64\x65\x2f\x2e\x74\x65\x73\x74\x28\x65\x2e\x74\x6f" -"\x53\x74\x72\x69\x6e\x67\x28\x29\x29\x7d\x76\x61\x72\x20\x69\x65\x2c\x6f\x65\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x53\x79\x6d\x62\x6f\x6c\x26\x26\x72\x65\x28\x53\x79\x6d\x62\x6f\x6c\x29\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x52\x65\x66\x6c\x65\x63\x74\x26\x26\x72\x65\x28\x52\x65\x66\x6c\x65\x63\x74\x2e" -"\x6f\x77\x6e\x4b\x65\x79\x73\x29\x3b\x69\x65\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x53\x65\x74\x26\x26\x72\x65\x28\x53\x65\x74\x29\x3f\x53\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x29\x7b\x74\x68\x69\x73\x2e\x73\x65\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c" -"\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x68\x61\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x30\x3d\x3d\x3d\x74\x68\x69\x73\x2e\x73\x65\x74\x5b\x65\x5d\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x61\x64\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x73\x65\x74\x5b\x65\x5d" -"\x3d\x21\x30\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x63\x6c\x65\x61\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x73\x65\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x7d\x2c\x65\x7d\x28\x29\x3b\x76\x61\x72\x20\x61\x65\x3d\x53\x2c\x73\x65\x3d\x30\x2c\x63\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69" -"\x73\x2e\x69\x64\x3d\x73\x65\x2b\x2b\x2c\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x3d\x5b\x5d\x7d\x3b\x63\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x61\x64\x64\x53\x75\x62\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x2e\x70\x75\x73\x68\x28\x65\x29\x7d\x2c\x63\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x72\x65\x6d\x6f\x76\x65\x53\x75\x62\x3d\x66\x75" -"\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x68\x28\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x2c\x65\x29\x7d\x2c\x63\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x64\x65\x70\x65\x6e\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x26\x26\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x61\x64\x64\x44\x65\x70\x28\x74\x68\x69\x73\x29\x7d\x2c\x63\x65\x2e\x70\x72\x6f\x74\x6f" -"\x74\x79\x70\x65\x2e\x6e\x6f\x74\x69\x66\x79\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x74\x3d\x30\x2c\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x65\x5b\x74\x5d\x2e\x75\x70\x64\x61\x74\x65\x28\x29\x7d\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x6e" -"\x75\x6c\x6c\x3b\x76\x61\x72\x20\x75\x65\x3d\x5b\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x65\x28\x65\x29\x7b\x75\x65\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x65\x28\x29\x7b\x75\x65\x2e\x70\x6f\x70\x28\x29\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x75\x65\x5b\x75\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d" -"\x7d\x76\x61\x72\x20\x70\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x29\x7b\x74\x68\x69\x73\x2e\x74\x61\x67\x3d\x65\x2c\x74\x68\x69\x73\x2e\x64\x61\x74\x61\x3d\x74\x2c\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x74\x65\x78\x74\x3d\x72\x2c\x74\x68\x69\x73\x2e\x65\x6c\x6d\x3d\x69\x2c\x74\x68\x69\x73" -"\x2e\x6e\x73\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x63\x6f\x6e\x74\x65\x78\x74\x3d\x6f\x2c\x74\x68\x69\x73\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79" -"\x3d\x74\x26\x26\x74\x2e\x6b\x65\x79\x2c\x74\x68\x69\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x61\x2c\x74\x68\x69\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x70\x61\x72\x65\x6e\x74\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x72\x61\x77\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e" -"\x69\x73\x53\x74\x61\x74\x69\x63\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x52\x6f\x6f\x74\x49\x6e\x73\x65\x72\x74\x3d\x21\x30\x2c\x74\x68\x69\x73\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x43\x6c\x6f\x6e\x65\x64\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x4f\x6e\x63\x65\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79" -"\x3d\x73\x2c\x74\x68\x69\x73\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x3d\x21\x31\x7d\x2c\x64\x65\x3d\x7b\x63\x68\x69\x6c\x64\x3a\x7b\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x7d\x7d\x3b\x64\x65\x2e\x63\x68\x69\x6c\x64\x2e\x67\x65\x74\x3d\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7d\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x69\x65\x73\x28\x70\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x64\x65\x29\x3b\x76\x61\x72\x20\x76\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x6f\x69" -"\x64\x20\x30\x3d\x3d\x3d\x65\x26\x26\x28\x65\x3d\x22\x22\x29\x3b\x76\x61\x72\x20\x74\x3d\x6e\x65\x77\x20\x70\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x74\x65\x78\x74\x3d\x65\x2c\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x21\x30\x2c\x74\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x65\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x70\x65\x28\x76\x6f\x69\x64\x20\x30\x2c\x76" -"\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x65\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x6e\x65\x77\x20\x70\x65\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x64\x61\x74\x61\x2c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x26\x26\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x65\x2e\x74\x65" -"\x78\x74\x2c\x65\x2e\x65\x6c\x6d\x2c\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x2c\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x6e\x73\x3d\x65\x2e\x6e\x73\x2c\x74\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x3d\x65\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x2c\x74\x2e\x6b\x65\x79\x3d\x65" -"\x2e\x6b\x65\x79\x2c\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x2c\x74\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x65\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x2c\x74\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x65\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x2c\x74\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x3d\x65\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64" -"\x2c\x74\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x3d\x65\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x2c\x74\x2e\x69\x73\x43\x6c\x6f\x6e\x65\x64\x3d\x21\x30\x2c\x74\x7d\x76\x61\x72\x20\x79\x65\x3d\x41\x72\x72\x61\x79\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x67\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x79\x65\x29\x3b\x5b\x22\x70\x75\x73\x68\x22\x2c\x22\x70\x6f\x70\x22\x2c\x22" -"\x73\x68\x69\x66\x74\x22\x2c\x22\x75\x6e\x73\x68\x69\x66\x74\x22\x2c\x22\x73\x70\x6c\x69\x63\x65\x22\x2c\x22\x73\x6f\x72\x74\x22\x2c\x22\x72\x65\x76\x65\x72\x73\x65\x22\x5d\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x79\x65\x5b\x65\x5d\x3b\x52\x28\x67\x65\x2c\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61" -"\x72\x20\x6e\x3d\x5b\x5d\x2c\x72\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x6e\x5b\x72\x5d\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x5b\x72\x5d\x3b\x76\x61\x72\x20\x69\x2c\x6f\x3d\x74\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x6e\x29\x2c\x61\x3d\x74\x68\x69\x73\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3b\x73\x77\x69\x74\x63\x68\x28\x65\x29\x7b\x63\x61\x73" -"\x65\x22\x70\x75\x73\x68\x22\x3a\x63\x61\x73\x65\x22\x75\x6e\x73\x68\x69\x66\x74\x22\x3a\x69\x3d\x6e\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x22\x73\x70\x6c\x69\x63\x65\x22\x3a\x69\x3d\x6e\x2e\x73\x6c\x69\x63\x65\x28\x32\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x69\x26\x26\x61\x2e\x6f\x62\x73\x65\x72\x76\x65\x41\x72\x72\x61\x79\x28\x69\x29\x2c\x61\x2e\x64\x65\x70\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29" -"\x2c\x6f\x7d\x29\x7d\x29\x3b\x76\x61\x72\x20\x5f\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x67\x65\x74\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79\x4e\x61\x6d\x65\x73\x28\x67\x65\x29\x2c\x62\x65\x3d\x21\x30\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x65\x28\x65\x29\x7b\x62\x65\x3d\x65\x7d\x76\x61\x72\x20\x77\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x74\x68\x69\x73" -"\x2e\x76\x61\x6c\x75\x65\x3d\x65\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x3d\x6e\x65\x77\x20\x63\x65\x2c\x74\x68\x69\x73\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x3d\x30\x2c\x52\x28\x65\x2c\x22\x5f\x5f\x6f\x62\x5f\x5f\x22\x2c\x74\x68\x69\x73\x29\x2c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x28\x55\x3f\x28\x74\x3d\x67\x65\x2c\x65\x2e\x5f\x5f\x70\x72\x6f\x74\x6f\x5f\x5f\x3d\x74\x29\x3a" -"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x5b\x72\x5d\x3b\x52\x28\x65\x2c\x6f\x2c\x74\x5b\x6f\x5d\x29\x7d\x7d\x28\x65\x2c\x67\x65\x2c\x5f\x65\x29\x2c\x74\x68\x69\x73\x2e\x6f\x62\x73\x65\x72\x76\x65\x41\x72\x72\x61\x79\x28" -"\x65\x29\x29\x3a\x74\x68\x69\x73\x2e\x77\x61\x6c\x6b\x28\x65\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x65\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3b\x69\x66\x28\x6f\x28\x65\x29\x26\x26\x21\x28\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x79\x28\x65\x2c\x22\x5f\x5f\x6f\x62\x5f\x5f\x22\x29\x26\x26\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x20" -"\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x77\x65\x3f\x6e\x3d\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3a\x62\x65\x26\x26\x21\x74\x65\x28\x29\x26\x26\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x7c\x7c\x73\x28\x65\x29\x29\x26\x26\x4f\x62\x6a\x65\x63\x74\x2e\x69\x73\x45\x78\x74\x65\x6e\x73\x69\x62\x6c\x65\x28\x65\x29\x26\x26\x21\x65\x2e\x5f\x69\x73\x56\x75\x65\x26\x26\x28\x6e\x3d" -"\x6e\x65\x77\x20\x77\x65\x28\x65\x29\x29\x2c\x74\x26\x26\x6e\x26\x26\x6e\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x2b\x2b\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x65\x77\x20\x63\x65\x2c\x61\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x67\x65\x74\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79\x44\x65\x73\x63\x72\x69\x70\x74\x6f\x72" -"\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x21\x61\x7c\x7c\x21\x31\x21\x3d\x3d\x61\x2e\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x29\x7b\x76\x61\x72\x20\x73\x3d\x61\x26\x26\x61\x2e\x67\x65\x74\x2c\x63\x3d\x61\x26\x26\x61\x2e\x73\x65\x74\x3b\x73\x26\x26\x21\x63\x7c\x7c\x32\x21\x3d\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x28\x6e\x3d\x65\x5b\x74\x5d\x29\x3b\x76\x61" -"\x72\x20\x75\x3d\x21\x69\x26\x26\x43\x65\x28\x6e\x29\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x7b\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x73\x3f\x73\x2e\x63\x61\x6c\x6c" -"\x28\x65\x29\x3a\x6e\x3b\x72\x65\x74\x75\x72\x6e\x20\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x26\x26\x28\x6f\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x75\x26\x26\x28\x75\x2e\x64\x65\x70\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x76\x6f\x69" -"\x64\x20\x30\x2c\x72\x3d\x30\x2c\x69\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x28\x6e\x3d\x74\x5b\x72\x5d\x29\x26\x26\x6e\x2e\x5f\x5f\x6f\x62\x5f\x5f\x26\x26\x6e\x2e\x5f\x5f\x6f\x62\x5f\x5f\x2e\x64\x65\x70\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x26\x26\x65\x28\x6e\x29\x7d\x28\x74\x29\x29\x29\x2c\x74\x7d" -"\x2c\x73\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x73\x3f\x73\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x6e\x3b\x74\x3d\x3d\x3d\x72\x7c\x7c\x74\x21\x3d\x74\x26\x26\x72\x21\x3d\x72\x7c\x7c\x73\x26\x26\x21\x63\x7c\x7c\x28\x63\x3f\x63\x2e\x63\x61\x6c\x6c\x28\x65\x2c\x74\x29\x3a\x6e\x3d\x74\x2c\x75\x3d\x21\x69\x26\x26\x43\x65\x28\x74\x29\x2c\x6f\x2e\x6e\x6f\x74\x69" -"\x66\x79\x28\x29\x29\x7d\x7d\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x26\x26\x63\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x4d\x61\x74\x68\x2e\x6d\x61\x78\x28\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x74\x29\x2c\x65\x2e\x73\x70\x6c\x69\x63\x65" -"\x28\x74\x2c\x31\x2c\x6e\x29\x2c\x6e\x3b\x69\x66\x28\x74\x20\x69\x6e\x20\x65\x26\x26\x21\x28\x74\x20\x69\x6e\x20\x4f\x62\x6a\x65\x63\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x3d\x6e\x2c\x6e\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x5f\x69\x73\x56\x75\x65\x7c\x7c\x72\x26\x26\x72\x2e\x76" -"\x6d\x43\x6f\x75\x6e\x74\x3f\x6e\x3a\x72\x3f\x28\x78\x65\x28\x72\x2e\x76\x61\x6c\x75\x65\x2c\x74\x2c\x6e\x29\x2c\x72\x2e\x64\x65\x70\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29\x2c\x6e\x29\x3a\x28\x65\x5b\x74\x5d\x3d\x6e\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x65\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x26\x26\x63\x28\x74\x29\x29" -"\x65\x2e\x73\x70\x6c\x69\x63\x65\x28\x74\x2c\x31\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3b\x65\x2e\x5f\x69\x73\x56\x75\x65\x7c\x7c\x6e\x26\x26\x6e\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x7c\x7c\x79\x28\x65\x2c\x74\x29\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x65\x5b\x74\x5d\x2c\x6e\x26\x26\x6e\x2e\x64\x65\x70\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29\x29\x7d\x7d\x77" -"\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x77\x61\x6c\x6b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x6e\x3d\x30\x3b\x6e\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x78\x65\x28\x65\x2c\x74\x5b\x6e\x5d\x29\x7d\x2c\x77\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x6f\x62" -"\x73\x65\x72\x76\x65\x41\x72\x72\x61\x79\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x2c\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x43\x65\x28\x65\x5b\x74\x5d\x29\x7d\x3b\x76\x61\x72\x20\x4f\x65\x3d\x46\x2e\x6f\x70\x74\x69\x6f\x6e\x4d\x65\x72\x67\x65\x53\x74\x72\x61\x74\x65\x67\x69\x65\x73\x3b\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x53\x65\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x2c\x6f\x3d\x6f\x65\x3f\x52\x65\x66\x6c\x65\x63\x74\x2e\x6f\x77\x6e\x4b\x65\x79\x73\x28\x74\x29\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2c\x61\x3d\x30\x3b\x61\x3c\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x61\x2b\x2b\x29\x22" -"\x5f\x5f\x6f\x62\x5f\x5f\x22\x21\x3d\x3d\x28\x6e\x3d\x6f\x5b\x61\x5d\x29\x26\x26\x28\x72\x3d\x65\x5b\x6e\x5d\x2c\x69\x3d\x74\x5b\x6e\x5d\x2c\x79\x28\x65\x2c\x6e\x29\x3f\x72\x21\x3d\x3d\x69\x26\x26\x73\x28\x72\x29\x26\x26\x73\x28\x69\x29\x26\x26\x53\x65\x28\x72\x2c\x69\x29\x3a\x6b\x65\x28\x65\x2c\x6e\x2c\x69\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x54\x65" -"\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x72\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x2e\x63\x61\x6c\x6c\x28\x6e\x2c\x6e\x29\x3a\x74\x2c\x69\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x2e\x63\x61\x6c\x6c\x28\x6e" -"\x2c\x6e\x29\x3a\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x3f\x53\x65\x28\x72\x2c\x69\x29\x3a\x69\x7d\x3a\x74\x3f\x65\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x53\x65\x28\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2c\x74\x68\x69\x73\x29\x3a\x74\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2c\x74\x68\x69\x73\x29\x3a\x65\x29\x7d\x3a\x74\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4e\x65\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x65\x3f\x65\x2e\x63\x6f\x6e\x63\x61\x74\x28\x74\x29\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x3f\x74\x3a\x5b\x74\x5d" -"\x3a\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x5b\x5d\x2c\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x2d\x31\x3d\x3d\x3d\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x65\x5b\x6e\x5d\x29\x26\x26\x74\x2e\x70\x75\x73\x68\x28\x65\x5b\x6e\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d" -"\x28\x6e\x29\x3a\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x7c\x7c\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x41\x28\x69\x2c\x74\x29\x3a\x69\x7d\x4f\x65\x2e\x64\x61\x74\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65" -"\x74\x75\x72\x6e\x20\x6e\x3f\x54\x65\x28\x65\x2c\x74\x2c\x6e\x29\x3a\x74\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x65\x3a\x54\x65\x28\x65\x2c\x74\x29\x7d\x2c\x4d\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x4f\x65\x5b\x65\x5d\x3d\x4e\x65\x7d\x29\x2c\x49\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x28\x65\x29\x7b\x4f\x65\x5b\x65\x2b\x22\x73\x22\x5d\x3d\x45\x65\x7d\x29\x2c\x4f\x65\x2e\x77\x61\x74\x63\x68\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x65\x3d\x3d\x3d\x59\x26\x26\x28\x65\x3d\x76\x6f\x69\x64\x20\x30\x29\x2c\x74\x3d\x3d\x3d\x59\x26\x26\x28\x74\x3d\x76\x6f\x69\x64\x20\x30\x29\x2c\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x4f\x62" -"\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x7c\x7c\x6e\x75\x6c\x6c\x29\x3b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x3b\x76\x61\x72\x20\x69\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x41\x28\x69\x2c\x65\x29\x2c\x74\x29\x7b\x76\x61\x72\x20\x61\x3d\x69\x5b\x6f\x5d\x2c\x73\x3d\x74\x5b\x6f\x5d\x3b\x61\x26\x26\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72" -"\x72\x61\x79\x28\x61\x29\x26\x26\x28\x61\x3d\x5b\x61\x5d\x29\x2c\x69\x5b\x6f\x5d\x3d\x61\x3f\x61\x2e\x63\x6f\x6e\x63\x61\x74\x28\x73\x29\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x73\x29\x3f\x73\x3a\x5b\x73\x5d\x7d\x72\x65\x74\x75\x72\x6e\x20\x69\x7d\x2c\x4f\x65\x2e\x70\x72\x6f\x70\x73\x3d\x4f\x65\x2e\x6d\x65\x74\x68\x6f\x64\x73\x3d\x4f\x65\x2e\x69\x6e\x6a\x65\x63\x74\x3d\x4f\x65" -"\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x3b\x76\x61\x72\x20\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x41\x28\x69\x2c\x65\x29\x2c\x74\x26\x26\x41\x28\x69\x2c\x74\x29\x2c\x69\x7d\x2c\x4f\x65\x2e\x70" -"\x72\x6f\x76\x69\x64\x65\x3d\x54\x65\x3b\x76\x61\x72\x20\x6a\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x74\x3f\x65\x3a\x74\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x26\x26\x28\x74" -"\x3d\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x2c\x6f\x3d\x7b\x7d\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x29\x66\x6f\x72\x28\x72\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x22" -"\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x28\x69\x3d\x6e\x5b\x72\x5d\x29\x26\x26\x28\x6f\x5b\x62\x28\x69\x29\x5d\x3d\x7b\x74\x79\x70\x65\x3a\x6e\x75\x6c\x6c\x7d\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x20\x69\x6e\x20\x6e\x29\x69\x3d\x6e\x5b\x61\x5d\x2c\x6f\x5b\x62\x28\x61\x29\x5d\x3d\x73\x28\x69\x29\x3f\x69\x3a\x7b\x74\x79" -"\x70\x65\x3a\x69\x7d\x3b\x65\x2e\x70\x72\x6f\x70\x73\x3d\x6f\x7d\x7d\x28\x74\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x69\x6e\x6a\x65\x63\x74\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x69\x6e\x6a\x65\x63\x74\x3d\x7b\x7d\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61" -"\x72\x20\x69\x3d\x30\x3b\x69\x3c\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x72\x5b\x6e\x5b\x69\x5d\x5d\x3d\x7b\x66\x72\x6f\x6d\x3a\x6e\x5b\x69\x5d\x7d\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x6e\x29\x7b\x76\x61\x72\x20\x61\x3d\x6e\x5b\x6f\x5d\x3b\x72\x5b\x6f\x5d\x3d\x73\x28\x61\x29\x3f\x41\x28\x7b\x66\x72\x6f\x6d\x3a\x6f" -"\x7d\x2c\x61\x29\x3a\x7b\x66\x72\x6f\x6d\x3a\x61\x7d\x7d\x7d\x7d\x28\x74\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3b\x69\x66\x28\x74\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x5b\x6e\x5d\x3b\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f" -"\x66\x20\x72\x26\x26\x28\x74\x5b\x6e\x5d\x3d\x7b\x62\x69\x6e\x64\x3a\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x72\x7d\x29\x7d\x7d\x28\x74\x29\x2c\x21\x74\x2e\x5f\x62\x61\x73\x65\x26\x26\x28\x74\x2e\x65\x78\x74\x65\x6e\x64\x73\x26\x26\x28\x65\x3d\x44\x65\x28\x65\x2c\x74\x2e\x65\x78\x74\x65\x6e\x64\x73\x2c\x6e\x29\x29\x2c\x74\x2e\x6d\x69\x78\x69\x6e\x73\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30" -"\x2c\x69\x3d\x74\x2e\x6d\x69\x78\x69\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x65\x3d\x44\x65\x28\x65\x2c\x74\x2e\x6d\x69\x78\x69\x6e\x73\x5b\x72\x5d\x2c\x6e\x29\x3b\x76\x61\x72\x20\x6f\x2c\x61\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x20\x65\x29\x63\x28\x6f\x29\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x20\x74\x29\x79\x28\x65\x2c\x6f\x29\x7c\x7c\x63\x28\x6f\x29\x3b" -"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x4f\x65\x5b\x72\x5d\x7c\x7c\x6a\x65\x3b\x61\x5b\x72\x5d\x3d\x69\x28\x65\x5b\x72\x5d\x2c\x74\x5b\x72\x5d\x2c\x6e\x2c\x72\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f" -"\x66\x20\x6e\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x74\x5d\x3b\x69\x66\x28\x79\x28\x69\x2c\x6e\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x5b\x6e\x5d\x3b\x76\x61\x72\x20\x6f\x3d\x62\x28\x6e\x29\x3b\x69\x66\x28\x79\x28\x69\x2c\x6f\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x5b\x6f\x5d\x3b\x76\x61\x72\x20\x61\x3d\x24\x28\x6f\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x79\x28\x69\x2c\x61\x29\x3f\x69\x5b\x61\x5d" -"\x3a\x69\x5b\x6e\x5d\x7c\x7c\x69\x5b\x6f\x5d\x7c\x7c\x69\x5b\x61\x5d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x49\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x74\x5b\x65\x5d\x2c\x6f\x3d\x21\x79\x28\x6e\x2c\x65\x29\x2c\x61\x3d\x6e\x5b\x65\x5d\x2c\x73\x3d\x52\x65\x28\x42\x6f\x6f\x6c\x65\x61\x6e\x2c\x69\x2e\x74\x79\x70\x65\x29\x3b\x69\x66\x28\x73\x3e\x2d\x31\x29\x69\x66\x28" -"\x6f\x26\x26\x21\x79\x28\x69\x2c\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x29\x29\x61\x3d\x21\x31\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x22\x3d\x3d\x3d\x61\x7c\x7c\x61\x3d\x3d\x3d\x43\x28\x65\x29\x29\x7b\x76\x61\x72\x20\x63\x3d\x52\x65\x28\x53\x74\x72\x69\x6e\x67\x2c\x69\x2e\x74\x79\x70\x65\x29\x3b\x28\x63\x3c\x30\x7c\x7c\x73\x3c\x63\x29\x26\x26\x28\x61\x3d\x21\x30\x29\x7d\x69\x66\x28\x76\x6f\x69\x64" -"\x20\x30\x3d\x3d\x3d\x61\x29\x7b\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x21\x79\x28\x74\x2c\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x29\x29\x72\x65\x74\x75\x72\x6e\x3b\x76\x61\x72\x20\x72\x3d\x74\x2e\x64\x65\x66\x61\x75\x6c\x74\x3b\x69\x66\x28\x65\x26\x26\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x26\x26\x76\x6f\x69\x64" -"\x20\x30\x3d\x3d\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x5b\x6e\x5d\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x65\x2e\x5f\x70\x72\x6f\x70\x73\x5b\x6e\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x5f\x70\x72\x6f\x70\x73\x5b\x6e\x5d\x3b\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x26\x26\x22\x46" -"\x75\x6e\x63\x74\x69\x6f\x6e\x22\x21\x3d\x3d\x46\x65\x28\x74\x2e\x74\x79\x70\x65\x29\x3f\x72\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x72\x7d\x28\x72\x2c\x69\x2c\x65\x29\x3b\x76\x61\x72\x20\x75\x3d\x62\x65\x3b\x24\x65\x28\x21\x30\x29\x2c\x43\x65\x28\x61\x29\x2c\x24\x65\x28\x75\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x76\x61\x72\x20\x4d\x65\x3d\x2f\x5e\x5c\x73\x2a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20" -"\x28\x5c\x77\x2b\x29\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x65\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x26\x26\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x2e\x6d\x61\x74\x63\x68\x28\x4d\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x74\x5b\x31\x5d\x3a\x22\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x50\x65\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x46\x65\x28\x65\x29" -"\x3d\x3d\x3d\x46\x65\x28\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x65\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x50\x65\x28\x74\x2c\x65\x29\x3f\x30\x3a\x2d\x31\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x2c\x72\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x3c\x72\x3b\x6e\x2b\x2b\x29\x69\x66" -"\x28\x50\x65\x28\x74\x5b\x6e\x5d\x2c\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x3b\x72\x65\x74\x75\x72\x6e\x2d\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x6c\x65\x28\x29\x3b\x74\x72\x79\x7b\x69\x66\x28\x74\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x74\x3b\x72\x3d\x72\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x24\x6f\x70" -"\x74\x69\x6f\x6e\x73\x2e\x65\x72\x72\x6f\x72\x43\x61\x70\x74\x75\x72\x65\x64\x3b\x69\x66\x28\x69\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x30\x3b\x6f\x3c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x2b\x2b\x29\x74\x72\x79\x7b\x69\x66\x28\x21\x31\x3d\x3d\x3d\x69\x5b\x6f\x5d\x2e\x63\x61\x6c\x6c\x28\x72\x2c\x65\x2c\x74\x2c\x6e\x29\x29\x72\x65\x74\x75\x72\x6e\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x55" -"\x65\x28\x65\x2c\x72\x2c\x22\x65\x72\x72\x6f\x72\x43\x61\x70\x74\x75\x72\x65\x64\x20\x68\x6f\x6f\x6b\x22\x29\x7d\x7d\x55\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x66\x65\x28\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3b\x74\x72\x79\x7b\x28\x6f\x3d\x6e\x3f\x65\x2e\x61\x70\x70\x6c\x79\x28\x74" -"\x2c\x6e\x29\x3a\x65\x2e\x63\x61\x6c\x6c\x28\x74\x29\x29\x26\x26\x21\x6f\x2e\x5f\x69\x73\x56\x75\x65\x26\x26\x75\x28\x6f\x29\x26\x26\x21\x6f\x2e\x5f\x68\x61\x6e\x64\x6c\x65\x64\x26\x26\x28\x6f\x2e\x63\x61\x74\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x65\x28\x65\x2c\x72\x2c\x69\x2b\x22\x20\x28\x50\x72\x6f\x6d\x69\x73\x65\x2f\x61\x73\x79\x6e\x63\x29" -"\x22\x29\x7d\x29\x2c\x6f\x2e\x5f\x68\x61\x6e\x64\x6c\x65\x64\x3d\x21\x30\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x48\x65\x28\x65\x2c\x72\x2c\x69\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6f\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x46\x2e\x65\x72\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x29\x74\x72\x79\x7b\x72\x65\x74\x75\x72\x6e\x20\x46\x2e\x65\x72" -"\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x2e\x63\x61\x6c\x6c\x28\x6e\x75\x6c\x6c\x2c\x65\x2c\x74\x2c\x6e\x29\x7d\x63\x61\x74\x63\x68\x28\x74\x29\x7b\x74\x21\x3d\x3d\x65\x26\x26\x56\x65\x28\x74\x2c\x6e\x75\x6c\x6c\x2c\x22\x63\x6f\x6e\x66\x69\x67\x2e\x65\x72\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x22\x29\x7d\x56\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x65\x28\x65" -"\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x21\x56\x26\x26\x21\x7a\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x29\x74\x68\x72\x6f\x77\x20\x65\x3b\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x65\x72\x72\x6f\x72\x28\x65\x29\x7d\x76\x61\x72\x20\x7a\x65\x2c\x4b\x65\x3d\x21\x31\x2c\x4a\x65\x3d\x5b\x5d\x2c\x71\x65\x3d\x21\x31\x3b\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x57\x65\x28\x29\x7b\x71\x65\x3d\x21\x31\x3b\x76\x61\x72\x20\x65\x3d\x4a\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x29\x3b\x4a\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x65\x5b\x74\x5d\x28\x29\x7d\x69\x66\x28\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f" -"\x66\x20\x50\x72\x6f\x6d\x69\x73\x65\x26\x26\x72\x65\x28\x50\x72\x6f\x6d\x69\x73\x65\x29\x29\x7b\x76\x61\x72\x20\x5a\x65\x3d\x50\x72\x6f\x6d\x69\x73\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x28\x29\x3b\x7a\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x5a\x65\x2e\x74\x68\x65\x6e\x28\x57\x65\x29\x2c\x47\x26\x26\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x53\x29\x7d\x2c\x4b\x65\x3d\x21\x30\x7d\x65" -"\x6c\x73\x65\x20\x69\x66\x28\x71\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x7c\x7c\x21\x72\x65\x28\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x29\x26\x26\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x43\x6f\x6e\x73" -"\x74\x72\x75\x63\x74\x6f\x72\x5d\x22\x21\x3d\x3d\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x29\x7a\x65\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x73\x65\x74\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x26\x26\x72\x65\x28\x73\x65\x74\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x29\x3f\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x28\x29\x7b\x73\x65\x74\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x28\x57\x65\x29\x7d\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x57\x65\x2c\x30\x29\x7d\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x47\x65\x3d\x31\x2c\x58\x65\x3d\x6e\x65\x77\x20\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x28\x57\x65\x29\x2c\x59\x65\x3d\x64\x6f\x63" -"\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x53\x74\x72\x69\x6e\x67\x28\x47\x65\x29\x29\x3b\x58\x65\x2e\x6f\x62\x73\x65\x72\x76\x65\x28\x59\x65\x2c\x7b\x63\x68\x61\x72\x61\x63\x74\x65\x72\x44\x61\x74\x61\x3a\x21\x30\x7d\x29\x2c\x7a\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x47\x65\x3d\x28\x47\x65\x2b\x31\x29\x25\x32\x2c\x59\x65\x2e\x64\x61\x74\x61" -"\x3d\x53\x74\x72\x69\x6e\x67\x28\x47\x65\x29\x7d\x2c\x4b\x65\x3d\x21\x30\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x65\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3b\x69\x66\x28\x4a\x65\x2e\x70\x75\x73\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x66\x28\x65\x29\x74\x72\x79\x7b\x65\x2e\x63\x61\x6c\x6c\x28\x74\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x48\x65\x28\x65\x2c\x74\x2c\x22" -"\x6e\x65\x78\x74\x54\x69\x63\x6b\x22\x29\x7d\x65\x6c\x73\x65\x20\x6e\x26\x26\x6e\x28\x74\x29\x7d\x29\x2c\x71\x65\x7c\x7c\x28\x71\x65\x3d\x21\x30\x2c\x7a\x65\x28\x29\x29\x2c\x21\x65\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x50\x72\x6f\x6d\x69\x73\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x50\x72\x6f\x6d\x69\x73\x65\x28\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x28\x65\x29\x7b\x6e\x3d\x65\x7d\x29\x7d\x76\x61\x72\x20\x65\x74\x3d\x6e\x65\x77\x20\x69\x65\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x74\x28\x65\x29\x7b\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x3b\x76\x61\x72\x20\x61\x3d\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x3b\x69\x66\x28\x21\x61\x26\x26\x21\x6f\x28\x74" -"\x29\x7c\x7c\x4f\x62\x6a\x65\x63\x74\x2e\x69\x73\x46\x72\x6f\x7a\x65\x6e\x28\x74\x29\x7c\x7c\x74\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x74\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x7b\x76\x61\x72\x20\x73\x3d\x74\x2e\x5f\x5f\x6f\x62\x5f\x5f\x2e\x64\x65\x70\x2e\x69\x64\x3b\x69\x66\x28\x6e\x2e\x68\x61\x73\x28\x73\x29\x29\x72\x65\x74\x75\x72\x6e\x3b" -"\x6e\x2e\x61\x64\x64\x28\x73\x29\x7d\x69\x66\x28\x61\x29\x66\x6f\x72\x28\x72\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x65\x28\x74\x5b\x72\x5d\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2c\x72\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x65\x28\x74\x5b\x69\x5b\x72\x5d\x5d\x2c\x6e\x29\x7d\x28" -"\x65\x2c\x65\x74\x29\x2c\x65\x74\x2e\x63\x6c\x65\x61\x72\x28\x29\x7d\x76\x61\x72\x20\x6e\x74\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x26\x22\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2c\x6e\x3d\x22\x7e\x22\x3d\x3d\x3d\x28\x65\x3d\x74\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x3a\x65\x29\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2c\x72" -"\x3d\x22\x21\x22\x3d\x3d\x3d\x28\x65\x3d\x6e\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x3a\x65\x29\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x6e\x61\x6d\x65\x3a\x65\x3d\x72\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x3a\x65\x2c\x6f\x6e\x63\x65\x3a\x6e\x2c\x63\x61\x70\x74\x75\x72\x65\x3a\x72\x2c\x70\x61\x73\x73\x69\x76\x65\x3a\x74\x7d\x7d\x29\x3b\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x72\x74\x28\x65\x2c\x74\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x72\x3d\x6e\x2e\x66\x6e\x73\x3b\x69\x66\x28\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x65\x28\x72\x2c\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x74\x2c\x22" -"\x76\x2d\x6f\x6e\x20\x68\x61\x6e\x64\x6c\x65\x72\x22\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x6f\x3d\x30\x3b\x6f\x3c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x2b\x2b\x29\x42\x65\x28\x69\x5b\x6f\x5d\x2c\x6e\x75\x6c\x6c\x2c\x65\x2c\x74\x2c\x22\x76\x2d\x6f\x6e\x20\x68\x61\x6e\x64\x6c\x65\x72\x22\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x66\x6e\x73\x3d" -"\x65\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x74\x28\x65\x2c\x6e\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x29\x7b\x76\x61\x72\x20\x63\x2c\x75\x2c\x6c\x2c\x66\x3b\x66\x6f\x72\x28\x63\x20\x69\x6e\x20\x65\x29\x75\x3d\x65\x5b\x63\x5d\x2c\x6c\x3d\x6e\x5b\x63\x5d\x2c\x66\x3d\x6e\x74\x28\x63\x29\x2c\x74\x28\x75\x29\x7c\x7c\x28\x74\x28\x6c\x29\x3f\x28\x74\x28\x75\x2e\x66\x6e\x73\x29\x26\x26\x28\x75\x3d" -"\x65\x5b\x63\x5d\x3d\x72\x74\x28\x75\x2c\x73\x29\x29\x2c\x72\x28\x66\x2e\x6f\x6e\x63\x65\x29\x26\x26\x28\x75\x3d\x65\x5b\x63\x5d\x3d\x61\x28\x66\x2e\x6e\x61\x6d\x65\x2c\x75\x2c\x66\x2e\x63\x61\x70\x74\x75\x72\x65\x29\x29\x2c\x69\x28\x66\x2e\x6e\x61\x6d\x65\x2c\x75\x2c\x66\x2e\x63\x61\x70\x74\x75\x72\x65\x2c\x66\x2e\x70\x61\x73\x73\x69\x76\x65\x2c\x66\x2e\x70\x61\x72\x61\x6d\x73\x29\x29\x3a\x75\x21" -"\x3d\x3d\x6c\x26\x26\x28\x6c\x2e\x66\x6e\x73\x3d\x75\x2c\x65\x5b\x63\x5d\x3d\x6c\x29\x29\x3b\x66\x6f\x72\x28\x63\x20\x69\x6e\x20\x6e\x29\x74\x28\x65\x5b\x63\x5d\x29\x26\x26\x6f\x28\x28\x66\x3d\x6e\x74\x28\x63\x29\x29\x2e\x6e\x61\x6d\x65\x2c\x6e\x5b\x63\x5d\x2c\x66\x2e\x63\x61\x70\x74\x75\x72\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x74\x28\x65\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61" -"\x3b\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x26\x26\x28\x65\x3d\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x7c\x7c\x28\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x3d\x7b\x7d\x29\x29\x3b\x76\x61\x72\x20\x73\x3d\x65\x5b\x69\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x28\x29\x7b\x6f\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x2c" -"\x68\x28\x61\x2e\x66\x6e\x73\x2c\x63\x29\x7d\x74\x28\x73\x29\x3f\x61\x3d\x72\x74\x28\x5b\x63\x5d\x29\x3a\x6e\x28\x73\x2e\x66\x6e\x73\x29\x26\x26\x72\x28\x73\x2e\x6d\x65\x72\x67\x65\x64\x29\x3f\x28\x61\x3d\x73\x29\x2e\x66\x6e\x73\x2e\x70\x75\x73\x68\x28\x63\x29\x3a\x61\x3d\x72\x74\x28\x5b\x73\x2c\x63\x5d\x29\x2c\x61\x2e\x6d\x65\x72\x67\x65\x64\x3d\x21\x30\x2c\x65\x5b\x69\x5d\x3d\x61\x7d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x20\x61\x74\x28\x65\x2c\x74\x2c\x72\x2c\x69\x2c\x6f\x29\x7b\x69\x66\x28\x6e\x28\x74\x29\x29\x7b\x69\x66\x28\x79\x28\x74\x2c\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x72\x5d\x3d\x74\x5b\x72\x5d\x2c\x6f\x7c\x7c\x64\x65\x6c\x65\x74\x65\x20\x74\x5b\x72\x5d\x2c\x21\x30\x3b\x69\x66\x28\x79\x28\x74\x2c\x69\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x72\x5d\x3d\x74\x5b\x69\x5d" -"\x2c\x6f\x7c\x7c\x64\x65\x6c\x65\x74\x65\x20\x74\x5b\x69\x5d\x2c\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x73\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x69\x28\x65\x29\x3f\x5b\x68\x65\x28\x65\x29\x5d\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x6f\x2c\x61\x29\x7b\x76\x61\x72\x20" -"\x73\x3d\x5b\x5d\x3b\x76\x61\x72\x20\x63\x2c\x75\x2c\x6c\x2c\x66\x3b\x66\x6f\x72\x28\x63\x3d\x30\x3b\x63\x3c\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x63\x2b\x2b\x29\x74\x28\x75\x3d\x6f\x5b\x63\x5d\x29\x7c\x7c\x22\x62\x6f\x6f\x6c\x65\x61\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x75\x7c\x7c\x28\x6c\x3d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x66\x3d\x73\x5b\x6c\x5d\x2c\x41\x72\x72\x61\x79\x2e\x69" -"\x73\x41\x72\x72\x61\x79\x28\x75\x29\x3f\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x30\x26\x26\x28\x63\x74\x28\x28\x75\x3d\x65\x28\x75\x2c\x28\x61\x7c\x7c\x22\x22\x29\x2b\x22\x5f\x22\x2b\x63\x29\x29\x5b\x30\x5d\x29\x26\x26\x63\x74\x28\x66\x29\x26\x26\x28\x73\x5b\x6c\x5d\x3d\x68\x65\x28\x66\x2e\x74\x65\x78\x74\x2b\x75\x5b\x30\x5d\x2e\x74\x65\x78\x74\x29\x2c\x75\x2e\x73\x68\x69\x66\x74\x28\x29\x29\x2c\x73" -"\x2e\x70\x75\x73\x68\x2e\x61\x70\x70\x6c\x79\x28\x73\x2c\x75\x29\x29\x3a\x69\x28\x75\x29\x3f\x63\x74\x28\x66\x29\x3f\x73\x5b\x6c\x5d\x3d\x68\x65\x28\x66\x2e\x74\x65\x78\x74\x2b\x75\x29\x3a\x22\x22\x21\x3d\x3d\x75\x26\x26\x73\x2e\x70\x75\x73\x68\x28\x68\x65\x28\x75\x29\x29\x3a\x63\x74\x28\x75\x29\x26\x26\x63\x74\x28\x66\x29\x3f\x73\x5b\x6c\x5d\x3d\x68\x65\x28\x66\x2e\x74\x65\x78\x74\x2b\x75\x2e\x74" -"\x65\x78\x74\x29\x3a\x28\x72\x28\x6f\x2e\x5f\x69\x73\x56\x4c\x69\x73\x74\x29\x26\x26\x6e\x28\x75\x2e\x74\x61\x67\x29\x26\x26\x74\x28\x75\x2e\x6b\x65\x79\x29\x26\x26\x6e\x28\x61\x29\x26\x26\x28\x75\x2e\x6b\x65\x79\x3d\x22\x5f\x5f\x76\x6c\x69\x73\x74\x22\x2b\x61\x2b\x22\x5f\x22\x2b\x63\x2b\x22\x5f\x5f\x22\x29\x2c\x73\x2e\x70\x75\x73\x68\x28\x75\x29\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x7d\x28" -"\x65\x29\x3a\x76\x6f\x69\x64\x20\x30\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x65\x29\x26\x26\x6e\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x21\x31\x3d\x3d\x3d\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x4f" -"\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x6f\x65\x3f\x52\x65\x66\x6c\x65\x63\x74\x2e\x6f\x77\x6e\x4b\x65\x79\x73\x28\x65\x29\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x72\x5b\x69\x5d\x3b\x69\x66\x28\x22\x5f\x5f\x6f\x62\x5f\x5f\x22" -"\x21\x3d\x3d\x6f\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x3d\x65\x5b\x6f\x5d\x2e\x66\x72\x6f\x6d\x2c\x73\x3d\x74\x3b\x73\x3b\x29\x7b\x69\x66\x28\x73\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x26\x26\x79\x28\x73\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x2c\x61\x29\x29\x7b\x6e\x5b\x6f\x5d\x3d\x73\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x5b\x61\x5d\x3b\x62\x72\x65\x61\x6b\x7d\x73\x3d\x73\x2e\x24\x70" -"\x61\x72\x65\x6e\x74\x7d\x69\x66\x28\x21\x73\x26\x26\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x69\x6e\x20\x65\x5b\x6f\x5d\x29\x7b\x76\x61\x72\x20\x63\x3d\x65\x5b\x6f\x5d\x2e\x64\x65\x66\x61\x75\x6c\x74\x3b\x6e\x5b\x6f\x5d\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x63\x3f\x63\x2e\x63\x61\x6c\x6c\x28\x74\x29\x3a\x63\x7d\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x7d" -"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x65\x7c\x7c\x21\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x72\x65\x74\x75\x72\x6e\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x7b\x7d\x2c\x72\x3d\x30\x2c\x69\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x5b\x72\x5d\x2c\x61\x3d\x6f\x2e\x64\x61\x74\x61\x3b" -"\x69\x66\x28\x61\x26\x26\x61\x2e\x61\x74\x74\x72\x73\x26\x26\x61\x2e\x61\x74\x74\x72\x73\x2e\x73\x6c\x6f\x74\x26\x26\x64\x65\x6c\x65\x74\x65\x20\x61\x2e\x61\x74\x74\x72\x73\x2e\x73\x6c\x6f\x74\x2c\x6f\x2e\x63\x6f\x6e\x74\x65\x78\x74\x21\x3d\x3d\x74\x26\x26\x6f\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x21\x3d\x3d\x74\x7c\x7c\x21\x61\x7c\x7c\x6e\x75\x6c\x6c\x3d\x3d\x61\x2e\x73\x6c\x6f\x74\x29\x28\x6e" -"\x2e\x64\x65\x66\x61\x75\x6c\x74\x7c\x7c\x28\x6e\x2e\x64\x65\x66\x61\x75\x6c\x74\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x6f\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x73\x3d\x61\x2e\x73\x6c\x6f\x74\x2c\x63\x3d\x6e\x5b\x73\x5d\x7c\x7c\x28\x6e\x5b\x73\x5d\x3d\x5b\x5d\x29\x3b\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x6f\x2e\x74\x61\x67\x3f\x63\x2e\x70\x75\x73\x68\x2e\x61\x70\x70\x6c" -"\x79\x28\x63\x2c\x6f\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x7c\x7c\x5b\x5d\x29\x3a\x63\x2e\x70\x75\x73\x68\x28\x6f\x29\x7d\x7d\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x20\x69\x6e\x20\x6e\x29\x6e\x5b\x75\x5d\x2e\x65\x76\x65\x72\x79\x28\x66\x74\x29\x26\x26\x64\x65\x6c\x65\x74\x65\x20\x6e\x5b\x75\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x74\x28\x65\x29\x7b\x72\x65" -"\x74\x75\x72\x6e\x20\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x21\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x7c\x7c\x22\x20\x22\x3d\x3d\x3d\x65\x2e\x74\x65\x78\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x7d\x66\x75" -"\x6e\x63\x74\x69\x6f\x6e\x20\x64\x74\x28\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x6e\x29\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x30\x2c\x61\x3d\x74\x3f\x21\x21\x74\x2e\x24\x73\x74\x61\x62\x6c\x65\x3a\x21\x6f\x2c\x73\x3d\x74\x26\x26\x74\x2e\x24\x6b\x65\x79\x3b\x69\x66\x28\x74\x29\x7b\x69\x66\x28\x74\x2e\x5f\x6e\x6f\x72\x6d\x61\x6c\x69\x7a" -"\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x5f\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x3b\x69\x66\x28\x61\x26\x26\x72\x26\x26\x72\x21\x3d\x3d\x65\x26\x26\x73\x3d\x3d\x3d\x72\x2e\x24\x6b\x65\x79\x26\x26\x21\x6f\x26\x26\x21\x72\x2e\x24\x68\x61\x73\x4e\x6f\x72\x6d\x61\x6c\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x63\x20\x69\x6e\x20\x69\x3d\x7b\x7d\x2c\x74\x29\x74" -"\x5b\x63\x5d\x26\x26\x22\x24\x22\x21\x3d\x3d\x63\x5b\x30\x5d\x26\x26\x28\x69\x5b\x63\x5d\x3d\x76\x74\x28\x6e\x2c\x63\x2c\x74\x5b\x63\x5d\x29\x29\x7d\x65\x6c\x73\x65\x20\x69\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x20\x69\x6e\x20\x6e\x29\x75\x20\x69\x6e\x20\x69\x7c\x7c\x28\x69\x5b\x75\x5d\x3d\x68\x74\x28\x6e\x2c\x75\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x4f\x62\x6a\x65\x63" -"\x74\x2e\x69\x73\x45\x78\x74\x65\x6e\x73\x69\x62\x6c\x65\x28\x74\x29\x26\x26\x28\x74\x2e\x5f\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x3d\x69\x29\x2c\x52\x28\x69\x2c\x22\x24\x73\x74\x61\x62\x6c\x65\x22\x2c\x61\x29\x2c\x52\x28\x69\x2c\x22\x24\x6b\x65\x79\x22\x2c\x73\x29\x2c\x52\x28\x69\x2c\x22\x24\x68\x61\x73\x4e\x6f\x72\x6d\x61\x6c\x22\x2c\x6f\x29\x2c\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76" -"\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3f\x6e\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x3a\x6e\x28\x7b\x7d\x29\x2c\x74\x3d\x28\x65\x3d\x65\x26\x26\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70" -"\x65\x6f\x66\x20\x65\x26\x26\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x5b\x65\x5d\x3a\x73\x74\x28\x65\x29\x29\x26\x26\x65\x5b\x30\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x26\x26\x28\x21\x74\x7c\x7c\x31\x3d\x3d\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x21\x70\x74\x28\x74\x29\x29\x3f\x76\x6f\x69\x64\x20\x30\x3a\x65" -"\x7d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x70\x72\x6f\x78\x79\x26\x26\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x7b\x67\x65\x74\x3a\x72\x2c\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x7d\x29\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x74\x28\x65\x2c\x74" -"\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x2c\x61\x2c\x73\x2c\x63\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x7c\x7c\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f" -"\x66\x20\x65\x29\x66\x6f\x72\x28\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x69\x3d\x30\x2c\x61\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x61\x3b\x69\x2b\x2b\x29\x72\x5b\x69\x5d\x3d\x74\x28\x65\x5b\x69\x5d\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x6e\x75\x6d\x62\x65\x72\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x66\x6f\x72\x28\x72" -"\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x65\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x65\x3b\x69\x2b\x2b\x29\x72\x5b\x69\x5d\x3d\x74\x28\x69\x2b\x31\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x6f\x28\x65\x29\x29\x69\x66\x28\x6f\x65\x26\x26\x65\x5b\x53\x79\x6d\x62\x6f\x6c\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x5d\x29\x7b\x72\x3d\x5b\x5d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x65\x5b\x53\x79\x6d" -"\x62\x6f\x6c\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x5d\x28\x29\x2c\x6c\x3d\x75\x2e\x6e\x65\x78\x74\x28\x29\x3b\x21\x6c\x2e\x64\x6f\x6e\x65\x3b\x29\x72\x2e\x70\x75\x73\x68\x28\x74\x28\x6c\x2e\x76\x61\x6c\x75\x65\x2c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x29\x29\x2c\x6c\x3d\x75\x2e\x6e\x65\x78\x74\x28\x29\x7d\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29" -"\x2c\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x73\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x69\x3d\x30\x2c\x61\x3d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x61\x3b\x69\x2b\x2b\x29\x63\x3d\x73\x5b\x69\x5d\x2c\x72\x5b\x69\x5d\x3d\x74\x28\x65\x5b\x63\x5d\x2c\x63\x2c\x69\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x72\x29\x7c\x7c\x28\x72\x3d\x5b\x5d\x29\x2c\x72\x2e\x5f\x69\x73\x56\x4c\x69\x73\x74" -"\x3d\x21\x30\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x3d\x74\x68\x69\x73\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x5b\x65\x5d\x3b\x6f\x3f\x28\x6e\x3d\x6e\x7c\x7c\x7b\x7d\x2c\x72\x26\x26\x28\x6e\x3d\x41\x28\x41\x28\x7b\x7d\x2c\x72\x29\x2c\x6e\x29\x29\x2c\x69\x3d\x6f\x28\x6e\x29\x7c\x7c\x28\x22\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x28\x29\x3a\x74\x29\x29\x3a\x69\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x5b\x65\x5d\x7c\x7c\x28\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x28\x29\x3a\x74\x29\x3b\x76\x61\x72\x20\x61\x3d\x6e\x26\x26\x6e\x2e\x73\x6c\x6f\x74\x3b\x72\x65\x74\x75\x72\x6e\x20\x61\x3f\x74\x68\x69" -"\x73\x2e\x24\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x2c\x7b\x73\x6c\x6f\x74\x3a\x61\x7d\x2c\x69\x29\x3a\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x4c\x65\x28\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x22\x66\x69\x6c\x74\x65\x72\x73\x22\x2c\x65\x29\x7c\x7c\x4e\x7d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x20\x5f\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x2d\x31\x3d\x3d\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3a\x65\x21\x3d\x3d\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x46\x2e\x6b\x65\x79\x43\x6f\x64\x65" -"\x73\x5b\x74\x5d\x7c\x7c\x6e\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x26\x26\x72\x26\x26\x21\x46\x2e\x6b\x65\x79\x43\x6f\x64\x65\x73\x5b\x74\x5d\x3f\x5f\x74\x28\x69\x2c\x72\x29\x3a\x6f\x3f\x5f\x74\x28\x6f\x2c\x65\x29\x3a\x72\x3f\x43\x28\x72\x29\x21\x3d\x3d\x74\x3a\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x69" -"\x66\x28\x6e\x29\x69\x66\x28\x6f\x28\x6e\x29\x29\x7b\x76\x61\x72\x20\x61\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x26\x26\x28\x6e\x3d\x4f\x28\x6e\x29\x29\x3b\x76\x61\x72\x20\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x69\x66\x28\x22\x63\x6c\x61\x73\x73\x22\x3d\x3d\x3d\x6f\x7c\x7c\x22\x73\x74\x79\x6c\x65\x22\x3d\x3d\x3d\x6f\x7c\x7c\x76\x28\x6f\x29\x29\x61\x3d" -"\x65\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x73\x3d\x65\x2e\x61\x74\x74\x72\x73\x26\x26\x65\x2e\x61\x74\x74\x72\x73\x2e\x74\x79\x70\x65\x3b\x61\x3d\x72\x7c\x7c\x46\x2e\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x28\x74\x2c\x73\x2c\x6f\x29\x3f\x65\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x7c\x7c\x28\x65\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x3d\x7b\x7d\x29\x3a\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x28\x65" -"\x2e\x61\x74\x74\x72\x73\x3d\x7b\x7d\x29\x7d\x76\x61\x72\x20\x63\x3d\x62\x28\x6f\x29\x2c\x75\x3d\x43\x28\x6f\x29\x3b\x63\x20\x69\x6e\x20\x61\x7c\x7c\x75\x20\x69\x6e\x20\x61\x7c\x7c\x28\x61\x5b\x6f\x5d\x3d\x6e\x5b\x6f\x5d\x2c\x69\x26\x26\x28\x28\x65\x2e\x6f\x6e\x7c\x7c\x28\x65\x2e\x6f\x6e\x3d\x7b\x7d\x29\x29\x5b\x22\x75\x70\x64\x61\x74\x65\x3a\x22\x2b\x6f\x5d\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28" -"\x65\x29\x7b\x6e\x5b\x6f\x5d\x3d\x65\x7d\x29\x29\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x63\x20\x69\x6e\x20\x6e\x29\x73\x28\x63\x29\x7d\x65\x6c\x73\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x77\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2e\x5f\x73\x74\x61\x74\x69\x63\x54\x72\x65\x65\x73\x7c\x7c\x28\x74\x68\x69\x73\x2e\x5f\x73\x74\x61" -"\x74\x69\x63\x54\x72\x65\x65\x73\x3d\x5b\x5d\x29\x2c\x72\x3d\x6e\x5b\x65\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x26\x26\x21\x74\x3f\x72\x3a\x28\x78\x74\x28\x72\x3d\x6e\x5b\x65\x5d\x3d\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x5b\x65\x5d\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2e\x5f\x72\x65\x6e\x64\x65\x72\x50\x72\x6f\x78" -"\x79\x2c\x6e\x75\x6c\x6c\x2c\x74\x68\x69\x73\x29\x2c\x22\x5f\x5f\x73\x74\x61\x74\x69\x63\x5f\x5f\x22\x2b\x65\x2c\x21\x31\x29\x2c\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x78\x74\x28\x65\x2c\x22\x5f\x5f\x6f\x6e\x63\x65\x5f\x5f\x22\x2b\x74\x2b\x28\x6e\x3f\x22\x5f\x22\x2b\x6e\x3a\x22\x22\x29\x2c\x21\x30\x29\x2c\x65\x7d\x66\x75" -"\x6e\x63\x74\x69\x6f\x6e\x20\x78\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x65\x5b\x72\x5d\x26\x26\x22\x73\x74\x72\x69\x6e\x67\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x5b\x72\x5d\x26\x26\x6b\x74\x28\x65\x5b\x72\x5d" -"\x2c\x74\x2b\x22\x5f\x22\x2b\x72\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x20\x6b\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x65\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x3d\x21\x30\x2c\x65\x2e\x6b\x65\x79\x3d\x74\x2c\x65\x2e\x69\x73\x4f\x6e\x63\x65\x3d\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74" -"\x29\x69\x66\x28\x73\x28\x74\x29\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x6f\x6e\x3d\x65\x2e\x6f\x6e\x3f\x41\x28\x7b\x7d\x2c\x65\x2e\x6f\x6e\x29\x3a\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20\x69\x3d\x6e\x5b\x72\x5d\x2c\x6f\x3d\x74\x5b\x72\x5d\x3b\x6e\x5b\x72\x5d\x3d\x69\x3f\x5b\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x69\x2c\x6f\x29\x3a\x6f\x7d\x7d\x65" -"\x6c\x73\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x74\x3d\x74\x7c\x7c\x7b\x24\x73\x74\x61\x62\x6c\x65\x3a\x21\x6e\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x5b\x69\x5d\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41" -"\x72\x72\x61\x79\x28\x6f\x29\x3f\x4f\x74\x28\x6f\x2c\x74\x2c\x6e\x29\x3a\x6f\x26\x26\x28\x6f\x2e\x70\x72\x6f\x78\x79\x26\x26\x28\x6f\x2e\x66\x6e\x2e\x70\x72\x6f\x78\x79\x3d\x21\x30\x29\x2c\x74\x5b\x6f\x2e\x6b\x65\x79\x5d\x3d\x6f\x2e\x66\x6e\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x26\x26\x28\x74\x2e\x24\x6b\x65\x79\x3d\x72\x29\x2c\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x74\x28\x65\x2c\x74" -"\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x3d\x32\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x5b\x6e\x5d\x3b\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x26\x26\x72\x26\x26\x28\x65\x5b\x74\x5b\x6e\x5d\x5d\x3d\x74\x5b\x6e\x2b\x31\x5d\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20" -"\x54\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x74\x2b\x65\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4e\x74\x28\x65\x29\x7b\x65\x2e\x5f\x6f\x3d\x43\x74\x2c\x65\x2e\x5f\x6e\x3d\x66\x2c\x65\x2e\x5f\x73\x3d\x6c\x2c\x65\x2e\x5f\x6c\x3d\x6d\x74\x2c\x65\x2e\x5f\x74\x3d\x79\x74\x2c\x65\x2e\x5f\x71\x3d\x45\x2c\x65" -"\x2e\x5f\x69\x3d\x6a\x2c\x65\x2e\x5f\x6d\x3d\x77\x74\x2c\x65\x2e\x5f\x66\x3d\x67\x74\x2c\x65\x2e\x5f\x6b\x3d\x62\x74\x2c\x65\x2e\x5f\x62\x3d\x24\x74\x2c\x65\x2e\x5f\x76\x3d\x68\x65\x2c\x65\x2e\x5f\x65\x3d\x76\x65\x2c\x65\x2e\x5f\x75\x3d\x4f\x74\x2c\x65\x2e\x5f\x67\x3d\x41\x74\x2c\x65\x2e\x5f\x64\x3d\x53\x74\x2c\x65\x2e\x5f\x70\x3d\x54\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x74\x28\x74\x2c" -"\x6e\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x76\x61\x72\x20\x73\x2c\x63\x3d\x74\x68\x69\x73\x2c\x75\x3d\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x79\x28\x6f\x2c\x22\x5f\x75\x69\x64\x22\x29\x3f\x28\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6f\x29\x29\x2e\x5f\x6f\x72\x69\x67\x69\x6e\x61\x6c\x3d\x6f\x3a\x28\x73\x3d\x6f\x2c\x6f\x3d\x6f\x2e\x5f\x6f\x72\x69\x67\x69\x6e\x61\x6c\x29\x3b\x76" -"\x61\x72\x20\x6c\x3d\x72\x28\x75\x2e\x5f\x63\x6f\x6d\x70\x69\x6c\x65\x64\x29\x2c\x66\x3d\x21\x6c\x3b\x74\x68\x69\x73\x2e\x64\x61\x74\x61\x3d\x74\x2c\x74\x68\x69\x73\x2e\x70\x72\x6f\x70\x73\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x69\x2c\x74\x68\x69\x73\x2e\x70\x61\x72\x65\x6e\x74\x3d\x6f\x2c\x74\x68\x69\x73\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x74\x2e\x6f\x6e\x7c" -"\x7c\x65\x2c\x74\x68\x69\x73\x2e\x69\x6e\x6a\x65\x63\x74\x69\x6f\x6e\x73\x3d\x75\x74\x28\x75\x2e\x69\x6e\x6a\x65\x63\x74\x2c\x6f\x29\x2c\x74\x68\x69\x73\x2e\x73\x6c\x6f\x74\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x63\x2e\x24\x73\x6c\x6f\x74\x73\x7c\x7c\x64\x74\x28\x74\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x63\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x6c" -"\x74\x28\x69\x2c\x6f\x29\x29\x2c\x63\x2e\x24\x73\x6c\x6f\x74\x73\x7d\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x74\x68\x69\x73\x2c\x22\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x22\x2c\x7b\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x74\x28\x74" -"\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74\x68\x69\x73\x2e\x73\x6c\x6f\x74\x73\x28\x29\x29\x7d\x7d\x29\x2c\x6c\x26\x26\x28\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x75\x2c\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x74\x68\x69\x73\x2e\x73\x6c\x6f\x74\x73\x28\x29\x2c\x74\x68\x69\x73\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x64\x74\x28\x74\x2e\x73\x63" -"\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x29\x29\x2c\x75\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x3f\x74\x68\x69\x73\x2e\x5f\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x48\x74\x28\x73\x2c\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x66\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x26\x26\x21\x41\x72\x72\x61\x79\x2e" -"\x69\x73\x41\x72\x72\x61\x79\x28\x69\x29\x26\x26\x28\x69\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x3d\x75\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x2c\x69\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x6f\x29\x2c\x69\x7d\x3a\x74\x68\x69\x73\x2e\x5f\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x74\x28\x73\x2c\x65\x2c\x74\x2c\x6e\x2c\x72\x2c" -"\x66\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6d\x65\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x6e\x2c\x6f\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x72\x2c\x74\x2e\x73\x6c\x6f\x74\x26\x26\x28\x28\x6f\x2e\x64\x61\x74\x61\x7c\x7c\x28\x6f\x2e\x64\x61\x74\x61\x3d" -"\x7b\x7d\x29\x29\x2e\x73\x6c\x6f\x74\x3d\x74\x2e\x73\x6c\x6f\x74\x29\x2c\x6f\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x74\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x65\x5b\x62\x28\x6e\x29\x5d\x3d\x74\x5b\x6e\x5d\x7d\x4e\x74\x28\x45\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x3b\x76\x61\x72\x20\x4c\x74\x3d\x7b\x69\x6e\x69\x74\x3a\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x26\x26\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x26\x26\x65\x2e\x64\x61\x74\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x3b\x4c\x74\x2e\x70\x72\x65" -"\x70\x61\x74\x63\x68\x28\x72\x2c\x72\x29\x7d\x65\x6c\x73\x65\x7b\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x7b\x5f\x69\x73\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3a\x21\x30\x2c\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3a\x65\x2c\x70\x61\x72\x65\x6e\x74\x3a\x74\x7d\x2c\x69" -"\x3d\x65\x2e\x64\x61\x74\x61\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3b\x6e\x28\x69\x29\x26\x26\x28\x72\x2e\x72\x65\x6e\x64\x65\x72\x3d\x69\x2e\x72\x65\x6e\x64\x65\x72\x2c\x72\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x69\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x65\x2e\x63\x6f" -"\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x2e\x43\x74\x6f\x72\x28\x72\x29\x7d\x28\x65\x2c\x5a\x74\x29\x29\x2e\x24\x6d\x6f\x75\x6e\x74\x28\x74\x3f\x65\x2e\x65\x6c\x6d\x3a\x76\x6f\x69\x64\x20\x30\x2c\x74\x29\x7d\x7d\x2c\x70\x72\x65\x70\x61\x74\x63\x68\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70" -"\x74\x69\x6f\x6e\x73\x3b\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x3d\x69\x2e\x64\x61\x74\x61\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x73\x3d\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x63\x3d\x21\x21\x28\x61\x26\x26\x21\x61\x2e\x24\x73\x74\x61\x62\x6c\x65\x7c\x7c\x73\x21\x3d\x3d\x65\x26\x26\x21\x73\x2e\x24" -"\x73\x74\x61\x62\x6c\x65\x7c\x7c\x61\x26\x26\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2e\x24\x6b\x65\x79\x21\x3d\x3d\x61\x2e\x24\x6b\x65\x79\x7c\x7c\x21\x61\x26\x26\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2e\x24\x6b\x65\x79\x29\x2c\x75\x3d\x21\x21\x28\x6f\x7c\x7c\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65\x6e" -"\x7c\x7c\x63\x29\x3b\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3d\x69\x2c\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x69\x2c\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x26\x26\x28\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x69\x29\x3b\x69\x66\x28\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65" -"\x6e\x3d\x6f\x2c\x74\x2e\x24\x61\x74\x74\x72\x73\x3d\x69\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x7c\x7c\x65\x2c\x74\x2e\x24\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x72\x7c\x7c\x65\x2c\x6e\x26\x26\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x29\x7b\x24\x65\x28\x21\x31\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6c\x3d\x74\x2e\x5f\x70\x72\x6f\x70\x73\x2c\x66\x3d\x74\x2e\x24\x6f" -"\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x72\x6f\x70\x4b\x65\x79\x73\x7c\x7c\x5b\x5d\x2c\x70\x3d\x30\x3b\x70\x3c\x66\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x70\x2b\x2b\x29\x7b\x76\x61\x72\x20\x64\x3d\x66\x5b\x70\x5d\x2c\x76\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x6c\x5b\x64\x5d\x3d\x49\x65\x28\x64\x2c\x76\x2c\x6e\x2c\x74\x29\x7d\x24\x65\x28\x21\x30\x29\x2c\x74\x2e\x24\x6f\x70" -"\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x3d\x6e\x7d\x72\x3d\x72\x7c\x7c\x65\x3b\x76\x61\x72\x20\x68\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3b\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x72\x2c\x57\x74\x28\x74\x2c\x72\x2c\x68\x29\x2c\x75" -"\x26\x26\x28\x74\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x6c\x74\x28\x6f\x2c\x69\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x74\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x29\x7d\x28\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2c\x72\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x2c\x72" -"\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x2c\x6e\x2c\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x7d\x2c\x69\x6e\x73\x65\x72\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x3d\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x72\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x72\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x7c\x7c\x28" -"\x72\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3d\x21\x30\x2c\x51\x74\x28\x72\x2c\x22\x6d\x6f\x75\x6e\x74\x65\x64\x22\x29\x29\x2c\x65\x2e\x64\x61\x74\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x26\x26\x28\x6e\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3f\x28\x28\x74\x3d\x72\x29\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x2c\x74\x6e\x2e\x70\x75\x73\x68\x28\x74\x29\x29\x3a\x59\x74\x28" -"\x72\x2c\x21\x30\x29\x29\x7d\x2c\x64\x65\x73\x74\x72\x6f\x79\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x74\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x7c\x7c\x28\x65\x2e\x64\x61\x74\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74" -"\x2c\x6e\x29\x7b\x69\x66\x28\x6e\x26\x26\x28\x74\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x2c\x58\x74\x28\x74\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x21\x74\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x29\x7b\x74\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x74\x2e\x24\x63\x68\x69\x6c\x64" -"\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x65\x28\x74\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x72\x5d\x29\x3b\x51\x74\x28\x74\x2c\x22\x64\x65\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x29\x7d\x7d\x28\x74\x2c\x21\x30\x29\x3a\x74\x2e\x24\x64\x65\x73\x74\x72\x6f\x79\x28\x29\x29\x7d\x7d\x2c\x49\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x4c\x74\x29\x3b\x66\x75\x6e\x63" -"\x74\x69\x6f\x6e\x20\x4d\x74\x28\x69\x2c\x61\x2c\x73\x2c\x63\x2c\x6c\x29\x7b\x69\x66\x28\x21\x74\x28\x69\x29\x29\x7b\x76\x61\x72\x20\x66\x3d\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x62\x61\x73\x65\x3b\x69\x66\x28\x6f\x28\x69\x29\x26\x26\x28\x69\x3d\x66\x2e\x65\x78\x74\x65\x6e\x64\x28\x69\x29\x29\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x69\x29\x7b\x76" -"\x61\x72\x20\x70\x3b\x69\x66\x28\x74\x28\x69\x2e\x63\x69\x64\x29\x26\x26\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x28\x69\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x69\x29\x7b\x69\x66\x28\x72\x28\x65\x2e\x65\x72\x72\x6f\x72\x29\x26\x26\x6e\x28\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x3b\x69\x66\x28\x6e\x28\x65\x2e" -"\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x3b\x76\x61\x72\x20\x61\x3d\x55\x74\x3b\x61\x26\x26\x6e\x28\x65\x2e\x6f\x77\x6e\x65\x72\x73\x29\x26\x26\x2d\x31\x3d\x3d\x3d\x65\x2e\x6f\x77\x6e\x65\x72\x73\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x61\x29\x26\x26\x65\x2e\x6f\x77\x6e\x65\x72\x73\x2e\x70\x75\x73\x68\x28\x61\x29\x3b\x69\x66\x28\x72" -"\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x29\x26\x26\x6e\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x3b\x69\x66\x28\x61\x26\x26\x21\x6e\x28\x65\x2e\x6f\x77\x6e\x65\x72\x73\x29\x29\x7b\x76\x61\x72\x20\x73\x3d\x65\x2e\x6f\x77\x6e\x65\x72\x73\x3d\x5b\x61\x5d\x2c\x63\x3d\x21\x30\x2c\x6c\x3d\x6e\x75\x6c" -"\x6c\x2c\x66\x3d\x6e\x75\x6c\x6c\x3b\x61\x2e\x24\x6f\x6e\x28\x22\x68\x6f\x6f\x6b\x3a\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x68\x28\x73\x2c\x61\x29\x7d\x29\x3b\x76\x61\x72\x20\x70\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x2c\x6e\x3d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b" -"\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x73\x5b\x74\x5d\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x3b\x65\x26\x26\x28\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x2c\x6e\x75\x6c\x6c\x21\x3d\x3d\x6c\x26\x26\x28\x63\x6c\x65\x61\x72\x54\x69\x6d\x65\x6f\x75\x74\x28\x6c\x29\x2c\x6c\x3d\x6e\x75\x6c\x6c\x29\x2c\x6e\x75\x6c\x6c\x21\x3d\x3d\x66\x26\x26\x28\x63\x6c\x65\x61\x72\x54\x69\x6d\x65\x6f\x75" -"\x74\x28\x66\x29\x2c\x66\x3d\x6e\x75\x6c\x6c\x29\x29\x7d\x2c\x64\x3d\x44\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x3d\x56\x74\x28\x74\x2c\x69\x29\x2c\x63\x3f\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x3a\x70\x28\x21\x30\x29\x7d\x29\x2c\x76\x3d\x44\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x6e\x28\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70" -"\x29\x26\x26\x28\x65\x2e\x65\x72\x72\x6f\x72\x3d\x21\x30\x2c\x70\x28\x21\x30\x29\x29\x7d\x29\x2c\x6d\x3d\x65\x28\x64\x2c\x76\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x28\x6d\x29\x26\x26\x28\x75\x28\x6d\x29\x3f\x74\x28\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x26\x26\x6d\x2e\x74\x68\x65\x6e\x28\x64\x2c\x76\x29\x3a\x75\x28\x6d\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x26\x26\x28\x6d\x2e\x63\x6f" -"\x6d\x70\x6f\x6e\x65\x6e\x74\x2e\x74\x68\x65\x6e\x28\x64\x2c\x76\x29\x2c\x6e\x28\x6d\x2e\x65\x72\x72\x6f\x72\x29\x26\x26\x28\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x3d\x56\x74\x28\x6d\x2e\x65\x72\x72\x6f\x72\x2c\x69\x29\x29\x2c\x6e\x28\x6d\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x29\x26\x26\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x3d\x56\x74\x28\x6d\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x2c" -"\x69\x29\x2c\x30\x3d\x3d\x3d\x6d\x2e\x64\x65\x6c\x61\x79\x3f\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x3d\x21\x30\x3a\x6c\x3d\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x6c\x3d\x6e\x75\x6c\x6c\x2c\x74\x28\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x26\x26\x74\x28\x65\x2e\x65\x72\x72\x6f\x72\x29\x26\x26\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x3d\x21\x30\x2c" -"\x70\x28\x21\x31\x29\x29\x7d\x2c\x6d\x2e\x64\x65\x6c\x61\x79\x7c\x7c\x32\x30\x30\x29\x29\x2c\x6e\x28\x6d\x2e\x74\x69\x6d\x65\x6f\x75\x74\x29\x26\x26\x28\x66\x3d\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x3d\x6e\x75\x6c\x6c\x2c\x74\x28\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x26\x26\x76\x28\x6e\x75\x6c\x6c\x29\x7d\x2c\x6d\x2e\x74\x69\x6d\x65\x6f" -"\x75\x74\x29\x29\x29\x29\x2c\x63\x3d\x21\x31\x2c\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x3f\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x3a\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x7d\x7d\x28\x70\x3d\x69\x2c\x66\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x76\x65\x28\x29\x3b\x72\x65\x74\x75\x72" -"\x6e\x20\x6f\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x3d\x65\x2c\x6f\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x3d\x7b\x64\x61\x74\x61\x3a\x74\x2c\x63\x6f\x6e\x74\x65\x78\x74\x3a\x6e\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x3a\x72\x2c\x74\x61\x67\x3a\x69\x7d\x2c\x6f\x7d\x28\x70\x2c\x61\x2c\x73\x2c\x63\x2c\x6c\x29\x3b\x61\x3d\x61\x7c\x7c\x7b\x7d\x2c\x77\x6e\x28\x69\x29\x2c\x6e\x28\x61\x2e\x6d" -"\x6f\x64\x65\x6c\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x6d\x6f\x64\x65\x6c\x26\x26\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x70\x72\x6f\x70\x7c\x7c\x22\x76\x61\x6c\x75\x65\x22\x2c\x69\x3d\x65\x2e\x6d\x6f\x64\x65\x6c\x26\x26\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x65\x76\x65\x6e\x74\x7c\x7c\x22\x69\x6e\x70\x75\x74\x22\x3b\x28\x74\x2e\x61\x74\x74\x72\x73" -"\x7c\x7c\x28\x74\x2e\x61\x74\x74\x72\x73\x3d\x7b\x7d\x29\x29\x5b\x72\x5d\x3d\x74\x2e\x6d\x6f\x64\x65\x6c\x2e\x76\x61\x6c\x75\x65\x3b\x76\x61\x72\x20\x6f\x3d\x74\x2e\x6f\x6e\x7c\x7c\x28\x74\x2e\x6f\x6e\x3d\x7b\x7d\x29\x2c\x61\x3d\x6f\x5b\x69\x5d\x2c\x73\x3d\x74\x2e\x6d\x6f\x64\x65\x6c\x2e\x63\x61\x6c\x6c\x62\x61\x63\x6b\x3b\x6e\x28\x61\x29\x3f\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79" -"\x28\x61\x29\x3f\x2d\x31\x3d\x3d\x3d\x61\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x73\x29\x3a\x61\x21\x3d\x3d\x73\x29\x26\x26\x28\x6f\x5b\x69\x5d\x3d\x5b\x73\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x61\x29\x29\x3a\x6f\x5b\x69\x5d\x3d\x73\x7d\x28\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x61\x29\x3b\x76\x61\x72\x20\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d" -"\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x21\x74\x28\x6f\x29\x29\x7b\x76\x61\x72\x20\x61\x3d\x7b\x7d\x2c\x73\x3d\x65\x2e\x61\x74\x74\x72\x73\x2c\x63\x3d\x65\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x6e\x28\x73\x29\x7c\x7c\x6e\x28\x63\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x20\x69\x6e\x20\x6f\x29\x7b\x76\x61\x72\x20\x6c\x3d\x43\x28\x75\x29\x3b\x61\x74\x28\x61" -"\x2c\x63\x2c\x75\x2c\x6c\x2c\x21\x30\x29\x7c\x7c\x61\x74\x28\x61\x2c\x73\x2c\x75\x2c\x6c\x2c\x21\x31\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x7d\x28\x61\x2c\x69\x29\x3b\x69\x66\x28\x72\x28\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x66\x75\x6e\x63\x74\x69\x6f\x6e\x61\x6c\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x76\x61\x72" -"\x20\x73\x3d\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x63\x3d\x7b\x7d\x2c\x75\x3d\x73\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x6e\x28\x75\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6c\x20\x69\x6e\x20\x75\x29\x63\x5b\x6c\x5d\x3d\x49\x65\x28\x6c\x2c\x75\x2c\x72\x7c\x7c\x65\x29\x3b\x65\x6c\x73\x65\x20\x6e\x28\x69\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x44\x74\x28\x63\x2c\x69\x2e\x61\x74\x74\x72\x73\x29\x2c" -"\x6e\x28\x69\x2e\x70\x72\x6f\x70\x73\x29\x26\x26\x44\x74\x28\x63\x2c\x69\x2e\x70\x72\x6f\x70\x73\x29\x3b\x76\x61\x72\x20\x66\x3d\x6e\x65\x77\x20\x45\x74\x28\x69\x2c\x63\x2c\x61\x2c\x6f\x2c\x74\x29\x2c\x70\x3d\x73\x2e\x72\x65\x6e\x64\x65\x72\x2e\x63\x61\x6c\x6c\x28\x6e\x75\x6c\x6c\x2c\x66\x2e\x5f\x63\x2c\x66\x29\x3b\x69\x66\x28\x70\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x29\x72\x65" -"\x74\x75\x72\x6e\x20\x6a\x74\x28\x70\x2c\x69\x2c\x66\x2e\x70\x61\x72\x65\x6e\x74\x2c\x73\x29\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x70\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x64\x3d\x73\x74\x28\x70\x29\x7c\x7c\x5b\x5d\x2c\x76\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x64\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x68\x3d\x30\x3b\x68\x3c\x64\x2e\x6c\x65\x6e\x67\x74" -"\x68\x3b\x68\x2b\x2b\x29\x76\x5b\x68\x5d\x3d\x6a\x74\x28\x64\x5b\x68\x5d\x2c\x69\x2c\x66\x2e\x70\x61\x72\x65\x6e\x74\x2c\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x76\x7d\x7d\x28\x69\x2c\x64\x2c\x61\x2c\x73\x2c\x63\x29\x3b\x76\x61\x72\x20\x76\x3d\x61\x2e\x6f\x6e\x3b\x69\x66\x28\x61\x2e\x6f\x6e\x3d\x61\x2e\x6e\x61\x74\x69\x76\x65\x4f\x6e\x2c\x72\x28\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73" -"\x74\x72\x61\x63\x74\x29\x29\x7b\x76\x61\x72\x20\x6d\x3d\x61\x2e\x73\x6c\x6f\x74\x3b\x61\x3d\x7b\x7d\x2c\x6d\x26\x26\x28\x61\x2e\x73\x6c\x6f\x74\x3d\x6d\x29\x7d\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x2e\x68\x6f\x6f\x6b\x7c\x7c\x28\x65\x2e\x68\x6f\x6f\x6b\x3d\x7b\x7d\x29\x2c\x6e\x3d\x30\x3b\x6e\x3c\x49\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e" -"\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x49\x74\x5b\x6e\x5d\x2c\x69\x3d\x74\x5b\x72\x5d\x2c\x6f\x3d\x4c\x74\x5b\x72\x5d\x3b\x69\x3d\x3d\x3d\x6f\x7c\x7c\x69\x26\x26\x69\x2e\x5f\x6d\x65\x72\x67\x65\x64\x7c\x7c\x28\x74\x5b\x72\x5d\x3d\x69\x3f\x46\x74\x28\x6f\x2c\x69\x29\x3a\x6f\x29\x7d\x7d\x28\x61\x29\x3b\x76\x61\x72\x20\x79\x3d\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6e\x61\x6d\x65\x7c\x7c\x6c\x3b" -"\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x70\x65\x28\x22\x76\x75\x65\x2d\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x2d\x22\x2b\x69\x2e\x63\x69\x64\x2b\x28\x79\x3f\x22\x2d\x22\x2b\x79\x3a\x22\x22\x29\x2c\x61\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x73\x2c\x7b\x43\x74\x6f\x72\x3a\x69\x2c\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x3a\x64\x2c\x6c\x69\x73\x74\x65" -"\x6e\x65\x72\x73\x3a\x76\x2c\x74\x61\x67\x3a\x6c\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x3a\x63\x7d\x2c\x70\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x2c\x72\x29\x7b\x65\x28\x6e\x2c\x72\x29\x2c\x74\x28\x6e\x2c\x72\x29\x7d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x6d\x65\x72\x67\x65\x64\x3d\x21" -"\x30\x2c\x6e\x7d\x76\x61\x72\x20\x50\x74\x3d\x31\x2c\x52\x74\x3d\x32\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x74\x28\x65\x2c\x61\x2c\x73\x2c\x63\x2c\x75\x2c\x6c\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x73\x29\x7c\x7c\x69\x28\x73\x29\x29\x26\x26\x28\x75\x3d\x63\x2c\x63\x3d\x73\x2c\x73\x3d\x76\x6f\x69\x64\x20\x30\x29\x2c\x72\x28\x6c\x29\x26\x26" -"\x28\x75\x3d\x52\x74\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x69\x2c\x61\x2c\x73\x2c\x63\x29\x7b\x69\x66\x28\x6e\x28\x61\x29\x26\x26\x6e\x28\x61\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x65\x28\x29\x3b\x6e\x28\x61\x29\x26\x26\x6e\x28\x61\x2e\x69\x73\x29\x26\x26\x28\x69\x3d\x61\x2e\x69\x73\x29\x3b\x69\x66\x28\x21\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x65\x28" -"\x29\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x73\x29\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x73\x5b\x30\x5d\x26\x26\x28\x28\x61\x3d\x61\x7c\x7c\x7b\x7d\x29\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x7b\x64\x65\x66\x61\x75\x6c\x74\x3a\x73\x5b\x30\x5d\x7d\x2c\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x29\x3b\x63\x3d\x3d\x3d\x52" -"\x74\x3f\x73\x3d\x73\x74\x28\x73\x29\x3a\x63\x3d\x3d\x3d\x50\x74\x26\x26\x28\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x5b\x74\x5d\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x70\x72\x6f\x74" -"\x6f\x74\x79\x70\x65\x2e\x63\x6f\x6e\x63\x61\x74\x2e\x61\x70\x70\x6c\x79\x28\x5b\x5d\x2c\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x28\x73\x29\x29\x3b\x76\x61\x72\x20\x75\x2c\x6c\x3b\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x69\x29\x7b\x76\x61\x72\x20\x66\x3b\x6c\x3d\x65\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x65\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x6e\x73\x7c" -"\x7c\x46\x2e\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x28\x69\x29\x2c\x75\x3d\x46\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x28\x69\x29\x3f\x6e\x65\x77\x20\x70\x65\x28\x46\x2e\x70\x61\x72\x73\x65\x50\x6c\x61\x74\x66\x6f\x72\x6d\x54\x61\x67\x4e\x61\x6d\x65\x28\x69\x29\x2c\x61\x2c\x73\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x65\x29\x3a\x61\x26\x26" -"\x61\x2e\x70\x72\x65\x7c\x7c\x21\x6e\x28\x66\x3d\x4c\x65\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x22\x2c\x69\x29\x29\x3f\x6e\x65\x77\x20\x70\x65\x28\x69\x2c\x61\x2c\x73\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x65\x29\x3a\x4d\x74\x28\x66\x2c\x61\x2c\x65\x2c\x73\x2c\x69\x29\x7d\x65\x6c\x73\x65\x20\x75\x3d\x4d\x74\x28\x69\x2c\x61" -"\x2c\x65\x2c\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x75\x29\x3f\x75\x3a\x6e\x28\x75\x29\x3f\x28\x6e\x28\x6c\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x69\x2c\x6f\x2c\x61\x29\x7b\x69\x2e\x6e\x73\x3d\x6f\x3b\x22\x66\x6f\x72\x65\x69\x67\x6e\x4f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x3d\x69\x2e\x74\x61\x67\x26\x26\x28\x6f\x3d\x76\x6f\x69" -"\x64\x20\x30\x2c\x61\x3d\x21\x30\x29\x3b\x69\x66\x28\x6e\x28\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x3d\x30\x2c\x63\x3d\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x3c\x63\x3b\x73\x2b\x2b\x29\x7b\x76\x61\x72\x20\x75\x3d\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x73\x5d\x3b\x6e\x28\x75\x2e\x74\x61\x67\x29\x26\x26\x28\x74" -"\x28\x75\x2e\x6e\x73\x29\x7c\x7c\x72\x28\x61\x29\x26\x26\x22\x73\x76\x67\x22\x21\x3d\x3d\x75\x2e\x74\x61\x67\x29\x26\x26\x65\x28\x75\x2c\x6f\x2c\x61\x29\x7d\x7d\x28\x75\x2c\x6c\x29\x2c\x6e\x28\x61\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6f\x28\x65\x2e\x73\x74\x79\x6c\x65\x29\x26\x26\x74\x74\x28\x65\x2e\x73\x74\x79\x6c\x65\x29\x3b\x6f\x28\x65\x2e\x63\x6c\x61\x73\x73\x29\x26\x26" -"\x74\x74\x28\x65\x2e\x63\x6c\x61\x73\x73\x29\x7d\x28\x61\x29\x2c\x75\x29\x3a\x76\x65\x28\x29\x7d\x28\x65\x2c\x61\x2c\x73\x2c\x63\x2c\x75\x29\x7d\x76\x61\x72\x20\x42\x74\x2c\x55\x74\x3d\x6e\x75\x6c\x6c\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x65\x2e\x5f\x5f\x65\x73\x4d\x6f\x64\x75\x6c\x65\x7c\x7c\x6f\x65\x26\x26\x22\x4d\x6f\x64\x75\x6c\x65" -"\x22\x3d\x3d\x3d\x65\x5b\x53\x79\x6d\x62\x6f\x6c\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x54\x61\x67\x5d\x29\x26\x26\x28\x65\x3d\x65\x2e\x64\x65\x66\x61\x75\x6c\x74\x29\x2c\x6f\x28\x65\x29\x3f\x74\x2e\x65\x78\x74\x65\x6e\x64\x28\x65\x29\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x74\x28\x65\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x66\x6f\x72\x28" -"\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x5b\x74\x5d\x3b\x69\x66\x28\x6e\x28\x72\x29\x26\x26\x28\x6e\x28\x72\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x29\x7c\x7c\x70\x74\x28\x72\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x74\x28\x65\x2c\x74" -"\x29\x7b\x42\x74\x2e\x24\x6f\x6e\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x74\x28\x65\x2c\x74\x29\x7b\x42\x74\x2e\x24\x6f\x66\x66\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x42\x74\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x28\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x3d\x74\x2e\x61" -"\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x26\x26\x6e\x2e\x24\x6f\x66\x66\x28\x65\x2c\x72\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x42\x74\x3d\x65\x2c\x69\x74\x28\x74\x2c\x6e\x7c\x7c\x7b\x7d\x2c\x4b\x74\x2c\x4a\x74\x2c\x71\x74\x2c\x65\x29\x2c\x42\x74\x3d\x76\x6f\x69\x64\x20\x30\x7d\x76\x61\x72\x20\x5a\x74\x3d\x6e" -"\x75\x6c\x6c\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x74\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x5a\x74\x3b\x72\x65\x74\x75\x72\x6e\x20\x5a\x74\x3d\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x5a\x74\x3d\x74\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x74\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x26\x26\x28\x65\x3d\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x29\x3b\x29\x69\x66\x28\x65\x2e" -"\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x59\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74\x29\x7b\x69\x66\x28\x65\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x2c\x58\x74\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x65\x2e\x5f\x64" -"\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x7c\x7c\x6e\x75\x6c\x6c\x3d\x3d\x3d\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x29\x7b\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65" -"\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x59\x74\x28\x65\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x6e\x5d\x29\x3b\x51\x74\x28\x65\x2c\x22\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x74\x28\x65\x2c\x74\x29\x7b\x6c\x65\x28\x29\x3b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x74\x5d\x2c\x72\x3d\x74\x2b\x22\x20\x68\x6f\x6f\x6b\x22" -"\x3b\x69\x66\x28\x6e\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x2c\x6f\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x42\x65\x28\x6e\x5b\x69\x5d\x2c\x65\x2c\x6e\x75\x6c\x6c\x2c\x65\x2c\x72\x29\x3b\x65\x2e\x5f\x68\x61\x73\x48\x6f\x6f\x6b\x45\x76\x65\x6e\x74\x26\x26\x65\x2e\x24\x65\x6d\x69\x74\x28\x22\x68\x6f\x6f\x6b\x3a\x22\x2b\x74\x29\x2c\x66\x65\x28\x29\x7d\x76\x61" -"\x72\x20\x65\x6e\x3d\x5b\x5d\x2c\x74\x6e\x3d\x5b\x5d\x2c\x6e\x6e\x3d\x7b\x7d\x2c\x72\x6e\x3d\x21\x31\x2c\x6f\x6e\x3d\x21\x31\x2c\x61\x6e\x3d\x30\x3b\x76\x61\x72\x20\x73\x6e\x3d\x30\x2c\x63\x6e\x3d\x44\x61\x74\x65\x2e\x6e\x6f\x77\x3b\x69\x66\x28\x56\x26\x26\x21\x71\x29\x7b\x76\x61\x72\x20\x75\x6e\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x70\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x3b\x75\x6e\x26\x26\x22\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x75\x6e\x2e\x6e\x6f\x77\x26\x26\x63\x6e\x28\x29\x3e\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x76\x65\x6e\x74\x28\x22\x45\x76\x65\x6e\x74\x22\x29\x2e\x74\x69\x6d\x65\x53\x74\x61\x6d\x70\x26\x26\x28\x63\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x75\x6e\x2e\x6e\x6f\x77\x28" -"\x29\x7d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x2c\x74\x3b\x66\x6f\x72\x28\x73\x6e\x3d\x63\x6e\x28\x29\x2c\x6f\x6e\x3d\x21\x30\x2c\x65\x6e\x2e\x73\x6f\x72\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x64\x2d\x74\x2e\x69\x64\x7d\x29\x2c\x61\x6e\x3d\x30\x3b\x61\x6e\x3c\x65\x6e\x2e\x6c\x65\x6e\x67" -"\x74\x68\x3b\x61\x6e\x2b\x2b\x29\x28\x65\x3d\x65\x6e\x5b\x61\x6e\x5d\x29\x2e\x62\x65\x66\x6f\x72\x65\x26\x26\x65\x2e\x62\x65\x66\x6f\x72\x65\x28\x29\x2c\x74\x3d\x65\x2e\x69\x64\x2c\x6e\x6e\x5b\x74\x5d\x3d\x6e\x75\x6c\x6c\x2c\x65\x2e\x72\x75\x6e\x28\x29\x3b\x76\x61\x72\x20\x6e\x3d\x74\x6e\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x72\x3d\x65\x6e\x2e\x73\x6c\x69\x63\x65\x28\x29\x3b\x61\x6e\x3d\x65\x6e\x2e" -"\x6c\x65\x6e\x67\x74\x68\x3d\x74\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x2c\x6e\x6e\x3d\x7b\x7d\x2c\x72\x6e\x3d\x6f\x6e\x3d\x21\x31\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x65\x5b\x74\x5d\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x2c\x59\x74\x28\x65\x5b\x74\x5d\x2c\x21" -"\x30\x29\x7d\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x6f\x72\x28\x3b\x74\x2d\x2d\x3b\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x5b\x74\x5d\x2c\x72\x3d\x6e\x2e\x76\x6d\x3b\x72\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x3d\x3d\x3d\x6e\x26\x26\x72\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x26\x26\x21\x72\x2e\x5f\x69\x73\x44" -"\x65\x73\x74\x72\x6f\x79\x65\x64\x26\x26\x51\x74\x28\x72\x2c\x22\x75\x70\x64\x61\x74\x65\x64\x22\x29\x7d\x7d\x28\x72\x29\x2c\x6e\x65\x26\x26\x46\x2e\x64\x65\x76\x74\x6f\x6f\x6c\x73\x26\x26\x6e\x65\x2e\x65\x6d\x69\x74\x28\x22\x66\x6c\x75\x73\x68\x22\x29\x7d\x76\x61\x72\x20\x66\x6e\x3d\x30\x2c\x70\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x74\x68\x69\x73" -"\x2e\x76\x6d\x3d\x65\x2c\x69\x26\x26\x28\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x3d\x74\x68\x69\x73\x29\x2c\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x2e\x70\x75\x73\x68\x28\x74\x68\x69\x73\x29\x2c\x72\x3f\x28\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x3d\x21\x21\x72\x2e\x64\x65\x65\x70\x2c\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x3d\x21\x21\x72\x2e\x75\x73\x65\x72\x2c\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79" -"\x3d\x21\x21\x72\x2e\x6c\x61\x7a\x79\x2c\x74\x68\x69\x73\x2e\x73\x79\x6e\x63\x3d\x21\x21\x72\x2e\x73\x79\x6e\x63\x2c\x74\x68\x69\x73\x2e\x62\x65\x66\x6f\x72\x65\x3d\x72\x2e\x62\x65\x66\x6f\x72\x65\x29\x3a\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x3d\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x3d\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x3d\x74\x68\x69\x73\x2e\x73\x79\x6e\x63\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x63" -"\x62\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x69\x64\x3d\x2b\x2b\x66\x6e\x2c\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x2c\x74\x68\x69\x73\x2e\x64\x69\x72\x74\x79\x3d\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x3d\x5b\x5d\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x3d\x5b\x5d\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x3d\x6e\x65\x77\x20\x69\x65" -"\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x3d\x6e\x65\x77\x20\x69\x65\x2c\x74\x68\x69\x73\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3d\x22\x22\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x3d\x74\x3a\x28\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" -"\x29\x7b\x69\x66\x28\x21\x48\x2e\x74\x65\x73\x74\x28\x65\x29\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x73\x70\x6c\x69\x74\x28\x22\x2e\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x7b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x3b\x65\x3d\x65\x5b" -"\x74\x5b\x6e\x5d\x5d\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x7d\x7d\x28\x74\x29\x2c\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x7c\x7c\x28\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x3d\x53\x29\x29\x2c\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3d\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x3f\x76\x6f\x69\x64\x20\x30\x3a\x74\x68\x69\x73\x2e\x67\x65\x74\x28\x29\x7d\x3b\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74" -"\x79\x70\x65\x2e\x67\x65\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3b\x6c\x65\x28\x74\x68\x69\x73\x29\x3b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x76\x6d\x3b\x74\x72\x79\x7b\x65\x3d\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x2e\x63\x61\x6c\x6c\x28\x74\x2c\x74\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x69\x66\x28\x21\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x29\x74" -"\x68\x72\x6f\x77\x20\x65\x3b\x48\x65\x28\x65\x2c\x74\x2c\x27\x67\x65\x74\x74\x65\x72\x20\x66\x6f\x72\x20\x77\x61\x74\x63\x68\x65\x72\x20\x22\x27\x2b\x74\x68\x69\x73\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x27\x22\x27\x29\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x26\x26\x74\x74\x28\x65\x29\x2c\x66\x65\x28\x29\x2c\x74\x68\x69\x73\x2e\x63\x6c\x65\x61\x6e\x75\x70" -"\x44\x65\x70\x73\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x61\x64\x64\x44\x65\x70\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x69\x64\x3b\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x68\x61\x73\x28\x74\x29\x7c\x7c\x28\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x61" -"\x64\x64\x28\x74\x29\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x2e\x68\x61\x73\x28\x74\x29\x7c\x7c\x65\x2e\x61\x64\x64\x53\x75\x62\x28\x74\x68\x69\x73\x29\x29\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x63\x6c\x65\x61\x6e\x75\x70\x44\x65\x70\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b" -"\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x65\x2d\x2d\x3b\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x5b\x65\x5d\x3b\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x68\x61\x73\x28\x74\x2e\x69\x64\x29\x7c\x7c\x74\x2e\x72\x65\x6d\x6f\x76\x65\x53\x75\x62\x28\x74\x68\x69\x73\x29\x7d\x76\x61\x72\x20" -"\x6e\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x3b\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x3d\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x63\x6c\x65\x61\x72\x28\x29\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2c\x74\x68\x69\x73\x2e\x64\x65" -"\x70\x73\x3d\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x75\x70\x64\x61\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x3f\x74\x68\x69\x73\x2e" -"\x64\x69\x72\x74\x79\x3d\x21\x30\x3a\x74\x68\x69\x73\x2e\x73\x79\x6e\x63\x3f\x74\x68\x69\x73\x2e\x72\x75\x6e\x28\x29\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x69\x64\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x3d\x3d\x6e\x6e\x5b\x74\x5d\x29\x7b\x69\x66\x28\x6e\x6e\x5b\x74\x5d\x3d\x21\x30\x2c\x6f\x6e\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x6e\x2e\x6c\x65" -"\x6e\x67\x74\x68\x2d\x31\x3b\x6e\x3e\x61\x6e\x26\x26\x65\x6e\x5b\x6e\x5d\x2e\x69\x64\x3e\x65\x2e\x69\x64\x3b\x29\x6e\x2d\x2d\x3b\x65\x6e\x2e\x73\x70\x6c\x69\x63\x65\x28\x6e\x2b\x31\x2c\x30\x2c\x65\x29\x7d\x65\x6c\x73\x65\x20\x65\x6e\x2e\x70\x75\x73\x68\x28\x65\x29\x3b\x72\x6e\x7c\x7c\x28\x72\x6e\x3d\x21\x30\x2c\x51\x65\x28\x6c\x6e\x29\x29\x7d\x7d\x28\x74\x68\x69\x73\x29\x7d\x2c\x70\x6e\x2e\x70\x72" -"\x6f\x74\x6f\x74\x79\x70\x65\x2e\x72\x75\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x66\x28\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x67\x65\x74\x28\x29\x3b\x69\x66\x28\x65\x21\x3d\x3d\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x7c\x7c\x6f\x28\x65\x29\x7c\x7c\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68" -"\x69\x73\x2e\x76\x61\x6c\x75\x65\x3b\x69\x66\x28\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3d\x65\x2c\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x29\x7b\x76\x61\x72\x20\x6e\x3d\x27\x63\x61\x6c\x6c\x62\x61\x63\x6b\x20\x66\x6f\x72\x20\x77\x61\x74\x63\x68\x65\x72\x20\x22\x27\x2b\x74\x68\x69\x73\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x27\x22\x27\x3b\x42\x65\x28\x74\x68\x69\x73\x2e\x63\x62\x2c\x74\x68" -"\x69\x73\x2e\x76\x6d\x2c\x5b\x65\x2c\x74\x5d\x2c\x74\x68\x69\x73\x2e\x76\x6d\x2c\x6e\x29\x7d\x65\x6c\x73\x65\x20\x74\x68\x69\x73\x2e\x63\x62\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2e\x76\x6d\x2c\x65\x2c\x74\x29\x7d\x7d\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x65\x76\x61\x6c\x75\x61\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65" -"\x3d\x74\x68\x69\x73\x2e\x67\x65\x74\x28\x29\x2c\x74\x68\x69\x73\x2e\x64\x69\x72\x74\x79\x3d\x21\x31\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x64\x65\x70\x65\x6e\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x65\x2d\x2d\x3b\x29\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x5b" -"\x65\x5d\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x66\x28\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x29\x7b\x74\x68\x69\x73\x2e\x76\x6d\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x7c\x7c\x68\x28\x74\x68\x69\x73\x2e\x76\x6d\x2e\x5f" -"\x77\x61\x74\x63\x68\x65\x72\x73\x2c\x74\x68\x69\x73\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x65\x2d\x2d\x3b\x29\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x5b\x65\x5d\x2e\x72\x65\x6d\x6f\x76\x65\x53\x75\x62\x28\x74\x68\x69\x73\x29\x3b\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x7d\x7d\x3b\x76\x61\x72\x20\x64\x6e\x3d" -"\x7b\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x67\x65\x74\x3a\x53\x2c\x73\x65\x74\x3a\x53\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x64\x6e\x2e\x67\x65\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x5b\x74\x5d\x5b\x6e\x5d\x7d\x2c" -"\x64\x6e\x2e\x73\x65\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x5b\x74\x5d\x5b\x6e\x5d\x3d\x65\x7d\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x6e\x2c\x64\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x6e\x28\x65\x29\x7b\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x3d\x5b\x5d\x3b\x76\x61\x72\x20\x74\x3d\x65" -"\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x74\x2e\x70\x72\x6f\x70\x73\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x7c\x7c\x7b\x7d\x2c\x72\x3d\x65\x2e\x5f\x70\x72\x6f\x70\x73\x3d\x7b\x7d\x2c\x69\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x72\x6f\x70\x4b\x65\x79\x73" -"\x3d\x5b\x5d\x3b\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x26\x26\x24\x65\x28\x21\x31\x29\x3b\x76\x61\x72\x20\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x69\x2e\x70\x75\x73\x68\x28\x6f\x29\x3b\x76\x61\x72\x20\x61\x3d\x49\x65\x28\x6f\x2c\x74\x2c\x6e\x2c\x65\x29\x3b\x78\x65\x28\x72\x2c\x6f\x2c\x61\x29\x2c\x6f\x20\x69\x6e\x20\x65\x7c\x7c\x76\x6e\x28\x65\x2c\x22\x5f\x70\x72\x6f\x70\x73\x22\x2c" -"\x6f\x29\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x20\x69\x6e\x20\x74\x29\x6f\x28\x61\x29\x3b\x24\x65\x28\x21\x30\x29\x7d\x28\x65\x2c\x74\x2e\x70\x72\x6f\x70\x73\x29\x2c\x74\x2e\x6d\x65\x74\x68\x6f\x64\x73\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29" -"\x65\x5b\x6e\x5d\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x5b\x6e\x5d\x3f\x53\x3a\x78\x28\x74\x5b\x6e\x5d\x2c\x65\x29\x7d\x28\x65\x2c\x74\x2e\x6d\x65\x74\x68\x6f\x64\x73\x29\x2c\x74\x2e\x64\x61\x74\x61\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x64\x61\x74\x61\x3b\x73\x28\x74\x3d" -"\x65\x2e\x5f\x64\x61\x74\x61\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x6c\x65\x28\x29\x3b\x74\x72\x79\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x61\x6c\x6c\x28\x74\x2c\x74\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x65\x28\x65\x2c\x74\x2c\x22\x64\x61\x74\x61\x28" -"\x29\x22\x29\x2c\x7b\x7d\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x66\x65\x28\x29\x7d\x7d\x28\x74\x2c\x65\x29\x3a\x74\x7c\x7c\x7b\x7d\x29\x7c\x7c\x28\x74\x3d\x7b\x7d\x29\x3b\x76\x61\x72\x20\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2c\x72\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x2c\x69\x3d\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6d\x65\x74\x68" -"\x6f\x64\x73\x2c\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3b\x66\x6f\x72\x28\x3b\x69\x2d\x2d\x3b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x5b\x69\x5d\x3b\x72\x26\x26\x79\x28\x72\x2c\x6f\x29\x7c\x7c\x28\x61\x3d\x76\x6f\x69\x64\x20\x30\x2c\x33\x36\x21\x3d\x3d\x28\x61\x3d\x28\x6f\x2b\x22\x22\x29\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x30\x29\x29\x26\x26\x39\x35\x21\x3d\x3d\x61\x26\x26\x76\x6e\x28\x65" -"\x2c\x22\x5f\x64\x61\x74\x61\x22\x2c\x6f\x29\x29\x7d\x76\x61\x72\x20\x61\x3b\x43\x65\x28\x74\x2c\x21\x30\x29\x7d\x28\x65\x29\x3a\x43\x65\x28\x65\x2e\x5f\x64\x61\x74\x61\x3d\x7b\x7d\x2c\x21\x30\x29\x2c\x74\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x63\x6f\x6d\x70\x75\x74\x65\x64\x57\x61\x74\x63\x68\x65\x72" -"\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x74\x65\x28\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20\x6f\x3d\x74\x5b\x69\x5d\x2c\x61\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6f\x3f\x6f\x3a\x6f\x2e\x67\x65\x74\x3b\x72\x7c\x7c\x28\x6e\x5b\x69\x5d\x3d\x6e\x65\x77\x20" -"\x70\x6e\x28\x65\x2c\x61\x7c\x7c\x53\x2c\x53\x2c\x6d\x6e\x29\x29\x2c\x69\x20\x69\x6e\x20\x65\x7c\x7c\x79\x6e\x28\x65\x2c\x69\x2c\x6f\x29\x7d\x7d\x28\x65\x2c\x74\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x29\x2c\x74\x2e\x77\x61\x74\x63\x68\x26\x26\x74\x2e\x77\x61\x74\x63\x68\x21\x3d\x3d\x59\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20" -"\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x5b\x6e\x5d\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x62\x6e\x28\x65\x2c\x6e\x2c\x72\x5b\x69\x5d\x29\x3b\x65\x6c\x73\x65\x20\x62\x6e\x28\x65\x2c\x6e\x2c\x72\x29\x7d\x7d\x28\x65\x2c\x74\x2e\x77\x61\x74\x63\x68" -"\x29\x7d\x76\x61\x72\x20\x6d\x6e\x3d\x7b\x6c\x61\x7a\x79\x3a\x21\x30\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x21\x74\x65\x28\x29\x3b\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6e\x3f\x28\x64\x6e\x2e\x67\x65\x74\x3d\x72\x3f\x67\x6e\x28\x74\x29\x3a\x5f\x6e\x28\x6e\x29\x2c\x64\x6e\x2e\x73\x65\x74\x3d" -"\x53\x29\x3a\x28\x64\x6e\x2e\x67\x65\x74\x3d\x6e\x2e\x67\x65\x74\x3f\x72\x26\x26\x21\x31\x21\x3d\x3d\x6e\x2e\x63\x61\x63\x68\x65\x3f\x67\x6e\x28\x74\x29\x3a\x5f\x6e\x28\x6e\x2e\x67\x65\x74\x29\x3a\x53\x2c\x64\x6e\x2e\x73\x65\x74\x3d\x6e\x2e\x73\x65\x74\x7c\x7c\x53\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x64\x6e\x29\x7d\x66\x75" -"\x6e\x63\x74\x69\x6f\x6e\x20\x67\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x5f\x63\x6f\x6d\x70\x75\x74\x65\x64\x57\x61\x74\x63\x68\x65\x72\x73\x26\x26\x74\x68\x69\x73\x2e\x5f\x63\x6f\x6d\x70\x75\x74\x65\x64\x57\x61\x74\x63\x68\x65\x72\x73\x5b\x65\x5d\x3b\x69\x66\x28\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x74" -"\x2e\x64\x69\x72\x74\x79\x26\x26\x74\x2e\x65\x76\x61\x6c\x75\x61\x74\x65\x28\x29\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x26\x26\x74\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x74\x2e\x76\x61\x6c\x75\x65\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x61\x6c\x6c\x28\x74" -"\x68\x69\x73\x2c\x74\x68\x69\x73\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x73\x28\x6e\x29\x26\x26\x28\x72\x3d\x6e\x2c\x6e\x3d\x6e\x2e\x68\x61\x6e\x64\x6c\x65\x72\x29\x2c\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6e\x26\x26\x28\x6e\x3d\x65\x5b\x6e\x5d\x29\x2c\x65\x2e\x24\x77\x61\x74\x63\x68" -"\x28\x74\x2c\x6e\x2c\x72\x29\x7d\x76\x61\x72\x20\x24\x6e\x3d\x30\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x77\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x65\x2e\x73\x75\x70\x65\x72\x29\x7b\x76\x61\x72\x20\x6e\x3d\x77\x6e\x28\x65\x2e\x73\x75\x70\x65\x72\x29\x3b\x69\x66\x28\x6e\x21\x3d\x3d\x65\x2e\x73\x75\x70\x65\x72\x4f\x70\x74\x69\x6f\x6e\x73\x29" -"\x7b\x65\x2e\x73\x75\x70\x65\x72\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x6e\x3b\x76\x61\x72\x20\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x3d\x65\x2e\x73\x65\x61\x6c\x65\x64\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x20\x69\x6e\x20\x6e\x29\x6e\x5b\x69\x5d\x21\x3d\x3d\x72\x5b\x69\x5d\x26\x26" -"\x28\x74\x7c\x7c\x28\x74\x3d\x7b\x7d\x29\x2c\x74\x5b\x69\x5d\x3d\x6e\x5b\x69\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x65\x29\x3b\x72\x26\x26\x41\x28\x65\x2e\x65\x78\x74\x65\x6e\x64\x4f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x29\x2c\x28\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x6e\x2c\x65\x2e\x65\x78\x74\x65\x6e\x64\x4f\x70\x74\x69\x6f\x6e\x73\x29\x29\x2e\x6e\x61\x6d\x65\x26" -"\x26\x28\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x5b\x74\x2e\x6e\x61\x6d\x65\x5d\x3d\x65\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x5f\x69\x6e\x69\x74\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x6e\x28\x65\x29\x7b\x65\x2e\x63\x69\x64\x3d\x30\x3b\x76\x61\x72\x20\x74\x3d\x31\x3b\x65\x2e\x65\x78" -"\x74\x65\x6e\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x3d\x65\x7c\x7c\x7b\x7d\x3b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2c\x72\x3d\x6e\x2e\x63\x69\x64\x2c\x69\x3d\x65\x2e\x5f\x43\x74\x6f\x72\x7c\x7c\x28\x65\x2e\x5f\x43\x74\x6f\x72\x3d\x7b\x7d\x29\x3b\x69\x66\x28\x69\x5b\x72\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x5b\x72\x5d\x3b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x6e\x61\x6d\x65" -"\x7c\x7c\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6e\x61\x6d\x65\x2c\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x5f\x69\x6e\x69\x74\x28\x65\x29\x7d\x3b\x72\x65\x74\x75\x72\x6e\x28\x61\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x29\x2e\x63\x6f\x6e\x73\x74\x72\x75" -"\x63\x74\x6f\x72\x3d\x61\x2c\x61\x2e\x63\x69\x64\x3d\x74\x2b\x2b\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x65\x29\x2c\x61\x2e\x73\x75\x70\x65\x72\x3d\x6e\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72" -"\x6f\x70\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x76\x6e\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x5f\x70\x72\x6f\x70\x73\x22\x2c\x6e\x29\x7d\x28\x61\x29\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f" -"\x6d\x70\x75\x74\x65\x64\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x79\x6e\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x6e\x2c\x74\x5b\x6e\x5d\x29\x7d\x28\x61\x29\x2c\x61\x2e\x65\x78\x74\x65\x6e\x64\x3d\x6e\x2e\x65\x78\x74\x65\x6e\x64\x2c\x61\x2e\x6d\x69\x78\x69\x6e\x3d\x6e\x2e\x6d\x69\x78\x69\x6e\x2c\x61\x2e\x75\x73\x65\x3d\x6e\x2e\x75\x73\x65\x2c\x49\x2e\x66\x6f\x72" -"\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x61\x5b\x65\x5d\x3d\x6e\x5b\x65\x5d\x7d\x29\x2c\x6f\x26\x26\x28\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x5b\x6f\x5d\x3d\x61\x29\x2c\x61\x2e\x73\x75\x70\x65\x72\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x61\x2e\x65\x78\x74\x65\x6e\x64\x4f\x70\x74\x69\x6f\x6e\x73" -"\x3d\x65\x2c\x61\x2e\x73\x65\x61\x6c\x65\x64\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x41\x28\x7b\x7d\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x2c\x69\x5b\x72\x5d\x3d\x61\x2c\x61\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x26\x26\x28\x65\x2e\x43\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6e\x61\x6d\x65\x7c\x7c\x65\x2e\x74\x61\x67\x29\x7d\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3e\x2d\x31\x3a\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x22\x29\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3e\x2d" -"\x31\x3a\x28\x6e\x3d\x65\x2c\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x52\x65\x67\x45\x78\x70\x5d\x22\x3d\x3d\x3d\x61\x2e\x63\x61\x6c\x6c\x28\x6e\x29\x26\x26\x65\x2e\x74\x65\x73\x74\x28\x74\x29\x29\x3b\x76\x61\x72\x20\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x63\x61\x63\x68\x65\x2c\x72\x3d\x65\x2e\x6b\x65\x79\x73\x2c\x69\x3d\x65\x2e\x5f" -"\x76\x6e\x6f\x64\x65\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x6e\x29\x7b\x76\x61\x72\x20\x61\x3d\x6e\x5b\x6f\x5d\x3b\x69\x66\x28\x61\x29\x7b\x76\x61\x72\x20\x73\x3d\x61\x2e\x6e\x61\x6d\x65\x3b\x73\x26\x26\x21\x74\x28\x73\x29\x26\x26\x53\x6e\x28\x6e\x2c\x6f\x2c\x72\x2c\x69\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72" -"\x20\x69\x3d\x65\x5b\x74\x5d\x3b\x21\x69\x7c\x7c\x72\x26\x26\x69\x2e\x74\x61\x67\x3d\x3d\x3d\x72\x2e\x74\x61\x67\x7c\x7c\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x24\x64\x65\x73\x74\x72\x6f\x79\x28\x29\x2c\x65\x5b\x74\x5d\x3d\x6e\x75\x6c\x6c\x2c\x68\x28\x6e\x2c\x74\x29\x7d\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79" -"\x70\x65\x2e\x5f\x69\x6e\x69\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x3b\x6e\x2e\x5f\x75\x69\x64\x3d\x24\x6e\x2b\x2b\x2c\x6e\x2e\x5f\x69\x73\x56\x75\x65\x3d\x21\x30\x2c\x74\x26\x26\x74\x2e\x5f\x69\x73\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x24\x6f\x70\x74" -"\x69\x6f\x6e\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x2c\x72\x3d\x74\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3b\x6e\x2e\x70\x61\x72\x65\x6e\x74\x3d\x74\x2e\x70\x61\x72\x65\x6e\x74\x2c\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3d\x72\x3b\x76\x61\x72\x20\x69\x3d" -"\x72\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x6e\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x3d\x69\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x2c\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x69\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x2c\x6e\x2e\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65\x6e\x3d\x69\x2e\x63\x68\x69\x6c\x64\x72" -"\x65\x6e\x2c\x6e\x2e\x5f\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x54\x61\x67\x3d\x69\x2e\x74\x61\x67\x2c\x74\x2e\x72\x65\x6e\x64\x65\x72\x26\x26\x28\x6e\x2e\x72\x65\x6e\x64\x65\x72\x3d\x74\x2e\x72\x65\x6e\x64\x65\x72\x2c\x6e\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x29\x7d\x28\x6e\x2c\x74\x29\x3a\x6e\x2e\x24" -"\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x77\x6e\x28\x6e\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x29\x2c\x74\x7c\x7c\x7b\x7d\x2c\x6e\x29\x2c\x6e\x2e\x5f\x72\x65\x6e\x64\x65\x72\x50\x72\x6f\x78\x79\x3d\x6e\x2c\x6e\x2e\x5f\x73\x65\x6c\x66\x3d\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x6e\x3d\x74\x2e\x70\x61" -"\x72\x65\x6e\x74\x3b\x69\x66\x28\x6e\x26\x26\x21\x74\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x29\x7b\x66\x6f\x72\x28\x3b\x6e\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x26\x26\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x29\x6e\x3d\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x6e\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x75\x73\x68\x28\x65\x29\x7d\x65\x2e\x24\x70\x61\x72\x65" -"\x6e\x74\x3d\x6e\x2c\x65\x2e\x24\x72\x6f\x6f\x74\x3d\x6e\x3f\x6e\x2e\x24\x72\x6f\x6f\x74\x3a\x65\x2c\x65\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x5b\x5d\x2c\x65\x2e\x24\x72\x65\x66\x73\x3d\x7b\x7d\x2c\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x3d\x6e\x75\x6c\x6c\x2c\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x6e\x75\x6c\x6c\x2c\x65\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76" -"\x65\x3d\x21\x31\x2c\x65\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3d\x21\x31\x2c\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x31\x2c\x65\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x31\x7d\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e\x5f\x65\x76\x65\x6e\x74\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74" -"\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x65\x2e\x5f\x68\x61\x73\x48\x6f\x6f\x6b\x45\x76\x65\x6e\x74\x3d\x21\x31\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3b\x74\x26\x26\x57\x74\x28\x65\x2c\x74\x29\x7d\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x3d\x6e\x75\x6c" -"\x6c\x2c\x74\x2e\x5f\x73\x74\x61\x74\x69\x63\x54\x72\x65\x65\x73\x3d\x6e\x75\x6c\x6c\x3b\x76\x61\x72\x20\x6e\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x3d\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x2c\x69\x3d\x72\x26\x26\x72\x2e\x63\x6f\x6e\x74\x65\x78\x74\x3b\x74\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x6c\x74\x28\x6e\x2e\x5f\x72\x65\x6e\x64\x65" -"\x72\x43\x68\x69\x6c\x64\x72\x65\x6e\x2c\x69\x29\x2c\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x65\x2c\x74\x2e\x5f\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x74\x28\x74\x2c\x65\x2c\x6e\x2c\x72\x2c\x69\x2c\x21\x31\x29\x7d\x2c\x74\x2e\x24\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x3d\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x28\x65\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x74\x28\x74\x2c\x65\x2c\x6e\x2c\x72\x2c\x69\x2c\x21\x30\x29\x7d\x3b\x76\x61\x72\x20\x6f\x3d\x72\x26\x26\x72\x2e\x64\x61\x74\x61\x3b\x78\x65\x28\x74\x2c\x22\x24\x61\x74\x74\x72\x73\x22\x2c\x6f\x26\x26\x6f\x2e\x61\x74\x74\x72\x73\x7c\x7c\x65\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x2c\x78\x65\x28\x74\x2c\x22\x24\x6c\x69" -"\x73\x74\x65\x6e\x65\x72\x73\x22\x2c\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x7c\x7c\x65\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x7d\x28\x6e\x29\x2c\x51\x74\x28\x6e\x2c\x22\x62\x65\x66\x6f\x72\x65\x43\x72\x65\x61\x74\x65\x22\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x75\x74\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x69\x6e\x6a" -"\x65\x63\x74\x2c\x65\x29\x3b\x74\x26\x26\x28\x24\x65\x28\x21\x31\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x78\x65\x28\x65\x2c\x6e\x2c\x74\x5b\x6e\x5d\x29\x7d\x29\x2c\x24\x65\x28\x21\x30\x29\x29\x7d\x28\x6e\x29\x2c\x68\x6e\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61" -"\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x76\x69\x64\x65\x3b\x74\x26\x26\x28\x65\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x74\x29\x7d\x28\x6e\x29\x2c\x51\x74\x28\x6e\x2c\x22\x63\x72\x65\x61\x74\x65\x64\x22\x29\x2c\x6e\x2e\x24\x6f\x70\x74\x69" -"\x6f\x6e\x73\x2e\x65\x6c\x26\x26\x6e\x2e\x24\x6d\x6f\x75\x6e\x74\x28\x6e\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x65\x6c\x29\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x64\x61\x74\x61\x7d\x7d\x2c\x6e\x3d\x7b\x67\x65\x74\x3a\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x70\x72\x6f\x70\x73\x7d\x7d\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x64\x61\x74\x61\x22\x2c\x74\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2e" -"\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x70\x72\x6f\x70\x73\x22\x2c\x6e\x29\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x73\x65\x74\x3d\x6b\x65\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x64\x65\x6c\x65\x74\x65\x3d\x41\x65\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x77\x61\x74\x63\x68\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b" -"\x69\x66\x28\x73\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x62\x6e\x28\x74\x68\x69\x73\x2c\x65\x2c\x74\x2c\x6e\x29\x3b\x28\x6e\x3d\x6e\x7c\x7c\x7b\x7d\x29\x2e\x75\x73\x65\x72\x3d\x21\x30\x3b\x76\x61\x72\x20\x72\x3d\x6e\x65\x77\x20\x70\x6e\x28\x74\x68\x69\x73\x2c\x65\x2c\x74\x2c\x6e\x29\x3b\x69\x66\x28\x6e\x2e\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x29\x7b\x76\x61\x72\x20\x69\x3d\x27\x63\x61\x6c\x6c" -"\x62\x61\x63\x6b\x20\x66\x6f\x72\x20\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x20\x77\x61\x74\x63\x68\x65\x72\x20\x22\x27\x2b\x72\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x27\x22\x27\x3b\x6c\x65\x28\x29\x2c\x42\x65\x28\x74\x2c\x74\x68\x69\x73\x2c\x5b\x72\x2e\x76\x61\x6c\x75\x65\x5d\x2c\x74\x68\x69\x73\x2c\x69\x29\x2c\x66\x65\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e" -"\x28\x29\x7b\x72\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x28\x29\x7d\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x2f\x5e\x68\x6f\x6f\x6b\x3a\x2f\x3b\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6f\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x68\x69\x73\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e" -"\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x2c\x6f\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x72\x2e\x24\x6f\x6e\x28\x65\x5b\x69\x5d\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x28\x72\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x7c\x7c\x28\x72\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x6e" -"\x29\x2c\x74\x2e\x74\x65\x73\x74\x28\x65\x29\x26\x26\x28\x72\x2e\x5f\x68\x61\x73\x48\x6f\x6f\x6b\x45\x76\x65\x6e\x74\x3d\x21\x30\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6f\x6e\x63\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x28\x29\x7b" -"\x6e\x2e\x24\x6f\x66\x66\x28\x65\x2c\x72\x29\x2c\x74\x2e\x61\x70\x70\x6c\x79\x28\x6e\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x2e\x66\x6e\x3d\x74\x2c\x6e\x2e\x24\x6f\x6e\x28\x65\x2c\x72\x29\x2c\x6e\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6f\x66\x66\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68" -"\x69\x73\x3b\x69\x66\x28\x21\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x65\x76\x65\x6e\x74\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x6e\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x65\x2e" -"\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x6e\x2e\x24\x6f\x66\x66\x28\x65\x5b\x72\x5d\x2c\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x76\x61\x72\x20\x6f\x2c\x61\x3d\x6e\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3b\x69\x66\x28\x21\x61\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x3b\x69\x66\x28\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d" -"\x3d\x6e\x75\x6c\x6c\x2c\x6e\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x3d\x61\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x2d\x2d\x3b\x29\x69\x66\x28\x28\x6f\x3d\x61\x5b\x73\x5d\x29\x3d\x3d\x3d\x74\x7c\x7c\x6f\x2e\x66\x6e\x3d\x3d\x3d\x74\x29\x7b\x61\x2e\x73\x70\x6c\x69\x63\x65\x28\x73\x2c\x31\x29\x3b\x62\x72\x65\x61\x6b\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65" -"\x2e\x24\x65\x6d\x69\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3b\x69\x66\x28\x74\x29\x7b\x74\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x31\x3f\x6b\x28\x74\x29\x3a\x74\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x6b\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x31\x29\x2c\x72\x3d\x27\x65\x76\x65\x6e\x74" -"\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x66\x6f\x72\x20\x22\x27\x2b\x65\x2b\x27\x22\x27\x2c\x69\x3d\x30\x2c\x6f\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x42\x65\x28\x74\x5b\x69\x5d\x2c\x74\x68\x69\x73\x2c\x6e\x2c\x74\x68\x69\x73\x2c\x72\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e" -"\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x5f\x75\x70\x64\x61\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2c\x72\x3d\x6e\x2e\x24\x65\x6c\x2c\x69\x3d\x6e\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6f\x3d\x47\x74\x28\x6e\x29\x3b\x6e\x2e\x5f\x76\x6e\x6f\x64\x65\x3d\x65\x2c\x6e\x2e\x24\x65\x6c\x3d\x69\x3f\x6e\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f" -"\x28\x69\x2c\x65\x29\x3a\x6e\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x6e\x2e\x24\x65\x6c\x2c\x65\x2c\x74\x2c\x21\x31\x29\x2c\x6f\x28\x29\x2c\x72\x26\x26\x28\x72\x2e\x5f\x5f\x76\x75\x65\x5f\x5f\x3d\x6e\x75\x6c\x6c\x29\x2c\x6e\x2e\x24\x65\x6c\x26\x26\x28\x6e\x2e\x24\x65\x6c\x2e\x5f\x5f\x76\x75\x65\x5f\x5f\x3d\x6e\x29\x2c\x6e\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74" -"\x26\x26\x6e\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x3d\x3d\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x26\x26\x28\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x2e\x24\x65\x6c\x3d\x6e\x2e\x24\x65\x6c\x29\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x5f\x77\x61\x74\x63" -"\x68\x65\x72\x26\x26\x74\x68\x69\x73\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x2e\x75\x70\x64\x61\x74\x65\x28\x29\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x64\x65\x73\x74\x72\x6f\x79\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x3b\x69\x66\x28\x21\x65\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x29\x7b\x51\x74\x28" -"\x65\x2c\x22\x62\x65\x66\x6f\x72\x65\x44\x65\x73\x74\x72\x6f\x79\x22\x29\x2c\x65\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x30\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x21\x74\x7c\x7c\x74\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x7c\x7c\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73\x74\x72\x61" -"\x63\x74\x7c\x7c\x68\x28\x74\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x65\x29\x2c\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x26\x26\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x28\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2d\x2d\x3b\x29\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73" -"\x5b\x6e\x5d\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x28\x29\x3b\x65\x2e\x5f\x64\x61\x74\x61\x2e\x5f\x5f\x6f\x62\x5f\x5f\x26\x26\x65\x2e\x5f\x64\x61\x74\x61\x2e\x5f\x5f\x6f\x62\x5f\x5f\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x2d\x2d\x2c\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x30\x2c\x65\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6e\x75\x6c\x6c\x29" -"\x2c\x51\x74\x28\x65\x2c\x22\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x22\x29\x2c\x65\x2e\x24\x6f\x66\x66\x28\x29\x2c\x65\x2e\x24\x65\x6c\x26\x26\x28\x65\x2e\x24\x65\x6c\x2e\x5f\x5f\x76\x75\x65\x5f\x5f\x3d\x6e\x75\x6c\x6c\x29\x2c\x65\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x28\x65\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x6e\x75\x6c\x6c\x29\x7d\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63" -"\x74\x69\x6f\x6e\x28\x65\x29\x7b\x4e\x74\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6e\x65\x78\x74\x54\x69\x63\x6b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x51\x65\x28\x65\x2c\x74\x68\x69\x73\x29\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x5f\x72\x65\x6e\x64\x65\x72\x3d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x2c\x74\x3d\x74\x68\x69\x73\x2c\x6e\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x3d\x6e\x2e\x72\x65\x6e\x64\x65\x72\x2c\x69\x3d\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3b\x69\x26\x26\x28\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x64\x74\x28\x69\x2e\x64\x61\x74\x61\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f" -"\x74\x73\x2c\x74\x2e\x24\x73\x6c\x6f\x74\x73\x2c\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x29\x29\x2c\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x69\x3b\x74\x72\x79\x7b\x55\x74\x3d\x74\x2c\x65\x3d\x72\x2e\x63\x61\x6c\x6c\x28\x74\x2e\x5f\x72\x65\x6e\x64\x65\x72\x50\x72\x6f\x78\x79\x2c\x74\x2e\x24\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x29\x7d\x63\x61\x74\x63\x68\x28\x6e\x29\x7b" -"\x48\x65\x28\x6e\x2c\x74\x2c\x22\x72\x65\x6e\x64\x65\x72\x22\x29\x2c\x65\x3d\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x55\x74\x3d\x6e\x75\x6c\x6c\x7d\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x26\x26\x31\x3d\x3d\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x65\x3d\x65\x5b\x30\x5d\x29\x2c\x65\x20\x69\x6e\x73\x74\x61\x6e" -"\x63\x65\x6f\x66\x20\x70\x65\x7c\x7c\x28\x65\x3d\x76\x65\x28\x29\x29\x2c\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x69\x2c\x65\x7d\x7d\x28\x43\x6e\x29\x3b\x76\x61\x72\x20\x54\x6e\x3d\x5b\x53\x74\x72\x69\x6e\x67\x2c\x52\x65\x67\x45\x78\x70\x2c\x41\x72\x72\x61\x79\x5d\x2c\x4e\x6e\x3d\x7b\x4b\x65\x65\x70\x41\x6c\x69\x76\x65\x3a\x7b\x6e\x61\x6d\x65\x3a\x22\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76\x65\x22\x2c\x61" -"\x62\x73\x74\x72\x61\x63\x74\x3a\x21\x30\x2c\x70\x72\x6f\x70\x73\x3a\x7b\x69\x6e\x63\x6c\x75\x64\x65\x3a\x54\x6e\x2c\x65\x78\x63\x6c\x75\x64\x65\x3a\x54\x6e\x2c\x6d\x61\x78\x3a\x5b\x53\x74\x72\x69\x6e\x67\x2c\x4e\x75\x6d\x62\x65\x72\x5d\x7d\x2c\x6d\x65\x74\x68\x6f\x64\x73\x3a\x7b\x63\x61\x63\x68\x65\x56\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68" -"\x69\x73\x2e\x63\x61\x63\x68\x65\x2c\x74\x3d\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x76\x6e\x6f\x64\x65\x54\x6f\x43\x61\x63\x68\x65\x2c\x72\x3d\x74\x68\x69\x73\x2e\x6b\x65\x79\x54\x6f\x43\x61\x63\x68\x65\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x69\x3d\x6e\x2e\x74\x61\x67\x2c\x6f\x3d\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2c\x61" -"\x3d\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x65\x5b\x72\x5d\x3d\x7b\x6e\x61\x6d\x65\x3a\x6b\x6e\x28\x61\x29\x2c\x74\x61\x67\x3a\x69\x2c\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3a\x6f\x7d\x2c\x74\x2e\x70\x75\x73\x68\x28\x72\x29\x2c\x74\x68\x69\x73\x2e\x6d\x61\x78\x26\x26\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x70\x61\x72\x73\x65\x49\x6e" -"\x74\x28\x74\x68\x69\x73\x2e\x6d\x61\x78\x29\x26\x26\x53\x6e\x28\x65\x2c\x74\x5b\x30\x5d\x2c\x74\x2c\x74\x68\x69\x73\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x2c\x74\x68\x69\x73\x2e\x76\x6e\x6f\x64\x65\x54\x6f\x43\x61\x63\x68\x65\x3d\x6e\x75\x6c\x6c\x7d\x7d\x7d\x2c\x63\x72\x65\x61\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x3d\x4f\x62\x6a\x65\x63\x74" -"\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x3d\x5b\x5d\x7d\x2c\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x20\x69\x6e\x20\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x29\x53\x6e\x28\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x2c\x65\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x29\x7d" -"\x2c\x6d\x6f\x75\x6e\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x3b\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x56\x4e\x6f\x64\x65\x28\x29\x2c\x74\x68\x69\x73\x2e\x24\x77\x61\x74\x63\x68\x28\x22\x69\x6e\x63\x6c\x75\x64\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x4f\x6e\x28\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b" -"\x72\x65\x74\x75\x72\x6e\x20\x41\x6e\x28\x74\x2c\x65\x29\x7d\x29\x7d\x29\x2c\x74\x68\x69\x73\x2e\x24\x77\x61\x74\x63\x68\x28\x22\x65\x78\x63\x6c\x75\x64\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x4f\x6e\x28\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x41\x6e\x28\x74\x2c\x65\x29\x7d\x29\x7d\x29\x7d\x2c\x75\x70\x64\x61\x74\x65\x64\x3a\x66\x75" -"\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x56\x4e\x6f\x64\x65\x28\x29\x7d\x2c\x72\x65\x6e\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x2e\x64\x65\x66\x61\x75\x6c\x74\x2c\x74\x3d\x7a\x74\x28\x65\x29\x2c\x6e\x3d\x74\x26\x26\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69" -"\x6f\x6e\x73\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6b\x6e\x28\x6e\x29\x2c\x69\x3d\x74\x68\x69\x73\x2e\x69\x6e\x63\x6c\x75\x64\x65\x2c\x6f\x3d\x74\x68\x69\x73\x2e\x65\x78\x63\x6c\x75\x64\x65\x3b\x69\x66\x28\x69\x26\x26\x28\x21\x72\x7c\x7c\x21\x41\x6e\x28\x69\x2c\x72\x29\x29\x7c\x7c\x6f\x26\x26\x72\x26\x26\x41\x6e\x28\x6f\x2c\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x3b\x76\x61\x72" -"\x20\x61\x3d\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x2c\x73\x3d\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x2c\x63\x3d\x6e\x75\x6c\x6c\x3d\x3d\x74\x2e\x6b\x65\x79\x3f\x6e\x2e\x43\x74\x6f\x72\x2e\x63\x69\x64\x2b\x28\x6e\x2e\x74\x61\x67\x3f\x22\x3a\x3a\x22\x2b\x6e\x2e\x74\x61\x67\x3a\x22\x22\x29\x3a\x74\x2e\x6b\x65\x79\x3b\x61\x5b\x63\x5d\x3f\x28\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74" -"\x61\x6e\x63\x65\x3d\x61\x5b\x63\x5d\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2c\x68\x28\x73\x2c\x63\x29\x2c\x73\x2e\x70\x75\x73\x68\x28\x63\x29\x29\x3a\x28\x74\x68\x69\x73\x2e\x76\x6e\x6f\x64\x65\x54\x6f\x43\x61\x63\x68\x65\x3d\x74\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x54\x6f\x43\x61\x63\x68\x65\x3d\x63\x29\x2c\x74\x2e\x64\x61\x74\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69" -"\x76\x65\x3d\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x65\x26\x26\x65\x5b\x30\x5d\x7d\x7d\x7d\x3b\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x46\x7d\x7d\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x22\x63\x6f" -"\x6e\x66\x69\x67\x22\x2c\x74\x29\x2c\x65\x2e\x75\x74\x69\x6c\x3d\x7b\x77\x61\x72\x6e\x3a\x61\x65\x2c\x65\x78\x74\x65\x6e\x64\x3a\x41\x2c\x6d\x65\x72\x67\x65\x4f\x70\x74\x69\x6f\x6e\x73\x3a\x44\x65\x2c\x64\x65\x66\x69\x6e\x65\x52\x65\x61\x63\x74\x69\x76\x65\x3a\x78\x65\x7d\x2c\x65\x2e\x73\x65\x74\x3d\x6b\x65\x2c\x65\x2e\x64\x65\x6c\x65\x74\x65\x3d\x41\x65\x2c\x65\x2e\x6e\x65\x78\x74\x54\x69\x63\x6b" -"\x3d\x51\x65\x2c\x65\x2e\x6f\x62\x73\x65\x72\x76\x61\x62\x6c\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x43\x65\x28\x65\x29\x2c\x65\x7d\x2c\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x49\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x65\x2e\x6f" -"\x70\x74\x69\x6f\x6e\x73\x5b\x74\x2b\x22\x73\x22\x5d\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x7d\x29\x2c\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x62\x61\x73\x65\x3d\x65\x2c\x41\x28\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x2c\x4e\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e\x75\x73\x65\x3d\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x65\x64\x50\x6c\x75\x67\x69\x6e\x73\x7c\x7c\x28\x74\x68\x69\x73\x2e\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x65\x64\x50\x6c\x75\x67\x69\x6e\x73\x3d\x5b\x5d\x29\x3b\x69\x66\x28\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x65\x29\x3e\x2d\x31\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x3b" -"\x76\x61\x72\x20\x6e\x3d\x6b\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x31\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x75\x6e\x73\x68\x69\x66\x74\x28\x74\x68\x69\x73\x29\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x2e\x69\x6e\x73\x74\x61\x6c\x6c\x3f\x65\x2e\x69\x6e\x73\x74\x61\x6c\x6c\x2e\x61\x70\x70\x6c\x79\x28\x65\x2c\x6e\x29\x3a\x22\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26\x26\x65\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x6e\x29\x2c\x74\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x74\x68\x69\x73\x7d\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e\x6d\x69\x78\x69\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x6f\x70\x74\x69" -"\x6f\x6e\x73\x3d\x44\x65\x28\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x65\x29\x2c\x74\x68\x69\x73\x7d\x7d\x28\x65\x29\x2c\x78\x6e\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x49\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x65\x5b\x74\x5d\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e" -"\x3f\x28\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x22\x3d\x3d\x3d\x74\x26\x26\x73\x28\x6e\x29\x26\x26\x28\x6e\x2e\x6e\x61\x6d\x65\x3d\x6e\x2e\x6e\x61\x6d\x65\x7c\x7c\x65\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x62\x61\x73\x65\x2e\x65\x78\x74\x65\x6e\x64\x28\x6e\x29\x29\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x22\x3d\x3d\x3d\x74\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6e\x26\x26\x28\x6e\x3d\x7b\x62\x69\x6e\x64\x3a\x6e\x2c\x75\x70\x64\x61\x74\x65\x3a\x6e\x7d\x29\x2c\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x74\x2b\x22\x73\x22\x5d\x5b\x65\x5d\x3d\x6e\x2c\x6e\x29\x3a\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x74\x2b\x22\x73\x22\x5d\x5b\x65\x5d\x7d\x7d\x29\x7d\x28\x65\x29\x7d\x28\x43\x6e\x29\x2c\x4f" -"\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x69\x73\x53\x65\x72\x76\x65\x72\x22\x2c\x7b\x67\x65\x74\x3a\x74\x65\x7d\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x73\x73\x72\x43\x6f\x6e\x74" -"\x65\x78\x74\x22\x2c\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x73\x73\x72\x43\x6f\x6e\x74\x65\x78\x74\x7d\x7d\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x6e\x2c\x22\x46\x75\x6e\x63\x74\x69\x6f" -"\x6e\x61\x6c\x52\x65\x6e\x64\x65\x72\x43\x6f\x6e\x74\x65\x78\x74\x22\x2c\x7b\x76\x61\x6c\x75\x65\x3a\x45\x74\x7d\x29\x2c\x43\x6e\x2e\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x32\x2e\x36\x2e\x31\x34\x22\x3b\x76\x61\x72\x20\x45\x6e\x3d\x70\x28\x22\x73\x74\x79\x6c\x65\x2c\x63\x6c\x61\x73\x73\x22\x29\x2c\x6a\x6e\x3d\x70\x28\x22\x69\x6e\x70\x75\x74\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x2c\x6f\x70\x74\x69\x6f" -"\x6e\x2c\x73\x65\x6c\x65\x63\x74\x2c\x70\x72\x6f\x67\x72\x65\x73\x73\x22\x29\x2c\x44\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x76\x61\x6c\x75\x65\x22\x3d\x3d\x3d\x6e\x26\x26\x6a\x6e\x28\x65\x29\x26\x26\x22\x62\x75\x74\x74\x6f\x6e\x22\x21\x3d\x3d\x74\x7c\x7c\x22\x73\x65\x6c\x65\x63\x74\x65\x64\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x6f\x70\x74\x69" -"\x6f\x6e\x22\x3d\x3d\x3d\x65\x7c\x7c\x22\x63\x68\x65\x63\x6b\x65\x64\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x65\x7c\x7c\x22\x6d\x75\x74\x65\x64\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x76\x69\x64\x65\x6f\x22\x3d\x3d\x3d\x65\x7d\x2c\x4c\x6e\x3d\x70\x28\x22\x63\x6f\x6e\x74\x65\x6e\x74\x65\x64\x69\x74\x61\x62\x6c\x65\x2c\x64\x72\x61\x67\x67\x61\x62\x6c\x65\x2c\x73\x70\x65\x6c\x6c" -"\x63\x68\x65\x63\x6b\x22\x29\x2c\x49\x6e\x3d\x70\x28\x22\x65\x76\x65\x6e\x74\x73\x2c\x63\x61\x72\x65\x74\x2c\x74\x79\x70\x69\x6e\x67\x2c\x70\x6c\x61\x69\x6e\x74\x65\x78\x74\x2d\x6f\x6e\x6c\x79\x22\x29\x2c\x4d\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x42\x6e\x28\x74\x29\x7c\x7c\x22\x66\x61\x6c\x73\x65\x22\x3d\x3d\x3d\x74\x3f\x22\x66\x61\x6c\x73\x65" -"\x22\x3a\x22\x63\x6f\x6e\x74\x65\x6e\x74\x65\x64\x69\x74\x61\x62\x6c\x65\x22\x3d\x3d\x3d\x65\x26\x26\x49\x6e\x28\x74\x29\x3f\x74\x3a\x22\x74\x72\x75\x65\x22\x7d\x2c\x46\x6e\x3d\x70\x28\x22\x61\x6c\x6c\x6f\x77\x66\x75\x6c\x6c\x73\x63\x72\x65\x65\x6e\x2c\x61\x73\x79\x6e\x63\x2c\x61\x75\x74\x6f\x66\x6f\x63\x75\x73\x2c\x61\x75\x74\x6f\x70\x6c\x61\x79\x2c\x63\x68\x65\x63\x6b\x65\x64\x2c\x63\x6f\x6d\x70" -"\x61\x63\x74\x2c\x63\x6f\x6e\x74\x72\x6f\x6c\x73\x2c\x64\x65\x63\x6c\x61\x72\x65\x2c\x64\x65\x66\x61\x75\x6c\x74\x2c\x64\x65\x66\x61\x75\x6c\x74\x63\x68\x65\x63\x6b\x65\x64\x2c\x64\x65\x66\x61\x75\x6c\x74\x6d\x75\x74\x65\x64\x2c\x64\x65\x66\x61\x75\x6c\x74\x73\x65\x6c\x65\x63\x74\x65\x64\x2c\x64\x65\x66\x65\x72\x2c\x64\x69\x73\x61\x62\x6c\x65\x64\x2c\x65\x6e\x61\x62\x6c\x65\x64\x2c\x66\x6f\x72\x6d" -"\x6e\x6f\x76\x61\x6c\x69\x64\x61\x74\x65\x2c\x68\x69\x64\x64\x65\x6e\x2c\x69\x6e\x64\x65\x74\x65\x72\x6d\x69\x6e\x61\x74\x65\x2c\x69\x6e\x65\x72\x74\x2c\x69\x73\x6d\x61\x70\x2c\x69\x74\x65\x6d\x73\x63\x6f\x70\x65\x2c\x6c\x6f\x6f\x70\x2c\x6d\x75\x6c\x74\x69\x70\x6c\x65\x2c\x6d\x75\x74\x65\x64\x2c\x6e\x6f\x68\x72\x65\x66\x2c\x6e\x6f\x72\x65\x73\x69\x7a\x65\x2c\x6e\x6f\x73\x68\x61\x64\x65\x2c\x6e\x6f" -"\x76\x61\x6c\x69\x64\x61\x74\x65\x2c\x6e\x6f\x77\x72\x61\x70\x2c\x6f\x70\x65\x6e\x2c\x70\x61\x75\x73\x65\x6f\x6e\x65\x78\x69\x74\x2c\x72\x65\x61\x64\x6f\x6e\x6c\x79\x2c\x72\x65\x71\x75\x69\x72\x65\x64\x2c\x72\x65\x76\x65\x72\x73\x65\x64\x2c\x73\x63\x6f\x70\x65\x64\x2c\x73\x65\x61\x6d\x6c\x65\x73\x73\x2c\x73\x65\x6c\x65\x63\x74\x65\x64\x2c\x73\x6f\x72\x74\x61\x62\x6c\x65\x2c\x74\x72\x75\x65\x73\x70" -"\x65\x65\x64\x2c\x74\x79\x70\x65\x6d\x75\x73\x74\x6d\x61\x74\x63\x68\x2c\x76\x69\x73\x69\x62\x6c\x65\x22\x29\x2c\x50\x6e\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x2c\x52\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x3a\x22\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x35\x29" -"\x26\x26\x22\x78\x6c\x69\x6e\x6b\x22\x3d\x3d\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x35\x29\x7d\x2c\x48\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x52\x6e\x28\x65\x29\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x36\x2c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3a\x22\x22\x7d\x2c\x42\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20" -"\x6e\x75\x6c\x6c\x3d\x3d\x65\x7c\x7c\x21\x31\x3d\x3d\x3d\x65\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x2e\x64\x61\x74\x61\x2c\x72\x3d\x65\x2c\x69\x3d\x65\x3b\x6e\x28\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x3b\x29\x28\x69\x3d\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61" -"\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x26\x26\x69\x2e\x64\x61\x74\x61\x26\x26\x28\x74\x3d\x56\x6e\x28\x69\x2e\x64\x61\x74\x61\x2c\x74\x29\x29\x3b\x66\x6f\x72\x28\x3b\x6e\x28\x72\x3d\x72\x2e\x70\x61\x72\x65\x6e\x74\x29\x3b\x29\x72\x26\x26\x72\x2e\x64\x61\x74\x61\x26\x26\x28\x74\x3d\x56\x6e\x28\x74\x2c\x72\x2e\x64\x61\x74\x61\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x6e\x28\x65\x29\x7c\x7c\x6e\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x7a\x6e\x28\x65\x2c\x4b\x6e\x28\x74\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x22\x7d\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2c\x74\x2e\x63\x6c\x61\x73\x73\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x73\x74\x61" -"\x74\x69\x63\x43\x6c\x61\x73\x73\x3a\x7a\x6e\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2c\x74\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x29\x2c\x63\x6c\x61\x73\x73\x3a\x6e\x28\x65\x2e\x63\x6c\x61\x73\x73\x29\x3f\x5b\x65\x2e\x63\x6c\x61\x73\x73\x2c\x74\x2e\x63\x6c\x61\x73\x73\x5d\x3a\x74\x2e\x63\x6c\x61\x73\x73\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x6e\x28\x65\x2c\x74" -"\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x3f\x74\x3f\x65\x2b\x22\x20\x22\x2b\x74\x3a\x65\x3a\x74\x7c\x7c\x22\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x2c\x72\x3d\x22\x22\x2c\x69\x3d\x30\x2c\x6f" -"\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x6e\x28\x74\x3d\x4b\x6e\x28\x65\x5b\x69\x5d\x29\x29\x26\x26\x22\x22\x21\x3d\x3d\x74\x26\x26\x28\x72\x26\x26\x28\x72\x2b\x3d\x22\x20\x22\x29\x2c\x72\x2b\x3d\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x28\x65\x29\x3a\x6f\x28\x65\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x22\x3b\x66" -"\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x65\x29\x65\x5b\x6e\x5d\x26\x26\x28\x74\x26\x26\x28\x74\x2b\x3d\x22\x20\x22\x29\x2c\x74\x2b\x3d\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x65\x29\x3a\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x3a\x22\x22\x7d\x76\x61\x72\x20\x4a\x6e\x3d\x7b\x73\x76\x67\x3a\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e" -"\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x2c\x6d\x61\x74\x68\x3a\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x38\x2f\x4d\x61\x74\x68\x2f\x4d\x61\x74\x68\x4d\x4c\x22\x7d\x2c\x71\x6e\x3d\x70\x28\x22\x68\x74\x6d\x6c\x2c\x62\x6f\x64\x79\x2c\x62\x61\x73\x65\x2c\x68\x65\x61\x64\x2c\x6c\x69\x6e\x6b\x2c\x6d\x65\x74\x61\x2c\x73\x74\x79\x6c" -"\x65\x2c\x74\x69\x74\x6c\x65\x2c\x61\x64\x64\x72\x65\x73\x73\x2c\x61\x72\x74\x69\x63\x6c\x65\x2c\x61\x73\x69\x64\x65\x2c\x66\x6f\x6f\x74\x65\x72\x2c\x68\x65\x61\x64\x65\x72\x2c\x68\x31\x2c\x68\x32\x2c\x68\x33\x2c\x68\x34\x2c\x68\x35\x2c\x68\x36\x2c\x68\x67\x72\x6f\x75\x70\x2c\x6e\x61\x76\x2c\x73\x65\x63\x74\x69\x6f\x6e\x2c\x64\x69\x76\x2c\x64\x64\x2c\x64\x6c\x2c\x64\x74\x2c\x66\x69\x67\x63\x61\x70" -"\x74\x69\x6f\x6e\x2c\x66\x69\x67\x75\x72\x65\x2c\x70\x69\x63\x74\x75\x72\x65\x2c\x68\x72\x2c\x69\x6d\x67\x2c\x6c\x69\x2c\x6d\x61\x69\x6e\x2c\x6f\x6c\x2c\x70\x2c\x70\x72\x65\x2c\x75\x6c\x2c\x61\x2c\x62\x2c\x61\x62\x62\x72\x2c\x62\x64\x69\x2c\x62\x64\x6f\x2c\x62\x72\x2c\x63\x69\x74\x65\x2c\x63\x6f\x64\x65\x2c\x64\x61\x74\x61\x2c\x64\x66\x6e\x2c\x65\x6d\x2c\x69\x2c\x6b\x62\x64\x2c\x6d\x61\x72\x6b\x2c" -"\x71\x2c\x72\x70\x2c\x72\x74\x2c\x72\x74\x63\x2c\x72\x75\x62\x79\x2c\x73\x2c\x73\x61\x6d\x70\x2c\x73\x6d\x61\x6c\x6c\x2c\x73\x70\x61\x6e\x2c\x73\x74\x72\x6f\x6e\x67\x2c\x73\x75\x62\x2c\x73\x75\x70\x2c\x74\x69\x6d\x65\x2c\x75\x2c\x76\x61\x72\x2c\x77\x62\x72\x2c\x61\x72\x65\x61\x2c\x61\x75\x64\x69\x6f\x2c\x6d\x61\x70\x2c\x74\x72\x61\x63\x6b\x2c\x76\x69\x64\x65\x6f\x2c\x65\x6d\x62\x65\x64\x2c\x6f\x62" -"\x6a\x65\x63\x74\x2c\x70\x61\x72\x61\x6d\x2c\x73\x6f\x75\x72\x63\x65\x2c\x63\x61\x6e\x76\x61\x73\x2c\x73\x63\x72\x69\x70\x74\x2c\x6e\x6f\x73\x63\x72\x69\x70\x74\x2c\x64\x65\x6c\x2c\x69\x6e\x73\x2c\x63\x61\x70\x74\x69\x6f\x6e\x2c\x63\x6f\x6c\x2c\x63\x6f\x6c\x67\x72\x6f\x75\x70\x2c\x74\x61\x62\x6c\x65\x2c\x74\x68\x65\x61\x64\x2c\x74\x62\x6f\x64\x79\x2c\x74\x64\x2c\x74\x68\x2c\x74\x72\x2c\x62\x75\x74" -"\x74\x6f\x6e\x2c\x64\x61\x74\x61\x6c\x69\x73\x74\x2c\x66\x69\x65\x6c\x64\x73\x65\x74\x2c\x66\x6f\x72\x6d\x2c\x69\x6e\x70\x75\x74\x2c\x6c\x61\x62\x65\x6c\x2c\x6c\x65\x67\x65\x6e\x64\x2c\x6d\x65\x74\x65\x72\x2c\x6f\x70\x74\x67\x72\x6f\x75\x70\x2c\x6f\x70\x74\x69\x6f\x6e\x2c\x6f\x75\x74\x70\x75\x74\x2c\x70\x72\x6f\x67\x72\x65\x73\x73\x2c\x73\x65\x6c\x65\x63\x74\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x2c" -"\x64\x65\x74\x61\x69\x6c\x73\x2c\x64\x69\x61\x6c\x6f\x67\x2c\x6d\x65\x6e\x75\x2c\x6d\x65\x6e\x75\x69\x74\x65\x6d\x2c\x73\x75\x6d\x6d\x61\x72\x79\x2c\x63\x6f\x6e\x74\x65\x6e\x74\x2c\x65\x6c\x65\x6d\x65\x6e\x74\x2c\x73\x68\x61\x64\x6f\x77\x2c\x74\x65\x6d\x70\x6c\x61\x74\x65\x2c\x62\x6c\x6f\x63\x6b\x71\x75\x6f\x74\x65\x2c\x69\x66\x72\x61\x6d\x65\x2c\x74\x66\x6f\x6f\x74\x22\x29\x2c\x57\x6e\x3d\x70\x28" -"\x22\x73\x76\x67\x2c\x61\x6e\x69\x6d\x61\x74\x65\x2c\x63\x69\x72\x63\x6c\x65\x2c\x63\x6c\x69\x70\x70\x61\x74\x68\x2c\x63\x75\x72\x73\x6f\x72\x2c\x64\x65\x66\x73\x2c\x64\x65\x73\x63\x2c\x65\x6c\x6c\x69\x70\x73\x65\x2c\x66\x69\x6c\x74\x65\x72\x2c\x66\x6f\x6e\x74\x2d\x66\x61\x63\x65\x2c\x66\x6f\x72\x65\x69\x67\x6e\x6f\x62\x6a\x65\x63\x74\x2c\x67\x2c\x67\x6c\x79\x70\x68\x2c\x69\x6d\x61\x67\x65\x2c\x6c" -"\x69\x6e\x65\x2c\x6d\x61\x72\x6b\x65\x72\x2c\x6d\x61\x73\x6b\x2c\x6d\x69\x73\x73\x69\x6e\x67\x2d\x67\x6c\x79\x70\x68\x2c\x70\x61\x74\x68\x2c\x70\x61\x74\x74\x65\x72\x6e\x2c\x70\x6f\x6c\x79\x67\x6f\x6e\x2c\x70\x6f\x6c\x79\x6c\x69\x6e\x65\x2c\x72\x65\x63\x74\x2c\x73\x77\x69\x74\x63\x68\x2c\x73\x79\x6d\x62\x6f\x6c\x2c\x74\x65\x78\x74\x2c\x74\x65\x78\x74\x70\x61\x74\x68\x2c\x74\x73\x70\x61\x6e\x2c\x75" -"\x73\x65\x2c\x76\x69\x65\x77\x22\x2c\x21\x30\x29\x2c\x5a\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x71\x6e\x28\x65\x29\x7c\x7c\x57\x6e\x28\x65\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x57\x6e\x28\x65\x29\x3f\x22\x73\x76\x67\x22\x3a\x22\x6d\x61\x74\x68\x22\x3d\x3d\x3d\x65\x3f\x22\x6d\x61\x74\x68\x22" -"\x3a\x76\x6f\x69\x64\x20\x30\x7d\x76\x61\x72\x20\x58\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x76\x61\x72\x20\x59\x6e\x3d\x70\x28\x22\x74\x65\x78\x74\x2c\x6e\x75\x6d\x62\x65\x72\x2c\x70\x61\x73\x73\x77\x6f\x72\x64\x2c\x73\x65\x61\x72\x63\x68\x2c\x65\x6d\x61\x69\x6c\x2c\x74\x65\x6c\x2c\x75\x72\x6c\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x6e" -"\x28\x65\x29\x7b\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x71\x75\x65\x72\x79\x53\x65\x6c\x65\x63\x74\x6f\x72\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x7d\x72" -"\x65\x74\x75\x72\x6e\x20\x65\x7d\x76\x61\x72\x20\x65\x72\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x66\x72\x65\x65\x7a\x65\x28\x7b\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x73\x65\x6c" -"\x65\x63\x74\x22\x21\x3d\x3d\x65\x3f\x6e\x3a\x28\x74\x2e\x64\x61\x74\x61\x26\x26\x74\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x74\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x26\x26\x6e\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x6d\x75\x6c\x74\x69\x70\x6c\x65\x22\x2c\x22\x6d\x75\x6c\x74\x69\x70\x6c" -"\x65\x22\x29\x2c\x6e\x29\x7d\x2c\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x4e\x53\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x4e\x53\x28\x4a\x6e\x5b\x65\x5d\x2c\x74\x29\x7d\x2c\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x65\x29\x7d\x2c\x63\x72\x65\x61\x74\x65\x43\x6f\x6d\x6d\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x43\x6f\x6d\x6d\x65\x6e\x74\x28\x65\x29" -"\x7d\x2c\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x65\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x74\x2c\x6e\x29\x7d\x2c\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x74\x29\x7d\x2c\x61\x70\x70\x65" -"\x6e\x64\x43\x68\x69\x6c\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x74\x29\x7d\x2c\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x7d\x2c\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x3a\x66\x75\x6e\x63" -"\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x7d\x2c\x74\x61\x67\x4e\x61\x6d\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x7d\x2c\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x74" -"\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x3d\x74\x7d\x2c\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x2c\x22\x22\x29\x7d\x7d\x29\x2c\x74\x72\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x6e\x72\x28\x74\x29\x7d\x2c\x75\x70" -"\x64\x61\x74\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x21\x3d\x3d\x74\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x26\x26\x28\x6e\x72\x28\x65\x2c\x21\x30\x29\x2c\x6e\x72\x28\x74\x29\x29\x7d\x2c\x64\x65\x73\x74\x72\x6f\x79\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x72\x28\x65\x2c\x21\x30\x29\x7d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x20\x6e\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x3b\x69\x66\x28\x6e\x28\x72\x29\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x6f\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7c\x7c\x65\x2e\x65\x6c\x6d\x2c\x61\x3d\x69\x2e\x24\x72\x65\x66\x73\x3b\x74\x3f\x41\x72\x72\x61\x79\x2e\x69" -"\x73\x41\x72\x72\x61\x79\x28\x61\x5b\x72\x5d\x29\x3f\x68\x28\x61\x5b\x72\x5d\x2c\x6f\x29\x3a\x61\x5b\x72\x5d\x3d\x3d\x3d\x6f\x26\x26\x28\x61\x5b\x72\x5d\x3d\x76\x6f\x69\x64\x20\x30\x29\x3a\x65\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x49\x6e\x46\x6f\x72\x3f\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x61\x5b\x72\x5d\x29\x3f\x61\x5b\x72\x5d\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x6f\x29\x3c\x30" -"\x26\x26\x61\x5b\x72\x5d\x2e\x70\x75\x73\x68\x28\x6f\x29\x3a\x61\x5b\x72\x5d\x3d\x5b\x6f\x5d\x3a\x61\x5b\x72\x5d\x3d\x6f\x7d\x7d\x76\x61\x72\x20\x72\x72\x3d\x6e\x65\x77\x20\x70\x65\x28\x22\x22\x2c\x7b\x7d\x2c\x5b\x5d\x29\x2c\x69\x72\x3d\x5b\x22\x63\x72\x65\x61\x74\x65\x22\x2c\x22\x61\x63\x74\x69\x76\x61\x74\x65\x22\x2c\x22\x75\x70\x64\x61\x74\x65\x22\x2c\x22\x72\x65\x6d\x6f\x76\x65\x22\x2c\x22\x64" -"\x65\x73\x74\x72\x6f\x79\x22\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x72\x28\x65\x2c\x69\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6b\x65\x79\x3d\x3d\x3d\x69\x2e\x6b\x65\x79\x26\x26\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x3d\x3d\x3d\x69\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x26\x26\x28\x65\x2e\x74\x61\x67\x3d\x3d\x3d\x69\x2e\x74\x61\x67\x26\x26\x65\x2e\x69" -"\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x3d\x3d\x69\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x6e\x28\x65\x2e\x64\x61\x74\x61\x29\x3d\x3d\x3d\x6e\x28\x69\x2e\x64\x61\x74\x61\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x21\x3d\x3d\x65\x2e\x74\x61\x67\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x76\x61\x72\x20\x72\x2c\x69\x3d\x6e\x28\x72" -"\x3d\x65\x2e\x64\x61\x74\x61\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x72\x2e\x74\x79\x70\x65\x2c\x6f\x3d\x6e\x28\x72\x3d\x74\x2e\x64\x61\x74\x61\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x72\x2e\x74\x79\x70\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x3d\x3d\x3d\x6f\x7c\x7c\x59\x6e\x28\x69\x29\x26\x26\x59\x6e\x28\x6f\x29\x7d\x28\x65\x2c\x69\x29\x7c" -"\x7c\x72\x28\x65\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x29\x26\x26\x74\x28\x69\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x2e\x65\x72\x72\x6f\x72\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x61\x72\x28\x65\x2c\x74\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x2c\x61\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x69\x3d\x74\x3b\x69\x3c\x3d\x72\x3b\x2b\x2b\x69\x29" -"\x6e\x28\x6f\x3d\x65\x5b\x69\x5d\x2e\x6b\x65\x79\x29\x26\x26\x28\x61\x5b\x6f\x5d\x3d\x69\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x76\x61\x72\x20\x73\x72\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x63\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x63\x72\x2c\x64\x65\x73\x74\x72\x6f\x79\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x63\x72\x28\x65\x2c\x72\x72\x29\x7d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e" -"\x20\x63\x72\x28\x65\x2c\x74\x29\x7b\x28\x65\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x7c\x7c\x74\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x2c\x6f\x3d\x65\x3d\x3d\x3d\x72\x72\x2c\x61\x3d\x74\x3d\x3d\x3d\x72\x72\x2c\x73\x3d\x6c\x72\x28\x65\x2e\x64\x61" -"\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2c\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x63\x3d\x6c\x72\x28\x74\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2c\x74\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x75\x3d\x5b\x5d\x2c\x6c\x3d\x5b\x5d\x3b\x66\x6f\x72\x28\x6e\x20\x69\x6e\x20\x63\x29\x72\x3d\x73\x5b\x6e\x5d\x2c\x69\x3d\x63\x5b\x6e\x5d\x2c\x72\x3f\x28\x69\x2e\x6f" -"\x6c\x64\x56\x61\x6c\x75\x65\x3d\x72\x2e\x76\x61\x6c\x75\x65\x2c\x69\x2e\x6f\x6c\x64\x41\x72\x67\x3d\x72\x2e\x61\x72\x67\x2c\x70\x72\x28\x69\x2c\x22\x75\x70\x64\x61\x74\x65\x22\x2c\x74\x2c\x65\x29\x2c\x69\x2e\x64\x65\x66\x26\x26\x69\x2e\x64\x65\x66\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x26\x26\x6c\x2e\x70\x75\x73\x68\x28\x69\x29\x29\x3a\x28\x70\x72\x28\x69\x2c\x22\x62" -"\x69\x6e\x64\x22\x2c\x74\x2c\x65\x29\x2c\x69\x2e\x64\x65\x66\x26\x26\x69\x2e\x64\x65\x66\x2e\x69\x6e\x73\x65\x72\x74\x65\x64\x26\x26\x75\x2e\x70\x75\x73\x68\x28\x69\x29\x29\x3b\x69\x66\x28\x75\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x66\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b" -"\x29\x70\x72\x28\x75\x5b\x6e\x5d\x2c\x22\x69\x6e\x73\x65\x72\x74\x65\x64\x22\x2c\x74\x2c\x65\x29\x7d\x3b\x6f\x3f\x6f\x74\x28\x74\x2c\x22\x69\x6e\x73\x65\x72\x74\x22\x2c\x66\x29\x3a\x66\x28\x29\x7d\x6c\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x6f\x74\x28\x74\x2c\x22\x70\x6f\x73\x74\x70\x61\x74\x63\x68\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e" -"\x3c\x6c\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x70\x72\x28\x6c\x5b\x6e\x5d\x2c\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x22\x2c\x74\x2c\x65\x29\x7d\x29\x3b\x69\x66\x28\x21\x6f\x29\x66\x6f\x72\x28\x6e\x20\x69\x6e\x20\x73\x29\x63\x5b\x6e\x5d\x7c\x7c\x70\x72\x28\x73\x5b\x6e\x5d\x2c\x22\x75\x6e\x62\x69\x6e\x64\x22\x2c\x65\x2c\x65\x2c\x61\x29\x7d\x28\x65\x2c\x74\x29" -"\x7d\x76\x61\x72\x20\x75\x72\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x3b\x66\x6f\x72\x28\x6e\x3d\x30\x3b\x6e\x3c" -"\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x28\x72\x3d\x65\x5b\x6e\x5d\x29\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x7c\x7c\x28\x72\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3d\x75\x72\x29\x2c\x69\x5b\x66\x72\x28\x72\x29\x5d\x3d\x72\x2c\x72\x2e\x64\x65\x66\x3d\x4c\x65\x28\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x22\x2c\x72\x2e\x6e\x61\x6d\x65" -"\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x72\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x61\x77\x4e\x61\x6d\x65\x7c\x7c\x65\x2e\x6e\x61\x6d\x65\x2b\x22\x2e\x22\x2b\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x7c\x7c\x7b\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2e\x22\x29\x7d\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x20\x70\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x64\x65\x66\x26\x26\x65\x2e\x64\x65\x66\x5b\x74\x5d\x3b\x69\x66\x28\x6f\x29\x74\x72\x79\x7b\x6f\x28\x6e\x2e\x65\x6c\x6d\x2c\x65\x2c\x6e\x2c\x72\x2c\x69\x29\x7d\x63\x61\x74\x63\x68\x28\x72\x29\x7b\x48\x65\x28\x72\x2c\x6e\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x20" -"\x22\x2b\x65\x2e\x6e\x61\x6d\x65\x2b\x22\x20\x22\x2b\x74\x2b\x22\x20\x68\x6f\x6f\x6b\x22\x29\x7d\x7d\x76\x61\x72\x20\x64\x72\x3d\x5b\x74\x72\x2c\x73\x72\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x72\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x21\x28\x6e\x28\x69\x29\x26\x26\x21\x31\x3d\x3d\x3d\x69\x2e" -"\x43\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x69\x6e\x68\x65\x72\x69\x74\x41\x74\x74\x72\x73\x7c\x7c\x74\x28\x65\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x74\x28\x72\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x29\x29\x29\x7b\x76\x61\x72\x20\x6f\x2c\x61\x2c\x73\x3d\x72\x2e\x65\x6c\x6d\x2c\x63\x3d\x65\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x7c\x7c\x7b\x7d\x2c\x75\x3d\x72" -"\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x7c\x7c\x7b\x7d\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x20\x6e\x28\x75\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x26\x26\x28\x75\x3d\x72\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x3d\x41\x28\x7b\x7d\x2c\x75\x29\x29\x2c\x75\x29\x61\x3d\x75\x5b\x6f\x5d\x2c\x63\x5b\x6f\x5d\x21\x3d\x3d\x61\x26\x26\x68\x72\x28\x73\x2c\x6f\x2c\x61\x2c\x72\x2e\x64\x61\x74\x61\x2e\x70\x72" -"\x65\x29\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x28\x71\x7c\x7c\x5a\x29\x26\x26\x75\x2e\x76\x61\x6c\x75\x65\x21\x3d\x3d\x63\x2e\x76\x61\x6c\x75\x65\x26\x26\x68\x72\x28\x73\x2c\x22\x76\x61\x6c\x75\x65\x22\x2c\x75\x2e\x76\x61\x6c\x75\x65\x29\x2c\x63\x29\x74\x28\x75\x5b\x6f\x5d\x29\x26\x26\x28\x52\x6e\x28\x6f\x29\x3f\x73\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4e\x53\x28\x50\x6e" -"\x2c\x48\x6e\x28\x6f\x29\x29\x3a\x4c\x6e\x28\x6f\x29\x7c\x7c\x73\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x6f\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x7c\x7c\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x2d\x22\x29\x3e\x2d\x31\x3f\x6d\x72\x28\x65\x2c\x74\x2c\x6e\x29\x3a\x46\x6e" -"\x28\x74\x29\x3f\x42\x6e\x28\x6e\x29\x3f\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x29\x3a\x28\x6e\x3d\x22\x61\x6c\x6c\x6f\x77\x66\x75\x6c\x6c\x73\x63\x72\x65\x65\x6e\x22\x3d\x3d\x3d\x74\x26\x26\x22\x45\x4d\x42\x45\x44\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x3f\x22\x74\x72\x75\x65\x22\x3a\x74\x2c\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65" -"\x28\x74\x2c\x6e\x29\x29\x3a\x4c\x6e\x28\x74\x29\x3f\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x2c\x4d\x6e\x28\x74\x2c\x6e\x29\x29\x3a\x52\x6e\x28\x74\x29\x3f\x42\x6e\x28\x6e\x29\x3f\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4e\x53\x28\x50\x6e\x2c\x48\x6e\x28\x74\x29\x29\x3a\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4e\x53\x28\x50\x6e" -"\x2c\x74\x2c\x6e\x29\x3a\x6d\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x42\x6e\x28\x6e\x29\x29\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x71\x26\x26\x21\x57\x26\x26\x22\x54\x45\x58\x54\x41\x52\x45\x41\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x4e\x61" -"\x6d\x65\x26\x26\x22\x70\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x22\x3d\x3d\x3d\x74\x26\x26\x22\x22\x21\x3d\x3d\x6e\x26\x26\x21\x65\x2e\x5f\x5f\x69\x65\x70\x68\x29\x7b\x76\x61\x72\x20\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x73\x74\x6f\x70\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x50\x72\x6f\x70\x61\x67\x61\x74\x69\x6f\x6e\x28\x29\x2c\x65\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65" -"\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x69\x6e\x70\x75\x74\x22\x2c\x72\x29\x7d\x3b\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x69\x6e\x70\x75\x74\x22\x2c\x72\x29\x2c\x65\x2e\x5f\x5f\x69\x65\x70\x68\x3d\x21\x30\x7d\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x2c\x6e\x29\x7d\x7d\x76\x61\x72\x20\x79\x72\x3d\x7b\x63\x72\x65\x61\x74\x65" -"\x3a\x76\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x76\x72\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x72\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x65\x6c\x6d\x2c\x6f\x3d\x72\x2e\x64\x61\x74\x61\x2c\x61\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x21\x28\x74\x28\x6f\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x29\x26\x26\x74\x28\x6f\x2e\x63\x6c\x61\x73\x73\x29\x26\x26\x28\x74\x28" -"\x61\x29\x7c\x7c\x74\x28\x61\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x29\x26\x26\x74\x28\x61\x2e\x63\x6c\x61\x73\x73\x29\x29\x29\x29\x7b\x76\x61\x72\x20\x73\x3d\x55\x6e\x28\x72\x29\x2c\x63\x3d\x69\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x3b\x6e\x28\x63\x29\x26\x26\x28\x73\x3d\x7a\x6e\x28\x73\x2c\x4b\x6e\x28\x63\x29\x29\x29\x2c\x73\x21\x3d\x3d\x69\x2e\x5f" -"\x70\x72\x65\x76\x43\x6c\x61\x73\x73\x26\x26\x28\x69\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x2c\x73\x29\x2c\x69\x2e\x5f\x70\x72\x65\x76\x43\x6c\x61\x73\x73\x3d\x73\x29\x7d\x7d\x76\x61\x72\x20\x5f\x72\x2c\x62\x72\x2c\x24\x72\x2c\x77\x72\x2c\x43\x72\x2c\x78\x72\x2c\x6b\x72\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x67\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x67\x72" -"\x7d\x2c\x41\x72\x3d\x2f\x5b\x5c\x77\x29\x2e\x2b\x5c\x2d\x5f\x24\x5c\x5d\x5d\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x72\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x3d\x21\x31\x2c\x73\x3d\x21\x31\x2c\x63\x3d\x21\x31\x2c\x75\x3d\x21\x31\x2c\x6c\x3d\x30\x2c\x66\x3d\x30\x2c\x70\x3d\x30\x2c\x64\x3d\x30\x3b\x66\x6f\x72\x28\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65" -"\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x69\x66\x28\x6e\x3d\x74\x2c\x74\x3d\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x72\x29\x2c\x61\x29\x33\x39\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x61\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x29\x33\x34\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x73\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28" -"\x63\x29\x39\x36\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x63\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x75\x29\x34\x37\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x75\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x31\x32\x34\x21\x3d\x3d\x74\x7c\x7c\x31\x32\x34\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x72\x2b\x31\x29\x7c\x7c" -"\x31\x32\x34\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x72\x2d\x31\x29\x7c\x7c\x6c\x7c\x7c\x66\x7c\x7c\x70\x29\x7b\x73\x77\x69\x74\x63\x68\x28\x74\x29\x7b\x63\x61\x73\x65\x20\x33\x34\x3a\x73\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x33\x39\x3a\x61\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x39\x36\x3a\x63\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b" -"\x3b\x63\x61\x73\x65\x20\x34\x30\x3a\x70\x2b\x2b\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x34\x31\x3a\x70\x2d\x2d\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x39\x31\x3a\x66\x2b\x2b\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x39\x33\x3a\x66\x2d\x2d\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x31\x32\x33\x3a\x6c\x2b\x2b\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x31\x32\x35" -"\x3a\x6c\x2d\x2d\x7d\x69\x66\x28\x34\x37\x3d\x3d\x3d\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x76\x3d\x72\x2d\x31\x2c\x68\x3d\x76\x6f\x69\x64\x20\x30\x3b\x76\x3e\x3d\x30\x26\x26\x22\x20\x22\x3d\x3d\x3d\x28\x68\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x76\x29\x29\x3b\x76\x2d\x2d\x29\x3b\x68\x26\x26\x41\x72\x2e\x74\x65\x73\x74\x28\x68\x29\x7c\x7c\x28\x75\x3d\x21\x30\x29\x7d\x7d\x65\x6c\x73\x65\x20" -"\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x69\x3f\x28\x64\x3d\x72\x2b\x31\x2c\x69\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x72\x29\x2e\x74\x72\x69\x6d\x28\x29\x29\x3a\x6d\x28\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x28\x29\x7b\x28\x6f\x7c\x7c\x28\x6f\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x65\x2e\x73\x6c\x69\x63\x65\x28\x64\x2c\x72\x29\x2e\x74\x72\x69\x6d\x28\x29\x29\x2c\x64\x3d\x72\x2b" -"\x31\x7d\x69\x66\x28\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x69\x3f\x69\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x72\x29\x2e\x74\x72\x69\x6d\x28\x29\x3a\x30\x21\x3d\x3d\x64\x26\x26\x6d\x28\x29\x2c\x6f\x29\x66\x6f\x72\x28\x72\x3d\x30\x3b\x72\x3c\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x69\x3d\x53\x72\x28\x69\x2c\x6f\x5b\x72\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x7d\x66\x75\x6e\x63" -"\x74\x69\x6f\x6e\x20\x53\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x28\x22\x29\x3b\x69\x66\x28\x6e\x3c\x30\x29\x72\x65\x74\x75\x72\x6e\x27\x5f\x66\x28\x22\x27\x2b\x74\x2b\x27\x22\x29\x28\x27\x2b\x65\x2b\x22\x29\x22\x3b\x76\x61\x72\x20\x72\x3d\x74\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x6e\x29\x2c\x69\x3d\x74\x2e\x73\x6c\x69\x63\x65\x28\x6e\x2b\x31" -"\x29\x3b\x72\x65\x74\x75\x72\x6e\x27\x5f\x66\x28\x22\x27\x2b\x72\x2b\x27\x22\x29\x28\x27\x2b\x65\x2b\x28\x22\x29\x22\x21\x3d\x3d\x69\x3f\x22\x2c\x22\x2b\x69\x3a\x69\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x54\x72\x28\x65\x2c\x74\x29\x7b\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x65\x72\x72\x6f\x72\x28\x22\x5b\x56\x75\x65\x20\x63\x6f\x6d\x70\x69\x6c\x65\x72\x5d\x3a\x20\x22\x2b\x65\x29\x7d\x66\x75\x6e\x63" -"\x74\x69\x6f\x6e\x20\x4e\x72\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x3f\x65\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x7d\x29\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x29\x3a\x5b\x5d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x72\x28\x65" -"\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x28\x65\x2e\x70\x72\x6f\x70\x73\x7c\x7c\x28\x65\x2e\x70\x72\x6f\x70\x73\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x48\x72\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x76\x61\x6c\x75\x65\x3a\x6e\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x69\x7d\x2c\x72\x29\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x72\x28\x65\x2c\x74\x2c" -"\x6e\x2c\x72\x2c\x69\x29\x7b\x28\x69\x3f\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x7c\x7c\x28\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x3d\x5b\x5d\x29\x3a\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x28\x65\x2e\x61\x74\x74\x72\x73\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x48\x72\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x76\x61\x6c\x75\x65\x3a\x6e\x2c\x64\x79\x6e\x61\x6d\x69\x63" -"\x3a\x69\x7d\x2c\x72\x29\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x3d\x6e\x2c\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2e\x70\x75\x73\x68\x28\x48\x72\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x76\x61\x6c\x75\x65\x3a\x6e\x7d\x2c\x72\x29\x29\x7d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x20\x4c\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x29\x7b\x28\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x7c\x7c\x28\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x48\x72\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x72\x61\x77\x4e\x61\x6d\x65\x3a\x6e\x2c\x76\x61\x6c\x75\x65\x3a\x72\x2c\x61\x72\x67\x3a\x69\x2c" -"\x69\x73\x44\x79\x6e\x61\x6d\x69\x63\x41\x72\x67\x3a\x6f\x2c\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3a\x61\x7d\x2c\x73\x29\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x49\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x22\x5f\x70\x28\x22\x2b\x74\x2b\x27\x2c\x22\x27\x2b\x65\x2b\x27\x22\x29\x27\x3a\x65\x2b\x74\x7d\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x4d\x72\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x2c\x63\x29\x7b\x76\x61\x72\x20\x75\x3b\x28\x69\x3d\x69\x7c\x7c\x65\x29\x2e\x72\x69\x67\x68\x74\x3f\x63\x3f\x6e\x3d\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x63\x6c\x69\x63\x6b\x27\x3f\x27\x63\x6f\x6e\x74\x65\x78\x74\x6d\x65\x6e\x75\x27\x3a\x28\x22\x2b\x6e\x2b\x22\x29\x22\x3a\x22\x63\x6c\x69\x63\x6b\x22\x3d\x3d" -"\x3d\x6e\x26\x26\x28\x6e\x3d\x22\x63\x6f\x6e\x74\x65\x78\x74\x6d\x65\x6e\x75\x22\x2c\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x72\x69\x67\x68\x74\x29\x3a\x69\x2e\x6d\x69\x64\x64\x6c\x65\x26\x26\x28\x63\x3f\x6e\x3d\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x63\x6c\x69\x63\x6b\x27\x3f\x27\x6d\x6f\x75\x73\x65\x75\x70\x27\x3a\x28\x22\x2b\x6e\x2b\x22\x29\x22\x3a\x22\x63\x6c\x69\x63\x6b\x22\x3d\x3d\x3d" -"\x6e\x26\x26\x28\x6e\x3d\x22\x6d\x6f\x75\x73\x65\x75\x70\x22\x29\x29\x2c\x69\x2e\x63\x61\x70\x74\x75\x72\x65\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x63\x61\x70\x74\x75\x72\x65\x2c\x6e\x3d\x49\x72\x28\x22\x21\x22\x2c\x6e\x2c\x63\x29\x29\x2c\x69\x2e\x6f\x6e\x63\x65\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x6f\x6e\x63\x65\x2c\x6e\x3d\x49\x72\x28\x22\x7e\x22\x2c\x6e\x2c\x63\x29\x29\x2c" -"\x69\x2e\x70\x61\x73\x73\x69\x76\x65\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x70\x61\x73\x73\x69\x76\x65\x2c\x6e\x3d\x49\x72\x28\x22\x26\x22\x2c\x6e\x2c\x63\x29\x29\x2c\x69\x2e\x6e\x61\x74\x69\x76\x65\x3f\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x6e\x61\x74\x69\x76\x65\x2c\x75\x3d\x74\x2e\x6e\x61\x74\x69\x76\x65\x45\x76\x65\x6e\x74\x73\x7c\x7c\x28\x74\x2e\x6e\x61\x74\x69\x76\x65\x45\x76\x65" -"\x6e\x74\x73\x3d\x7b\x7d\x29\x29\x3a\x75\x3d\x74\x2e\x65\x76\x65\x6e\x74\x73\x7c\x7c\x28\x74\x2e\x65\x76\x65\x6e\x74\x73\x3d\x7b\x7d\x29\x3b\x76\x61\x72\x20\x6c\x3d\x48\x72\x28\x7b\x76\x61\x6c\x75\x65\x3a\x72\x2e\x74\x72\x69\x6d\x28\x29\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x63\x7d\x2c\x73\x29\x3b\x69\x21\x3d\x3d\x65\x26\x26\x28\x6c\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3d\x69\x29\x3b\x76\x61\x72" -"\x20\x66\x3d\x75\x5b\x6e\x5d\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x66\x29\x3f\x6f\x3f\x66\x2e\x75\x6e\x73\x68\x69\x66\x74\x28\x6c\x29\x3a\x66\x2e\x70\x75\x73\x68\x28\x6c\x29\x3a\x75\x5b\x6e\x5d\x3d\x66\x3f\x6f\x3f\x5b\x6c\x2c\x66\x5d\x3a\x5b\x66\x2c\x6c\x5d\x3a\x6c\x2c\x74\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x72\x28\x65\x2c\x74\x2c" -"\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x50\x72\x28\x65\x2c\x22\x3a\x22\x2b\x74\x29\x7c\x7c\x50\x72\x28\x65\x2c\x22\x76\x2d\x62\x69\x6e\x64\x3a\x22\x2b\x74\x29\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x21\x3d\x72\x29\x72\x65\x74\x75\x72\x6e\x20\x4f\x72\x28\x72\x29\x3b\x69\x66\x28\x21\x31\x21\x3d\x3d\x6e\x29\x7b\x76\x61\x72\x20\x69\x3d\x50\x72\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x21\x3d\x69\x29" -"\x72\x65\x74\x75\x72\x6e\x20\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x69\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x50\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x21\x3d\x28\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c" -"\x6f\x3d\x30\x2c\x61\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x3c\x61\x3b\x6f\x2b\x2b\x29\x69\x66\x28\x69\x5b\x6f\x5d\x2e\x6e\x61\x6d\x65\x3d\x3d\x3d\x74\x29\x7b\x69\x2e\x73\x70\x6c\x69\x63\x65\x28\x6f\x2c\x31\x29\x3b\x62\x72\x65\x61\x6b\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x26\x26\x64\x65\x6c\x65\x74\x65\x20\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x20\x52\x72\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x72\x3d\x30\x2c\x69\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x5b\x72\x5d\x3b\x69\x66\x28\x74\x2e\x74\x65\x73\x74\x28\x6f\x2e\x6e\x61\x6d\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x73\x70\x6c\x69\x63" -"\x65\x28\x72\x2c\x31\x29\x2c\x6f\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x72\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x28\x6e\x75\x6c\x6c\x21\x3d\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x28\x65\x2e\x73\x74\x61\x72\x74\x3d\x74\x2e\x73\x74\x61\x72\x74\x29\x2c\x6e\x75\x6c\x6c\x21\x3d\x74\x2e\x65\x6e\x64\x26\x26\x28\x65\x2e\x65\x6e\x64\x3d\x74\x2e\x65\x6e\x64\x29\x29\x2c\x65" -"\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x7c\x7c\x7b\x7d\x2c\x69\x3d\x72\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x6f\x3d\x22\x24\x24\x76\x22\x3b\x72\x2e\x74\x72\x69\x6d\x26\x26\x28\x6f\x3d\x22\x28\x74\x79\x70\x65\x6f\x66\x20\x24\x24\x76\x20\x3d\x3d\x3d\x20\x27\x73\x74\x72\x69\x6e\x67\x27\x3f\x20\x24\x24\x76\x2e\x74\x72\x69\x6d\x28\x29\x3a" -"\x20\x24\x24\x76\x29\x22\x29\x2c\x69\x26\x26\x28\x6f\x3d\x22\x5f\x6e\x28\x22\x2b\x6f\x2b\x22\x29\x22\x29\x3b\x76\x61\x72\x20\x61\x3d\x55\x72\x28\x74\x2c\x6f\x29\x3b\x65\x2e\x6d\x6f\x64\x65\x6c\x3d\x7b\x76\x61\x6c\x75\x65\x3a\x22\x28\x22\x2b\x74\x2b\x22\x29\x22\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x74\x29\x2c\x63\x61\x6c\x6c\x62" -"\x61\x63\x6b\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x24\x24\x76\x29\x20\x7b\x22\x2b\x61\x2b\x22\x7d\x22\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x3d\x65\x2e\x74\x72\x69\x6d\x28\x29\x2c\x5f\x72\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66" -"\x28\x22\x5b\x22\x29\x3c\x30\x7c\x7c\x65\x2e\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x4f\x66\x28\x22\x5d\x22\x29\x3c\x5f\x72\x2d\x31\x29\x72\x65\x74\x75\x72\x6e\x28\x77\x72\x3d\x65\x2e\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x4f\x66\x28\x22\x2e\x22\x29\x29\x3e\x2d\x31\x3f\x7b\x65\x78\x70\x3a\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x77\x72\x29\x2c\x6b\x65\x79\x3a\x27\x22\x27\x2b\x65\x2e\x73\x6c\x69\x63\x65" -"\x28\x77\x72\x2b\x31\x29\x2b\x27\x22\x27\x7d\x3a\x7b\x65\x78\x70\x3a\x65\x2c\x6b\x65\x79\x3a\x6e\x75\x6c\x6c\x7d\x3b\x62\x72\x3d\x65\x2c\x77\x72\x3d\x43\x72\x3d\x78\x72\x3d\x30\x3b\x66\x6f\x72\x28\x3b\x21\x7a\x72\x28\x29\x3b\x29\x4b\x72\x28\x24\x72\x3d\x56\x72\x28\x29\x29\x3f\x71\x72\x28\x24\x72\x29\x3a\x39\x31\x3d\x3d\x3d\x24\x72\x26\x26\x4a\x72\x28\x24\x72\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x65" -"\x78\x70\x3a\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x43\x72\x29\x2c\x6b\x65\x79\x3a\x65\x2e\x73\x6c\x69\x63\x65\x28\x43\x72\x2b\x31\x2c\x78\x72\x29\x7d\x7d\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x3d\x6e\x2e\x6b\x65\x79\x3f\x65\x2b\x22\x3d\x22\x2b\x74\x3a\x22\x24\x73\x65\x74\x28\x22\x2b\x6e\x2e\x65\x78\x70\x2b\x22\x2c\x20\x22\x2b\x6e\x2e\x6b\x65\x79\x2b\x22\x2c\x20\x22" -"\x2b\x74\x2b\x22\x29\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x72\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x62\x72\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x2b\x2b\x77\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x72\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x77\x72\x3e\x3d\x5f\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x72\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x33\x34" -"\x3d\x3d\x3d\x65\x7c\x7c\x33\x39\x3d\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x72\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x31\x3b\x66\x6f\x72\x28\x43\x72\x3d\x77\x72\x3b\x21\x7a\x72\x28\x29\x3b\x29\x69\x66\x28\x4b\x72\x28\x65\x3d\x56\x72\x28\x29\x29\x29\x71\x72\x28\x65\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x39\x31\x3d\x3d\x3d\x65\x26\x26\x74\x2b\x2b\x2c\x39\x33\x3d\x3d\x3d\x65\x26" -"\x26\x74\x2d\x2d\x2c\x30\x3d\x3d\x3d\x74\x29\x7b\x78\x72\x3d\x77\x72\x3b\x62\x72\x65\x61\x6b\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x72\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x3b\x21\x7a\x72\x28\x29\x26\x26\x28\x65\x3d\x56\x72\x28\x29\x29\x21\x3d\x3d\x74\x3b\x29\x3b\x7d\x76\x61\x72\x20\x57\x72\x2c\x5a\x72\x3d\x22\x5f\x5f\x72\x22\x2c\x47\x72\x3d\x22\x5f\x5f\x63\x22\x3b" -"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x57\x72\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x28\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x3d\x74\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x26\x26\x65\x69\x28\x65\x2c\x69\x2c\x6e\x2c\x72\x29\x7d\x7d\x76\x61\x72\x20\x59\x72\x3d" -"\x4b\x65\x26\x26\x21\x28\x58\x26\x26\x4e\x75\x6d\x62\x65\x72\x28\x58\x5b\x31\x5d\x29\x3c\x3d\x35\x33\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x59\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x73\x6e\x2c\x6f\x3d\x74\x3b\x74\x3d\x6f\x2e\x5f\x77\x72\x61\x70\x70\x65\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x2e\x74\x61" -"\x72\x67\x65\x74\x3d\x3d\x3d\x65\x2e\x63\x75\x72\x72\x65\x6e\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x65\x2e\x74\x69\x6d\x65\x53\x74\x61\x6d\x70\x3e\x3d\x69\x7c\x7c\x65\x2e\x74\x69\x6d\x65\x53\x74\x61\x6d\x70\x3c\x3d\x30\x7c\x7c\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x6f\x77\x6e\x65\x72\x44\x6f\x63\x75\x6d\x65\x6e\x74\x21\x3d\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x61" -"\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x7d\x7d\x57\x72\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x65\x2c\x74\x2c\x51\x3f\x7b\x63\x61\x70\x74\x75\x72\x65\x3a\x6e\x2c\x70\x61\x73\x73\x69\x76\x65\x3a\x72\x7d\x3a\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x69\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x28\x72\x7c\x7c\x57\x72" -"\x29\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x65\x2c\x74\x2e\x5f\x77\x72\x61\x70\x70\x65\x72\x7c\x7c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x69\x28\x65\x2c\x72\x29\x7b\x69\x66\x28\x21\x74\x28\x65\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x29\x7c\x7c\x21\x74\x28\x72\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x29\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x64" -"\x61\x74\x61\x2e\x6f\x6e\x7c\x7c\x7b\x7d\x2c\x6f\x3d\x65\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x7c\x7c\x7b\x7d\x3b\x57\x72\x3d\x72\x2e\x65\x6c\x6d\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x6e\x28\x65\x5b\x5a\x72\x5d\x29\x29\x7b\x76\x61\x72\x20\x74\x3d\x71\x3f\x22\x63\x68\x61\x6e\x67\x65\x22\x3a\x22\x69\x6e\x70\x75\x74\x22\x3b\x65\x5b\x74\x5d\x3d\x5b\x5d\x2e\x63\x6f\x6e\x63\x61\x74" -"\x28\x65\x5b\x5a\x72\x5d\x2c\x65\x5b\x74\x5d\x7c\x7c\x5b\x5d\x29\x2c\x64\x65\x6c\x65\x74\x65\x20\x65\x5b\x5a\x72\x5d\x7d\x6e\x28\x65\x5b\x47\x72\x5d\x29\x26\x26\x28\x65\x2e\x63\x68\x61\x6e\x67\x65\x3d\x5b\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x5b\x47\x72\x5d\x2c\x65\x2e\x63\x68\x61\x6e\x67\x65\x7c\x7c\x5b\x5d\x29\x2c\x64\x65\x6c\x65\x74\x65\x20\x65\x5b\x47\x72\x5d\x29\x7d\x28\x69\x29\x2c\x69\x74" -"\x28\x69\x2c\x6f\x2c\x51\x72\x2c\x65\x69\x2c\x58\x72\x2c\x72\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x57\x72\x3d\x76\x6f\x69\x64\x20\x30\x7d\x7d\x76\x61\x72\x20\x6e\x69\x2c\x72\x69\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x74\x69\x2c\x75\x70\x64\x61\x74\x65\x3a\x74\x69\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x69\x28\x65\x2c\x72\x29\x7b\x69\x66\x28\x21\x74\x28\x65\x2e\x64\x61\x74\x61\x2e\x64\x6f" -"\x6d\x50\x72\x6f\x70\x73\x29\x7c\x7c\x21\x74\x28\x72\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x29\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x2c\x61\x3d\x72\x2e\x65\x6c\x6d\x2c\x73\x3d\x65\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x7c\x7c\x7b\x7d\x2c\x63\x3d\x72\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x7c\x7c\x7b\x7d\x3b\x66\x6f\x72\x28\x69\x20\x69\x6e\x20\x6e" -"\x28\x63\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x26\x26\x28\x63\x3d\x72\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x3d\x41\x28\x7b\x7d\x2c\x63\x29\x29\x2c\x73\x29\x69\x20\x69\x6e\x20\x63\x7c\x7c\x28\x61\x5b\x69\x5d\x3d\x22\x22\x29\x3b\x66\x6f\x72\x28\x69\x20\x69\x6e\x20\x63\x29\x7b\x69\x66\x28\x6f\x3d\x63\x5b\x69\x5d\x2c\x22\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x22\x3d\x3d\x3d\x69\x7c" -"\x7c\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x3d\x3d\x3d\x69\x29\x7b\x69\x66\x28\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x26\x26\x28\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x29\x2c\x6f\x3d\x3d\x3d\x73\x5b\x69\x5d\x29\x63\x6f\x6e\x74\x69\x6e\x75\x65\x3b\x31\x3d\x3d\x3d\x61\x2e\x63\x68\x69\x6c\x64\x4e\x6f\x64\x65\x73\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x61\x2e" -"\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x61\x2e\x63\x68\x69\x6c\x64\x4e\x6f\x64\x65\x73\x5b\x30\x5d\x29\x7d\x69\x66\x28\x22\x76\x61\x6c\x75\x65\x22\x3d\x3d\x3d\x69\x26\x26\x22\x50\x52\x4f\x47\x52\x45\x53\x53\x22\x21\x3d\x3d\x61\x2e\x74\x61\x67\x4e\x61\x6d\x65\x29\x7b\x61\x2e\x5f\x76\x61\x6c\x75\x65\x3d\x6f\x3b\x76\x61\x72\x20\x75\x3d\x74\x28\x6f\x29\x3f\x22\x22\x3a\x53\x74\x72\x69\x6e\x67" -"\x28\x6f\x29\x3b\x6f\x69\x28\x61\x2c\x75\x29\x26\x26\x28\x61\x2e\x76\x61\x6c\x75\x65\x3d\x75\x29\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x3d\x3d\x3d\x69\x26\x26\x57\x6e\x28\x61\x2e\x74\x61\x67\x4e\x61\x6d\x65\x29\x26\x26\x74\x28\x61\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x29\x29\x7b\x28\x6e\x69\x3d\x6e\x69\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72" -"\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x29\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x3d\x22\x3c\x73\x76\x67\x3e\x22\x2b\x6f\x2b\x22\x3c\x2f\x73\x76\x67\x3e\x22\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6c\x3d\x6e\x69\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x3b\x61\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x3b\x29\x61\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64" -"\x28\x61\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x29\x3b\x66\x6f\x72\x28\x3b\x6c\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x3b\x29\x61\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x6c\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x29\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x6f\x21\x3d\x3d\x73\x5b\x69\x5d\x29\x74\x72\x79\x7b\x61\x5b\x69\x5d\x3d\x6f\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d" -"\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x69\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x26\x26\x28\x22\x4f\x50\x54\x49\x4f\x4e\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x7c\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x21\x30\x3b\x74\x72\x79\x7b\x6e\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74" -"\x2e\x61\x63\x74\x69\x76\x65\x45\x6c\x65\x6d\x65\x6e\x74\x21\x3d\x3d\x65\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x26\x26\x65\x2e\x76\x61\x6c\x75\x65\x21\x3d\x3d\x74\x7d\x28\x65\x2c\x74\x29\x7c\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x65\x2e\x5f\x76\x4d\x6f\x64\x69\x66\x69\x65\x72" -"\x73\x3b\x69\x66\x28\x6e\x28\x69\x29\x29\x7b\x69\x66\x28\x69\x2e\x6e\x75\x6d\x62\x65\x72\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x28\x72\x29\x21\x3d\x3d\x66\x28\x74\x29\x3b\x69\x66\x28\x69\x2e\x74\x72\x69\x6d\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x2e\x74\x72\x69\x6d\x28\x29\x21\x3d\x3d\x74\x2e\x74\x72\x69\x6d\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x21\x3d\x3d\x74\x7d\x28\x65\x2c\x74\x29\x29\x7d\x76" -"\x61\x72\x20\x61\x69\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x69\x69\x2c\x75\x70\x64\x61\x74\x65\x3a\x69\x69\x7d\x2c\x73\x69\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x2f\x3a\x28\x2e\x2b\x29\x2f\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x70\x6c\x69\x74\x28\x2f\x3b\x28\x3f\x21\x5b\x5e\x28\x5d\x2a\x5c\x29\x29\x2f\x67\x29\x2e\x66\x6f\x72\x45" -"\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x73\x70\x6c\x69\x74\x28\x6e\x29\x3b\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x31\x26\x26\x28\x74\x5b\x72\x5b\x30\x5d\x2e\x74\x72\x69\x6d\x28\x29\x5d\x3d\x72\x5b\x31\x5d\x2e\x74\x72\x69\x6d\x28\x29\x29\x7d\x7d\x29\x2c\x74\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x69\x28\x65" -"\x29\x7b\x76\x61\x72\x20\x74\x3d\x75\x69\x28\x65\x2e\x73\x74\x79\x6c\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x3f\x41\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2c\x74\x29\x3a\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29" -"\x3f\x4f\x28\x65\x29\x3a\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x73\x69\x28\x65\x29\x3a\x65\x7d\x76\x61\x72\x20\x6c\x69\x2c\x66\x69\x3d\x2f\x5e\x2d\x2d\x2f\x2c\x70\x69\x3d\x2f\x5c\x73\x2a\x21\x69\x6d\x70\x6f\x72\x74\x61\x6e\x74\x24\x2f\x2c\x64\x69\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x66\x69\x2e\x74\x65\x73\x74\x28\x74" -"\x29\x29\x65\x2e\x73\x74\x79\x6c\x65\x2e\x73\x65\x74\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x74\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x70\x69\x2e\x74\x65\x73\x74\x28\x6e\x29\x29\x65\x2e\x73\x74\x79\x6c\x65\x2e\x73\x65\x74\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x28\x74\x29\x2c\x6e\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x70\x69\x2c\x22\x22\x29\x2c\x22\x69\x6d\x70\x6f\x72\x74\x61\x6e\x74\x22\x29" -"\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x72\x3d\x68\x69\x28\x74\x29\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x2c\x6f\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x65\x2e\x73\x74\x79\x6c\x65\x5b\x72\x5d\x3d\x6e\x5b\x69\x5d\x3b\x65\x6c\x73\x65\x20\x65\x2e\x73\x74\x79\x6c\x65\x5b\x72\x5d" -"\x3d\x6e\x7d\x7d\x2c\x76\x69\x3d\x5b\x22\x57\x65\x62\x6b\x69\x74\x22\x2c\x22\x4d\x6f\x7a\x22\x2c\x22\x6d\x73\x22\x5d\x2c\x68\x69\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x6c\x69\x3d\x6c\x69\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x2e\x73\x74\x79\x6c\x65\x2c\x22\x66\x69\x6c\x74\x65\x72" -"\x22\x21\x3d\x3d\x28\x65\x3d\x62\x28\x65\x29\x29\x26\x26\x65\x20\x69\x6e\x20\x6c\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2e\x74\x6f\x55\x70\x70\x65\x72\x43\x61\x73\x65\x28\x29\x2b\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x2c\x6e\x3d\x30\x3b\x6e\x3c\x76\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x7b\x76" -"\x61\x72\x20\x72\x3d\x76\x69\x5b\x6e\x5d\x2b\x74\x3b\x69\x66\x28\x72\x20\x69\x6e\x20\x6c\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x69\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x64\x61\x74\x61\x2c\x6f\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x21\x28\x74\x28\x69\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x29\x26\x26\x74\x28" -"\x69\x2e\x73\x74\x79\x6c\x65\x29\x26\x26\x74\x28\x6f\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x29\x26\x26\x74\x28\x6f\x2e\x73\x74\x79\x6c\x65\x29\x29\x29\x7b\x76\x61\x72\x20\x61\x2c\x73\x2c\x63\x3d\x72\x2e\x65\x6c\x6d\x2c\x75\x3d\x6f\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2c\x6c\x3d\x6f\x2e\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x53\x74\x79\x6c\x65\x7c\x7c\x6f\x2e\x73\x74\x79\x6c" -"\x65\x7c\x7c\x7b\x7d\x2c\x66\x3d\x75\x7c\x7c\x6c\x2c\x70\x3d\x75\x69\x28\x72\x2e\x64\x61\x74\x61\x2e\x73\x74\x79\x6c\x65\x29\x7c\x7c\x7b\x7d\x3b\x72\x2e\x64\x61\x74\x61\x2e\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x53\x74\x79\x6c\x65\x3d\x6e\x28\x70\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x3f\x41\x28\x7b\x7d\x2c\x70\x29\x3a\x70\x3b\x76\x61\x72\x20\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29" -"\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3d\x7b\x7d\x3b\x69\x66\x28\x74\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x65\x3b\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x29\x28\x69\x3d\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x26\x26\x69\x2e\x64\x61\x74\x61\x26\x26\x28\x6e\x3d\x63\x69\x28\x69\x2e\x64\x61" -"\x74\x61\x29\x29\x26\x26\x41\x28\x72\x2c\x6e\x29\x3b\x28\x6e\x3d\x63\x69\x28\x65\x2e\x64\x61\x74\x61\x29\x29\x26\x26\x41\x28\x72\x2c\x6e\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x65\x3b\x6f\x3d\x6f\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x6f\x2e\x64\x61\x74\x61\x26\x26\x28\x6e\x3d\x63\x69\x28\x6f\x2e\x64\x61\x74\x61\x29\x29\x26\x26\x41\x28\x72\x2c\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d" -"\x28\x72\x2c\x21\x30\x29\x3b\x66\x6f\x72\x28\x73\x20\x69\x6e\x20\x66\x29\x74\x28\x64\x5b\x73\x5d\x29\x26\x26\x64\x69\x28\x63\x2c\x73\x2c\x22\x22\x29\x3b\x66\x6f\x72\x28\x73\x20\x69\x6e\x20\x64\x29\x28\x61\x3d\x64\x5b\x73\x5d\x29\x21\x3d\x3d\x66\x5b\x73\x5d\x26\x26\x64\x69\x28\x63\x2c\x73\x2c\x6e\x75\x6c\x6c\x3d\x3d\x61\x3f\x22\x22\x3a\x61\x29\x7d\x7d\x76\x61\x72\x20\x79\x69\x3d\x7b\x63\x72\x65\x61" -"\x74\x65\x3a\x6d\x69\x2c\x75\x70\x64\x61\x74\x65\x3a\x6d\x69\x7d\x2c\x67\x69\x3d\x2f\x5c\x73\x2b\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x69\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74\x26\x26\x28\x74\x3d\x74\x2e\x74\x72\x69\x6d\x28\x29\x29\x29\x69\x66\x28\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x29\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x20\x22\x29\x3e\x2d\x31\x3f\x74\x2e\x73\x70\x6c" -"\x69\x74\x28\x67\x69\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x61\x64\x64\x28\x74\x29\x7d\x29\x3a\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x61\x64\x64\x28\x74\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x6e\x3d\x22\x20\x22\x2b\x28\x65\x2e\x67\x65\x74\x41\x74\x74\x72\x69" -"\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x7c\x7c\x22\x22\x29\x2b\x22\x20\x22\x3b\x6e\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x20\x22\x2b\x74\x2b\x22\x20\x22\x29\x3c\x30\x26\x26\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x2c\x28\x6e\x2b\x74\x29\x2e\x74\x72\x69\x6d\x28\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x69\x28\x65\x2c\x74" -"\x29\x7b\x69\x66\x28\x74\x26\x26\x28\x74\x3d\x74\x2e\x74\x72\x69\x6d\x28\x29\x29\x29\x69\x66\x28\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x29\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x20\x22\x29\x3e\x2d\x31\x3f\x74\x2e\x73\x70\x6c\x69\x74\x28\x67\x69\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x6c\x61\x73\x73" -"\x4c\x69\x73\x74\x2e\x72\x65\x6d\x6f\x76\x65\x28\x74\x29\x7d\x29\x3a\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x72\x65\x6d\x6f\x76\x65\x28\x74\x29\x2c\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x3b\x65\x6c\x73\x65\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e" -"\x3d\x22\x20\x22\x2b\x28\x65\x2e\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x7c\x7c\x22\x22\x29\x2b\x22\x20\x22\x2c\x72\x3d\x22\x20\x22\x2b\x74\x2b\x22\x20\x22\x3b\x6e\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x72\x29\x3e\x3d\x30\x3b\x29\x6e\x3d\x6e\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x72\x2c\x22\x20\x22\x29\x3b\x28\x6e\x3d\x6e\x2e\x74\x72\x69\x6d\x28\x29\x29\x3f" -"\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x2c\x6e\x29\x3a\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x69\x28\x65\x29\x7b\x69\x66\x28\x65\x29\x7b\x69\x66\x28\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x7b\x76\x61" -"\x72\x20\x74\x3d\x7b\x7d\x3b\x72\x65\x74\x75\x72\x6e\x21\x31\x21\x3d\x3d\x65\x2e\x63\x73\x73\x26\x26\x41\x28\x74\x2c\x77\x69\x28\x65\x2e\x6e\x61\x6d\x65\x7c\x7c\x22\x76\x22\x29\x29\x2c\x41\x28\x74\x2c\x65\x29\x2c\x74\x7d\x72\x65\x74\x75\x72\x6e\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x77\x69\x28\x65\x29\x3a\x76\x6f\x69\x64\x20\x30\x7d\x7d\x76\x61\x72\x20\x77\x69" -"\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x65\x6e\x74\x65\x72\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x65\x6e\x74\x65\x72\x22\x2c\x65\x6e\x74\x65\x72\x54\x6f\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x65\x6e\x74\x65\x72\x2d\x74\x6f\x22\x2c\x65\x6e\x74\x65\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x65\x6e\x74\x65\x72\x2d\x61\x63" -"\x74\x69\x76\x65\x22\x2c\x6c\x65\x61\x76\x65\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x6c\x65\x61\x76\x65\x22\x2c\x6c\x65\x61\x76\x65\x54\x6f\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x6c\x65\x61\x76\x65\x2d\x74\x6f\x22\x2c\x6c\x65\x61\x76\x65\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x6c\x65\x61\x76\x65\x2d\x61\x63\x74\x69\x76\x65\x22\x7d\x7d\x29\x2c\x43\x69\x3d\x56\x26\x26\x21" -"\x57\x2c\x78\x69\x3d\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c\x6b\x69\x3d\x22\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x22\x2c\x41\x69\x3d\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c\x4f\x69\x3d\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x22\x2c\x53\x69\x3d\x22\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x22\x2c\x54\x69\x3d\x22\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x65\x6e\x64\x22" -"\x3b\x43\x69\x26\x26\x28\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x77\x65\x62\x6b\x69\x74\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x28\x41\x69\x3d\x22\x57\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22" -"\x2c\x4f\x69\x3d\x22\x77\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x45\x6e\x64\x22\x29\x2c\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x77\x65\x62\x6b\x69\x74\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x28\x53\x69" -"\x3d\x22\x57\x65\x62\x6b\x69\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x22\x2c\x54\x69\x3d\x22\x77\x65\x62\x6b\x69\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x45\x6e\x64\x22\x29\x29\x3b\x76\x61\x72\x20\x4e\x69\x3d\x56\x3f\x77\x69\x6e\x64\x6f\x77\x2e\x72\x65\x71\x75\x65\x73\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x46\x72\x61\x6d\x65\x3f\x77\x69\x6e\x64\x6f\x77\x2e\x72\x65\x71\x75\x65\x73\x74\x41\x6e\x69" -"\x6d\x61\x74\x69\x6f\x6e\x46\x72\x61\x6d\x65\x2e\x62\x69\x6e\x64\x28\x77\x69\x6e\x64\x6f\x77\x29\x3a\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x28\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x69\x28\x65\x29\x7b\x4e\x69\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x4e\x69\x28\x65\x29\x7d\x29\x7d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x20\x6a\x69\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x7c\x7c\x28\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x3d\x5b\x5d\x29\x3b\x6e\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3c\x30\x26\x26\x28\x6e\x2e\x70\x75\x73\x68\x28\x74\x29\x2c\x5f\x69\x28\x65\x2c" -"\x74\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x69\x28\x65\x2c\x74\x29\x7b\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x26\x26\x68\x28\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x2c\x74\x29\x2c\x62\x69\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20" -"\x72\x3d\x4d\x69\x28\x65\x2c\x74\x29\x2c\x69\x3d\x72\x2e\x74\x79\x70\x65\x2c\x6f\x3d\x72\x2e\x74\x69\x6d\x65\x6f\x75\x74\x2c\x61\x3d\x72\x2e\x70\x72\x6f\x70\x43\x6f\x75\x6e\x74\x3b\x69\x66\x28\x21\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x29\x3b\x76\x61\x72\x20\x73\x3d\x69\x3d\x3d\x3d\x78\x69\x3f\x4f\x69\x3a\x54\x69\x2c\x63\x3d\x30\x2c\x75\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e" -"\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x73\x2c\x6c\x29\x2c\x6e\x28\x29\x7d\x2c\x6c\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x74\x61\x72\x67\x65\x74\x3d\x3d\x3d\x65\x26\x26\x2b\x2b\x63\x3e\x3d\x61\x26\x26\x75\x28\x29\x7d\x3b\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x63\x3c\x61\x26\x26\x75\x28" -"\x29\x7d\x2c\x6f\x2b\x31\x29\x2c\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x73\x2c\x6c\x29\x7d\x76\x61\x72\x20\x49\x69\x3d\x2f\x5c\x62\x28\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x7c\x61\x6c\x6c\x29\x28\x2c\x7c\x24\x29\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4d\x69\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x67\x65\x74\x43" -"\x6f\x6d\x70\x75\x74\x65\x64\x53\x74\x79\x6c\x65\x28\x65\x29\x2c\x69\x3d\x28\x72\x5b\x41\x69\x2b\x22\x44\x65\x6c\x61\x79\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x6f\x3d\x28\x72\x5b\x41\x69\x2b\x22\x44\x75\x72\x61\x74\x69\x6f\x6e\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x61\x3d\x46\x69\x28\x69\x2c\x6f\x29\x2c\x73\x3d\x28" -"\x72\x5b\x53\x69\x2b\x22\x44\x65\x6c\x61\x79\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x63\x3d\x28\x72\x5b\x53\x69\x2b\x22\x44\x75\x72\x61\x74\x69\x6f\x6e\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x75\x3d\x46\x69\x28\x73\x2c\x63\x29\x2c\x6c\x3d\x30\x2c\x66\x3d\x30\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3d\x3d\x3d\x78\x69\x3f" -"\x61\x3e\x30\x26\x26\x28\x6e\x3d\x78\x69\x2c\x6c\x3d\x61\x2c\x66\x3d\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3a\x74\x3d\x3d\x3d\x6b\x69\x3f\x75\x3e\x30\x26\x26\x28\x6e\x3d\x6b\x69\x2c\x6c\x3d\x75\x2c\x66\x3d\x63\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3a\x66\x3d\x28\x6e\x3d\x28\x6c\x3d\x4d\x61\x74\x68\x2e\x6d\x61\x78\x28\x61\x2c\x75\x29\x29\x3e\x30\x3f\x61\x3e\x75\x3f\x78\x69\x3a\x6b\x69\x3a\x6e\x75\x6c\x6c" -"\x29\x3f\x6e\x3d\x3d\x3d\x78\x69\x3f\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3a\x63\x2e\x6c\x65\x6e\x67\x74\x68\x3a\x30\x2c\x7b\x74\x79\x70\x65\x3a\x6e\x2c\x74\x69\x6d\x65\x6f\x75\x74\x3a\x6c\x2c\x70\x72\x6f\x70\x43\x6f\x75\x6e\x74\x3a\x66\x2c\x68\x61\x73\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3a\x6e\x3d\x3d\x3d\x78\x69\x26\x26\x49\x69\x2e\x74\x65\x73\x74\x28\x72\x5b\x41\x69\x2b\x22\x50\x72\x6f\x70\x65\x72" -"\x74\x79\x22\x5d\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x69\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x3b\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x29\x65\x3d\x65\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x4d\x61\x74\x68\x2e\x6d\x61\x78\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x74\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x28\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x50\x69\x28\x74\x29\x2b\x50\x69\x28\x65\x5b\x6e\x5d\x29\x7d\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x50\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x31\x65\x33\x2a\x4e\x75\x6d\x62\x65\x72\x28\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x22\x2c\x22\x2c\x22\x2e\x22\x29\x29\x7d\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x69\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x65\x6c\x6d\x3b\x6e\x28\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x29\x26\x26\x28\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3d\x21\x30\x2c\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x28\x29\x29\x3b\x76\x61\x72\x20\x61\x3d\x24\x69\x28\x65\x2e\x64\x61\x74\x61\x2e\x74\x72" -"\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x3b\x69\x66\x28\x21\x74\x28\x61\x29\x26\x26\x21\x6e\x28\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x29\x26\x26\x31\x3d\x3d\x3d\x69\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x3d\x61\x2e\x63\x73\x73\x2c\x63\x3d\x61\x2e\x74\x79\x70\x65\x2c\x75\x3d\x61\x2e\x65\x6e\x74\x65\x72\x43\x6c\x61\x73\x73\x2c\x6c\x3d\x61\x2e\x65\x6e\x74\x65" -"\x72\x54\x6f\x43\x6c\x61\x73\x73\x2c\x70\x3d\x61\x2e\x65\x6e\x74\x65\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x2c\x64\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x43\x6c\x61\x73\x73\x2c\x76\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x54\x6f\x43\x6c\x61\x73\x73\x2c\x68\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x2c\x6d\x3d\x61\x2e\x62\x65\x66\x6f\x72\x65\x45\x6e\x74\x65" -"\x72\x2c\x79\x3d\x61\x2e\x65\x6e\x74\x65\x72\x2c\x67\x3d\x61\x2e\x61\x66\x74\x65\x72\x45\x6e\x74\x65\x72\x2c\x5f\x3d\x61\x2e\x65\x6e\x74\x65\x72\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x2c\x62\x3d\x61\x2e\x62\x65\x66\x6f\x72\x65\x41\x70\x70\x65\x61\x72\x2c\x24\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x2c\x77\x3d\x61\x2e\x61\x66\x74\x65\x72\x41\x70\x70\x65\x61\x72\x2c\x43\x3d\x61\x2e\x61\x70\x70\x65\x61\x72" -"\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x2c\x78\x3d\x61\x2e\x64\x75\x72\x61\x74\x69\x6f\x6e\x2c\x6b\x3d\x5a\x74\x2c\x41\x3d\x5a\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3b\x41\x26\x26\x41\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x6b\x3d\x41\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x41\x3d\x41\x2e\x70\x61\x72\x65\x6e\x74\x3b\x76\x61\x72\x20\x4f\x3d\x21\x6b\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x7c\x7c\x21\x65\x2e" -"\x69\x73\x52\x6f\x6f\x74\x49\x6e\x73\x65\x72\x74\x3b\x69\x66\x28\x21\x4f\x7c\x7c\x24\x7c\x7c\x22\x22\x3d\x3d\x3d\x24\x29\x7b\x76\x61\x72\x20\x53\x3d\x4f\x26\x26\x64\x3f\x64\x3a\x75\x2c\x54\x3d\x4f\x26\x26\x68\x3f\x68\x3a\x70\x2c\x4e\x3d\x4f\x26\x26\x76\x3f\x76\x3a\x6c\x2c\x45\x3d\x4f\x26\x26\x62\x7c\x7c\x6d\x2c\x6a\x3d\x4f\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f" -"\x66\x20\x24\x3f\x24\x3a\x79\x2c\x4c\x3d\x4f\x26\x26\x77\x7c\x7c\x67\x2c\x49\x3d\x4f\x26\x26\x43\x7c\x7c\x5f\x2c\x4d\x3d\x66\x28\x6f\x28\x78\x29\x3f\x78\x2e\x65\x6e\x74\x65\x72\x3a\x78\x29\x2c\x46\x3d\x21\x31\x21\x3d\x3d\x73\x26\x26\x21\x57\x2c\x50\x3d\x55\x69\x28\x6a\x29\x2c\x52\x3d\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x3d\x44\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x46\x26\x26\x28\x44" -"\x69\x28\x69\x2c\x4e\x29\x2c\x44\x69\x28\x69\x2c\x54\x29\x29\x2c\x52\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3f\x28\x46\x26\x26\x44\x69\x28\x69\x2c\x53\x29\x2c\x49\x26\x26\x49\x28\x69\x29\x29\x3a\x4c\x26\x26\x4c\x28\x69\x29\x2c\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x3d\x6e\x75\x6c\x6c\x7d\x29\x3b\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x7c\x7c\x6f\x74\x28\x65\x2c\x22\x69\x6e\x73\x65\x72\x74" -"\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2c\x6e\x3d\x74\x26\x26\x74\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x26\x26\x74\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5b\x65\x2e\x6b\x65\x79\x5d\x3b\x6e\x26\x26\x6e\x2e\x74\x61\x67\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x26\x26\x6e\x2e\x65\x6c\x6d\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x26" -"\x26\x6e\x2e\x65\x6c\x6d\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x28\x29\x2c\x6a\x26\x26\x6a\x28\x69\x2c\x52\x29\x7d\x29\x2c\x45\x26\x26\x45\x28\x69\x29\x2c\x46\x26\x26\x28\x6a\x69\x28\x69\x2c\x53\x29\x2c\x6a\x69\x28\x69\x2c\x54\x29\x2c\x45\x69\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x44\x69\x28\x69\x2c\x53\x29\x2c\x52\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x7c\x7c\x28\x6a\x69\x28\x69\x2c\x4e" -"\x29\x2c\x50\x7c\x7c\x28\x42\x69\x28\x4d\x29\x3f\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x52\x2c\x4d\x29\x3a\x4c\x69\x28\x69\x2c\x63\x2c\x52\x29\x29\x29\x7d\x29\x29\x2c\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x26\x26\x28\x72\x26\x26\x72\x28\x29\x2c\x6a\x26\x26\x6a\x28\x69\x2c\x52\x29\x29\x2c\x46\x7c\x7c\x50\x7c\x7c\x52\x28\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x69\x28\x65" -"\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x65\x6c\x6d\x3b\x6e\x28\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x29\x26\x26\x28\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3d\x21\x30\x2c\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x28\x29\x29\x3b\x76\x61\x72\x20\x61\x3d\x24\x69\x28\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x3b\x69\x66" -"\x28\x74\x28\x61\x29\x7c\x7c\x31\x21\x3d\x3d\x69\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x28\x29\x3b\x69\x66\x28\x21\x6e\x28\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x29\x29\x7b\x76\x61\x72\x20\x73\x3d\x61\x2e\x63\x73\x73\x2c\x63\x3d\x61\x2e\x74\x79\x70\x65\x2c\x75\x3d\x61\x2e\x6c\x65\x61\x76\x65\x43\x6c\x61\x73\x73\x2c\x6c\x3d\x61\x2e\x6c\x65\x61\x76\x65\x54\x6f\x43" -"\x6c\x61\x73\x73\x2c\x70\x3d\x61\x2e\x6c\x65\x61\x76\x65\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x2c\x64\x3d\x61\x2e\x62\x65\x66\x6f\x72\x65\x4c\x65\x61\x76\x65\x2c\x76\x3d\x61\x2e\x6c\x65\x61\x76\x65\x2c\x68\x3d\x61\x2e\x61\x66\x74\x65\x72\x4c\x65\x61\x76\x65\x2c\x6d\x3d\x61\x2e\x6c\x65\x61\x76\x65\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x2c\x79\x3d\x61\x2e\x64\x65\x6c\x61\x79\x4c\x65\x61\x76\x65" -"\x2c\x67\x3d\x61\x2e\x64\x75\x72\x61\x74\x69\x6f\x6e\x2c\x5f\x3d\x21\x31\x21\x3d\x3d\x73\x26\x26\x21\x57\x2c\x62\x3d\x55\x69\x28\x76\x29\x2c\x24\x3d\x66\x28\x6f\x28\x67\x29\x3f\x67\x2e\x6c\x65\x61\x76\x65\x3a\x67\x29\x2c\x77\x3d\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x3d\x44\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x26\x26\x69\x2e\x70\x61\x72" -"\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x26\x26\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5b\x65\x2e\x6b\x65\x79\x5d\x3d\x6e\x75\x6c\x6c\x29\x2c\x5f\x26\x26\x28\x44\x69\x28\x69\x2c\x6c\x29\x2c\x44\x69\x28\x69\x2c\x70\x29\x29\x2c\x77\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3f\x28\x5f\x26\x26\x44\x69\x28\x69\x2c\x75\x29\x2c\x6d" -"\x26\x26\x6d\x28\x69\x29\x29\x3a\x28\x72\x28\x29\x2c\x68\x26\x26\x68\x28\x69\x29\x29\x2c\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x3d\x6e\x75\x6c\x6c\x7d\x29\x3b\x79\x3f\x79\x28\x43\x29\x3a\x43\x28\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x28\x29\x7b\x77\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x7c\x7c\x28\x21\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x26\x26\x69\x2e\x70\x61\x72\x65\x6e\x74" -"\x4e\x6f\x64\x65\x26\x26\x28\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x7c\x7c\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x3d\x7b\x7d\x29\x29\x5b\x65\x2e\x6b\x65\x79\x5d\x3d\x65\x29\x2c\x64\x26\x26\x64\x28\x69\x29\x2c\x5f\x26\x26\x28\x6a\x69\x28\x69\x2c\x75\x29\x2c\x6a\x69\x28\x69\x2c\x70\x29\x2c\x45\x69\x28" -"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x44\x69\x28\x69\x2c\x75\x29\x2c\x77\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x7c\x7c\x28\x6a\x69\x28\x69\x2c\x6c\x29\x2c\x62\x7c\x7c\x28\x42\x69\x28\x24\x29\x3f\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x77\x2c\x24\x29\x3a\x4c\x69\x28\x69\x2c\x63\x2c\x77\x29\x29\x29\x7d\x29\x29\x2c\x76\x26\x26\x76\x28\x69\x2c\x77\x29\x2c\x5f\x7c\x7c\x62\x7c\x7c\x77\x28" -"\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x6e\x75\x6d\x62\x65\x72\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26\x26\x21\x69\x73\x4e\x61\x4e\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x69\x28\x65\x29\x7b\x69\x66\x28\x74\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x66\x6e\x73\x3b\x72" -"\x65\x74\x75\x72\x6e\x20\x6e\x28\x72\x29\x3f\x55\x69\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x3f\x72\x5b\x30\x5d\x3a\x72\x29\x3a\x28\x65\x2e\x5f\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3e\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x69\x28\x65\x2c\x74\x29\x7b\x21\x30\x21\x3d\x3d\x74\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x26\x26\x52\x69" -"\x28\x74\x29\x7d\x76\x61\x72\x20\x7a\x69\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x6f\x2c\x61\x2c\x73\x3d\x7b\x7d\x2c\x63\x3d\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x75\x3d\x65\x2e\x6e\x6f\x64\x65\x4f\x70\x73\x3b\x66\x6f\x72\x28\x6f\x3d\x30\x3b\x6f\x3c\x69\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x6f\x29\x66\x6f\x72\x28\x73\x5b\x69\x72\x5b\x6f\x5d\x5d\x3d\x5b\x5d\x2c" -"\x61\x3d\x30\x3b\x61\x3c\x63\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x61\x29\x6e\x28\x63\x5b\x61\x5d\x5b\x69\x72\x5b\x6f\x5d\x5d\x29\x26\x26\x73\x5b\x69\x72\x5b\x6f\x5d\x5d\x2e\x70\x75\x73\x68\x28\x63\x5b\x61\x5d\x5b\x69\x72\x5b\x6f\x5d\x5d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x75\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x28\x65\x29\x3b\x6e\x28" -"\x74\x29\x26\x26\x75\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x74\x2c\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x2c\x61\x2c\x63\x2c\x6c\x29\x7b\x69\x66\x28\x6e\x28\x65\x2e\x65\x6c\x6d\x29\x26\x26\x6e\x28\x63\x29\x26\x26\x28\x65\x3d\x63\x5b\x6c\x5d\x3d\x6d\x65\x28\x65\x29\x29\x2c\x65\x2e\x69\x73\x52\x6f\x6f\x74\x49\x6e\x73\x65\x72\x74\x3d\x21\x61" -"\x2c\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x6e\x28\x61\x29\x29\x7b\x76\x61\x72\x20\x63\x3d\x6e\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x26\x26\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x3b\x69\x66\x28\x6e\x28\x61\x3d\x61\x2e\x68\x6f\x6f\x6b\x29\x26\x26" -"\x6e\x28\x61\x3d\x61\x2e\x69\x6e\x69\x74\x29\x26\x26\x61\x28\x65\x2c\x21\x31\x29\x2c\x6e\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x64\x28\x65\x2c\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x2c\x72\x28\x63\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x72\x2c\x69\x29\x7b\x66\x6f\x72\x28\x76" -"\x61\x72\x20\x6f\x2c\x61\x3d\x65\x3b\x61\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x29\x69\x66\x28\x61\x3d\x61\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6e\x28\x6f\x3d\x61\x2e\x64\x61\x74\x61\x29\x26\x26\x6e\x28\x6f\x3d\x6f\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x29\x7b\x66\x6f\x72\x28\x6f\x3d" -"\x30\x3b\x6f\x3c\x73\x2e\x61\x63\x74\x69\x76\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x6f\x29\x73\x2e\x61\x63\x74\x69\x76\x61\x74\x65\x5b\x6f\x5d\x28\x72\x72\x2c\x61\x29\x3b\x74\x2e\x70\x75\x73\x68\x28\x61\x29\x3b\x62\x72\x65\x61\x6b\x7d\x76\x28\x72\x2c\x65\x2e\x65\x6c\x6d\x2c\x69\x29\x7d\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x2c\x21\x30\x7d\x7d\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x29\x7b" -"\x76\x61\x72\x20\x66\x3d\x65\x2e\x64\x61\x74\x61\x2c\x70\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x6d\x3d\x65\x2e\x74\x61\x67\x3b\x6e\x28\x6d\x29\x3f\x28\x65\x2e\x65\x6c\x6d\x3d\x65\x2e\x6e\x73\x3f\x75\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x4e\x53\x28\x65\x2e\x6e\x73\x2c\x6d\x29\x3a\x75\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x6d\x2c\x65\x29\x2c\x67\x28" -"\x65\x29\x2c\x68\x28\x65\x2c\x70\x2c\x74\x29\x2c\x6e\x28\x66\x29\x26\x26\x79\x28\x65\x2c\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x29\x3a\x72\x28\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x29\x3f\x28\x65\x2e\x65\x6c\x6d\x3d\x75\x2e\x63\x72\x65\x61\x74\x65\x43\x6f\x6d\x6d\x65\x6e\x74\x28\x65\x2e\x74\x65\x78\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x29\x3a\x28" -"\x65\x2e\x65\x6c\x6d\x3d\x75\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x65\x2e\x74\x65\x78\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x64\x28\x65\x2c\x74\x29\x7b\x6e\x28\x65\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x29\x26\x26\x28\x74\x2e\x70\x75\x73\x68\x2e\x61\x70\x70\x6c\x79" -"\x28\x74\x2c\x65\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x29\x2c\x65\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x3d\x6e\x75\x6c\x6c\x29\x2c\x65\x2e\x65\x6c\x6d\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x24\x65\x6c\x2c\x6d\x28\x65\x29\x3f\x28\x79\x28\x65\x2c\x74\x29\x2c\x67\x28\x65\x29\x29" -"\x3a\x28\x6e\x72\x28\x65\x29\x2c\x74\x2e\x70\x75\x73\x68\x28\x65\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x28\x65\x2c\x74\x2c\x72\x29\x7b\x6e\x28\x65\x29\x26\x26\x28\x6e\x28\x72\x29\x3f\x75\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x28\x72\x29\x3d\x3d\x3d\x65\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x74\x2c\x72\x29\x3a\x75\x2e\x61\x70\x70\x65\x6e\x64" -"\x43\x68\x69\x6c\x64\x28\x65\x2c\x74\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72\x29\x66\x28\x74\x5b\x72\x5d\x2c\x6e\x2c\x65\x2e\x65\x6c\x6d\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x2c" -"\x74\x2c\x72\x29\x3b\x65\x6c\x73\x65\x20\x69\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x75\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x65\x2e\x65\x6c\x6d\x2c\x75\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x53\x74\x72\x69\x6e\x67\x28\x65\x2e\x74\x65\x78\x74\x29\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x2e\x63\x6f\x6d\x70" -"\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x29\x65\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x65\x2e\x74\x61\x67\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x73\x2e\x63\x72\x65\x61\x74\x65\x2e\x6c" -"\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72\x29\x73\x2e\x63\x72\x65\x61\x74\x65\x5b\x72\x5d\x28\x72\x72\x2c\x65\x29\x3b\x6e\x28\x6f\x3d\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x28\x6e\x28\x6f\x2e\x63\x72\x65\x61\x74\x65\x29\x26\x26\x6f\x2e\x63\x72\x65\x61\x74\x65\x28\x72\x72\x2c\x65\x29\x2c\x6e\x28\x6f\x2e\x69\x6e\x73\x65\x72\x74\x29\x26\x26\x74\x2e\x70\x75\x73\x68\x28\x65\x29\x29\x7d\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x69\x66\x28\x6e\x28\x74\x3d\x65\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x29\x29\x75\x2e\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x28\x65\x2e\x65\x6c\x6d\x2c\x74\x29\x3b\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x65\x3b\x72\x3b\x29\x6e\x28\x74\x3d\x72\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x26\x26" -"\x6e\x28\x74\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x29\x26\x26\x75\x2e\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x28\x65\x2e\x65\x6c\x6d\x2c\x74\x29\x2c\x72\x3d\x72\x2e\x70\x61\x72\x65\x6e\x74\x3b\x6e\x28\x74\x3d\x5a\x74\x29\x26\x26\x74\x21\x3d\x3d\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x26\x26\x74\x21\x3d\x3d\x65\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78" -"\x74\x26\x26\x6e\x28\x74\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x29\x26\x26\x75\x2e\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x28\x65\x2e\x65\x6c\x6d\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x29\x7b\x66\x6f\x72\x28\x3b\x72\x3c\x3d\x69\x3b\x2b\x2b\x72\x29\x66\x28\x6e\x5b\x72\x5d\x2c\x6f" -"\x2c\x65\x2c\x74\x2c\x21\x31\x2c\x6e\x2c\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x72\x2c\x69\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x6e\x28\x69\x29\x29\x66\x6f\x72\x28\x6e\x28\x74\x3d\x69\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x74\x3d\x74\x2e\x64\x65\x73\x74\x72\x6f\x79\x29\x26\x26\x74\x28\x65\x29\x2c\x74\x3d\x30\x3b\x74\x3c\x73\x2e\x64\x65" -"\x73\x74\x72\x6f\x79\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x74\x29\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x5b\x74\x5d\x28\x65\x29\x3b\x69\x66\x28\x6e\x28\x74\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x66\x6f\x72\x28\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72\x29\x62\x28\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x72\x5d\x29" -"\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x28\x65\x2c\x74\x2c\x72\x29\x7b\x66\x6f\x72\x28\x3b\x74\x3c\x3d\x72\x3b\x2b\x2b\x74\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x74\x5d\x3b\x6e\x28\x69\x29\x26\x26\x28\x6e\x28\x69\x2e\x74\x61\x67\x29\x3f\x28\x77\x28\x69\x29\x2c\x62\x28\x69\x29\x29\x3a\x6c\x28\x69\x2e\x65\x6c\x6d\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x77\x28\x65\x2c\x74\x29\x7b" -"\x69\x66\x28\x6e\x28\x74\x29\x7c\x7c\x6e\x28\x65\x2e\x64\x61\x74\x61\x29\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x3d\x73\x2e\x72\x65\x6d\x6f\x76\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2b\x31\x3b\x66\x6f\x72\x28\x6e\x28\x74\x29\x3f\x74\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x2b\x3d\x69\x3a\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x29\x7b\x30" -"\x3d\x3d\x2d\x2d\x6e\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x26\x26\x6c\x28\x65\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x74\x2c\x6e\x7d\x28\x65\x2e\x65\x6c\x6d\x2c\x69\x29\x2c\x6e\x28\x72\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x26\x26\x6e\x28\x72\x2e" -"\x64\x61\x74\x61\x29\x26\x26\x77\x28\x72\x2c\x74\x29\x2c\x72\x3d\x30\x3b\x72\x3c\x73\x2e\x72\x65\x6d\x6f\x76\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72\x29\x73\x2e\x72\x65\x6d\x6f\x76\x65\x5b\x72\x5d\x28\x65\x2c\x74\x29\x3b\x6e\x28\x72\x3d\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x72\x65\x6d\x6f\x76\x65\x29\x3f\x72\x28\x65\x2c\x74\x29\x3a\x74\x28\x29\x7d" -"\x65\x6c\x73\x65\x20\x6c\x28\x65\x2e\x65\x6c\x6d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x28\x65\x2c\x74\x2c\x72\x2c\x69\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x72\x3b\x6f\x3c\x69\x3b\x6f\x2b\x2b\x29\x7b\x76\x61\x72\x20\x61\x3d\x74\x5b\x6f\x5d\x3b\x69\x66\x28\x6e\x28\x61\x29\x26\x26\x6f\x72\x28\x65\x2c\x61\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x20\x78\x28\x65\x2c\x69\x2c\x6f\x2c\x61\x2c\x63\x2c\x6c\x29\x7b\x69\x66\x28\x65\x21\x3d\x3d\x69\x29\x7b\x6e\x28\x69\x2e\x65\x6c\x6d\x29\x26\x26\x6e\x28\x61\x29\x26\x26\x28\x69\x3d\x61\x5b\x63\x5d\x3d\x6d\x65\x28\x69\x29\x29\x3b\x76\x61\x72\x20\x70\x3d\x69\x2e\x65\x6c\x6d\x3d\x65\x2e\x65\x6c\x6d\x3b\x69\x66\x28\x72\x28\x65\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65" -"\x72\x29\x29\x6e\x28\x69\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x3f\x4f\x28\x65\x2e\x65\x6c\x6d\x2c\x69\x2c\x6f\x29\x3a\x69\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x3d\x21\x30\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x72\x28\x69\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x29\x26\x26\x72\x28\x65\x2e\x69\x73\x53\x74\x61\x74" -"\x69\x63\x29\x26\x26\x69\x2e\x6b\x65\x79\x3d\x3d\x3d\x65\x2e\x6b\x65\x79\x26\x26\x28\x72\x28\x69\x2e\x69\x73\x43\x6c\x6f\x6e\x65\x64\x29\x7c\x7c\x72\x28\x69\x2e\x69\x73\x4f\x6e\x63\x65\x29\x29\x29\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x64\x2c" -"\x76\x3d\x69\x2e\x64\x61\x74\x61\x3b\x6e\x28\x76\x29\x26\x26\x6e\x28\x64\x3d\x76\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x64\x3d\x64\x2e\x70\x72\x65\x70\x61\x74\x63\x68\x29\x26\x26\x64\x28\x65\x2c\x69\x29\x3b\x76\x61\x72\x20\x68\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x79\x3d\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x6e\x28\x76\x29\x26\x26\x6d\x28\x69\x29\x29\x7b\x66\x6f\x72" -"\x28\x64\x3d\x30\x3b\x64\x3c\x73\x2e\x75\x70\x64\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x64\x29\x73\x2e\x75\x70\x64\x61\x74\x65\x5b\x64\x5d\x28\x65\x2c\x69\x29\x3b\x6e\x28\x64\x3d\x76\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x64\x3d\x64\x2e\x75\x70\x64\x61\x74\x65\x29\x26\x26\x64\x28\x65\x2c\x69\x29\x7d\x74\x28\x69\x2e\x74\x65\x78\x74\x29\x3f\x6e\x28\x68\x29\x26\x26\x6e\x28\x79\x29\x3f" -"\x68\x21\x3d\x3d\x79\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x2c\x63\x2c\x6c\x2c\x70\x3d\x30\x2c\x64\x3d\x30\x2c\x76\x3d\x72\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x68\x3d\x72\x5b\x30\x5d\x2c\x6d\x3d\x72\x5b\x76\x5d\x2c\x79\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x67\x3d\x69\x5b\x30\x5d\x2c\x62\x3d\x69\x5b" -"\x79\x5d\x2c\x77\x3d\x21\x61\x3b\x70\x3c\x3d\x76\x26\x26\x64\x3c\x3d\x79\x3b\x29\x74\x28\x68\x29\x3f\x68\x3d\x72\x5b\x2b\x2b\x70\x5d\x3a\x74\x28\x6d\x29\x3f\x6d\x3d\x72\x5b\x2d\x2d\x76\x5d\x3a\x6f\x72\x28\x68\x2c\x67\x29\x3f\x28\x78\x28\x68\x2c\x67\x2c\x6f\x2c\x69\x2c\x64\x29\x2c\x68\x3d\x72\x5b\x2b\x2b\x70\x5d\x2c\x67\x3d\x69\x5b\x2b\x2b\x64\x5d\x29\x3a\x6f\x72\x28\x6d\x2c\x62\x29\x3f\x28\x78\x28" -"\x6d\x2c\x62\x2c\x6f\x2c\x69\x2c\x79\x29\x2c\x6d\x3d\x72\x5b\x2d\x2d\x76\x5d\x2c\x62\x3d\x69\x5b\x2d\x2d\x79\x5d\x29\x3a\x6f\x72\x28\x68\x2c\x62\x29\x3f\x28\x78\x28\x68\x2c\x62\x2c\x6f\x2c\x69\x2c\x79\x29\x2c\x77\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x68\x2e\x65\x6c\x6d\x2c\x75\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x28\x6d\x2e\x65\x6c\x6d\x29\x29\x2c" -"\x68\x3d\x72\x5b\x2b\x2b\x70\x5d\x2c\x62\x3d\x69\x5b\x2d\x2d\x79\x5d\x29\x3a\x6f\x72\x28\x6d\x2c\x67\x29\x3f\x28\x78\x28\x6d\x2c\x67\x2c\x6f\x2c\x69\x2c\x64\x29\x2c\x77\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x6d\x2e\x65\x6c\x6d\x2c\x68\x2e\x65\x6c\x6d\x29\x2c\x6d\x3d\x72\x5b\x2d\x2d\x76\x5d\x2c\x67\x3d\x69\x5b\x2b\x2b\x64\x5d\x29\x3a\x28\x74\x28\x73\x29\x26\x26" -"\x28\x73\x3d\x61\x72\x28\x72\x2c\x70\x2c\x76\x29\x29\x2c\x74\x28\x63\x3d\x6e\x28\x67\x2e\x6b\x65\x79\x29\x3f\x73\x5b\x67\x2e\x6b\x65\x79\x5d\x3a\x43\x28\x67\x2c\x72\x2c\x70\x2c\x76\x29\x29\x3f\x66\x28\x67\x2c\x6f\x2c\x65\x2c\x68\x2e\x65\x6c\x6d\x2c\x21\x31\x2c\x69\x2c\x64\x29\x3a\x6f\x72\x28\x6c\x3d\x72\x5b\x63\x5d\x2c\x67\x29\x3f\x28\x78\x28\x6c\x2c\x67\x2c\x6f\x2c\x69\x2c\x64\x29\x2c\x72\x5b\x63" -"\x5d\x3d\x76\x6f\x69\x64\x20\x30\x2c\x77\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x6c\x2e\x65\x6c\x6d\x2c\x68\x2e\x65\x6c\x6d\x29\x29\x3a\x66\x28\x67\x2c\x6f\x2c\x65\x2c\x68\x2e\x65\x6c\x6d\x2c\x21\x31\x2c\x69\x2c\x64\x29\x2c\x67\x3d\x69\x5b\x2b\x2b\x64\x5d\x29\x3b\x70\x3e\x76\x3f\x5f\x28\x65\x2c\x74\x28\x69\x5b\x79\x2b\x31\x5d\x29\x3f\x6e\x75\x6c\x6c\x3a\x69\x5b" -"\x79\x2b\x31\x5d\x2e\x65\x6c\x6d\x2c\x69\x2c\x64\x2c\x79\x2c\x6f\x29\x3a\x64\x3e\x79\x26\x26\x24\x28\x72\x2c\x70\x2c\x76\x29\x7d\x28\x70\x2c\x68\x2c\x79\x2c\x6f\x2c\x6c\x29\x3a\x6e\x28\x79\x29\x3f\x28\x6e\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x75\x2e\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x28\x70\x2c\x22\x22\x29\x2c\x5f\x28\x70\x2c\x6e\x75\x6c\x6c\x2c\x79\x2c\x30\x2c\x79\x2e\x6c" -"\x65\x6e\x67\x74\x68\x2d\x31\x2c\x6f\x29\x29\x3a\x6e\x28\x68\x29\x3f\x24\x28\x68\x2c\x30\x2c\x68\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x29\x3a\x6e\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x75\x2e\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x28\x70\x2c\x22\x22\x29\x3a\x65\x2e\x74\x65\x78\x74\x21\x3d\x3d\x69\x2e\x74\x65\x78\x74\x26\x26\x75\x2e\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65" -"\x6e\x74\x28\x70\x2c\x69\x2e\x74\x65\x78\x74\x29\x2c\x6e\x28\x76\x29\x26\x26\x6e\x28\x64\x3d\x76\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x64\x3d\x64\x2e\x70\x6f\x73\x74\x70\x61\x74\x63\x68\x29\x26\x26\x64\x28\x65\x2c\x69\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x28\x65\x2c\x74\x2c\x69\x29\x7b\x69\x66\x28\x72\x28\x69\x29\x26\x26\x6e\x28\x65\x2e\x70\x61\x72\x65\x6e\x74\x29\x29\x65\x2e" -"\x70\x61\x72\x65\x6e\x74\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x3d\x74\x3b\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x30\x3b\x6f\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x6f\x29\x74\x5b\x6f\x5d\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x2e\x69\x6e\x73\x65\x72\x74\x28\x74\x5b\x6f\x5d\x29\x7d\x76\x61\x72\x20\x41\x3d\x70\x28\x22\x61\x74\x74" -"\x72\x73\x2c\x63\x6c\x61\x73\x73\x2c\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2c\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2c\x6b\x65\x79\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x2c\x73\x3d\x74\x2e\x74\x61\x67\x2c\x63\x3d\x74\x2e\x64\x61\x74\x61\x2c\x75\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x6f\x3d" -"\x6f\x7c\x7c\x63\x26\x26\x63\x2e\x70\x72\x65\x2c\x74\x2e\x65\x6c\x6d\x3d\x65\x2c\x72\x28\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x29\x26\x26\x6e\x28\x74\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x3d\x21\x30\x2c\x21\x30\x3b\x69\x66\x28\x6e\x28\x63\x29\x26\x26\x28\x6e\x28" -"\x61\x3d\x63\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x69\x6e\x69\x74\x29\x26\x26\x61\x28\x74\x2c\x21\x30\x29\x2c\x6e\x28\x61\x3d\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x64\x28\x74\x2c\x69\x29\x2c\x21\x30\x3b\x69\x66\x28\x6e\x28\x73\x29\x29\x7b\x69\x66\x28\x6e\x28\x75\x29\x29\x69\x66\x28\x65\x2e\x68\x61\x73" -"\x43\x68\x69\x6c\x64\x4e\x6f\x64\x65\x73\x28\x29\x29\x69\x66\x28\x6e\x28\x61\x3d\x63\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x29\x29\x7b\x69\x66\x28\x61\x21\x3d\x3d\x65\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x65\x6c\x73\x65\x7b\x66\x6f\x72\x28\x76\x61\x72\x20" -"\x6c\x3d\x21\x30\x2c\x66\x3d\x65\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x2c\x70\x3d\x30\x3b\x70\x3c\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x70\x2b\x2b\x29\x7b\x69\x66\x28\x21\x66\x7c\x7c\x21\x4f\x28\x66\x2c\x75\x5b\x70\x5d\x2c\x69\x2c\x6f\x29\x29\x7b\x6c\x3d\x21\x31\x3b\x62\x72\x65\x61\x6b\x7d\x66\x3d\x66\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x7d\x69\x66\x28\x21\x6c\x7c\x7c\x66\x29\x72" -"\x65\x74\x75\x72\x6e\x21\x31\x7d\x65\x6c\x73\x65\x20\x68\x28\x74\x2c\x75\x2c\x69\x29\x3b\x69\x66\x28\x6e\x28\x63\x29\x29\x7b\x76\x61\x72\x20\x76\x3d\x21\x31\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6d\x20\x69\x6e\x20\x63\x29\x69\x66\x28\x21\x41\x28\x6d\x29\x29\x7b\x76\x3d\x21\x30\x2c\x79\x28\x74\x2c\x69\x29\x3b\x62\x72\x65\x61\x6b\x7d\x21\x76\x26\x26\x63\x2e\x63\x6c\x61\x73\x73\x26\x26\x74\x74\x28\x63" -"\x2e\x63\x6c\x61\x73\x73\x29\x7d\x7d\x65\x6c\x73\x65\x20\x65\x2e\x64\x61\x74\x61\x21\x3d\x3d\x74\x2e\x74\x65\x78\x74\x26\x26\x28\x65\x2e\x64\x61\x74\x61\x3d\x74\x2e\x74\x65\x78\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x69\x66\x28\x21\x74\x28\x69\x29\x29\x7b\x76\x61\x72\x20\x63\x2c\x6c\x3d\x21" -"\x31\x2c\x70\x3d\x5b\x5d\x3b\x69\x66\x28\x74\x28\x65\x29\x29\x6c\x3d\x21\x30\x2c\x66\x28\x69\x2c\x70\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x64\x3d\x6e\x28\x65\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x3b\x69\x66\x28\x21\x64\x26\x26\x6f\x72\x28\x65\x2c\x69\x29\x29\x78\x28\x65\x2c\x69\x2c\x70\x2c\x6e\x75\x6c\x6c\x2c\x6e\x75\x6c\x6c\x2c\x61\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x64\x29\x7b\x69" -"\x66\x28\x31\x3d\x3d\x3d\x65\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x26\x26\x65\x2e\x68\x61\x73\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x4c\x29\x26\x26\x28\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x4c\x29\x2c\x6f\x3d\x21\x30\x29\x2c\x72\x28\x6f\x29\x26\x26\x4f\x28\x65\x2c\x69\x2c\x70\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6b\x28\x69\x2c\x70\x2c\x21\x30\x29\x2c\x65\x3b\x63" -"\x3d\x65\x2c\x65\x3d\x6e\x65\x77\x20\x70\x65\x28\x75\x2e\x74\x61\x67\x4e\x61\x6d\x65\x28\x63\x29\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x7b\x7d\x2c\x5b\x5d\x2c\x76\x6f\x69\x64\x20\x30\x2c\x63\x29\x7d\x76\x61\x72\x20\x76\x3d\x65\x2e\x65\x6c\x6d\x2c\x68\x3d\x75\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x28\x76\x29\x3b\x69\x66\x28\x66\x28\x69\x2c\x70\x2c\x76\x2e\x5f\x6c\x65\x61" -"\x76\x65\x43\x62\x3f\x6e\x75\x6c\x6c\x3a\x68\x2c\x75\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x28\x76\x29\x29\x2c\x6e\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x79\x3d\x69\x2e\x70\x61\x72\x65\x6e\x74\x2c\x67\x3d\x6d\x28\x69\x29\x3b\x79\x3b\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x5f\x3d\x30\x3b\x5f\x3c\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x2e\x6c\x65\x6e\x67" -"\x74\x68\x3b\x2b\x2b\x5f\x29\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x5b\x5f\x5d\x28\x79\x29\x3b\x69\x66\x28\x79\x2e\x65\x6c\x6d\x3d\x69\x2e\x65\x6c\x6d\x2c\x67\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x77\x3d\x30\x3b\x77\x3c\x73\x2e\x63\x72\x65\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x77\x29\x73\x2e\x63\x72\x65\x61\x74\x65\x5b\x77\x5d\x28\x72\x72\x2c\x79\x29\x3b\x76\x61\x72\x20\x43\x3d\x79" -"\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x2e\x69\x6e\x73\x65\x72\x74\x3b\x69\x66\x28\x43\x2e\x6d\x65\x72\x67\x65\x64\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x41\x3d\x31\x3b\x41\x3c\x43\x2e\x66\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x41\x2b\x2b\x29\x43\x2e\x66\x6e\x73\x5b\x41\x5d\x28\x29\x7d\x65\x6c\x73\x65\x20\x6e\x72\x28\x79\x29\x3b\x79\x3d\x79\x2e\x70\x61\x72\x65\x6e\x74\x7d\x6e\x28\x68\x29\x3f\x24" -"\x28\x5b\x65\x5d\x2c\x30\x2c\x30\x29\x3a\x6e\x28\x65\x2e\x74\x61\x67\x29\x26\x26\x62\x28\x65\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6b\x28\x69\x2c\x70\x2c\x6c\x29\x2c\x69\x2e\x65\x6c\x6d\x7d\x6e\x28\x65\x29\x26\x26\x62\x28\x65\x29\x7d\x7d\x28\x7b\x6e\x6f\x64\x65\x4f\x70\x73\x3a\x65\x72\x2c\x6d\x6f\x64\x75\x6c\x65\x73\x3a\x5b\x79\x72\x2c\x6b\x72\x2c\x72\x69\x2c\x61\x69\x2c\x79\x69\x2c\x56\x3f\x7b" -"\x63\x72\x65\x61\x74\x65\x3a\x56\x69\x2c\x61\x63\x74\x69\x76\x61\x74\x65\x3a\x56\x69\x2c\x72\x65\x6d\x6f\x76\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x21\x30\x21\x3d\x3d\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3f\x48\x69\x28\x65\x2c\x74\x29\x3a\x74\x28\x29\x7d\x7d\x3a\x7b\x7d\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x64\x72\x29\x7d\x29\x3b\x57\x26\x26\x64\x6f\x63\x75\x6d\x65" -"\x6e\x74\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x63\x68\x61\x6e\x67\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x61\x63\x74\x69\x76\x65\x45\x6c\x65\x6d\x65\x6e\x74\x3b\x65\x26\x26\x65\x2e\x76\x6d\x6f\x64\x65\x6c\x26\x26\x59\x69\x28\x65\x2c\x22\x69\x6e\x70" -"\x75\x74\x22\x29\x7d\x29\x3b\x76\x61\x72\x20\x4b\x69\x3d\x7b\x69\x6e\x73\x65\x72\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x22\x73\x65\x6c\x65\x63\x74\x22\x3d\x3d\x3d\x6e\x2e\x74\x61\x67\x3f\x28\x72\x2e\x65\x6c\x6d\x26\x26\x21\x72\x2e\x65\x6c\x6d\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e\x73\x3f\x6f\x74\x28\x6e\x2c\x22\x70\x6f\x73\x74\x70\x61\x74\x63\x68\x22" -"\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x4b\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x29\x3a\x4a\x69\x28\x65\x2c\x74\x2c\x6e\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x65\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x5b\x5d\x2e\x6d\x61\x70\x2e\x63\x61\x6c\x6c\x28\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x5a\x69\x29\x29\x3a\x28\x22" -"\x74\x65\x78\x74\x61\x72\x65\x61\x22\x3d\x3d\x3d\x6e\x2e\x74\x61\x67\x7c\x7c\x59\x6e\x28\x65\x2e\x74\x79\x70\x65\x29\x29\x26\x26\x28\x65\x2e\x5f\x76\x4d\x6f\x64\x69\x66\x69\x65\x72\x73\x3d\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2c\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2e\x6c\x61\x7a\x79\x7c\x7c\x28\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x63\x6f" -"\x6d\x70\x6f\x73\x69\x74\x69\x6f\x6e\x73\x74\x61\x72\x74\x22\x2c\x47\x69\x29\x2c\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x63\x6f\x6d\x70\x6f\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x22\x2c\x58\x69\x29\x2c\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x58\x69\x29\x2c\x57\x26\x26\x28\x65\x2e\x76\x6d" -"\x6f\x64\x65\x6c\x3d\x21\x30\x29\x29\x29\x7d\x2c\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x22\x73\x65\x6c\x65\x63\x74\x22\x3d\x3d\x3d\x6e\x2e\x74\x61\x67\x29\x7b\x4a\x69\x28\x65\x2c\x74\x2c\x6e\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e" -"\x73\x2c\x69\x3d\x65\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x5b\x5d\x2e\x6d\x61\x70\x2e\x63\x61\x6c\x6c\x28\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x5a\x69\x29\x3b\x69\x66\x28\x69\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x45\x28\x65\x2c\x72\x5b\x74\x5d\x29\x7d\x29\x29\x28\x65\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x3f\x74\x2e\x76" -"\x61\x6c\x75\x65\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x57\x69\x28\x65\x2c\x69\x29\x7d\x29\x3a\x74\x2e\x76\x61\x6c\x75\x65\x21\x3d\x3d\x74\x2e\x6f\x6c\x64\x56\x61\x6c\x75\x65\x26\x26\x57\x69\x28\x74\x2e\x76\x61\x6c\x75\x65\x2c\x69\x29\x29\x26\x26\x59\x69\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x29\x7d\x7d\x7d\x3b\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x4a\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x71\x69\x28\x65\x2c\x74\x2c\x6e\x29\x2c\x28\x71\x7c\x7c\x5a\x29\x26\x26\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x71\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x2c\x30\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65" -"\x2c\x69\x3d\x65\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x3b\x69\x66\x28\x21\x69\x7c\x7c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x2c\x61\x2c\x73\x3d\x30\x2c\x63\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x3c\x63\x3b\x73\x2b\x2b\x29\x69\x66\x28\x61\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x73\x5d\x2c" -"\x69\x29\x6f\x3d\x6a\x28\x72\x2c\x5a\x69\x28\x61\x29\x29\x3e\x2d\x31\x2c\x61\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x21\x3d\x3d\x6f\x26\x26\x28\x61\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x3d\x6f\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x45\x28\x5a\x69\x28\x61\x29\x2c\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x28\x65\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x49\x6e\x64\x65\x78\x21\x3d\x3d\x73\x26" -"\x26\x28\x65\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x49\x6e\x64\x65\x78\x3d\x73\x29\x29\x3b\x69\x7c\x7c\x28\x65\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x49\x6e\x64\x65\x78\x3d\x2d\x31\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x69\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x65\x76\x65\x72\x79\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x45\x28" -"\x74\x2c\x65\x29\x7d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5a\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5f\x76\x61\x6c\x75\x65\x22\x69\x6e\x20\x65\x3f\x65\x2e\x5f\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x69\x28\x65\x29\x7b\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x3d\x21\x30\x7d\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x58\x69\x28\x65\x29\x7b\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x26\x26\x28\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x3d\x21\x31\x2c\x59\x69\x28\x65\x2e\x74\x61\x72\x67\x65\x74\x2c\x22\x69\x6e\x70\x75\x74\x22\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x59\x69\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x64\x6f" -"\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x76\x65\x6e\x74\x28\x22\x48\x54\x4d\x4c\x45\x76\x65\x6e\x74\x73\x22\x29\x3b\x6e\x2e\x69\x6e\x69\x74\x45\x76\x65\x6e\x74\x28\x74\x2c\x21\x30\x2c\x21\x30\x29\x2c\x65\x2e\x64\x69\x73\x70\x61\x74\x63\x68\x45\x76\x65\x6e\x74\x28\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x65\x2e\x63\x6f\x6d" -"\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7c\x7c\x65\x2e\x64\x61\x74\x61\x26\x26\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3f\x65\x3a\x51\x69\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x7d\x76\x61\x72\x20\x65\x6f\x3d\x7b\x6d\x6f\x64\x65\x6c\x3a\x4b\x69\x2c\x73\x68\x6f\x77\x3a\x7b\x62\x69" -"\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x28\x6e\x3d\x51\x69\x28\x6e\x29\x29\x2e\x64\x61\x74\x61\x26\x26\x6e\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x2c\x6f\x3d\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x3d\x22\x6e\x6f\x6e\x65\x22\x3d\x3d" -"\x3d\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3f\x22\x22\x3a\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3b\x72\x26\x26\x69\x3f\x28\x6e\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3d\x21\x30\x2c\x52\x69\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x6f\x7d\x29\x29\x3a\x65\x2e\x73\x74\x79\x6c" -"\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x72\x3f\x6f\x3a\x22\x6e\x6f\x6e\x65\x22\x7d\x2c\x75\x70\x64\x61\x74\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65\x3b\x21\x72\x21\x3d\x21\x74\x2e\x6f\x6c\x64\x56\x61\x6c\x75\x65\x26\x26\x28\x28\x6e\x3d\x51\x69\x28\x6e\x29\x29\x2e\x64\x61\x74\x61\x26\x26\x6e\x2e\x64\x61\x74\x61\x2e" -"\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3f\x28\x6e\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3d\x21\x30\x2c\x72\x3f\x52\x69\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x7d\x29\x3a\x48\x69\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b" -"\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x22\x6e\x6f\x6e\x65\x22\x7d\x29\x29\x3a\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x72\x3f\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x3a\x22\x6e\x6f\x6e\x65\x22\x29\x7d\x2c\x75\x6e\x62\x69\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29" -"\x7b\x69\x7c\x7c\x28\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x29\x7d\x7d\x7d\x2c\x74\x6f\x3d\x7b\x6e\x61\x6d\x65\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x3a\x42\x6f\x6f\x6c\x65\x61\x6e\x2c\x63\x73\x73\x3a\x42\x6f\x6f\x6c\x65\x61\x6e\x2c\x6d\x6f\x64\x65\x3a\x53\x74\x72\x69\x6e\x67" -"\x2c\x74\x79\x70\x65\x3a\x53\x74\x72\x69\x6e\x67\x2c\x65\x6e\x74\x65\x72\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6c\x65\x61\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x65\x6e\x74\x65\x72\x54\x6f\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6c\x65\x61\x76\x65\x54\x6f\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x65\x6e\x74\x65\x72\x41\x63\x74\x69\x76\x65" -"\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6c\x65\x61\x76\x65\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x54\x6f\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e" -"\x67\x2c\x64\x75\x72\x61\x74\x69\x6f\x6e\x3a\x5b\x4e\x75\x6d\x62\x65\x72\x2c\x53\x74\x72\x69\x6e\x67\x2c\x4f\x62\x6a\x65\x63\x74\x5d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x6f\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x26\x26\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x74\x2e\x43\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f" -"\x6e\x73\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x3f\x6e\x6f\x28\x7a\x74\x28\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x6f\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x20\x69\x6e\x20\x6e\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x29\x74\x5b\x72\x5d\x3d" -"\x65\x5b\x72\x5d\x3b\x76\x61\x72\x20\x69\x3d\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x69\x29\x74\x5b\x62\x28\x6f\x29\x5d\x3d\x69\x5b\x6f\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x6f\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x2f\x5c\x64\x2d\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76" -"\x65\x24\x2f\x2e\x74\x65\x73\x74\x28\x74\x2e\x74\x61\x67\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x28\x22\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76\x65\x22\x2c\x7b\x70\x72\x6f\x70\x73\x3a\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x7d\x29\x7d\x76\x61\x72\x20\x6f\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72" -"\x6e\x20\x65\x2e\x74\x61\x67\x7c\x7c\x70\x74\x28\x65\x29\x7d\x2c\x61\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x73\x68\x6f\x77\x22\x3d\x3d\x3d\x65\x2e\x6e\x61\x6d\x65\x7d\x2c\x73\x6f\x3d\x7b\x6e\x61\x6d\x65\x3a\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c\x70\x72\x6f\x70\x73\x3a\x74\x6f\x2c\x61\x62\x73\x74\x72\x61\x63\x74\x3a\x21\x30\x2c\x72\x65\x6e" -"\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x2e\x64\x65\x66\x61\x75\x6c\x74\x3b\x69\x66\x28\x6e\x26\x26\x28\x6e\x3d\x6e\x2e\x66\x69\x6c\x74\x65\x72\x28\x6f\x6f\x29\x29\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x68\x69\x73\x2e\x6d\x6f\x64\x65\x2c\x6f\x3d\x6e\x5b" -"\x30\x5d\x3b\x69\x66\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x3d\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x69\x66\x28\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x28\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x3b\x76\x61\x72\x20\x61\x3d\x6e\x6f\x28\x6f\x29\x3b" -"\x69\x66\x28\x21\x61\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x3b\x69\x66\x28\x74\x68\x69\x73\x2e\x5f\x6c\x65\x61\x76\x69\x6e\x67\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x6f\x28\x65\x2c\x6f\x29\x3b\x76\x61\x72\x20\x73\x3d\x22\x5f\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x2d\x22\x2b\x74\x68\x69\x73\x2e\x5f\x75\x69\x64\x2b\x22\x2d\x22\x3b\x61\x2e\x6b\x65\x79\x3d\x6e\x75\x6c\x6c\x3d\x3d\x61\x2e\x6b\x65\x79" -"\x3f\x61\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3f\x73\x2b\x22\x63\x6f\x6d\x6d\x65\x6e\x74\x22\x3a\x73\x2b\x61\x2e\x74\x61\x67\x3a\x69\x28\x61\x2e\x6b\x65\x79\x29\x3f\x30\x3d\x3d\x3d\x53\x74\x72\x69\x6e\x67\x28\x61\x2e\x6b\x65\x79\x29\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x73\x29\x3f\x61\x2e\x6b\x65\x79\x3a\x73\x2b\x61\x2e\x6b\x65\x79\x3a\x61\x2e\x6b\x65\x79\x3b\x76\x61\x72\x20\x63\x3d\x28\x61\x2e" -"\x64\x61\x74\x61\x7c\x7c\x28\x61\x2e\x64\x61\x74\x61\x3d\x7b\x7d\x29\x29\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x72\x6f\x28\x74\x68\x69\x73\x29\x2c\x75\x3d\x74\x68\x69\x73\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6c\x3d\x6e\x6f\x28\x75\x29\x3b\x69\x66\x28\x61\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x26\x26\x61\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73" -"\x2e\x73\x6f\x6d\x65\x28\x61\x6f\x29\x26\x26\x28\x61\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3d\x21\x30\x29\x2c\x6c\x26\x26\x6c\x2e\x64\x61\x74\x61\x26\x26\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x6b\x65\x79\x3d\x3d\x3d\x65\x2e\x6b\x65\x79\x26\x26\x74\x2e\x74\x61\x67\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7d\x28\x61\x2c\x6c\x29\x26\x26\x21\x70\x74" -"\x28\x6c\x29\x26\x26\x28\x21\x6c\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7c\x7c\x21\x6c\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x29\x29\x7b\x76\x61\x72\x20\x66\x3d\x6c\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x41\x28\x7b\x7d\x2c\x63\x29\x3b" -"\x69\x66\x28\x22\x6f\x75\x74\x2d\x69\x6e\x22\x3d\x3d\x3d\x72\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x6c\x65\x61\x76\x69\x6e\x67\x3d\x21\x30\x2c\x6f\x74\x28\x66\x2c\x22\x61\x66\x74\x65\x72\x4c\x65\x61\x76\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x2e\x5f\x6c\x65\x61\x76\x69\x6e\x67\x3d\x21\x31\x2c\x74\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x7d" -"\x29\x2c\x69\x6f\x28\x65\x2c\x6f\x29\x3b\x69\x66\x28\x22\x69\x6e\x2d\x6f\x75\x74\x22\x3d\x3d\x3d\x72\x29\x7b\x69\x66\x28\x70\x74\x28\x61\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x75\x3b\x76\x61\x72\x20\x70\x2c\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x70\x28\x29\x7d\x3b\x6f\x74\x28\x63\x2c\x22\x61\x66\x74\x65\x72\x45\x6e\x74\x65\x72\x22\x2c\x64\x29\x2c\x6f\x74\x28\x63\x2c\x22\x65\x6e\x74\x65" -"\x72\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x22\x2c\x64\x29\x2c\x6f\x74\x28\x66\x2c\x22\x64\x65\x6c\x61\x79\x4c\x65\x61\x76\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x70\x3d\x65\x7d\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6f\x7d\x7d\x7d\x2c\x63\x6f\x3d\x41\x28\x7b\x74\x61\x67\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6d\x6f\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x7d\x2c\x74" -"\x6f\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x6f\x28\x65\x29\x7b\x65\x2e\x65\x6c\x6d\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x26\x26\x65\x2e\x65\x6c\x6d\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x28\x29\x2c\x65\x2e\x65\x6c\x6d\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x26\x26\x65\x2e\x65\x6c\x6d\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x28\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x6f\x28\x65\x29\x7b\x65\x2e\x64" -"\x61\x74\x61\x2e\x6e\x65\x77\x50\x6f\x73\x3d\x65\x2e\x65\x6c\x6d\x2e\x67\x65\x74\x42\x6f\x75\x6e\x64\x69\x6e\x67\x43\x6c\x69\x65\x6e\x74\x52\x65\x63\x74\x28\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x6f\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x64\x61\x74\x61\x2e\x70\x6f\x73\x2c\x6e\x3d\x65\x2e\x64\x61\x74\x61\x2e\x6e\x65\x77\x50\x6f\x73\x2c\x72\x3d\x74\x2e\x6c\x65\x66\x74\x2d\x6e\x2e" -"\x6c\x65\x66\x74\x2c\x69\x3d\x74\x2e\x74\x6f\x70\x2d\x6e\x2e\x74\x6f\x70\x3b\x69\x66\x28\x72\x7c\x7c\x69\x29\x7b\x65\x2e\x64\x61\x74\x61\x2e\x6d\x6f\x76\x65\x64\x3d\x21\x30\x3b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x65\x6c\x6d\x2e\x73\x74\x79\x6c\x65\x3b\x6f\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x6f\x2e\x57\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61" -"\x74\x65\x28\x22\x2b\x72\x2b\x22\x70\x78\x2c\x22\x2b\x69\x2b\x22\x70\x78\x29\x22\x2c\x6f\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x44\x75\x72\x61\x74\x69\x6f\x6e\x3d\x22\x30\x73\x22\x7d\x7d\x64\x65\x6c\x65\x74\x65\x20\x63\x6f\x2e\x6d\x6f\x64\x65\x3b\x76\x61\x72\x20\x70\x6f\x3d\x7b\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3a\x73\x6f\x2c\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x47\x72\x6f\x75\x70" -"\x3a\x7b\x70\x72\x6f\x70\x73\x3a\x63\x6f\x2c\x62\x65\x66\x6f\x72\x65\x4d\x6f\x75\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2c\x74\x3d\x74\x68\x69\x73\x2e\x5f\x75\x70\x64\x61\x74\x65\x3b\x74\x68\x69\x73\x2e\x5f\x75\x70\x64\x61\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x47\x74\x28\x65\x29\x3b\x65" -"\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x65\x2e\x6b\x65\x70\x74\x2c\x21\x31\x2c\x21\x30\x29\x2c\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x3d\x65\x2e\x6b\x65\x70\x74\x2c\x69\x28\x29\x2c\x74\x2e\x63\x61\x6c\x6c\x28\x65\x2c\x6e\x2c\x72\x29\x7d\x7d\x2c\x72\x65\x6e\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x74" -"\x68\x69\x73\x2e\x74\x61\x67\x7c\x7c\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x64\x61\x74\x61\x2e\x74\x61\x67\x7c\x7c\x22\x73\x70\x61\x6e\x22\x2c\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x74\x68\x69\x73\x2e\x70\x72\x65\x76\x43\x68\x69\x6c\x64\x72\x65\x6e\x3d\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x69\x3d\x74\x68\x69\x73" -"\x2e\x24\x73\x6c\x6f\x74\x73\x2e\x64\x65\x66\x61\x75\x6c\x74\x7c\x7c\x5b\x5d\x2c\x6f\x3d\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x5b\x5d\x2c\x61\x3d\x72\x6f\x28\x74\x68\x69\x73\x29\x2c\x73\x3d\x30\x3b\x73\x3c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x2b\x2b\x29\x7b\x76\x61\x72\x20\x63\x3d\x69\x5b\x73\x5d\x3b\x63\x2e\x74\x61\x67\x26\x26\x6e\x75\x6c\x6c\x21\x3d\x63\x2e\x6b\x65\x79\x26" -"\x26\x30\x21\x3d\x3d\x53\x74\x72\x69\x6e\x67\x28\x63\x2e\x6b\x65\x79\x29\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x5f\x5f\x76\x6c\x69\x73\x74\x22\x29\x26\x26\x28\x6f\x2e\x70\x75\x73\x68\x28\x63\x29\x2c\x6e\x5b\x63\x2e\x6b\x65\x79\x5d\x3d\x63\x2c\x28\x63\x2e\x64\x61\x74\x61\x7c\x7c\x28\x63\x2e\x64\x61\x74\x61\x3d\x7b\x7d\x29\x29\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x61\x29\x7d\x69\x66\x28" -"\x72\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x5b\x5d\x2c\x6c\x3d\x5b\x5d\x2c\x66\x3d\x30\x3b\x66\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x2b\x2b\x29\x7b\x76\x61\x72\x20\x70\x3d\x72\x5b\x66\x5d\x3b\x70\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x61\x2c\x70\x2e\x64\x61\x74\x61\x2e\x70\x6f\x73\x3d\x70\x2e\x65\x6c\x6d\x2e\x67\x65\x74\x42\x6f\x75\x6e\x64\x69\x6e\x67" -"\x43\x6c\x69\x65\x6e\x74\x52\x65\x63\x74\x28\x29\x2c\x6e\x5b\x70\x2e\x6b\x65\x79\x5d\x3f\x75\x2e\x70\x75\x73\x68\x28\x70\x29\x3a\x6c\x2e\x70\x75\x73\x68\x28\x70\x29\x7d\x74\x68\x69\x73\x2e\x6b\x65\x70\x74\x3d\x65\x28\x74\x2c\x6e\x75\x6c\x6c\x2c\x75\x29\x2c\x74\x68\x69\x73\x2e\x72\x65\x6d\x6f\x76\x65\x64\x3d\x6c\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x28\x74\x2c\x6e\x75\x6c\x6c\x2c\x6f\x29\x7d\x2c\x75" -"\x70\x64\x61\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x70\x72\x65\x76\x43\x68\x69\x6c\x64\x72\x65\x6e\x2c\x74\x3d\x74\x68\x69\x73\x2e\x6d\x6f\x76\x65\x43\x6c\x61\x73\x73\x7c\x7c\x28\x74\x68\x69\x73\x2e\x6e\x61\x6d\x65\x7c\x7c\x22\x76\x22\x29\x2b\x22\x2d\x6d\x6f\x76\x65\x22\x3b\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x74\x68\x69\x73\x2e" -"\x68\x61\x73\x4d\x6f\x76\x65\x28\x65\x5b\x30\x5d\x2e\x65\x6c\x6d\x2c\x74\x29\x26\x26\x28\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x75\x6f\x29\x2c\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x6c\x6f\x29\x2c\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x6f\x29\x2c\x74\x68\x69\x73\x2e\x5f\x72\x65\x66\x6c\x6f\x77\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x62\x6f\x64\x79\x2e\x6f\x66\x66\x73\x65\x74\x48\x65\x69" -"\x67\x68\x74\x2c\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x2e\x64\x61\x74\x61\x2e\x6d\x6f\x76\x65\x64\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x65\x6c\x6d\x2c\x72\x3d\x6e\x2e\x73\x74\x79\x6c\x65\x3b\x6a\x69\x28\x6e\x2c\x74\x29\x2c\x72\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x72\x2e\x57\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x66\x6f" -"\x72\x6d\x3d\x72\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x44\x75\x72\x61\x74\x69\x6f\x6e\x3d\x22\x22\x2c\x6e\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x4f\x69\x2c\x6e\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x72\x29\x7b\x72\x26\x26\x72\x2e\x74\x61\x72\x67\x65\x74\x21\x3d\x3d\x6e\x7c\x7c\x72\x26\x26\x21\x2f\x74\x72\x61\x6e\x73" -"\x66\x6f\x72\x6d\x24\x2f\x2e\x74\x65\x73\x74\x28\x72\x2e\x70\x72\x6f\x70\x65\x72\x74\x79\x4e\x61\x6d\x65\x29\x7c\x7c\x28\x6e\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x4f\x69\x2c\x65\x29\x2c\x6e\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x3d\x6e\x75\x6c\x6c\x2c\x44\x69\x28\x6e\x2c\x74\x29\x29\x7d\x29\x7d\x7d\x29\x29\x7d\x2c\x6d\x65\x74\x68\x6f\x64\x73\x3a\x7b\x68\x61" -"\x73\x4d\x6f\x76\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x43\x69\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x74\x68\x69\x73\x2e\x5f\x68\x61\x73\x4d\x6f\x76\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x68\x61\x73\x4d\x6f\x76\x65\x3b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x63\x6c\x6f\x6e\x65\x4e\x6f\x64\x65\x28\x29\x3b\x65\x2e\x5f\x74\x72\x61" -"\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x26\x26\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x62\x69\x28\x6e\x2c\x65\x29\x7d\x29\x2c\x5f\x69\x28\x6e\x2c\x74\x29\x2c\x6e\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x22\x6e\x6f\x6e\x65\x22\x2c\x74\x68" -"\x69\x73\x2e\x24\x65\x6c\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x6e\x29\x3b\x76\x61\x72\x20\x72\x3d\x4d\x69\x28\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x24\x65\x6c\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x6e\x29\x2c\x74\x68\x69\x73\x2e\x5f\x68\x61\x73\x4d\x6f\x76\x65\x3d\x72\x2e\x68\x61\x73\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x7d\x7d\x7d\x7d\x3b\x43\x6e" -"\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x3d\x44\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3d\x5a\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x41\x74\x74\x72\x3d\x45\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70" -"\x61\x63\x65\x3d\x47\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x69\x73\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x21\x56\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x69\x66\x28\x5a\x6e\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x65\x3d\x65\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c" -"\x6e\x75\x6c\x6c\x21\x3d\x58\x6e\x5b\x65\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x58\x6e\x5b\x65\x5d\x3b\x76\x61\x72\x20\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x2d\x22\x29\x3e\x2d\x31\x3f\x58\x6e\x5b\x65\x5d\x3d\x74\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f" -"\x72\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x48\x54\x4d\x4c\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x7c\x7c\x74\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x48\x54\x4d\x4c\x45\x6c\x65\x6d\x65\x6e\x74\x3a\x58\x6e\x5b\x65\x5d\x3d\x2f\x48\x54\x4d\x4c\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x2f\x2e\x74\x65\x73\x74\x28\x74\x2e" -"\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x29\x7d\x2c\x41\x28\x43\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2c\x65\x6f\x29\x2c\x41\x28\x43\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x2c\x70\x6f\x29\x2c\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x3d\x56\x3f\x7a\x69\x3a\x53\x2c\x43" -"\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6d\x6f\x75\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x24\x65\x6c\x3d\x74\x2c\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x72\x65\x6e\x64\x65\x72\x7c\x7c\x28\x65\x2e\x24" -"\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x72\x65\x6e\x64\x65\x72\x3d\x76\x65\x29\x2c\x51\x74\x28\x65\x2c\x22\x62\x65\x66\x6f\x72\x65\x4d\x6f\x75\x6e\x74\x22\x29\x2c\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x5f\x75\x70\x64\x61\x74\x65\x28\x65\x2e\x5f\x72\x65\x6e\x64\x65\x72\x28\x29\x2c\x6e\x29\x7d\x2c\x6e\x65\x77\x20\x70\x6e\x28\x65\x2c\x72\x2c\x53\x2c\x7b\x62\x65\x66\x6f\x72\x65\x3a\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x26\x26\x21\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x26\x26\x51\x74\x28\x65\x2c\x22\x62\x65\x66\x6f\x72\x65\x55\x70\x64\x61\x74\x65\x22\x29\x7d\x7d\x2c\x21\x30\x29\x2c\x6e\x3d\x21\x31\x2c\x6e\x75\x6c\x6c\x3d\x3d\x65\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x28\x65\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74" -"\x65\x64\x3d\x21\x30\x2c\x51\x74\x28\x65\x2c\x22\x6d\x6f\x75\x6e\x74\x65\x64\x22\x29\x29\x2c\x65\x7d\x28\x74\x68\x69\x73\x2c\x65\x3d\x65\x26\x26\x56\x3f\x51\x6e\x28\x65\x29\x3a\x76\x6f\x69\x64\x20\x30\x2c\x74\x29\x7d\x2c\x56\x26\x26\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x46\x2e\x64\x65\x76\x74\x6f\x6f\x6c\x73\x26\x26\x6e\x65\x26\x26\x6e\x65\x2e\x65" -"\x6d\x69\x74\x28\x22\x69\x6e\x69\x74\x22\x2c\x43\x6e\x29\x7d\x2c\x30\x29\x3b\x76\x61\x72\x20\x76\x6f\x3d\x2f\x5c\x7b\x5c\x7b\x28\x28\x3f\x3a\x2e\x7c\x5c\x72\x3f\x5c\x6e\x29\x2b\x3f\x29\x5c\x7d\x5c\x7d\x2f\x67\x2c\x68\x6f\x3d\x2f\x5b\x2d\x2e\x2a\x2b\x3f\x5e\x24\x7b\x7d\x28\x29\x7c\x5b\x5c\x5d\x5c\x2f\x5c\x5c\x5d\x2f\x67\x2c\x6d\x6f\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61" -"\x72\x20\x74\x3d\x65\x5b\x30\x5d\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x68\x6f\x2c\x22\x5c\x5c\x24\x26\x22\x29\x2c\x6e\x3d\x65\x5b\x31\x5d\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x68\x6f\x2c\x22\x5c\x5c\x24\x26\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x74\x2b\x22\x28\x28\x3f\x3a\x2e\x7c\x5c\x5c\x6e\x29\x2b\x3f\x29\x22\x2b\x6e\x2c\x22\x67\x22\x29\x7d\x29\x3b\x76" -"\x61\x72\x20\x79\x6f\x3d\x7b\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x3a\x5b\x22\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x22\x5d\x2c\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x77\x61\x72\x6e\x3b\x76\x61\x72\x20\x6e\x3d\x50\x72\x28\x65\x2c\x22\x63\x6c\x61\x73\x73\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x73\x74\x61\x74\x69" -"\x63\x43\x6c\x61\x73\x73\x3d\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6e\x29\x29\x3b\x76\x61\x72\x20\x72\x3d\x46\x72\x28\x65\x2c\x22\x63\x6c\x61\x73\x73\x22\x2c\x21\x31\x29\x3b\x72\x26\x26\x28\x65\x2e\x63\x6c\x61\x73\x73\x42\x69\x6e\x64\x69\x6e\x67\x3d\x72\x29\x7d\x2c\x67\x65\x6e\x44\x61\x74\x61\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x22" -"\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x26\x26\x28\x74\x2b\x3d\x22\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x3a\x22\x2b\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x63\x6c\x61\x73\x73\x42\x69\x6e\x64\x69\x6e\x67\x26\x26\x28\x74\x2b\x3d\x22\x63\x6c\x61\x73\x73\x3a\x22\x2b\x65\x2e\x63\x6c\x61\x73\x73\x42\x69\x6e" -"\x64\x69\x6e\x67\x2b\x22\x2c\x22\x29\x2c\x74\x7d\x7d\x3b\x76\x61\x72\x20\x67\x6f\x2c\x5f\x6f\x3d\x7b\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x3a\x5b\x22\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x22\x5d\x2c\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x77\x61\x72\x6e\x3b\x76\x61\x72\x20\x6e\x3d\x50\x72\x28\x65\x2c\x22\x73" -"\x74\x79\x6c\x65\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x3d\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x73\x69\x28\x6e\x29\x29\x29\x3b\x76\x61\x72\x20\x72\x3d\x46\x72\x28\x65\x2c\x22\x73\x74\x79\x6c\x65\x22\x2c\x21\x31\x29\x3b\x72\x26\x26\x28\x65\x2e\x73\x74\x79\x6c\x65\x42\x69\x6e\x64\x69\x6e\x67\x3d\x72\x29\x7d\x2c\x67\x65\x6e\x44\x61\x74" -"\x61\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x26\x26\x28\x74\x2b\x3d\x22\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x3a\x22\x2b\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x73\x74\x79\x6c\x65\x42\x69\x6e\x64\x69\x6e\x67\x26\x26\x28" -"\x74\x2b\x3d\x22\x73\x74\x79\x6c\x65\x3a\x28\x22\x2b\x65\x2e\x73\x74\x79\x6c\x65\x42\x69\x6e\x64\x69\x6e\x67\x2b\x22\x29\x2c\x22\x29\x2c\x74\x7d\x7d\x2c\x62\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x67\x6f\x3d\x67\x6f\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x29\x2e\x69\x6e" -"\x6e\x65\x72\x48\x54\x4d\x4c\x3d\x65\x2c\x67\x6f\x2e\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x7d\x2c\x24\x6f\x3d\x70\x28\x22\x61\x72\x65\x61\x2c\x62\x61\x73\x65\x2c\x62\x72\x2c\x63\x6f\x6c\x2c\x65\x6d\x62\x65\x64\x2c\x66\x72\x61\x6d\x65\x2c\x68\x72\x2c\x69\x6d\x67\x2c\x69\x6e\x70\x75\x74\x2c\x69\x73\x69\x6e\x64\x65\x78\x2c\x6b\x65\x79\x67\x65\x6e\x2c\x6c\x69\x6e\x6b\x2c\x6d\x65\x74\x61\x2c\x70" -"\x61\x72\x61\x6d\x2c\x73\x6f\x75\x72\x63\x65\x2c\x74\x72\x61\x63\x6b\x2c\x77\x62\x72\x22\x29\x2c\x77\x6f\x3d\x70\x28\x22\x63\x6f\x6c\x67\x72\x6f\x75\x70\x2c\x64\x64\x2c\x64\x74\x2c\x6c\x69\x2c\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x70\x2c\x74\x64\x2c\x74\x66\x6f\x6f\x74\x2c\x74\x68\x2c\x74\x68\x65\x61\x64\x2c\x74\x72\x2c\x73\x6f\x75\x72\x63\x65\x22\x29\x2c\x43\x6f\x3d\x70\x28\x22\x61\x64\x64\x72\x65\x73" -"\x73\x2c\x61\x72\x74\x69\x63\x6c\x65\x2c\x61\x73\x69\x64\x65\x2c\x62\x61\x73\x65\x2c\x62\x6c\x6f\x63\x6b\x71\x75\x6f\x74\x65\x2c\x62\x6f\x64\x79\x2c\x63\x61\x70\x74\x69\x6f\x6e\x2c\x63\x6f\x6c\x2c\x63\x6f\x6c\x67\x72\x6f\x75\x70\x2c\x64\x64\x2c\x64\x65\x74\x61\x69\x6c\x73\x2c\x64\x69\x61\x6c\x6f\x67\x2c\x64\x69\x76\x2c\x64\x6c\x2c\x64\x74\x2c\x66\x69\x65\x6c\x64\x73\x65\x74\x2c\x66\x69\x67\x63\x61" -"\x70\x74\x69\x6f\x6e\x2c\x66\x69\x67\x75\x72\x65\x2c\x66\x6f\x6f\x74\x65\x72\x2c\x66\x6f\x72\x6d\x2c\x68\x31\x2c\x68\x32\x2c\x68\x33\x2c\x68\x34\x2c\x68\x35\x2c\x68\x36\x2c\x68\x65\x61\x64\x2c\x68\x65\x61\x64\x65\x72\x2c\x68\x67\x72\x6f\x75\x70\x2c\x68\x72\x2c\x68\x74\x6d\x6c\x2c\x6c\x65\x67\x65\x6e\x64\x2c\x6c\x69\x2c\x6d\x65\x6e\x75\x69\x74\x65\x6d\x2c\x6d\x65\x74\x61\x2c\x6f\x70\x74\x67\x72\x6f" -"\x75\x70\x2c\x6f\x70\x74\x69\x6f\x6e\x2c\x70\x61\x72\x61\x6d\x2c\x72\x70\x2c\x72\x74\x2c\x73\x6f\x75\x72\x63\x65\x2c\x73\x74\x79\x6c\x65\x2c\x73\x75\x6d\x6d\x61\x72\x79\x2c\x74\x62\x6f\x64\x79\x2c\x74\x64\x2c\x74\x66\x6f\x6f\x74\x2c\x74\x68\x2c\x74\x68\x65\x61\x64\x2c\x74\x69\x74\x6c\x65\x2c\x74\x72\x2c\x74\x72\x61\x63\x6b\x22\x29\x2c\x78\x6f\x3d\x2f\x5e\x5c\x73\x2a\x28\x5b\x5e\x5c\x73\x22\x27\x3c" -"\x3e\x5c\x2f\x3d\x5d\x2b\x29\x28\x3f\x3a\x5c\x73\x2a\x28\x3d\x29\x5c\x73\x2a\x28\x3f\x3a\x22\x28\x5b\x5e\x22\x5d\x2a\x29\x22\x2b\x7c\x27\x28\x5b\x5e\x27\x5d\x2a\x29\x27\x2b\x7c\x28\x5b\x5e\x5c\x73\x22\x27\x3d\x3c\x3e\x60\x5d\x2b\x29\x29\x29\x3f\x2f\x2c\x6b\x6f\x3d\x2f\x5e\x5c\x73\x2a\x28\x28\x3f\x3a\x76\x2d\x5b\x5c\x77\x2d\x5d\x2b\x3a\x7c\x40\x7c\x3a\x7c\x23\x29\x5c\x5b\x5b\x5e\x3d\x5d\x2b\x3f\x5c" -"\x5d\x5b\x5e\x5c\x73\x22\x27\x3c\x3e\x5c\x2f\x3d\x5d\x2a\x29\x28\x3f\x3a\x5c\x73\x2a\x28\x3d\x29\x5c\x73\x2a\x28\x3f\x3a\x22\x28\x5b\x5e\x22\x5d\x2a\x29\x22\x2b\x7c\x27\x28\x5b\x5e\x27\x5d\x2a\x29\x27\x2b\x7c\x28\x5b\x5e\x5c\x73\x22\x27\x3d\x3c\x3e\x60\x5d\x2b\x29\x29\x29\x3f\x2f\x2c\x41\x6f\x3d\x22\x5b\x61\x2d\x7a\x41\x2d\x5a\x5f\x5d\x5b\x5c\x5c\x2d\x5c\x5c\x2e\x30\x2d\x39\x5f\x61\x2d\x7a\x41\x2d" -"\x5a\x22\x2b\x50\x2e\x73\x6f\x75\x72\x63\x65\x2b\x22\x5d\x2a\x22\x2c\x4f\x6f\x3d\x22\x28\x28\x3f\x3a\x22\x2b\x41\x6f\x2b\x22\x5c\x5c\x3a\x29\x3f\x22\x2b\x41\x6f\x2b\x22\x29\x22\x2c\x53\x6f\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5e\x3c\x22\x2b\x4f\x6f\x29\x2c\x54\x6f\x3d\x2f\x5e\x5c\x73\x2a\x28\x5c\x2f\x3f\x29\x3e\x2f\x2c\x4e\x6f\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5e" -"\x3c\x5c\x5c\x2f\x22\x2b\x4f\x6f\x2b\x22\x5b\x5e\x3e\x5d\x2a\x3e\x22\x29\x2c\x45\x6f\x3d\x2f\x5e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x5b\x5e\x3e\x5d\x2b\x3e\x2f\x69\x2c\x6a\x6f\x3d\x2f\x5e\x3c\x21\x5c\x2d\x2d\x2f\x2c\x44\x6f\x3d\x2f\x5e\x3c\x21\x5c\x5b\x2f\x2c\x4c\x6f\x3d\x70\x28\x22\x73\x63\x72\x69\x70\x74\x2c\x73\x74\x79\x6c\x65\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x22\x2c\x21\x30\x29\x2c\x49" -"\x6f\x3d\x7b\x7d\x2c\x4d\x6f\x3d\x7b\x22\x26\x6c\x74\x3b\x22\x3a\x22\x3c\x22\x2c\x22\x26\x67\x74\x3b\x22\x3a\x22\x3e\x22\x2c\x22\x26\x71\x75\x6f\x74\x3b\x22\x3a\x27\x22\x27\x2c\x22\x26\x61\x6d\x70\x3b\x22\x3a\x22\x26\x22\x2c\x22\x26\x23\x31\x30\x3b\x22\x3a\x22\x5c\x6e\x22\x2c\x22\x26\x23\x39\x3b\x22\x3a\x22\x5c\x74\x22\x2c\x22\x26\x23\x33\x39\x3b\x22\x3a\x22\x27\x22\x7d\x2c\x46\x6f\x3d\x2f\x26\x28" -"\x3f\x3a\x6c\x74\x7c\x67\x74\x7c\x71\x75\x6f\x74\x7c\x61\x6d\x70\x7c\x23\x33\x39\x29\x3b\x2f\x67\x2c\x50\x6f\x3d\x2f\x26\x28\x3f\x3a\x6c\x74\x7c\x67\x74\x7c\x71\x75\x6f\x74\x7c\x61\x6d\x70\x7c\x23\x33\x39\x7c\x23\x31\x30\x7c\x23\x39\x29\x3b\x2f\x67\x2c\x52\x6f\x3d\x70\x28\x22\x70\x72\x65\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x22\x2c\x21\x30\x29\x2c\x48\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" -"\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x26\x26\x52\x6f\x28\x65\x29\x26\x26\x22\x5c\x6e\x22\x3d\x3d\x3d\x74\x5b\x30\x5d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x6f\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x50\x6f\x3a\x46\x6f\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75" -"\x72\x6e\x20\x4d\x6f\x5b\x65\x5d\x7d\x29\x7d\x76\x61\x72\x20\x55\x6f\x2c\x56\x6f\x2c\x7a\x6f\x2c\x4b\x6f\x2c\x4a\x6f\x2c\x71\x6f\x2c\x57\x6f\x2c\x5a\x6f\x2c\x47\x6f\x3d\x2f\x5e\x40\x7c\x5e\x76\x2d\x6f\x6e\x3a\x2f\x2c\x58\x6f\x3d\x2f\x5e\x76\x2d\x7c\x5e\x40\x7c\x5e\x3a\x7c\x5e\x23\x2f\x2c\x59\x6f\x3d\x2f\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x3f\x29\x5c\x73\x2b\x28\x3f\x3a\x69\x6e\x7c\x6f\x66\x29\x5c\x73" -"\x2b\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x29\x2f\x2c\x51\x6f\x3d\x2f\x2c\x28\x5b\x5e\x2c\x5c\x7d\x5c\x5d\x5d\x2a\x29\x28\x3f\x3a\x2c\x28\x5b\x5e\x2c\x5c\x7d\x5c\x5d\x5d\x2a\x29\x29\x3f\x24\x2f\x2c\x65\x61\x3d\x2f\x5e\x5c\x28\x7c\x5c\x29\x24\x2f\x67\x2c\x74\x61\x3d\x2f\x5e\x5c\x5b\x2e\x2a\x5c\x5d\x24\x2f\x2c\x6e\x61\x3d\x2f\x3a\x28\x2e\x2a\x29\x24\x2f\x2c\x72\x61\x3d\x2f\x5e\x3a\x7c\x5e\x5c\x2e\x7c\x5e" -"\x76\x2d\x62\x69\x6e\x64\x3a\x2f\x2c\x69\x61\x3d\x2f\x5c\x2e\x5b\x5e\x2e\x5c\x5d\x5d\x2b\x28\x3f\x3d\x5b\x5e\x5c\x5d\x5d\x2a\x24\x29\x2f\x67\x2c\x6f\x61\x3d\x2f\x5e\x76\x2d\x73\x6c\x6f\x74\x28\x3a\x7c\x24\x29\x7c\x5e\x23\x2f\x2c\x61\x61\x3d\x2f\x5b\x5c\x72\x5c\x6e\x5d\x2f\x2c\x73\x61\x3d\x2f\x5b\x20\x5c\x66\x5c\x74\x5c\x72\x5c\x6e\x5d\x2b\x2f\x67\x2c\x63\x61\x3d\x67\x28\x62\x6f\x29\x2c\x75\x61\x3d" -"\x22\x5f\x65\x6d\x70\x74\x79\x5f\x22\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x61\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x74\x79\x70\x65\x3a\x31\x2c\x74\x61\x67\x3a\x65\x2c\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x3a\x74\x2c\x61\x74\x74\x72\x73\x4d\x61\x70\x3a\x79\x61\x28\x74\x29\x2c\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x3a\x7b\x7d\x2c\x70\x61\x72\x65\x6e\x74\x3a\x6e\x2c" -"\x63\x68\x69\x6c\x64\x72\x65\x6e\x3a\x5b\x5d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x61\x28\x65\x2c\x74\x29\x7b\x55\x6f\x3d\x74\x2e\x77\x61\x72\x6e\x7c\x7c\x54\x72\x2c\x71\x6f\x3d\x74\x2e\x69\x73\x50\x72\x65\x54\x61\x67\x7c\x7c\x54\x2c\x57\x6f\x3d\x74\x2e\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x7c\x7c\x54\x2c\x5a\x6f\x3d\x74\x2e\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63" -"\x65\x7c\x7c\x54\x3b\x74\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3b\x7a\x6f\x3d\x4e\x72\x28\x74\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x22\x29\x2c\x4b\x6f\x3d\x4e\x72\x28\x74\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x70\x72\x65\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x22\x29\x2c\x4a\x6f\x3d\x4e\x72\x28\x74\x2e\x6d\x6f" -"\x64\x75\x6c\x65\x73\x2c\x22\x70\x6f\x73\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x22\x29\x2c\x56\x6f\x3d\x74\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x3b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x5b\x5d\x2c\x6f\x3d\x21\x31\x21\x3d\x3d\x74\x2e\x70\x72\x65\x73\x65\x72\x76\x65\x57\x68\x69\x74\x65\x73\x70\x61\x63\x65\x2c\x61\x3d\x74\x2e\x77\x68\x69\x74\x65\x73\x70\x61\x63\x65\x2c\x73" -"\x3d\x21\x31\x2c\x63\x3d\x21\x31\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x28\x65\x29\x7b\x69\x66\x28\x6c\x28\x65\x29\x2c\x73\x7c\x7c\x65\x2e\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x7c\x7c\x28\x65\x3d\x70\x61\x28\x65\x2c\x74\x29\x29\x2c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x65\x3d\x3d\x3d\x6e\x7c\x7c\x6e\x2e\x69\x66\x26\x26\x28\x65\x2e\x65\x6c\x73\x65\x69\x66\x7c\x7c\x65\x2e\x65\x6c\x73\x65\x29" -"\x26\x26\x76\x61\x28\x6e\x2c\x7b\x65\x78\x70\x3a\x65\x2e\x65\x6c\x73\x65\x69\x66\x2c\x62\x6c\x6f\x63\x6b\x3a\x65\x7d\x29\x2c\x72\x26\x26\x21\x65\x2e\x66\x6f\x72\x62\x69\x64\x64\x65\x6e\x29\x69\x66\x28\x65\x2e\x65\x6c\x73\x65\x69\x66\x7c\x7c\x65\x2e\x65\x6c\x73\x65\x29\x61\x3d\x65\x2c\x28\x75\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68" -"\x3b\x66\x6f\x72\x28\x3b\x74\x2d\x2d\x3b\x29\x7b\x69\x66\x28\x31\x3d\x3d\x3d\x65\x5b\x74\x5d\x2e\x74\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x3b\x65\x2e\x70\x6f\x70\x28\x29\x7d\x7d\x28\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x26\x26\x75\x2e\x69\x66\x26\x26\x76\x61\x28\x75\x2c\x7b\x65\x78\x70\x3a\x61\x2e\x65\x6c\x73\x65\x69\x66\x2c\x62\x6c\x6f\x63\x6b\x3a\x61\x7d\x29\x3b" -"\x65\x6c\x73\x65\x7b\x69\x66\x28\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x3b\x28\x72\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x7c\x7c\x28\x72\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x7b\x7d\x29\x29\x5b\x6f\x5d\x3d\x65\x7d\x72\x2e\x63\x68\x69\x6c" -"\x64\x72\x65\x6e\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x72\x7d\x76\x61\x72\x20\x61\x2c\x75\x3b\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x7d\x29\x2c\x6c\x28\x65\x29\x2c\x65" -"\x2e\x70\x72\x65\x26\x26\x28\x73\x3d\x21\x31\x29\x2c\x71\x6f\x28\x65\x2e\x74\x61\x67\x29\x26\x26\x28\x63\x3d\x21\x31\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x66\x3d\x30\x3b\x66\x3c\x4a\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x2b\x2b\x29\x4a\x6f\x5b\x66\x5d\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x28\x65\x29\x7b\x69\x66\x28\x21\x63\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3b" -"\x28\x74\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x29\x26\x26\x33\x3d\x3d\x3d\x74\x2e\x74\x79\x70\x65\x26\x26\x22\x20\x22\x3d\x3d\x3d\x74\x2e\x74\x65\x78\x74\x3b\x29\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x6f\x70\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29" -"\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x5b\x5d\x2c\x6f\x3d\x74\x2e\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x2c\x61\x3d\x74\x2e\x69\x73\x55\x6e\x61\x72\x79\x54\x61\x67\x7c\x7c\x54\x2c\x73\x3d\x74\x2e\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x7c\x7c\x54\x2c\x63\x3d\x30\x3b\x65\x3b\x29\x7b\x69\x66\x28\x6e\x3d\x65\x2c\x72\x26\x26\x4c\x6f\x28\x72\x29\x29\x7b" -"\x76\x61\x72\x20\x75\x3d\x30\x2c\x6c\x3d\x72\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x66\x3d\x49\x6f\x5b\x6c\x5d\x7c\x7c\x28\x49\x6f\x5b\x6c\x5d\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x28\x5b\x5c\x5c\x73\x5c\x5c\x53\x5d\x2a\x3f\x29\x28\x3c\x2f\x22\x2b\x6c\x2b\x22\x5b\x5e\x3e\x5d\x2a\x3e\x29\x22\x2c\x22\x69\x22\x29\x29\x2c\x70\x3d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65" -"\x28\x66\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x75\x3d\x72\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x4c\x6f\x28\x6c\x29\x7c\x7c\x22\x6e\x6f\x73\x63\x72\x69\x70\x74\x22\x3d\x3d\x3d\x6c\x7c\x7c\x28\x6e\x3d\x6e\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x3c\x21\x5c\x2d\x2d\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x3f\x29\x2d\x2d\x3e\x2f\x67\x2c\x22\x24\x31\x22\x29" -"\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x3c\x21\x5c\x5b\x43\x44\x41\x54\x41\x5c\x5b\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x3f\x29\x5d\x5d\x3e\x2f\x67\x2c\x22\x24\x31\x22\x29\x29\x2c\x48\x6f\x28\x6c\x2c\x6e\x29\x26\x26\x28\x6e\x3d\x6e\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x29\x2c\x74\x2e\x63\x68\x61\x72\x73\x26\x26\x74\x2e\x63\x68\x61\x72\x73\x28\x6e\x29\x2c\x22\x22\x7d\x29\x3b\x63\x2b\x3d\x65\x2e\x6c\x65" -"\x6e\x67\x74\x68\x2d\x70\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x65\x3d\x70\x2c\x41\x28\x6c\x2c\x63\x2d\x75\x2c\x63\x29\x7d\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x64\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x3c\x22\x29\x3b\x69\x66\x28\x30\x3d\x3d\x3d\x64\x29\x7b\x69\x66\x28\x6a\x6f\x2e\x74\x65\x73\x74\x28\x65\x29\x29\x7b\x76\x61\x72\x20\x76\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x2d\x2d\x5c" -"\x78\x33\x65\x22\x29\x3b\x69\x66\x28\x76\x3e\x3d\x30\x29\x7b\x74\x2e\x73\x68\x6f\x75\x6c\x64\x4b\x65\x65\x70\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x74\x2e\x63\x6f\x6d\x6d\x65\x6e\x74\x28\x65\x2e\x73\x75\x62\x73\x74\x72\x69\x6e\x67\x28\x34\x2c\x76\x29\x2c\x63\x2c\x63\x2b\x76\x2b\x33\x29\x2c\x43\x28\x76\x2b\x33\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x7d\x69\x66\x28\x44\x6f\x2e\x74\x65\x73\x74\x28" -"\x65\x29\x29\x7b\x76\x61\x72\x20\x68\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x5d\x3e\x22\x29\x3b\x69\x66\x28\x68\x3e\x3d\x30\x29\x7b\x43\x28\x68\x2b\x32\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x7d\x76\x61\x72\x20\x6d\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x45\x6f\x29\x3b\x69\x66\x28\x6d\x29\x7b\x43\x28\x6d\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d" -"\x76\x61\x72\x20\x79\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x4e\x6f\x29\x3b\x69\x66\x28\x79\x29\x7b\x76\x61\x72\x20\x67\x3d\x63\x3b\x43\x28\x79\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x41\x28\x79\x5b\x31\x5d\x2c\x67\x2c\x63\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x76\x61\x72\x20\x5f\x3d\x78\x28\x29\x3b\x69\x66\x28\x5f\x29\x7b\x6b\x28\x5f\x29\x2c\x48\x6f\x28\x5f\x2e\x74\x61\x67\x4e\x61\x6d" -"\x65\x2c\x65\x29\x26\x26\x43\x28\x31\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x7d\x76\x61\x72\x20\x62\x3d\x76\x6f\x69\x64\x20\x30\x2c\x24\x3d\x76\x6f\x69\x64\x20\x30\x2c\x77\x3d\x76\x6f\x69\x64\x20\x30\x3b\x69\x66\x28\x64\x3e\x3d\x30\x29\x7b\x66\x6f\x72\x28\x24\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x64\x29\x3b\x21\x28\x4e\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x53\x6f\x2e\x74\x65\x73\x74\x28" -"\x24\x29\x7c\x7c\x6a\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x44\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x28\x77\x3d\x24\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x3c\x22\x2c\x31\x29\x29\x3c\x30\x29\x3b\x29\x64\x2b\x3d\x77\x2c\x24\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x64\x29\x3b\x62\x3d\x65\x2e\x73\x75\x62\x73\x74\x72\x69\x6e\x67\x28\x30\x2c\x64\x29\x7d\x64\x3c\x30\x26\x26\x28\x62\x3d\x65\x29" -"\x2c\x62\x26\x26\x43\x28\x62\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x74\x2e\x63\x68\x61\x72\x73\x26\x26\x62\x26\x26\x74\x2e\x63\x68\x61\x72\x73\x28\x62\x2c\x63\x2d\x62\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x63\x29\x7d\x69\x66\x28\x65\x3d\x3d\x3d\x6e\x29\x7b\x74\x2e\x63\x68\x61\x72\x73\x26\x26\x74\x2e\x63\x68\x61\x72\x73\x28\x65\x29\x3b\x62\x72\x65\x61\x6b\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x28" -"\x74\x29\x7b\x63\x2b\x3d\x74\x2c\x65\x3d\x65\x2e\x73\x75\x62\x73\x74\x72\x69\x6e\x67\x28\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x53\x6f\x29\x3b\x69\x66\x28\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x7b\x74\x61\x67\x4e\x61\x6d\x65\x3a\x74\x5b\x31\x5d\x2c\x61\x74\x74\x72\x73\x3a\x5b\x5d\x2c\x73\x74\x61\x72\x74" -"\x3a\x63\x7d\x3b\x66\x6f\x72\x28\x43\x28\x74\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3b\x21\x28\x6e\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x54\x6f\x29\x29\x26\x26\x28\x72\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x6b\x6f\x29\x7c\x7c\x65\x2e\x6d\x61\x74\x63\x68\x28\x78\x6f\x29\x29\x3b\x29\x72\x2e\x73\x74\x61\x72\x74\x3d\x63\x2c\x43\x28\x72\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x72\x2e\x65\x6e" -"\x64\x3d\x63\x2c\x69\x2e\x61\x74\x74\x72\x73\x2e\x70\x75\x73\x68\x28\x72\x29\x3b\x69\x66\x28\x6e\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x2e\x75\x6e\x61\x72\x79\x53\x6c\x61\x73\x68\x3d\x6e\x5b\x31\x5d\x2c\x43\x28\x6e\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x69\x2e\x65\x6e\x64\x3d\x63\x2c\x69\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x28\x65\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x74\x61" -"\x67\x4e\x61\x6d\x65\x2c\x63\x3d\x65\x2e\x75\x6e\x61\x72\x79\x53\x6c\x61\x73\x68\x3b\x6f\x26\x26\x28\x22\x70\x22\x3d\x3d\x3d\x72\x26\x26\x43\x6f\x28\x6e\x29\x26\x26\x41\x28\x72\x29\x2c\x73\x28\x6e\x29\x26\x26\x72\x3d\x3d\x3d\x6e\x26\x26\x41\x28\x6e\x29\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x61\x28\x6e\x29\x7c\x7c\x21\x21\x63\x2c\x6c\x3d\x65\x2e\x61\x74\x74\x72\x73\x2e\x6c\x65\x6e\x67\x74" -"\x68\x2c\x66\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x6c\x29\x2c\x70\x3d\x30\x3b\x70\x3c\x6c\x3b\x70\x2b\x2b\x29\x7b\x76\x61\x72\x20\x64\x3d\x65\x2e\x61\x74\x74\x72\x73\x5b\x70\x5d\x2c\x76\x3d\x64\x5b\x33\x5d\x7c\x7c\x64\x5b\x34\x5d\x7c\x7c\x64\x5b\x35\x5d\x7c\x7c\x22\x22\x2c\x68\x3d\x22\x61\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x68\x72\x65\x66\x22\x3d\x3d\x3d\x64\x5b\x31\x5d\x3f\x74\x2e\x73\x68\x6f" -"\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x3a\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x3b\x66\x5b\x70\x5d\x3d\x7b\x6e\x61\x6d\x65\x3a\x64\x5b\x31\x5d\x2c\x76\x61\x6c\x75\x65\x3a\x42\x6f\x28\x76\x2c\x68\x29\x7d\x7d\x75\x7c\x7c\x28\x69\x2e\x70\x75\x73\x68\x28\x7b\x74\x61\x67\x3a\x6e\x2c\x6c\x6f\x77" -"\x65\x72\x43\x61\x73\x65\x64\x54\x61\x67\x3a\x6e\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x61\x74\x74\x72\x73\x3a\x66\x2c\x73\x74\x61\x72\x74\x3a\x65\x2e\x73\x74\x61\x72\x74\x2c\x65\x6e\x64\x3a\x65\x2e\x65\x6e\x64\x7d\x29\x2c\x72\x3d\x6e\x29\x2c\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x74\x2e\x73\x74\x61\x72\x74\x28\x6e\x2c\x66\x2c\x75\x2c\x65\x2e\x73\x74\x61\x72\x74\x2c\x65\x2e\x65" -"\x6e\x64\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x28\x65\x2c\x6e\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x2c\x73\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x3d\x3d\x6e\x26\x26\x28\x6e\x3d\x63\x29\x2c\x6e\x75\x6c\x6c\x3d\x3d\x6f\x26\x26\x28\x6f\x3d\x63\x29\x2c\x65\x29\x66\x6f\x72\x28\x73\x3d\x65\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x61\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x3b" -"\x61\x3e\x3d\x30\x26\x26\x69\x5b\x61\x5d\x2e\x6c\x6f\x77\x65\x72\x43\x61\x73\x65\x64\x54\x61\x67\x21\x3d\x3d\x73\x3b\x61\x2d\x2d\x29\x3b\x65\x6c\x73\x65\x20\x61\x3d\x30\x3b\x69\x66\x28\x61\x3e\x3d\x30\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x3b\x75\x3e\x3d\x61\x3b\x75\x2d\x2d\x29\x74\x2e\x65\x6e\x64\x26\x26\x74\x2e\x65\x6e\x64\x28\x69\x5b\x75\x5d\x2e" -"\x74\x61\x67\x2c\x6e\x2c\x6f\x29\x3b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x61\x2c\x72\x3d\x61\x26\x26\x69\x5b\x61\x2d\x31\x5d\x2e\x74\x61\x67\x7d\x65\x6c\x73\x65\x22\x62\x72\x22\x3d\x3d\x3d\x73\x3f\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x74\x2e\x73\x74\x61\x72\x74\x28\x65\x2c\x5b\x5d\x2c\x21\x30\x2c\x6e\x2c\x6f\x29\x3a\x22\x70\x22\x3d\x3d\x3d\x73\x26\x26\x28\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x74\x2e" -"\x73\x74\x61\x72\x74\x28\x65\x2c\x5b\x5d\x2c\x21\x31\x2c\x6e\x2c\x6f\x29\x2c\x74\x2e\x65\x6e\x64\x26\x26\x74\x2e\x65\x6e\x64\x28\x65\x2c\x6e\x2c\x6f\x29\x29\x7d\x41\x28\x29\x7d\x28\x65\x2c\x7b\x77\x61\x72\x6e\x3a\x55\x6f\x2c\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x3a\x74\x2e\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x2c\x69\x73\x55\x6e\x61\x72\x79\x54\x61\x67\x3a\x74\x2e\x69\x73\x55\x6e\x61\x72\x79" -"\x54\x61\x67\x2c\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x3a\x74\x2e\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x3a\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c" -"\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x3a\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x2c\x73\x68\x6f\x75\x6c\x64\x4b\x65\x65\x70\x43\x6f\x6d\x6d\x65\x6e\x74\x3a\x74\x2e\x63\x6f\x6d\x6d\x65\x6e\x74\x73\x2c\x6f\x75\x74\x70\x75\x74\x53\x6f\x75\x72\x63\x65\x52\x61\x6e\x67\x65\x3a\x74\x2e\x6f\x75\x74\x70\x75\x74\x53\x6f\x75" -"\x72\x63\x65\x52\x61\x6e\x67\x65\x2c\x73\x74\x61\x72\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6f\x2c\x61\x2c\x6c\x2c\x66\x29\x7b\x76\x61\x72\x20\x70\x3d\x72\x26\x26\x72\x2e\x6e\x73\x7c\x7c\x5a\x6f\x28\x65\x29\x3b\x71\x26\x26\x22\x73\x76\x67\x22\x3d\x3d\x3d\x70\x26\x26\x28\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x5b\x5d\x2c\x6e\x3d" -"\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x5b\x6e\x5d\x3b\x67\x61\x2e\x74\x65\x73\x74\x28\x72\x2e\x6e\x61\x6d\x65\x29\x7c\x7c\x28\x72\x2e\x6e\x61\x6d\x65\x3d\x72\x2e\x6e\x61\x6d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x5f\x61\x2c\x22\x22\x29\x2c\x74\x2e\x70\x75\x73\x68\x28\x72\x29\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x6f\x29\x29" -"\x3b\x76\x61\x72\x20\x64\x2c\x76\x3d\x6c\x61\x28\x65\x2c\x6f\x2c\x72\x29\x3b\x70\x26\x26\x28\x76\x2e\x6e\x73\x3d\x70\x29\x2c\x22\x73\x74\x79\x6c\x65\x22\x21\x3d\x3d\x28\x64\x3d\x76\x29\x2e\x74\x61\x67\x26\x26\x28\x22\x73\x63\x72\x69\x70\x74\x22\x21\x3d\x3d\x64\x2e\x74\x61\x67\x7c\x7c\x64\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x26\x26\x22\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63" -"\x72\x69\x70\x74\x22\x21\x3d\x3d\x64\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x29\x7c\x7c\x74\x65\x28\x29\x7c\x7c\x28\x76\x2e\x66\x6f\x72\x62\x69\x64\x64\x65\x6e\x3d\x21\x30\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x68\x3d\x30\x3b\x68\x3c\x4b\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x68\x2b\x2b\x29\x76\x3d\x4b\x6f\x5b\x68\x5d\x28\x76\x2c\x74\x29\x7c\x7c\x76\x3b\x73\x7c\x7c\x28\x21\x66\x75" -"\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x70\x72\x65\x22\x29\x26\x26\x28\x65\x2e\x70\x72\x65\x3d\x21\x30\x29\x7d\x28\x76\x29\x2c\x76\x2e\x70\x72\x65\x26\x26\x28\x73\x3d\x21\x30\x29\x29\x2c\x71\x6f\x28\x76\x2e\x74\x61\x67\x29\x26\x26\x28\x63\x3d\x21\x30\x29\x2c\x73\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65" -"\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x6e\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x66\x28\x6e\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x6e\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x6e\x3b\x69\x2b\x2b\x29\x72\x5b\x69\x5d\x3d\x7b\x6e\x61\x6d\x65\x3a\x74\x5b\x69\x5d\x2e\x6e\x61\x6d\x65\x2c\x76\x61\x6c\x75\x65\x3a\x4a\x53\x4f" -"\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x74\x5b\x69\x5d\x2e\x76\x61\x6c\x75\x65\x29\x7d\x2c\x6e\x75\x6c\x6c\x21\x3d\x74\x5b\x69\x5d\x2e\x73\x74\x61\x72\x74\x26\x26\x28\x72\x5b\x69\x5d\x2e\x73\x74\x61\x72\x74\x3d\x74\x5b\x69\x5d\x2e\x73\x74\x61\x72\x74\x2c\x72\x5b\x69\x5d\x2e\x65\x6e\x64\x3d\x74\x5b\x69\x5d\x2e\x65\x6e\x64\x29\x3b\x65\x6c\x73\x65\x20\x65\x2e\x70\x72\x65\x7c\x7c\x28\x65\x2e" -"\x70\x6c\x61\x69\x6e\x3d\x21\x30\x29\x7d\x28\x76\x29\x3a\x76\x2e\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x7c\x7c\x28\x64\x61\x28\x76\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x69\x66\x22\x29\x3b\x69\x66\x28\x74\x29\x65\x2e\x69\x66\x3d\x74\x2c\x76\x61\x28\x65\x2c\x7b\x65\x78\x70\x3a\x74\x2c\x62\x6c\x6f\x63\x6b\x3a\x65\x7d\x29\x3b\x65" -"\x6c\x73\x65\x7b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x22\x29\x26\x26\x28\x65\x2e\x65\x6c\x73\x65\x3d\x21\x30\x29\x3b\x76\x61\x72\x20\x6e\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x2d\x69\x66\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x65\x6c\x73\x65\x69\x66\x3d\x6e\x29\x7d\x7d\x28\x76\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x75\x6c\x6c\x21" -"\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x6f\x6e\x63\x65\x22\x29\x26\x26\x28\x65\x2e\x6f\x6e\x63\x65\x3d\x21\x30\x29\x7d\x28\x76\x29\x29\x2c\x6e\x7c\x7c\x28\x6e\x3d\x76\x29\x2c\x61\x3f\x75\x28\x76\x29\x3a\x28\x72\x3d\x76\x2c\x69\x2e\x70\x75\x73\x68\x28\x76\x29\x29\x7d\x2c\x65\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x6f\x3d\x69\x5b\x69\x2e\x6c\x65\x6e" -"\x67\x74\x68\x2d\x31\x5d\x3b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x3d\x31\x2c\x72\x3d\x69\x5b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x2c\x75\x28\x6f\x29\x7d\x2c\x63\x68\x61\x72\x73\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x72\x26\x26\x28\x21\x71\x7c\x7c\x22\x74\x65\x78\x74\x61\x72\x65\x61\x22\x21\x3d\x3d\x72\x2e\x74\x61\x67\x7c\x7c\x72\x2e\x61\x74\x74\x72" -"\x73\x4d\x61\x70\x2e\x70\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x21\x3d\x3d\x65\x29\x29\x7b\x76\x61\x72\x20\x69\x2c\x75\x2c\x6c\x2c\x66\x3d\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x65\x3d\x63\x7c\x7c\x65\x2e\x74\x72\x69\x6d\x28\x29\x3f\x22\x73\x63\x72\x69\x70\x74\x22\x3d\x3d\x3d\x28\x69\x3d\x72\x29\x2e\x74\x61\x67\x7c\x7c\x22\x73\x74\x79\x6c\x65\x22\x3d\x3d\x3d\x69\x2e\x74\x61\x67" -"\x3f\x65\x3a\x63\x61\x28\x65\x29\x3a\x66\x2e\x6c\x65\x6e\x67\x74\x68\x3f\x61\x3f\x22\x63\x6f\x6e\x64\x65\x6e\x73\x65\x22\x3d\x3d\x3d\x61\x26\x26\x61\x61\x2e\x74\x65\x73\x74\x28\x65\x29\x3f\x22\x22\x3a\x22\x20\x22\x3a\x6f\x3f\x22\x20\x22\x3a\x22\x22\x3a\x22\x22\x29\x63\x7c\x7c\x22\x63\x6f\x6e\x64\x65\x6e\x73\x65\x22\x21\x3d\x3d\x61\x7c\x7c\x28\x65\x3d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x73\x61" -"\x2c\x22\x20\x22\x29\x29\x2c\x21\x73\x26\x26\x22\x20\x22\x21\x3d\x3d\x65\x26\x26\x28\x75\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x6d\x6f\x28\x74\x29\x3a\x76\x6f\x3b\x69\x66\x28\x6e\x2e\x74\x65\x73\x74\x28\x65\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x2c\x69\x2c\x6f\x2c\x61\x3d\x5b\x5d\x2c\x73\x3d\x5b\x5d\x2c\x63\x3d\x6e\x2e\x6c\x61\x73\x74" -"\x49\x6e\x64\x65\x78\x3d\x30\x3b\x72\x3d\x6e\x2e\x65\x78\x65\x63\x28\x65\x29\x3b\x29\x7b\x28\x69\x3d\x72\x2e\x69\x6e\x64\x65\x78\x29\x3e\x63\x26\x26\x28\x73\x2e\x70\x75\x73\x68\x28\x6f\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x63\x2c\x69\x29\x29\x2c\x61\x2e\x70\x75\x73\x68\x28\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x29\x29\x29\x3b\x76\x61\x72\x20\x75\x3d\x4f\x72\x28\x72\x5b\x31" -"\x5d\x2e\x74\x72\x69\x6d\x28\x29\x29\x3b\x61\x2e\x70\x75\x73\x68\x28\x22\x5f\x73\x28\x22\x2b\x75\x2b\x22\x29\x22\x29\x2c\x73\x2e\x70\x75\x73\x68\x28\x7b\x22\x40\x62\x69\x6e\x64\x69\x6e\x67\x22\x3a\x75\x7d\x29\x2c\x63\x3d\x69\x2b\x72\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x7d\x72\x65\x74\x75\x72\x6e\x20\x63\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x73\x2e\x70\x75\x73\x68\x28\x6f\x3d\x65\x2e" -"\x73\x6c\x69\x63\x65\x28\x63\x29\x29\x2c\x61\x2e\x70\x75\x73\x68\x28\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x29\x29\x29\x2c\x7b\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x61\x2e\x6a\x6f\x69\x6e\x28\x22\x2b\x22\x29\x2c\x74\x6f\x6b\x65\x6e\x73\x3a\x73\x7d\x7d\x7d\x28\x65\x2c\x56\x6f\x29\x29\x3f\x6c\x3d\x7b\x74\x79\x70\x65\x3a\x32\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e" -"\x3a\x75\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2c\x74\x6f\x6b\x65\x6e\x73\x3a\x75\x2e\x74\x6f\x6b\x65\x6e\x73\x2c\x74\x65\x78\x74\x3a\x65\x7d\x3a\x22\x20\x22\x3d\x3d\x3d\x65\x26\x26\x66\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x22\x20\x22\x3d\x3d\x3d\x66\x5b\x66\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x2e\x74\x65\x78\x74\x7c\x7c\x28\x6c\x3d\x7b\x74\x79\x70\x65\x3a\x33\x2c\x74\x65\x78\x74\x3a\x65" -"\x7d\x29\x2c\x6c\x26\x26\x66\x2e\x70\x75\x73\x68\x28\x6c\x29\x7d\x7d\x2c\x63\x6f\x6d\x6d\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x7b\x74\x79\x70\x65\x3a\x33\x2c\x74\x65\x78\x74\x3a\x65\x2c\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3a\x21\x30\x7d\x3b\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x75\x73\x68\x28\x69" -"\x29\x7d\x7d\x7d\x29\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3b\x28\x72\x3d\x46\x72\x28\x6e\x3d\x65\x2c\x22\x6b\x65\x79\x22\x29\x29\x26\x26\x28\x6e\x2e\x6b\x65\x79\x3d\x72\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x65\x2e\x6b\x65\x79\x26\x26\x21\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x26\x26\x21\x65\x2e\x61\x74\x74" -"\x72\x73\x4c\x69\x73\x74\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x46\x72\x28\x65\x2c\x22\x72\x65\x66\x22\x29\x3b\x74\x26\x26\x28\x65\x2e\x72\x65\x66\x3d\x74\x2c\x65\x2e\x72\x65\x66\x49\x6e\x46\x6f\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x3b\x66\x6f\x72\x28\x3b\x74\x3b\x29\x7b\x69\x66\x28\x76" -"\x6f\x69\x64\x20\x30\x21\x3d\x3d\x74\x2e\x66\x6f\x72\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x74\x3d\x74\x2e\x70\x61\x72\x65\x6e\x74\x7d\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x28\x65\x29\x29\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x3f\x28\x74\x3d\x50\x72\x28\x65\x2c\x22\x73\x63" -"\x6f\x70\x65\x22\x29\x2c\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x74\x7c\x7c\x50\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x22\x29\x29\x3a\x28\x74\x3d\x50\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x22\x29\x29\x26\x26\x28\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x74\x29\x3b\x76\x61\x72\x20\x6e\x3d\x46\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x22\x29\x3b" -"\x6e\x26\x26\x28\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x3d\x27\x22\x22\x27\x3d\x3d\x3d\x6e\x3f\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x3a\x6e\x2c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x3d\x21\x28\x21\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x3a\x73\x6c\x6f\x74\x22\x5d\x26\x26\x21\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x76\x2d\x62" -"\x69\x6e\x64\x3a\x73\x6c\x6f\x74\x22\x5d\x29\x2c\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x7c\x7c\x6a\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x22\x2c\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x3a\x22\x2b\x74\x5d" -"\x7c\x7c\x65\x2e\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x76\x2d\x62\x69\x6e\x64\x3a\x22\x2b\x74\x5d\x7c\x7c\x65\x2e\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x7d\x28\x65\x2c\x22\x73\x6c\x6f\x74\x22\x29\x29\x29\x3b\x69\x66\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x29\x7b\x76\x61\x72\x20\x72\x3d\x52\x72\x28\x65\x2c\x6f\x61\x29\x3b\x69\x66" -"\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x68\x61\x28\x72\x29\x2c\x6f\x3d\x69\x2e\x6e\x61\x6d\x65\x2c\x61\x3d\x69\x2e\x64\x79\x6e\x61\x6d\x69\x63\x3b\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x3d\x6f\x2c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x3d\x61\x2c\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x72\x2e\x76\x61\x6c\x75\x65\x7c\x7c\x75\x61\x7d\x7d\x65" -"\x6c\x73\x65\x7b\x76\x61\x72\x20\x73\x3d\x52\x72\x28\x65\x2c\x6f\x61\x29\x3b\x69\x66\x28\x73\x29\x7b\x76\x61\x72\x20\x63\x3d\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x7c\x7c\x28\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x7b\x7d\x29\x2c\x75\x3d\x68\x61\x28\x73\x29\x2c\x6c\x3d\x75\x2e\x6e\x61\x6d\x65\x2c\x66\x3d\x75\x2e\x64\x79\x6e\x61\x6d\x69\x63\x2c\x70\x3d\x63\x5b\x6c\x5d" -"\x3d\x6c\x61\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x2c\x5b\x5d\x2c\x65\x29\x3b\x70\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x3d\x6c\x2c\x70\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x3d\x66\x2c\x70\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69" -"\x66\x28\x21\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x70\x2c\x21\x30\x7d\x29\x2c\x70\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x73\x2e\x76\x61\x6c\x75\x65\x7c\x7c\x75\x61\x2c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x5b\x5d\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x7d\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x28\x65\x29\x7b\x22\x73\x6c\x6f\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x26\x26\x28\x65\x2e\x73\x6c\x6f\x74\x4e\x61\x6d\x65\x3d\x46\x72\x28\x65\x2c\x22\x6e\x61\x6d\x65\x22\x29\x29\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x28\x74\x3d\x46\x72\x28\x65\x2c\x22\x69\x73\x22\x29\x29\x26\x26\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3d\x74\x29" -"\x3b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x69\x6e\x6c\x69\x6e\x65\x2d\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x29\x26\x26\x28\x65\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3d\x21\x30\x29\x7d\x28\x65\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x7a\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x65\x3d\x7a\x6f\x5b\x69\x5d\x28\x65\x2c\x74\x29\x7c\x7c" -"\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x2c\x63\x2c\x75\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x3b\x66\x6f\x72\x28\x74\x3d\x30\x2c\x6e\x3d\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x69\x66\x28\x72\x3d\x69\x3d\x75\x5b\x74\x5d\x2e\x6e\x61\x6d\x65\x2c\x6f" -"\x3d\x75\x5b\x74\x5d\x2e\x76\x61\x6c\x75\x65\x2c\x58\x6f\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x69\x66\x28\x65\x2e\x68\x61\x73\x42\x69\x6e\x64\x69\x6e\x67\x73\x3d\x21\x30\x2c\x28\x61\x3d\x6d\x61\x28\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x58\x6f\x2c\x22\x22\x29\x29\x29\x26\x26\x28\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x69\x61\x2c\x22\x22\x29\x29\x2c\x72\x61\x2e\x74\x65\x73\x74\x28\x72\x29" -"\x29\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x72\x61\x2c\x22\x22\x29\x2c\x6f\x3d\x4f\x72\x28\x6f\x29\x2c\x28\x63\x3d\x74\x61\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x26\x26\x28\x72\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x29\x2c\x61\x26\x26\x28\x61\x2e\x70\x72\x6f\x70\x26\x26\x21\x63\x26\x26\x22\x69\x6e\x6e\x65\x72\x48\x74\x6d\x6c\x22\x3d\x3d\x3d\x28\x72\x3d\x62\x28\x72\x29\x29" -"\x26\x26\x28\x72\x3d\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x29\x2c\x61\x2e\x63\x61\x6d\x65\x6c\x26\x26\x21\x63\x26\x26\x28\x72\x3d\x62\x28\x72\x29\x29\x2c\x61\x2e\x73\x79\x6e\x63\x26\x26\x28\x73\x3d\x55\x72\x28\x6f\x2c\x22\x24\x65\x76\x65\x6e\x74\x22\x29\x2c\x63\x3f\x4d\x72\x28\x65\x2c\x27\x22\x75\x70\x64\x61\x74\x65\x3a\x22\x2b\x28\x27\x2b\x72\x2b\x22\x29\x22\x2c\x73\x2c\x6e\x75\x6c\x6c\x2c" -"\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x2c\x21\x30\x29\x3a\x28\x4d\x72\x28\x65\x2c\x22\x75\x70\x64\x61\x74\x65\x3a\x22\x2b\x62\x28\x72\x29\x2c\x73\x2c\x6e\x75\x6c\x6c\x2c\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x29\x2c\x43\x28\x72\x29\x21\x3d\x3d\x62\x28\x72\x29\x26\x26\x4d\x72\x28\x65\x2c\x22\x75\x70\x64\x61\x74\x65\x3a\x22\x2b\x43\x28\x72\x29\x2c\x73\x2c\x6e\x75\x6c\x6c\x2c\x21\x31\x2c\x30\x2c\x75\x5b" -"\x74\x5d\x29\x29\x29\x29\x2c\x61\x26\x26\x61\x2e\x70\x72\x6f\x70\x7c\x7c\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x26\x26\x57\x6f\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x2c\x72\x29\x3f\x45\x72\x28\x65\x2c\x72\x2c\x6f\x2c\x75\x5b\x74\x5d\x2c\x63\x29\x3a\x6a\x72\x28\x65\x2c\x72\x2c\x6f\x2c\x75\x5b\x74\x5d\x2c\x63\x29\x3b\x65\x6c\x73\x65\x20\x69" -"\x66\x28\x47\x6f\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x47\x6f\x2c\x22\x22\x29\x2c\x28\x63\x3d\x74\x61\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x26\x26\x28\x72\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x29\x2c\x4d\x72\x28\x65\x2c\x72\x2c\x6f\x2c\x61\x2c\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x2c\x63\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x6c" -"\x3d\x28\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x58\x6f\x2c\x22\x22\x29\x29\x2e\x6d\x61\x74\x63\x68\x28\x6e\x61\x29\x2c\x66\x3d\x6c\x26\x26\x6c\x5b\x31\x5d\x3b\x63\x3d\x21\x31\x2c\x66\x26\x26\x28\x72\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x28\x66\x2e\x6c\x65\x6e\x67\x74\x68\x2b\x31\x29\x29\x2c\x74\x61\x2e\x74\x65\x73\x74\x28\x66\x29\x26\x26\x28\x66\x3d\x66\x2e\x73\x6c\x69\x63\x65" -"\x28\x31\x2c\x2d\x31\x29\x2c\x63\x3d\x21\x30\x29\x29\x2c\x4c\x72\x28\x65\x2c\x72\x2c\x69\x2c\x6f\x2c\x66\x2c\x63\x2c\x61\x2c\x75\x5b\x74\x5d\x29\x7d\x65\x6c\x73\x65\x20\x6a\x72\x28\x65\x2c\x72\x2c\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x29\x2c\x75\x5b\x74\x5d\x29\x2c\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x26\x26\x22\x6d\x75\x74\x65\x64\x22\x3d\x3d\x3d\x72\x26\x26" -"\x57\x6f\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x2c\x72\x29\x26\x26\x45\x72\x28\x65\x2c\x72\x2c\x22\x74\x72\x75\x65\x22\x2c\x75\x5b\x74\x5d\x29\x7d\x28\x65\x29\x2c\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x64\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x69\x66\x28\x74\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x66\x6f\x72\x22\x29\x29\x7b\x76\x61\x72\x20" -"\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x59\x6f\x29\x3b\x69\x66\x28\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x3b\x76\x61\x72\x20\x6e\x3d\x7b\x7d\x3b\x6e\x2e\x66\x6f\x72\x3d\x74\x5b\x32\x5d\x2e\x74\x72\x69\x6d\x28\x29\x3b\x76\x61\x72\x20\x72\x3d\x74\x5b\x31\x5d\x2e\x74\x72\x69\x6d\x28\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x65\x61" -"\x2c\x22\x22\x29\x2c\x69\x3d\x72\x2e\x6d\x61\x74\x63\x68\x28\x51\x6f\x29\x3b\x69\x3f\x28\x6e\x2e\x61\x6c\x69\x61\x73\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x51\x6f\x2c\x22\x22\x29\x2e\x74\x72\x69\x6d\x28\x29\x2c\x6e\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x31\x3d\x69\x5b\x31\x5d\x2e\x74\x72\x69\x6d\x28\x29\x2c\x69\x5b\x32\x5d\x26\x26\x28\x6e\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x32\x3d\x69\x5b\x32" -"\x5d\x2e\x74\x72\x69\x6d\x28\x29\x29\x29\x3a\x6e\x2e\x61\x6c\x69\x61\x73\x3d\x72\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x28\x74\x29\x3b\x6e\x26\x26\x41\x28\x65\x2c\x6e\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x61\x28\x65\x2c\x74\x29\x7b\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x7c\x7c\x28\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x3d\x5b\x5d\x29\x2c\x65\x2e" -"\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x70\x75\x73\x68\x28\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6e\x61\x6d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x6f\x61\x2c\x22\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x22\x23\x22\x21\x3d\x3d\x65\x2e\x6e\x61\x6d\x65\x5b\x30\x5d\x26\x26\x28\x74\x3d\x22\x64\x65\x66\x61\x75" -"\x6c\x74\x22\x29\x2c\x74\x61\x2e\x74\x65\x73\x74\x28\x74\x29\x3f\x7b\x6e\x61\x6d\x65\x3a\x74\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x21\x30\x7d\x3a\x7b\x6e\x61\x6d\x65\x3a\x27\x22\x27\x2b\x74\x2b\x27\x22\x27\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x21\x31\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6d" -"\x61\x74\x63\x68\x28\x69\x61\x29\x3b\x69\x66\x28\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x7b\x7d\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x5b\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x5d\x3d\x21\x30\x7d\x29\x2c\x6e\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x61\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d" -"\x7b\x7d\x2c\x6e\x3d\x30\x2c\x72\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x3c\x72\x3b\x6e\x2b\x2b\x29\x74\x5b\x65\x5b\x6e\x5d\x2e\x6e\x61\x6d\x65\x5d\x3d\x65\x5b\x6e\x5d\x2e\x76\x61\x6c\x75\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x76\x61\x72\x20\x67\x61\x3d\x2f\x5e\x78\x6d\x6c\x6e\x73\x3a\x4e\x53\x5c\x64\x2b\x2f\x2c\x5f\x61\x3d\x2f\x5e\x4e\x53\x5c\x64\x2b\x3a\x2f\x3b\x66\x75\x6e\x63\x74\x69" -"\x6f\x6e\x20\x62\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6c\x61\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x65\x2e\x70\x61\x72\x65\x6e\x74\x29\x7d\x76\x61\x72\x20\x24\x61\x3d\x5b\x79\x6f\x2c\x5f\x6f\x2c\x7b\x70\x72\x65\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29" -"\x7b\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x3b\x69\x66\x28\x21\x72\x5b\x22\x76\x2d\x6d\x6f\x64\x65\x6c\x22\x5d\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x28\x72\x5b\x22\x3a\x74\x79\x70\x65\x22\x5d\x7c\x7c\x72\x5b\x22\x76\x2d\x62\x69\x6e\x64\x3a\x74\x79\x70\x65\x22\x5d\x29\x26\x26\x28" -"\x6e\x3d\x46\x72\x28\x65\x2c\x22\x74\x79\x70\x65\x22\x29\x29\x2c\x72\x2e\x74\x79\x70\x65\x7c\x7c\x6e\x7c\x7c\x21\x72\x5b\x22\x76\x2d\x62\x69\x6e\x64\x22\x5d\x7c\x7c\x28\x6e\x3d\x22\x28\x22\x2b\x72\x5b\x22\x76\x2d\x62\x69\x6e\x64\x22\x5d\x2b\x22\x29\x2e\x74\x79\x70\x65\x22\x29\x2c\x6e\x29\x7b\x76\x61\x72\x20\x69\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x69\x66\x22\x2c\x21\x30\x29\x2c\x6f\x3d\x69\x3f\x22" -"\x26\x26\x28\x22\x2b\x69\x2b\x22\x29\x22\x3a\x22\x22\x2c\x61\x3d\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x22\x2c\x21\x30\x29\x2c\x73\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x2d\x69\x66\x22\x2c\x21\x30\x29\x2c\x63\x3d\x62\x61\x28\x65\x29\x3b\x64\x61\x28\x63\x29\x2c\x44\x72\x28\x63\x2c\x22\x74\x79\x70\x65\x22\x2c\x22\x63\x68\x65\x63\x6b\x62\x6f\x78\x22\x29" -"\x2c\x70\x61\x28\x63\x2c\x74\x29\x2c\x63\x2e\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x63\x2e\x69\x66\x3d\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x63\x68\x65\x63\x6b\x62\x6f\x78\x27\x22\x2b\x6f\x2c\x76\x61\x28\x63\x2c\x7b\x65\x78\x70\x3a\x63\x2e\x69\x66\x2c\x62\x6c\x6f\x63\x6b\x3a\x63\x7d\x29\x3b\x76\x61\x72\x20\x75\x3d\x62\x61\x28\x65\x29\x3b\x50\x72\x28\x75\x2c\x22\x76\x2d\x66" -"\x6f\x72\x22\x2c\x21\x30\x29\x2c\x44\x72\x28\x75\x2c\x22\x74\x79\x70\x65\x22\x2c\x22\x72\x61\x64\x69\x6f\x22\x29\x2c\x70\x61\x28\x75\x2c\x74\x29\x2c\x76\x61\x28\x63\x2c\x7b\x65\x78\x70\x3a\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x72\x61\x64\x69\x6f\x27\x22\x2b\x6f\x2c\x62\x6c\x6f\x63\x6b\x3a\x75\x7d\x29\x3b\x76\x61\x72\x20\x6c\x3d\x62\x61\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x50\x72" -"\x28\x6c\x2c\x22\x76\x2d\x66\x6f\x72\x22\x2c\x21\x30\x29\x2c\x44\x72\x28\x6c\x2c\x22\x3a\x74\x79\x70\x65\x22\x2c\x6e\x29\x2c\x70\x61\x28\x6c\x2c\x74\x29\x2c\x76\x61\x28\x63\x2c\x7b\x65\x78\x70\x3a\x69\x2c\x62\x6c\x6f\x63\x6b\x3a\x6c\x7d\x29\x2c\x61\x3f\x63\x2e\x65\x6c\x73\x65\x3d\x21\x30\x3a\x73\x26\x26\x28\x63\x2e\x65\x6c\x73\x65\x69\x66\x3d\x73\x29\x2c\x63\x7d\x7d\x7d\x7d\x5d\x3b\x76\x61\x72\x20" -"\x77\x61\x2c\x43\x61\x2c\x78\x61\x3d\x7b\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x3a\x21\x30\x2c\x6d\x6f\x64\x75\x6c\x65\x73\x3a\x24\x61\x2c\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3a\x7b\x6d\x6f\x64\x65\x6c\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2c\x6f\x3d\x65" -"\x2e\x74\x61\x67\x2c\x61\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x3b\x69\x66\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x72\x28\x65\x2c\x72\x2c\x69\x29\x2c\x21\x31\x3b\x69\x66\x28\x22\x73\x65\x6c\x65\x63\x74\x22\x3d\x3d\x3d\x6f\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x27\x76\x61" -"\x72\x20\x24\x24\x73\x65\x6c\x65\x63\x74\x65\x64\x56\x61\x6c\x20\x3d\x20\x41\x72\x72\x61\x79\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x66\x69\x6c\x74\x65\x72\x2e\x63\x61\x6c\x6c\x28\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x7d\x29\x2e" -"\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x76\x61\x72\x20\x76\x61\x6c\x20\x3d\x20\x22\x5f\x76\x61\x6c\x75\x65\x22\x20\x69\x6e\x20\x6f\x20\x3f\x20\x6f\x2e\x5f\x76\x61\x6c\x75\x65\x20\x3a\x20\x6f\x2e\x76\x61\x6c\x75\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x27\x2b\x28\x6e\x26\x26\x6e\x2e\x6e\x75\x6d\x62\x65\x72\x3f\x22\x5f\x6e\x28\x76\x61\x6c\x29\x22\x3a\x22\x76\x61\x6c\x22\x29\x2b" -"\x22\x7d\x29\x3b\x22\x3b\x72\x3d\x72\x2b\x22\x20\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x20\x3f\x20\x24\x24\x73\x65\x6c\x65\x63\x74\x65\x64\x56\x61\x6c\x20\x3a\x20\x24\x24\x73\x65\x6c\x65\x63\x74\x65\x64\x56\x61\x6c\x5b\x30\x5d\x22\x29\x2c\x4d\x72\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x72\x2c\x6e\x75\x6c\x6c" -"\x2c\x21\x30\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x6f\x26\x26\x22\x63\x68\x65\x63\x6b\x62\x6f\x78\x22\x3d\x3d\x3d\x61\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x26\x26\x6e\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x69\x3d\x46\x72\x28\x65\x2c\x22\x76\x61\x6c\x75\x65\x22\x29\x7c" -"\x7c\x22\x6e\x75\x6c\x6c\x22\x2c\x6f\x3d\x46\x72\x28\x65\x2c\x22\x74\x72\x75\x65\x2d\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x74\x72\x75\x65\x22\x2c\x61\x3d\x46\x72\x28\x65\x2c\x22\x66\x61\x6c\x73\x65\x2d\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x66\x61\x6c\x73\x65\x22\x3b\x45\x72\x28\x65\x2c\x22\x63\x68\x65\x63\x6b\x65\x64\x22\x2c\x22\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x22\x2b" -"\x74\x2b\x22\x29\x3f\x5f\x69\x28\x22\x2b\x74\x2b\x22\x2c\x22\x2b\x69\x2b\x22\x29\x3e\x2d\x31\x22\x2b\x28\x22\x74\x72\x75\x65\x22\x3d\x3d\x3d\x6f\x3f\x22\x3a\x28\x22\x2b\x74\x2b\x22\x29\x22\x3a\x22\x3a\x5f\x71\x28\x22\x2b\x74\x2b\x22\x2c\x22\x2b\x6f\x2b\x22\x29\x22\x29\x29\x2c\x4d\x72\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x22\x76\x61\x72\x20\x24\x24\x61\x3d\x22\x2b\x74\x2b\x22\x2c\x24\x24" -"\x65\x6c\x3d\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2c\x24\x24\x63\x3d\x24\x24\x65\x6c\x2e\x63\x68\x65\x63\x6b\x65\x64\x3f\x28\x22\x2b\x6f\x2b\x22\x29\x3a\x28\x22\x2b\x61\x2b\x22\x29\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x24\x24\x61\x29\x29\x7b\x76\x61\x72\x20\x24\x24\x76\x3d\x22\x2b\x28\x72\x3f\x22\x5f\x6e\x28\x22\x2b\x69\x2b\x22\x29\x22\x3a\x69\x29" -"\x2b\x22\x2c\x24\x24\x69\x3d\x5f\x69\x28\x24\x24\x61\x2c\x24\x24\x76\x29\x3b\x69\x66\x28\x24\x24\x65\x6c\x2e\x63\x68\x65\x63\x6b\x65\x64\x29\x7b\x24\x24\x69\x3c\x30\x26\x26\x28\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x24\x61\x2e\x63\x6f\x6e\x63\x61\x74\x28\x5b\x24\x24\x76\x5d\x29\x22\x29\x2b\x22\x29\x7d\x65\x6c\x73\x65\x7b\x24\x24\x69\x3e\x2d\x31\x26\x26\x28\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x24\x61" -"\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x24\x24\x69\x29\x2e\x63\x6f\x6e\x63\x61\x74\x28\x24\x24\x61\x2e\x73\x6c\x69\x63\x65\x28\x24\x24\x69\x2b\x31\x29\x29\x22\x29\x2b\x22\x29\x7d\x7d\x65\x6c\x73\x65\x7b\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x24\x63\x22\x29\x2b\x22\x7d\x22\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22" -"\x3d\x3d\x3d\x6f\x26\x26\x22\x72\x61\x64\x69\x6f\x22\x3d\x3d\x3d\x61\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x26\x26\x6e\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x69\x3d\x46\x72\x28\x65\x2c\x22\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x6e\x75\x6c\x6c\x22\x3b\x45\x72\x28\x65\x2c\x22\x63\x68\x65\x63\x6b\x65\x64\x22\x2c\x22\x5f\x71\x28\x22\x2b\x74\x2b" -"\x22\x2c\x22\x2b\x28\x69\x3d\x72\x3f\x22\x5f\x6e\x28\x22\x2b\x69\x2b\x22\x29\x22\x3a\x69\x29\x2b\x22\x29\x22\x29\x2c\x4d\x72\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x55\x72\x28\x74\x2c\x69\x29\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x6f\x7c\x7c\x22\x74\x65\x78\x74\x61\x72\x65\x61\x22\x3d" -"\x3d\x3d\x6f\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x2c\x69\x3d\x6e\x7c\x7c\x7b\x7d\x2c\x6f\x3d\x69\x2e\x6c\x61\x7a\x79\x2c\x61\x3d\x69\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x73\x3d\x69\x2e\x74\x72\x69\x6d\x2c\x63\x3d\x21\x6f\x26\x26\x22\x72\x61\x6e\x67\x65\x22\x21\x3d\x3d\x72\x2c\x75\x3d" -"\x6f\x3f\x22\x63\x68\x61\x6e\x67\x65\x22\x3a\x22\x72\x61\x6e\x67\x65\x22\x3d\x3d\x3d\x72\x3f\x5a\x72\x3a\x22\x69\x6e\x70\x75\x74\x22\x2c\x6c\x3d\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x76\x61\x6c\x75\x65\x22\x3b\x73\x26\x26\x28\x6c\x3d\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x76\x61\x6c\x75\x65\x2e\x74\x72\x69\x6d\x28\x29\x22\x29\x2c\x61\x26\x26\x28\x6c\x3d" -"\x22\x5f\x6e\x28\x22\x2b\x6c\x2b\x22\x29\x22\x29\x3b\x76\x61\x72\x20\x66\x3d\x55\x72\x28\x74\x2c\x6c\x29\x3b\x63\x26\x26\x28\x66\x3d\x22\x69\x66\x28\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x29\x72\x65\x74\x75\x72\x6e\x3b\x22\x2b\x66\x29\x2c\x45\x72\x28\x65\x2c\x22\x76\x61\x6c\x75\x65\x22\x2c\x22\x28\x22\x2b\x74\x2b\x22\x29\x22\x29\x2c\x4d\x72\x28" -"\x65\x2c\x75\x2c\x66\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x2c\x28\x73\x7c\x7c\x61\x29\x26\x26\x4d\x72\x28\x65\x2c\x22\x62\x6c\x75\x72\x22\x2c\x22\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x22\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x21\x46\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x28\x6f\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x72\x28\x65" -"\x2c\x72\x2c\x69\x29\x2c\x21\x31\x3b\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x2c\x74\x65\x78\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x76\x61\x6c\x75\x65\x26\x26\x45\x72\x28\x65\x2c\x22\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x22\x2c\x22\x5f\x73\x28\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x22\x2c\x74\x29\x7d\x2c\x68\x74\x6d\x6c\x3a\x66\x75\x6e\x63\x74\x69\x6f" -"\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x76\x61\x6c\x75\x65\x26\x26\x45\x72\x28\x65\x2c\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x2c\x22\x5f\x73\x28\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x22\x2c\x74\x29\x7d\x7d\x2c\x69\x73\x50\x72\x65\x54\x61\x67\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x70\x72\x65\x22\x3d\x3d\x3d\x65\x7d\x2c\x69\x73\x55\x6e\x61\x72" -"\x79\x54\x61\x67\x3a\x24\x6f\x2c\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x3a\x44\x6e\x2c\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x3a\x77\x6f\x2c\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3a\x5a\x6e\x2c\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x3a\x47\x6e\x2c\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" -"\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x64\x75\x63\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x6f\x6e\x63\x61\x74\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x7c\x7c\x5b\x5d\x29\x7d\x2c\x5b\x5d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x7d\x28\x24\x61\x29\x7d\x2c\x6b\x61\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e" -"\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x70\x28\x22\x74\x79\x70\x65\x2c\x74\x61\x67\x2c\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x61\x74\x74\x72\x73\x4d\x61\x70\x2c\x70\x6c\x61\x69\x6e\x2c\x70\x61\x72\x65\x6e\x74\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x61\x74\x74\x72\x73\x2c\x73\x74\x61\x72\x74\x2c\x65\x6e\x64\x2c\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x22\x2b\x28\x65\x3f\x22\x2c\x22\x2b" -"\x65\x3a\x22\x22\x29\x29\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x61\x28\x65\x2c\x74\x29\x7b\x65\x26\x26\x28\x77\x61\x3d\x6b\x61\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x7c\x7c\x22\x22\x29\x2c\x43\x61\x3d\x74\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x7c\x7c\x54\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x29\x7b\x74\x2e\x73\x74\x61\x74\x69\x63\x3d\x66" -"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x32\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x33\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x72\x65\x74\x75\x72\x6e\x21\x28\x21\x65\x2e\x70\x72\x65\x26\x26\x28\x65\x2e\x68\x61\x73\x42\x69\x6e\x64\x69\x6e\x67\x73\x7c\x7c\x65\x2e\x69\x66\x7c\x7c\x65\x2e\x66\x6f\x72" -"\x7c\x7c\x64\x28\x65\x2e\x74\x61\x67\x29\x7c\x7c\x21\x43\x61\x28\x65\x2e\x74\x61\x67\x29\x7c\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x7b\x69\x66\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x21\x3d\x3d\x28\x65\x3d\x65\x2e\x70\x61\x72\x65\x6e\x74\x29\x2e\x74\x61\x67\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x65\x2e\x66" -"\x6f\x72\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x28\x65\x29\x7c\x7c\x21\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2e\x65\x76\x65\x72\x79\x28\x77\x61\x29\x29\x29\x7d\x28\x74\x29\x3b\x69\x66\x28\x31\x3d\x3d\x3d\x74\x2e\x74\x79\x70\x65\x29\x7b\x69\x66\x28\x21\x43\x61\x28\x74\x2e\x74\x61\x67\x29\x26\x26\x22\x73\x6c\x6f\x74\x22\x21\x3d\x3d\x74\x2e\x74" -"\x61\x67\x26\x26\x6e\x75\x6c\x6c\x3d\x3d\x74\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x69\x6e\x6c\x69\x6e\x65\x2d\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x5d\x29\x72\x65\x74\x75\x72\x6e\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x2c\x72\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x3c\x72\x3b\x6e\x2b\x2b\x29\x7b\x76\x61\x72\x20\x69\x3d\x74\x2e\x63\x68\x69\x6c" -"\x64\x72\x65\x6e\x5b\x6e\x5d\x3b\x65\x28\x69\x29\x2c\x69\x2e\x73\x74\x61\x74\x69\x63\x7c\x7c\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x3d\x21\x31\x29\x7d\x69\x66\x28\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x31\x2c\x61\x3d\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x3c\x61\x3b\x6f\x2b\x2b\x29\x7b" -"\x76\x61\x72\x20\x73\x3d\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x5b\x6f\x5d\x2e\x62\x6c\x6f\x63\x6b\x3b\x65\x28\x73\x29\x2c\x73\x2e\x73\x74\x61\x74\x69\x63\x7c\x7c\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x3d\x21\x31\x29\x7d\x7d\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x2c\x6e\x29\x7b\x69\x66\x28\x31\x3d\x3d\x3d\x74\x2e\x74\x79\x70\x65\x29\x7b\x69\x66\x28\x28" -"\x74\x2e\x73\x74\x61\x74\x69\x63\x7c\x7c\x74\x2e\x6f\x6e\x63\x65\x29\x26\x26\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x49\x6e\x46\x6f\x72\x3d\x6e\x29\x2c\x74\x2e\x73\x74\x61\x74\x69\x63\x26\x26\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x31\x21\x3d\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x33\x21\x3d\x3d\x74\x2e\x63\x68\x69\x6c" -"\x64\x72\x65\x6e\x5b\x30\x5d\x2e\x74\x79\x70\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x6f\x6f\x74\x3d\x21\x30\x29\x3b\x69\x66\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x6f\x6f\x74\x3d\x21\x31\x2c\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65" -"\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x65\x28\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x72\x5d\x2c\x6e\x7c\x7c\x21\x21\x74\x2e\x66\x6f\x72\x29\x3b\x69\x66\x28\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x31\x2c\x61\x3d\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x3c\x61\x3b\x6f" -"\x2b\x2b\x29\x65\x28\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x5b\x6f\x5d\x2e\x62\x6c\x6f\x63\x6b\x2c\x6e\x29\x7d\x7d\x28\x65\x2c\x21\x31\x29\x29\x7d\x76\x61\x72\x20\x4f\x61\x3d\x2f\x5e\x28\x5b\x5c\x77\x24\x5f\x5d\x2b\x7c\x5c\x28\x5b\x5e\x29\x5d\x2a\x3f\x5c\x29\x29\x5c\x73\x2a\x3d\x3e\x7c\x5e\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x3f\x3a\x5c\x73\x2b\x5b\x5c\x77\x24\x5d\x2b\x29\x3f\x5c" -"\x73\x2a\x5c\x28\x2f\x2c\x53\x61\x3d\x2f\x5c\x28\x5b\x5e\x29\x5d\x2a\x3f\x5c\x29\x3b\x2a\x24\x2f\x2c\x54\x61\x3d\x2f\x5e\x5b\x41\x2d\x5a\x61\x2d\x7a\x5f\x24\x5d\x5b\x5c\x77\x24\x5d\x2a\x28\x3f\x3a\x5c\x2e\x5b\x41\x2d\x5a\x61\x2d\x7a\x5f\x24\x5d\x5b\x5c\x77\x24\x5d\x2a\x7c\x5c\x5b\x27\x5b\x5e\x27\x5d\x2a\x3f\x27\x5d\x7c\x5c\x5b\x22\x5b\x5e\x22\x5d\x2a\x3f\x22\x5d\x7c\x5c\x5b\x5c\x64\x2b\x5d\x7c\x5c" -"\x5b\x5b\x41\x2d\x5a\x61\x2d\x7a\x5f\x24\x5d\x5b\x5c\x77\x24\x5d\x2a\x5d\x29\x2a\x24\x2f\x2c\x4e\x61\x3d\x7b\x65\x73\x63\x3a\x32\x37\x2c\x74\x61\x62\x3a\x39\x2c\x65\x6e\x74\x65\x72\x3a\x31\x33\x2c\x73\x70\x61\x63\x65\x3a\x33\x32\x2c\x75\x70\x3a\x33\x38\x2c\x6c\x65\x66\x74\x3a\x33\x37\x2c\x72\x69\x67\x68\x74\x3a\x33\x39\x2c\x64\x6f\x77\x6e\x3a\x34\x30\x2c\x64\x65\x6c\x65\x74\x65\x3a\x5b\x38\x2c\x34" -"\x36\x5d\x7d\x2c\x45\x61\x3d\x7b\x65\x73\x63\x3a\x5b\x22\x45\x73\x63\x22\x2c\x22\x45\x73\x63\x61\x70\x65\x22\x5d\x2c\x74\x61\x62\x3a\x22\x54\x61\x62\x22\x2c\x65\x6e\x74\x65\x72\x3a\x22\x45\x6e\x74\x65\x72\x22\x2c\x73\x70\x61\x63\x65\x3a\x5b\x22\x20\x22\x2c\x22\x53\x70\x61\x63\x65\x62\x61\x72\x22\x5d\x2c\x75\x70\x3a\x5b\x22\x55\x70\x22\x2c\x22\x41\x72\x72\x6f\x77\x55\x70\x22\x5d\x2c\x6c\x65\x66\x74" -"\x3a\x5b\x22\x4c\x65\x66\x74\x22\x2c\x22\x41\x72\x72\x6f\x77\x4c\x65\x66\x74\x22\x5d\x2c\x72\x69\x67\x68\x74\x3a\x5b\x22\x52\x69\x67\x68\x74\x22\x2c\x22\x41\x72\x72\x6f\x77\x52\x69\x67\x68\x74\x22\x5d\x2c\x64\x6f\x77\x6e\x3a\x5b\x22\x44\x6f\x77\x6e\x22\x2c\x22\x41\x72\x72\x6f\x77\x44\x6f\x77\x6e\x22\x5d\x2c\x64\x65\x6c\x65\x74\x65\x3a\x5b\x22\x42\x61\x63\x6b\x73\x70\x61\x63\x65\x22\x2c\x22\x44\x65" -"\x6c\x65\x74\x65\x22\x2c\x22\x44\x65\x6c\x22\x5d\x7d\x2c\x6a\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x69\x66\x28\x22\x2b\x65\x2b\x22\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3b\x22\x7d\x2c\x44\x61\x3d\x7b\x73\x74\x6f\x70\x3a\x22\x24\x65\x76\x65\x6e\x74\x2e\x73\x74\x6f\x70\x50\x72\x6f\x70\x61\x67\x61\x74\x69\x6f\x6e\x28\x29\x3b\x22\x2c\x70\x72\x65" -"\x76\x65\x6e\x74\x3a\x22\x24\x65\x76\x65\x6e\x74\x2e\x70\x72\x65\x76\x65\x6e\x74\x44\x65\x66\x61\x75\x6c\x74\x28\x29\x3b\x22\x2c\x73\x65\x6c\x66\x3a\x6a\x61\x28\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x20\x21\x3d\x3d\x20\x24\x65\x76\x65\x6e\x74\x2e\x63\x75\x72\x72\x65\x6e\x74\x54\x61\x72\x67\x65\x74\x22\x29\x2c\x63\x74\x72\x6c\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x63" -"\x74\x72\x6c\x4b\x65\x79\x22\x29\x2c\x73\x68\x69\x66\x74\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x73\x68\x69\x66\x74\x4b\x65\x79\x22\x29\x2c\x61\x6c\x74\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x61\x6c\x74\x4b\x65\x79\x22\x29\x2c\x6d\x65\x74\x61\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x6d\x65\x74\x61\x4b\x65\x79\x22\x29\x2c\x6c\x65\x66\x74\x3a\x6a\x61\x28\x22\x27" -"\x62\x75\x74\x74\x6f\x6e\x27\x20\x69\x6e\x20\x24\x65\x76\x65\x6e\x74\x20\x26\x26\x20\x24\x65\x76\x65\x6e\x74\x2e\x62\x75\x74\x74\x6f\x6e\x20\x21\x3d\x3d\x20\x30\x22\x29\x2c\x6d\x69\x64\x64\x6c\x65\x3a\x6a\x61\x28\x22\x27\x62\x75\x74\x74\x6f\x6e\x27\x20\x69\x6e\x20\x24\x65\x76\x65\x6e\x74\x20\x26\x26\x20\x24\x65\x76\x65\x6e\x74\x2e\x62\x75\x74\x74\x6f\x6e\x20\x21\x3d\x3d\x20\x31\x22\x29\x2c\x72\x69" -"\x67\x68\x74\x3a\x6a\x61\x28\x22\x27\x62\x75\x74\x74\x6f\x6e\x27\x20\x69\x6e\x20\x24\x65\x76\x65\x6e\x74\x20\x26\x26\x20\x24\x65\x76\x65\x6e\x74\x2e\x62\x75\x74\x74\x6f\x6e\x20\x21\x3d\x3d\x20\x32\x22\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x22\x6e\x61\x74\x69\x76\x65\x4f\x6e\x3a\x22\x3a\x22\x6f\x6e\x3a\x22\x2c\x72\x3d\x22\x22" -"\x2c\x69\x3d\x22\x22\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x65\x29\x7b\x76\x61\x72\x20\x61\x3d\x49\x61\x28\x65\x5b\x6f\x5d\x29\x3b\x65\x5b\x6f\x5d\x26\x26\x65\x5b\x6f\x5d\x2e\x64\x79\x6e\x61\x6d\x69\x63\x3f\x69\x2b\x3d\x6f\x2b\x22\x2c\x22\x2b\x61\x2b\x22\x2c\x22\x3a\x72\x2b\x3d\x27\x22\x27\x2b\x6f\x2b\x27\x22\x3a\x27\x2b\x61\x2b\x22\x2c\x22\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x3d" -"\x22\x7b\x22\x2b\x72\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x7d\x22\x2c\x69\x3f\x6e\x2b\x22\x5f\x64\x28\x22\x2b\x72\x2b\x22\x2c\x5b\x22\x2b\x69\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x5d\x29\x22\x3a\x6e\x2b\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x49\x61\x28\x65\x29\x7b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29" -"\x7b\x7d\x22\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x22\x5b\x22\x2b\x65\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x49\x61\x28\x65\x29\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x2b\x22\x5d\x22\x3b\x76\x61\x72\x20\x74\x3d\x54\x61\x2e\x74\x65\x73\x74\x28\x65\x2e\x76\x61\x6c" -"\x75\x65\x29\x2c\x6e\x3d\x4f\x61\x2e\x74\x65\x73\x74\x28\x65\x2e\x76\x61\x6c\x75\x65\x29\x2c\x72\x3d\x54\x61\x2e\x74\x65\x73\x74\x28\x65\x2e\x76\x61\x6c\x75\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x53\x61\x2c\x22\x22\x29\x29\x3b\x69\x66\x28\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x29\x7b\x76\x61\x72\x20\x69\x3d\x22\x22\x2c\x6f\x3d\x22\x22\x2c\x61\x3d\x5b\x5d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20" -"\x73\x20\x69\x6e\x20\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x29\x69\x66\x28\x44\x61\x5b\x73\x5d\x29\x6f\x2b\x3d\x44\x61\x5b\x73\x5d\x2c\x4e\x61\x5b\x73\x5d\x26\x26\x61\x2e\x70\x75\x73\x68\x28\x73\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x65\x78\x61\x63\x74\x22\x3d\x3d\x3d\x73\x29\x7b\x76\x61\x72\x20\x63\x3d\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3b\x6f\x2b\x3d\x6a\x61\x28\x5b\x22\x63" -"\x74\x72\x6c\x22\x2c\x22\x73\x68\x69\x66\x74\x22\x2c\x22\x61\x6c\x74\x22\x2c\x22\x6d\x65\x74\x61\x22\x5d\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x63\x5b\x65\x5d\x7d\x29\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x24\x65\x76\x65\x6e\x74\x2e\x22\x2b\x65\x2b\x22\x4b\x65\x79\x22\x7d" -"\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x7c\x7c\x22\x29\x29\x7d\x65\x6c\x73\x65\x20\x61\x2e\x70\x75\x73\x68\x28\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x61\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x69\x2b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x69\x66\x28\x21\x24\x65\x76\x65\x6e\x74\x2e\x74\x79\x70\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x27\x6b\x65\x79\x27\x29\x26" -"\x26\x22\x2b\x65\x2e\x6d\x61\x70\x28\x4d\x61\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x26\x26\x22\x29\x2b\x22\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3b\x22\x7d\x28\x61\x29\x29\x2c\x6f\x26\x26\x28\x69\x2b\x3d\x6f\x29\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x24\x65\x76\x65\x6e\x74\x29\x7b\x22\x2b\x69\x2b\x28\x74\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x2b\x22\x2e" -"\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x20\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x22\x3a\x6e\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x28\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x20\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x22\x3a\x72\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x29" -"\x2b\x22\x7d\x22\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x6e\x3f\x65\x2e\x76\x61\x6c\x75\x65\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x24\x65\x76\x65\x6e\x74\x29\x7b\x22\x2b\x28\x72\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x29\x2b\x22\x7d\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4d\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d" -"\x70\x61\x72\x73\x65\x49\x6e\x74\x28\x65\x2c\x31\x30\x29\x3b\x69\x66\x28\x74\x29\x72\x65\x74\x75\x72\x6e\x22\x24\x65\x76\x65\x6e\x74\x2e\x6b\x65\x79\x43\x6f\x64\x65\x21\x3d\x3d\x22\x2b\x74\x3b\x76\x61\x72\x20\x6e\x3d\x4e\x61\x5b\x65\x5d\x2c\x72\x3d\x45\x61\x5b\x65\x5d\x3b\x72\x65\x74\x75\x72\x6e\x22\x5f\x6b\x28\x24\x65\x76\x65\x6e\x74\x2e\x6b\x65\x79\x43\x6f\x64\x65\x2c\x22\x2b\x4a\x53\x4f\x4e\x2e" -"\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x65\x29\x2b\x22\x2c\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6e\x29\x2b\x22\x2c\x24\x65\x76\x65\x6e\x74\x2e\x6b\x65\x79\x2c\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x72\x29\x2b\x22\x29\x22\x7d\x76\x61\x72\x20\x46\x61\x3d\x7b\x6f\x6e\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x77" -"\x72\x61\x70\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5f\x67\x28\x22\x2b\x65\x2b\x22\x2c\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x22\x7d\x7d\x2c\x62\x69\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x77\x72\x61\x70\x44\x61\x74\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x72" -"\x65\x74\x75\x72\x6e\x22\x5f\x62\x28\x22\x2b\x6e\x2b\x22\x2c\x27\x22\x2b\x65\x2e\x74\x61\x67\x2b\x22\x27\x2c\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x2c\x22\x2b\x28\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x26\x26\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2e\x70\x72\x6f\x70\x3f\x22\x74\x72\x75\x65\x22\x3a\x22\x66\x61\x6c\x73\x65\x22\x29\x2b\x28\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73" -"\x26\x26\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2e\x73\x79\x6e\x63\x3f\x22\x2c\x74\x72\x75\x65\x22\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x7d\x2c\x63\x6c\x6f\x61\x6b\x3a\x53\x7d\x2c\x50\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x65\x2c\x74\x68\x69\x73\x2e\x77\x61\x72\x6e\x3d\x65\x2e\x77\x61\x72\x6e\x7c\x7c\x54\x72\x2c\x74\x68\x69" -"\x73\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x73\x3d\x4e\x72\x28\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x43\x6f\x64\x65\x22\x29\x2c\x74\x68\x69\x73\x2e\x64\x61\x74\x61\x47\x65\x6e\x46\x6e\x73\x3d\x4e\x72\x28\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x67\x65\x6e\x44\x61\x74\x61\x22\x29\x2c\x74\x68\x69\x73\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3d\x41" -"\x28\x41\x28\x7b\x7d\x2c\x46\x61\x29\x2c\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x29\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x7c\x7c\x54\x3b\x74\x68\x69\x73\x2e\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74" -"\x7c\x7c\x21\x74\x28\x65\x2e\x74\x61\x67\x29\x7d\x2c\x74\x68\x69\x73\x2e\x6f\x6e\x63\x65\x49\x64\x3d\x30\x2c\x74\x68\x69\x73\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x5b\x5d\x2c\x74\x68\x69\x73\x2e\x70\x72\x65\x3d\x21\x31\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x6e\x65\x77\x20\x50\x61\x28\x74\x29\x3b\x72\x65\x74" -"\x75\x72\x6e\x7b\x72\x65\x6e\x64\x65\x72\x3a\x22\x77\x69\x74\x68\x28\x74\x68\x69\x73\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x28\x65\x3f\x22\x73\x63\x72\x69\x70\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x3f\x22\x6e\x75\x6c\x6c\x22\x3a\x48\x61\x28\x65\x2c\x6e\x29\x3a\x27\x5f\x63\x28\x22\x64\x69\x76\x22\x29\x27\x29\x2b\x22\x7d\x22\x2c\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3a" -"\x6e\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x61\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x70\x61\x72\x65\x6e\x74\x26\x26\x28\x65\x2e\x70\x72\x65\x3d\x65\x2e\x70\x72\x65\x7c\x7c\x65\x2e\x70\x61\x72\x65\x6e\x74\x2e\x70\x72\x65\x29\x2c\x65\x2e\x73\x74\x61\x74\x69\x63\x52\x6f\x6f\x74\x26\x26\x21\x65\x2e\x73\x74\x61\x74\x69\x63" -"\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x6f\x6e\x63\x65\x26\x26\x21\x65\x2e\x6f\x6e\x63\x65\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x55\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x66\x6f\x72\x26\x26\x21\x65\x2e\x66\x6f\x72\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e" -"\x20\x7a\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x69\x66\x26\x26\x21\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x56\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x21\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x74\x2e\x70\x72\x65\x29\x7b\x69\x66\x28\x22\x73\x6c\x6f\x74" -"\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x73\x6c\x6f\x74\x4e\x61\x6d\x65\x7c\x7c\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x2c\x72\x3d\x57\x61\x28\x65\x2c\x74\x29\x2c\x69\x3d\x22\x5f\x74\x28\x22\x2b\x6e\x2b\x28\x72\x3f\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74" -"\x75\x72\x6e\x20\x22\x2b\x72\x2b\x22\x7d\x22\x3a\x22\x22\x29\x2c\x6f\x3d\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x3f\x58\x61\x28\x28\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x5b\x5d\x29\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x7c\x7c\x5b\x5d\x29\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" -"\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x6e\x61\x6d\x65\x3a\x62\x28\x65\x2e\x6e\x61\x6d\x65\x29\x2c\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x7d\x7d\x29\x29\x3a\x6e\x75\x6c\x6c\x2c\x61\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x76\x2d\x62\x69\x6e\x64\x22\x5d\x3b\x21\x6f\x26\x26\x21\x61\x7c\x7c\x72\x7c\x7c\x28" -"\x69\x2b\x3d\x22\x2c\x6e\x75\x6c\x6c\x22\x29\x3b\x6f\x26\x26\x28\x69\x2b\x3d\x22\x2c\x22\x2b\x6f\x29\x3b\x61\x26\x26\x28\x69\x2b\x3d\x28\x6f\x3f\x22\x22\x3a\x22\x2c\x6e\x75\x6c\x6c\x22\x29\x2b\x22\x2c\x22\x2b\x61\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x2b\x22\x29\x22\x7d\x28\x65\x2c\x74\x29\x3b\x76\x61\x72\x20\x6e\x3b\x69\x66\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x6e\x3d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3f\x6e\x75\x6c\x6c\x3a\x57\x61\x28\x74\x2c\x6e\x2c\x21\x30\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x5f\x63\x28\x22\x2b\x65\x2b\x22\x2c\x22\x2b\x4b\x61\x28\x74\x2c\x6e\x29\x2b\x28\x72\x3f\x22\x2c\x22\x2b\x72\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x28\x65\x2e\x63\x6f" -"\x6d\x70\x6f\x6e\x65\x6e\x74\x2c\x65\x2c\x74\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x72\x3b\x28\x21\x65\x2e\x70\x6c\x61\x69\x6e\x7c\x7c\x65\x2e\x70\x72\x65\x26\x26\x74\x2e\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x28\x65\x29\x29\x26\x26\x28\x72\x3d\x4b\x61\x28\x65\x2c\x74\x29\x29\x3b\x76\x61\x72\x20\x69\x3d\x65\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3f\x6e" -"\x75\x6c\x6c\x3a\x57\x61\x28\x65\x2c\x74\x2c\x21\x30\x29\x3b\x6e\x3d\x22\x5f\x63\x28\x27\x22\x2b\x65\x2e\x74\x61\x67\x2b\x22\x27\x22\x2b\x28\x72\x3f\x22\x2c\x22\x2b\x72\x3a\x22\x22\x29\x2b\x28\x69\x3f\x22\x2c\x22\x2b\x69\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x30\x3b\x6f\x3c\x74\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x2b" -"\x2b\x29\x6e\x3d\x74\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x73\x5b\x6f\x5d\x28\x65\x2c\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x72\x65\x74\x75\x72\x6e\x20\x57\x61\x28\x65\x2c\x74\x29\x7c\x7c\x22\x76\x6f\x69\x64\x20\x30\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x61\x28\x65\x2c\x74\x29\x7b\x65\x2e\x73\x74\x61\x74\x69\x63\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x3b\x76\x61\x72" -"\x20\x6e\x3d\x74\x2e\x70\x72\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x72\x65\x26\x26\x28\x74\x2e\x70\x72\x65\x3d\x65\x2e\x70\x72\x65\x29\x2c\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x70\x75\x73\x68\x28\x22\x77\x69\x74\x68\x28\x74\x68\x69\x73\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x48\x61\x28\x65\x2c\x74\x29\x2b\x22\x7d\x22\x29\x2c\x74\x2e\x70\x72\x65\x3d" -"\x6e\x2c\x22\x5f\x6d\x28\x22\x2b\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x29\x2b\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x49\x6e\x46\x6f\x72\x3f\x22\x2c\x74\x72\x75\x65\x22\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x61\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x6f\x6e\x63\x65\x50\x72\x6f\x63\x65\x73" -"\x73\x65\x64\x3d\x21\x30\x2c\x65\x2e\x69\x66\x26\x26\x21\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x56\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x49\x6e\x46\x6f\x72\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x22\x22\x2c\x72\x3d\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x72\x3b\x29\x7b\x69\x66\x28\x72\x2e\x66\x6f\x72\x29\x7b\x6e" -"\x3d\x72\x2e\x6b\x65\x79\x3b\x62\x72\x65\x61\x6b\x7d\x72\x3d\x72\x2e\x70\x61\x72\x65\x6e\x74\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x22\x5f\x6f\x28\x22\x2b\x48\x61\x28\x65\x2c\x74\x29\x2b\x22\x2c\x22\x2b\x74\x2e\x6f\x6e\x63\x65\x49\x64\x2b\x2b\x2b\x22\x2c\x22\x2b\x6e\x2b\x22\x29\x22\x3a\x48\x61\x28\x65\x2c\x74\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x42\x61\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74" -"\x69\x6f\x6e\x20\x56\x61\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x69\x66\x28\x21\x74\x2e\x6c\x65\x6e\x67\x74\x68\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x7c\x7c\x22\x5f\x65\x28\x29\x22\x3b\x76\x61\x72\x20\x6f\x3d\x74\x2e\x73\x68" -"\x69\x66\x74\x28\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x65\x78\x70\x3f\x22\x28\x22\x2b\x6f\x2e\x65\x78\x70\x2b\x22\x29\x3f\x22\x2b\x61\x28\x6f\x2e\x62\x6c\x6f\x63\x6b\x29\x2b\x22\x3a\x22\x2b\x65\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x3a\x22\x22\x2b\x61\x28\x6f\x2e\x62\x6c\x6f\x63\x6b\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x72\x3f\x72\x28\x65" -"\x2c\x6e\x29\x3a\x65\x2e\x6f\x6e\x63\x65\x3f\x55\x61\x28\x65\x2c\x6e\x29\x3a\x48\x61\x28\x65\x2c\x6e\x29\x7d\x7d\x28\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x74\x2c\x6e\x2c\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x61\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x66\x6f\x72\x2c\x6f\x3d\x65\x2e\x61\x6c\x69\x61" -"\x73\x2c\x61\x3d\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x31\x3f\x22\x2c\x22\x2b\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x31\x3a\x22\x22\x2c\x73\x3d\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x32\x3f\x22\x2c\x22\x2b\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x32\x3a\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x66\x6f\x72\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x28\x72\x7c\x7c\x22\x5f\x6c" -"\x22\x29\x2b\x22\x28\x28\x22\x2b\x69\x2b\x22\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x22\x2b\x6f\x2b\x61\x2b\x73\x2b\x22\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x28\x6e\x7c\x7c\x48\x61\x29\x28\x65\x2c\x74\x29\x2b\x22\x7d\x29\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x22\x7b\x22\x2c\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c" -"\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3b\x69\x66\x28\x21\x6e\x29\x72\x65\x74\x75\x72\x6e\x3b\x76\x61\x72\x20\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x3d\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3a\x5b\x22\x2c\x63\x3d\x21\x31\x3b\x66\x6f\x72\x28\x72\x3d\x30\x2c\x69\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x6f\x3d\x6e" -"\x5b\x72\x5d\x2c\x61\x3d\x21\x30\x3b\x76\x61\x72\x20\x75\x3d\x74\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x5b\x6f\x2e\x6e\x61\x6d\x65\x5d\x3b\x75\x26\x26\x28\x61\x3d\x21\x21\x75\x28\x65\x2c\x6f\x2c\x74\x2e\x77\x61\x72\x6e\x29\x29\x2c\x61\x26\x26\x28\x63\x3d\x21\x30\x2c\x73\x2b\x3d\x27\x7b\x6e\x61\x6d\x65\x3a\x22\x27\x2b\x6f\x2e\x6e\x61\x6d\x65\x2b\x27\x22\x2c\x72\x61\x77\x4e\x61\x6d\x65\x3a\x22" -"\x27\x2b\x6f\x2e\x72\x61\x77\x4e\x61\x6d\x65\x2b\x27\x22\x27\x2b\x28\x6f\x2e\x76\x61\x6c\x75\x65\x3f\x22\x2c\x76\x61\x6c\x75\x65\x3a\x28\x22\x2b\x6f\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x2e\x76\x61\x6c\x75\x65\x29\x3a\x22\x22\x29\x2b\x28\x6f\x2e\x61\x72\x67\x3f\x22\x2c\x61\x72\x67" -"\x3a\x22\x2b\x28\x6f\x2e\x69\x73\x44\x79\x6e\x61\x6d\x69\x63\x41\x72\x67\x3f\x6f\x2e\x61\x72\x67\x3a\x27\x22\x27\x2b\x6f\x2e\x61\x72\x67\x2b\x27\x22\x27\x29\x3a\x22\x22\x29\x2b\x28\x6f\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3f\x22\x2c\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3a\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x29\x3a\x22" -"\x22\x29\x2b\x22\x7d\x2c\x22\x29\x7d\x69\x66\x28\x63\x29\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x5d\x22\x7d\x28\x65\x2c\x74\x29\x3b\x72\x26\x26\x28\x6e\x2b\x3d\x72\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x6b\x65\x79\x26\x26\x28\x6e\x2b\x3d\x22\x6b\x65\x79\x3a\x22\x2b\x65\x2e\x6b\x65\x79\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x72\x65\x66\x26\x26\x28\x6e\x2b\x3d\x22" -"\x72\x65\x66\x3a\x22\x2b\x65\x2e\x72\x65\x66\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x72\x65\x66\x49\x6e\x46\x6f\x72\x26\x26\x28\x6e\x2b\x3d\x22\x72\x65\x66\x49\x6e\x46\x6f\x72\x3a\x74\x72\x75\x65\x2c\x22\x29\x2c\x65\x2e\x70\x72\x65\x26\x26\x28\x6e\x2b\x3d\x22\x70\x72\x65\x3a\x74\x72\x75\x65\x2c\x22\x29\x2c\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x26\x26\x28\x6e\x2b\x3d\x27\x74\x61\x67\x3a\x22\x27\x2b" -"\x65\x2e\x74\x61\x67\x2b\x27\x22\x2c\x27\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x74\x2e\x64\x61\x74\x61\x47\x65\x6e\x46\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x6e\x2b\x3d\x74\x2e\x64\x61\x74\x61\x47\x65\x6e\x46\x6e\x73\x5b\x69\x5d\x28\x65\x29\x3b\x69\x66\x28\x65\x2e\x61\x74\x74\x72\x73\x26\x26\x28\x6e\x2b\x3d\x22\x61\x74\x74\x72\x73\x3a\x22\x2b\x58\x61\x28" -"\x65\x2e\x61\x74\x74\x72\x73\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x70\x72\x6f\x70\x73\x26\x26\x28\x6e\x2b\x3d\x22\x64\x6f\x6d\x50\x72\x6f\x70\x73\x3a\x22\x2b\x58\x61\x28\x65\x2e\x70\x72\x6f\x70\x73\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x65\x76\x65\x6e\x74\x73\x26\x26\x28\x6e\x2b\x3d\x4c\x61\x28\x65\x2e\x65\x76\x65\x6e\x74\x73\x2c\x21\x31\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x6e\x61\x74\x69\x76\x65\x45" -"\x76\x65\x6e\x74\x73\x26\x26\x28\x6e\x2b\x3d\x4c\x61\x28\x65\x2e\x6e\x61\x74\x69\x76\x65\x45\x76\x65\x6e\x74\x73\x2c\x21\x30\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x26\x26\x21\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x26\x26\x28\x6e\x2b\x3d\x22\x73\x6c\x6f\x74\x3a\x22\x2b\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x73\x63" -"\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x26\x26\x28\x6e\x2b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x66\x6f\x72\x7c\x7c\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x5b\x65\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x73\x6c\x6f\x74" -"\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x7c\x7c\x6e\x2e\x69\x66\x7c\x7c\x6e\x2e\x66\x6f\x72\x7c\x7c\x4a\x61\x28\x6e\x29\x7d\x29\x2c\x69\x3d\x21\x21\x65\x2e\x69\x66\x3b\x69\x66\x28\x21\x72\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x6f\x3b\x29\x7b\x69\x66\x28\x6f\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x26\x26\x6f\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70" -"\x65\x21\x3d\x3d\x75\x61\x7c\x7c\x6f\x2e\x66\x6f\x72\x29\x7b\x72\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b\x7d\x6f\x2e\x69\x66\x26\x26\x28\x69\x3d\x21\x30\x29\x2c\x6f\x3d\x6f\x2e\x70\x61\x72\x65\x6e\x74\x7d\x76\x61\x72\x20\x61\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x71\x61\x28\x74\x5b\x65" -"\x5d\x2c\x6e\x29\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3a\x5f\x75\x28\x5b\x22\x2b\x61\x2b\x22\x5d\x22\x2b\x28\x72\x3f\x22\x2c\x6e\x75\x6c\x6c\x2c\x74\x72\x75\x65\x22\x3a\x22\x22\x29\x2b\x28\x21\x72\x26\x26\x69\x3f\x22\x2c\x6e\x75\x6c\x6c\x2c\x66\x61\x6c\x73\x65\x2c\x22\x2b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" -"\x29\x7b\x76\x61\x72\x20\x74\x3d\x35\x33\x38\x31\x2c\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x6f\x72\x28\x3b\x6e\x3b\x29\x74\x3d\x33\x33\x2a\x74\x5e\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x2d\x2d\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3e\x3e\x3e\x30\x7d\x28\x61\x29\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x28\x65\x2c\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74" -"\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x6d\x6f\x64\x65\x6c\x26\x26\x28\x6e\x2b\x3d\x22\x6d\x6f\x64\x65\x6c\x3a\x7b\x76\x61\x6c\x75\x65\x3a\x22\x2b\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x76\x61\x6c\x75\x65\x2b\x22\x2c\x63\x61\x6c\x6c\x62\x61\x63\x6b\x3a\x22\x2b\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x63\x61\x6c\x6c\x62\x61\x63\x6b\x2b\x22\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x22\x2b\x65\x2e\x6d\x6f\x64" -"\x65\x6c\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x22\x7d\x2c\x22\x29\x2c\x65\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x29\x7b\x76\x61\x72\x20\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x30\x5d\x3b\x69\x66\x28\x6e\x26\x26\x31\x3d\x3d\x3d\x6e\x2e\x74\x79\x70\x65\x29\x7b\x76\x61\x72\x20" -"\x72\x3d\x52\x61\x28\x6e\x2c\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3a\x7b\x72\x65\x6e\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x22\x2b\x72\x2e\x72\x65\x6e\x64\x65\x72\x2b\x22\x7d\x2c\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3a\x5b\x22\x2b\x72\x2e\x73\x74\x61\x74\x69\x63" -"\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x22\x2b\x65\x2b\x22\x7d\x22\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x2b\x22\x5d\x7d\x22\x7d\x7d\x28\x65\x2c\x74\x29\x3b\x6f\x26\x26\x28\x6e\x2b\x3d\x6f\x2b\x22\x2c\x22\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x3d\x6e" -"\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x2c\x24\x2f\x2c\x22\x22\x29\x2b\x22\x7d\x22\x2c\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x26\x26\x28\x6e\x3d\x22\x5f\x62\x28\x22\x2b\x6e\x2b\x27\x2c\x22\x27\x2b\x65\x2e\x74\x61\x67\x2b\x27\x22\x2c\x27\x2b\x58\x61\x28\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x29\x2b\x22\x29\x22\x29\x2c\x65\x2e\x77\x72\x61\x70\x44\x61\x74\x61\x26" -"\x26\x28\x6e\x3d\x65\x2e\x77\x72\x61\x70\x44\x61\x74\x61\x28\x6e\x29\x29\x2c\x65\x2e\x77\x72\x61\x70\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x26\x26\x28\x6e\x3d\x65\x2e\x77\x72\x61\x70\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x28\x6e\x29\x29\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x31\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x26\x26\x28\x22\x73\x6c\x6f" -"\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x73\x6f\x6d\x65\x28\x4a\x61\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x22\x5d\x3b\x69\x66\x28\x65\x2e\x69\x66\x26\x26\x21\x65\x2e\x69\x66\x50\x72\x6f\x63\x65" -"\x73\x73\x65\x64\x26\x26\x21\x6e\x29\x72\x65\x74\x75\x72\x6e\x20\x56\x61\x28\x65\x2c\x74\x2c\x71\x61\x2c\x22\x6e\x75\x6c\x6c\x22\x29\x3b\x69\x66\x28\x65\x2e\x66\x6f\x72\x26\x26\x21\x65\x2e\x66\x6f\x72\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x7a\x61\x28\x65\x2c\x74\x2c\x71\x61\x29\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x3d\x3d\x75\x61" -"\x3f\x22\x22\x3a\x53\x74\x72\x69\x6e\x67\x28\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x29\x2c\x69\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x22\x2b\x72\x2b\x22\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x3f\x65\x2e\x69\x66\x26\x26\x6e\x3f\x22\x28\x22\x2b\x65\x2e\x69\x66\x2b\x22\x29\x3f\x22\x2b\x28\x57\x61\x28\x65\x2c" -"\x74\x29\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x29\x2b\x22\x3a\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3a\x57\x61\x28\x65\x2c\x74\x29\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3a\x48\x61\x28\x65\x2c\x74\x29\x29\x2b\x22\x7d\x22\x2c\x6f\x3d\x72\x3f\x22\x22\x3a\x22\x2c\x70\x72\x6f\x78\x79\x3a\x74\x72\x75\x65\x22\x3b\x72\x65\x74\x75\x72\x6e\x22\x7b\x6b\x65\x79\x3a\x22\x2b\x28" -"\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x29\x2b\x22\x2c\x66\x6e\x3a\x22\x2b\x69\x2b\x6f\x2b\x22\x7d\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x61\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x61" -"\x3d\x6f\x5b\x30\x5d\x3b\x69\x66\x28\x31\x3d\x3d\x3d\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x61\x2e\x66\x6f\x72\x26\x26\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x21\x3d\x3d\x61\x2e\x74\x61\x67\x26\x26\x22\x73\x6c\x6f\x74\x22\x21\x3d\x3d\x61\x2e\x74\x61\x67\x29\x7b\x76\x61\x72\x20\x73\x3d\x6e\x3f\x74\x2e\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x28\x61\x29\x3f\x22\x2c\x31\x22\x3a\x22" -"\x2c\x30\x22\x3a\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x22\x22\x2b\x28\x72\x7c\x7c\x48\x61\x29\x28\x61\x2c\x74\x29\x2b\x73\x7d\x76\x61\x72\x20\x63\x3d\x6e\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x2c\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x72\x5d\x3b\x69\x66\x28\x31" -"\x3d\x3d\x3d\x69\x2e\x74\x79\x70\x65\x29\x7b\x69\x66\x28\x5a\x61\x28\x69\x29\x7c\x7c\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x26\x26\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x5a\x61\x28\x65\x2e\x62\x6c\x6f\x63\x6b\x29\x7d\x29\x29\x7b\x6e\x3d\x32\x3b\x62\x72\x65\x61\x6b" -"\x7d\x28\x74\x28\x69\x29\x7c\x7c\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x26\x26\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x28\x65\x2e\x62\x6c\x6f\x63\x6b\x29\x7d\x29\x29\x26\x26\x28\x6e\x3d\x31\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x28\x6f\x2c\x74\x2e\x6d" -"\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x3a\x30\x2c\x75\x3d\x69\x7c\x7c\x47\x61\x3b\x72\x65\x74\x75\x72\x6e\x22\x5b\x22\x2b\x6f\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x75\x28\x65\x2c\x74\x29\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x2b\x22\x5d\x22\x2b\x28\x63\x3f\x22\x2c\x22\x2b\x63\x3a\x22\x22\x29\x7d\x7d\x66\x75\x6e" -"\x63\x74\x69\x6f\x6e\x20\x5a\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x65\x2e\x66\x6f\x72\x7c\x7c\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x22\x73\x6c\x6f\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x61\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x31\x3d\x3d\x3d\x65\x2e" -"\x74\x79\x70\x65\x3f\x48\x61\x28\x65\x2c\x74\x29\x3a\x33\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x26\x26\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3f\x28\x72\x3d\x65\x2c\x22\x5f\x65\x28\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x72\x2e\x74\x65\x78\x74\x29\x2b\x22\x29\x22\x29\x3a\x22\x5f\x76\x28\x22\x2b\x28\x32\x3d\x3d\x3d\x28\x6e\x3d\x65\x29\x2e\x74\x79\x70\x65\x3f\x6e\x2e" -"\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x59\x61\x28\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6e\x2e\x74\x65\x78\x74\x29\x29\x29\x2b\x22\x29\x22\x3b\x76\x61\x72\x20\x6e\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x61\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x22\x22\x2c\x6e\x3d\x22\x22\x2c\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72" -"\x2b\x2b\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x72\x5d\x2c\x6f\x3d\x59\x61\x28\x69\x2e\x76\x61\x6c\x75\x65\x29\x3b\x69\x2e\x64\x79\x6e\x61\x6d\x69\x63\x3f\x6e\x2b\x3d\x69\x2e\x6e\x61\x6d\x65\x2b\x22\x2c\x22\x2b\x6f\x2b\x22\x2c\x22\x3a\x74\x2b\x3d\x27\x22\x27\x2b\x69\x2e\x6e\x61\x6d\x65\x2b\x27\x22\x3a\x27\x2b\x6f\x2b\x22\x2c\x22\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x3d\x22\x7b\x22\x2b\x74\x2e\x73" -"\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x7d\x22\x2c\x6e\x3f\x22\x5f\x64\x28\x22\x2b\x74\x2b\x22\x2c\x5b\x22\x2b\x6e\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x5d\x29\x22\x3a\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x59\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x5c\x75\x32\x30\x32\x38\x2f\x67\x2c\x22\x5c\x5c\x75\x32\x30\x32" -"\x38\x22\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x5c\x75\x32\x30\x32\x39\x2f\x67\x2c\x22\x5c\x5c\x75\x32\x30\x32\x39\x22\x29\x7d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5c\x5c\x62\x22\x2b\x22\x64\x6f\x2c\x69\x66\x2c\x66\x6f\x72\x2c\x6c\x65\x74\x2c\x6e\x65\x77\x2c\x74\x72\x79\x2c\x76\x61\x72\x2c\x63\x61\x73\x65\x2c\x65\x6c\x73\x65\x2c\x77\x69\x74\x68\x2c\x61\x77\x61\x69\x74\x2c\x62\x72" -"\x65\x61\x6b\x2c\x63\x61\x74\x63\x68\x2c\x63\x6c\x61\x73\x73\x2c\x63\x6f\x6e\x73\x74\x2c\x73\x75\x70\x65\x72\x2c\x74\x68\x72\x6f\x77\x2c\x77\x68\x69\x6c\x65\x2c\x79\x69\x65\x6c\x64\x2c\x64\x65\x6c\x65\x74\x65\x2c\x65\x78\x70\x6f\x72\x74\x2c\x69\x6d\x70\x6f\x72\x74\x2c\x72\x65\x74\x75\x72\x6e\x2c\x73\x77\x69\x74\x63\x68\x2c\x64\x65\x66\x61\x75\x6c\x74\x2c\x65\x78\x74\x65\x6e\x64\x73\x2c\x66\x69\x6e" -"\x61\x6c\x6c\x79\x2c\x63\x6f\x6e\x74\x69\x6e\x75\x65\x2c\x64\x65\x62\x75\x67\x67\x65\x72\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x22\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x22\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x5c\x5c\x62\x7c\x5c\x5c\x62\x22\x29\x2b\x22\x5c\x5c\x62\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x61\x28\x65\x2c\x74\x29\x7b\x74\x72\x79\x7b\x72\x65" -"\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x46\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7d\x63\x61\x74\x63\x68\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x70\x75\x73\x68\x28\x7b\x65\x72\x72\x3a\x6e\x2c\x63\x6f\x64\x65\x3a\x65\x7d\x29\x2c\x53\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x73\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75" -"\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x2c\x72\x2c\x69\x29\x7b\x28\x72\x3d\x41\x28\x7b\x7d\x2c\x72\x29\x29\x2e\x77\x61\x72\x6e\x3b\x64\x65\x6c\x65\x74\x65\x20\x72\x2e\x77\x61\x72\x6e\x3b\x76\x61\x72\x20\x6f\x3d\x72\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x3f\x53\x74\x72\x69\x6e\x67\x28\x72\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x29\x2b\x6e\x3a" -"\x6e\x3b\x69\x66\x28\x74\x5b\x6f\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x5b\x6f\x5d\x3b\x76\x61\x72\x20\x61\x3d\x65\x28\x6e\x2c\x72\x29\x2c\x73\x3d\x7b\x7d\x2c\x63\x3d\x5b\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x72\x65\x6e\x64\x65\x72\x3d\x51\x61\x28\x61\x2e\x72\x65\x6e\x64\x65\x72\x2c\x63\x29\x2c\x73\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x61\x2e\x73\x74\x61\x74" -"\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x51\x61\x28\x65\x2c\x63\x29\x7d\x29\x2c\x74\x5b\x6f\x5d\x3d\x73\x7d\x7d\x76\x61\x72\x20\x74\x73\x2c\x6e\x73\x2c\x72\x73\x3d\x28\x74\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x61\x28\x65\x2e\x74\x72\x69\x6d\x28" -"\x29\x2c\x74\x29\x3b\x21\x31\x21\x3d\x3d\x74\x2e\x6f\x70\x74\x69\x6d\x69\x7a\x65\x26\x26\x41\x61\x28\x6e\x2c\x74\x29\x3b\x76\x61\x72\x20\x72\x3d\x52\x61\x28\x6e\x2c\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x61\x73\x74\x3a\x6e\x2c\x72\x65\x6e\x64\x65\x72\x3a\x72\x2e\x72\x65\x6e\x64\x65\x72\x2c\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3a\x72\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e" -"\x64\x65\x72\x46\x6e\x73\x7d\x7d\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x28\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x29\x2c\x69\x3d\x5b\x5d\x2c\x6f\x3d\x5b\x5d\x3b\x69\x66\x28\x6e\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x20\x69\x6e\x20\x6e\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x26\x26\x28" -"\x72\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x3d\x28\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x7c\x7c\x5b\x5d\x29\x2e\x63\x6f\x6e\x63\x61\x74\x28\x6e\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x29\x29\x2c\x6e\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x26\x26\x28\x72\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3d\x41\x28\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65" -"\x73\x7c\x7c\x6e\x75\x6c\x6c\x29\x2c\x6e\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x29\x29\x2c\x6e\x29\x22\x6d\x6f\x64\x75\x6c\x65\x73\x22\x21\x3d\x3d\x61\x26\x26\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x22\x21\x3d\x3d\x61\x26\x26\x28\x72\x5b\x61\x5d\x3d\x6e\x5b\x61\x5d\x29\x3b\x72\x2e\x77\x61\x72\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x28\x6e\x3f\x6f\x3a\x69" -"\x29\x2e\x70\x75\x73\x68\x28\x65\x29\x7d\x3b\x76\x61\x72\x20\x73\x3d\x74\x73\x28\x74\x2e\x74\x72\x69\x6d\x28\x29\x2c\x72\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x65\x72\x72\x6f\x72\x73\x3d\x69\x2c\x73\x2e\x74\x69\x70\x73\x3d\x6f\x2c\x73\x7d\x72\x65\x74\x75\x72\x6e\x7b\x63\x6f\x6d\x70\x69\x6c\x65\x3a\x74\x2c\x63\x6f\x6d\x70\x69\x6c\x65\x54\x6f\x46\x75\x6e\x63\x74\x69\x6f\x6e\x73\x3a\x65\x73\x28" -"\x74\x29\x7d\x7d\x29\x28\x78\x61\x29\x2c\x69\x73\x3d\x28\x72\x73\x2e\x63\x6f\x6d\x70\x69\x6c\x65\x2c\x72\x73\x2e\x63\x6f\x6d\x70\x69\x6c\x65\x54\x6f\x46\x75\x6e\x63\x74\x69\x6f\x6e\x73\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x73\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x6e\x73\x3d\x6e\x73\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28" -"\x22\x64\x69\x76\x22\x29\x29\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x3d\x65\x3f\x27\x3c\x61\x20\x68\x72\x65\x66\x3d\x22\x5c\x6e\x22\x2f\x3e\x27\x3a\x27\x3c\x64\x69\x76\x20\x61\x3d\x22\x5c\x6e\x22\x2f\x3e\x27\x2c\x6e\x73\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x26\x23\x31\x30\x3b\x22\x29\x3e\x30\x7d\x76\x61\x72\x20\x61\x73\x3d\x21\x21\x56\x26\x26\x6f\x73\x28" -"\x21\x31\x29\x2c\x73\x73\x3d\x21\x21\x56\x26\x26\x6f\x73\x28\x21\x30\x29\x2c\x63\x73\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x51\x6e\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x74\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x7d\x29\x2c\x75\x73\x3d\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6d\x6f\x75\x6e\x74\x3b\x72\x65\x74\x75\x72" -"\x6e\x20\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6d\x6f\x75\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x28\x65\x3d\x65\x26\x26\x51\x6e\x28\x65\x29\x29\x3d\x3d\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x62\x6f\x64\x79\x7c\x7c\x65\x3d\x3d\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x64\x6f\x63\x75\x6d\x65\x6e\x74\x45\x6c\x65\x6d\x65\x6e\x74\x29\x72\x65" -"\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x3b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x21\x6e\x2e\x72\x65\x6e\x64\x65\x72\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x2e\x74\x65\x6d\x70\x6c\x61\x74\x65\x3b\x69\x66\x28\x72\x29\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x29\x22\x23\x22\x3d\x3d\x3d\x72\x2e\x63\x68\x61\x72" -"\x41\x74\x28\x30\x29\x26\x26\x28\x72\x3d\x63\x73\x28\x72\x29\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x21\x72\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x3b\x72\x3d\x72\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x7d\x65\x6c\x73\x65\x20\x65\x26\x26\x28\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x2e\x6f\x75\x74\x65\x72\x48\x54\x4d\x4c" -"\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6f\x75\x74\x65\x72\x48\x54\x4d\x4c\x3b\x76\x61\x72\x20\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x65\x2e\x63\x6c\x6f\x6e\x65\x4e\x6f\x64\x65\x28\x21\x30\x29\x29\x2c\x74\x2e\x69\x6e\x6e\x65" -"\x72\x48\x54\x4d\x4c\x7d\x28\x65\x29\x29\x3b\x69\x66\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x69\x73\x28\x72\x2c\x7b\x6f\x75\x74\x70\x75\x74\x53\x6f\x75\x72\x63\x65\x52\x61\x6e\x67\x65\x3a\x21\x31\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x3a\x61\x73\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65" -"\x66\x3a\x73\x73\x2c\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x3a\x6e\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x2c\x63\x6f\x6d\x6d\x65\x6e\x74\x73\x3a\x6e\x2e\x63\x6f\x6d\x6d\x65\x6e\x74\x73\x7d\x2c\x74\x68\x69\x73\x29\x2c\x6f\x3d\x69\x2e\x72\x65\x6e\x64\x65\x72\x2c\x61\x3d\x69\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3b\x6e\x2e\x72\x65\x6e\x64\x65\x72\x3d\x6f\x2c\x6e\x2e" -"\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x61\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x75\x73\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2c\x65\x2c\x74\x29\x7d\x2c\x43\x6e\x2e\x63\x6f\x6d\x70\x69\x6c\x65\x3d\x69\x73\x2c\x43\x6e\x7d\x29\x3b\x0d\x0a\x00\x00"; +"\x20\x31\x38\x2c\x20\x33\x32\x2c\x20\x33\x30\x5d\x2c\x20\x6e\x61\x6d\x65\x3a\x20\x27\x45\x61\x72\x74\x68\x27\x2c\x20\x77\x6f\x72\x6d\x68\x6f\x6c\x65\x3a\x20\x35\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x33\x2c\x20\x33\x34\x2c\x20\x31\x32\x2c\x20\x37\x2c\x20\x31\x39\x2c\x20\x36\x2c\x20\x32\x39\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20" +"\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4a\x75\x6e\x67\x6c\x65\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x37\x2c\x20\x38\x2c\x20\x31\x34\x2c\x20\x31\x37\x2c\x20\x33\x32\x2c\x20\x32\x33\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x44\x65\x73\x65\x72\x74\x20\x50" +"\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x35\x2c\x20\x33\x35\x2c\x20\x38\x2c\x20\x33\x30\x2c\x20\x33\x31\x2c\x20\x32\x39\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x48\x6f\x74\x68\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78" +"\x65\x73\x3a\x20\x5b\x31\x2c\x20\x33\x34\x2c\x20\x31\x32\x2c\x20\x37\x2c\x20\x32\x35\x2c\x20\x33\x32\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x47\x72\x61\x76\x65\x20\x50\x69\x74\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x30\x2c\x20\x31\x32\x2c\x20\x31" +"\x34\x2c\x20\x32\x33\x2c\x20\x33\x32\x2c\x20\x32\x33\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x52\x75\x69\x6e\x73\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x34\x2c\x20\x32\x30\x2c\x20\x32\x33\x2c\x20\x32\x38\x2c\x20\x36\x2c\x20\x31\x31\x2c\x20\x33\x33\x5d\x2c\x20" +"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x46\x6f\x67\x67\x79\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x34\x2c\x20\x31\x37\x2c\x20\x32\x33\x2c\x20\x33\x32\x2c\x20\x33\x35\x2c\x20\x38\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x44" +"\x65\x70\x6f\x72\x74\x61\x74\x69\x6f\x6e\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x33\x2c\x20\x31\x33\x2c\x20\x31\x37\x2c\x20\x31\x39\x2c\x20\x31\x2c\x20\x33\x35\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x43\x6c\x6f\x76\x65\x72\x64\x61\x6c\x65\x20\x50\x6c" +"\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x32\x2c\x20\x31\x34\x2c\x20\x31\x38\x2c\x20\x32\x33\x2c\x20\x33\x30\x2c\x20\x35\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4d\x61\x6c\x69\x63\x65\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d" +"\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x35\x2c\x20\x31\x37\x2c\x20\x32\x33\x2c\x20\x32\x35\x2c\x20\x31\x2c\x20\x32\x38\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4e\x6f\x76\x75\x73\x20\x43\x6f\x6c\x6f\x6e\x79\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a" +"\x20\x5b\x36\x2c\x20\x32\x36\x2c\x20\x32\x38\x2c\x20\x31\x30\x2c\x20\x33\x31\x2c\x20\x31\x32\x2c\x20\x33\x33\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x4c\x61\x73\x74\x20\x50\x6c\x61\x6e\x65\x74\x27\x20\x7d\x2c\x0d\x0a\x20\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x35\x2c\x20\x31\x33\x2c\x20\x33\x34\x2c\x20\x31\x38\x2c\x20\x33\x31" +"\x2c\x20\x37\x2c\x20\x34\x5d\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x57\x6f\x72\x6d\x68\x6f\x6c\x65\x27\x2c\x20\x77\x6f\x72\x6d\x68\x6f\x6c\x65\x3a\x20\x33\x20\x7d\x2c\x0d\x0a\x20\x20\x2f\x2f\x20\x7b\x20\x73\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x65\x73\x3a\x20\x5b\x31\x2c\x20\x33\x36\x2c\x20\x32\x2c\x20\x33\x35\x2c\x20\x33\x2c\x20\x33\x34\x5d\x2c\x20\x20" +"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x61\x6d\x65\x3a\x20\x27\x54\x65\x73\x74\x20\x23\x31\x27\x20\x7d\x2c\x0d\x0a\x5d\x3b\x0d\x0a\x0d\x0a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x65\x74\x53\x79\x6d\x62\x6f\x6c\x49\x6e\x64\x65\x78\x28\x53\x79\x6d\x62\x6f\x6c\x4f\x6e\x65\x42\x61\x73\x65\x64\x29\x0d\x0a\x7b\x0d\x0a\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x61\x6c\x6c\x73\x79\x6d\x62" +"\x6f\x6c\x73\x5b\x53\x79\x6d\x62\x6f\x6c\x4f\x6e\x65\x42\x61\x73\x65\x64\x2d\x31\x5d\x3b\x0d\x0a\x7d\x0d\x0a\x0d\x0a\x6c\x65\x74\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x20\x3d\x0d\x0a\x7b\x0d\x0a\x20\x20\x73\x79\x6d\x62\x6f\x6c\x73\x3a\x20\x61\x6c\x6c\x73\x79\x6d\x62\x6f\x6c\x73\x2c\x0d\x0a\x20\x20\x61\x6c\x6c\x61\x64\x64\x72\x65\x73\x73\x65\x73\x3a\x20\x61\x6c\x6c\x61\x64\x64\x72\x65\x73" +"\x73\x65\x73\x2c\x0d\x0a\x0d\x0a\x20\x20\x73\x74\x61\x74\x75\x73\x3a\x20\x7b\x0d\x0a\x20\x20\x20\x20\x74\x65\x78\x74\x3a\x20\x22\x22\x2c\x0d\x0a\x20\x20\x20\x20\x63\x61\x6e\x63\x65\x6c\x5f\x72\x65\x71\x75\x65\x73\x74\x3a\x20\x66\x61\x6c\x73\x65\x2c\x0d\x0a\x20\x20\x20\x20\x74\x69\x6d\x65\x5f\x68\x6f\x75\x72\x3a\x20\x30\x2c\x20\x74\x69\x6d\x65\x5f\x6d\x69\x6e\x3a\x20\x30\x0d\x0a\x20\x20\x7d\x2c\x0d" +"\x0a\x20\x20\x69\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x3a\x20\x66\x61\x6c\x73\x65\x2c\x0d\x0a\x20\x20\x69\x73\x5f\x61\x64\x76\x5f\x6d\x6f\x64\x65\x3a\x20\x66\x61\x6c\x73\x65\x0d\x0a\x7d\x3b\x0d\x0a\x0d\x0a\x76\x61\x72\x20\x63\x75\x72\x72\x65\x6e\x74\x41\x70\x70\x20\x3d\x20\x6e\x65\x77\x20\x56\x75\x65\x28\x7b\x0d\x0a\x20\x20\x65\x6c\x3a\x20\x27\x23\x61\x70\x70\x27\x2c\x0d\x0a\x20\x20\x64\x61" +"\x74\x61\x3a\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x0d\x0a\x7d\x29\x0d\x0a\x0d\x0a\x61\x73\x79\x6e\x63\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x28\x29\x20\x7b\x0d\x0a\x0d\x0a\x20\x20\x2f\x2f\x20\x47\x65\x74\x20\x73\x79\x73\x74\x65\x6d\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\x73\x0d\x0a\x20\x20\x61\x77\x61\x69\x74\x20\x66\x65\x74\x63" +"\x68\x28\x27\x2f\x61\x70\x69\x2f\x67\x65\x74\x73\x74\x61\x74\x75\x73\x27\x29\x0d\x0a\x20\x20\x20\x20\x20\x20\x2e\x74\x68\x65\x6e\x28\x28\x72\x65\x73\x70\x6f\x6e\x73\x65\x29\x20\x3d\x3e\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x72\x65\x73\x70\x6f\x6e\x73\x65\x2e\x6f\x6b\x29\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x68\x72\x6f\x77" +"\x20\x6e\x65\x77\x20\x45\x72\x72\x6f\x72\x28\x27\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\x20\x67\x65\x74\x20\x73\x74\x61\x74\x75\x73\x27\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x7d\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x72\x65\x73\x70\x6f\x6e\x73\x65\x2e\x6a\x73\x6f\x6e\x28\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x7d\x29\x0d\x0a\x20\x20\x20\x20\x20" +"\x20\x2e\x74\x68\x65\x6e\x28\x28\x64\x61\x74\x61\x29\x20\x3d\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x6c\x6f\x67\x28\x22\x64\x61\x74\x61\x3a\x20\x22\x2c\x20\x64\x61\x74\x61\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x2e\x73\x74\x61\x74\x75\x73\x20\x3d\x20\x64\x61\x74\x61\x2e\x73" +"\x74\x61\x74\x75\x73\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x2e\x69\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x20\x3d\x20\x74\x72\x75\x65\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x2c\x20\x35\x30\x30\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x7d\x29\x0d\x0a" +"\x20\x20\x20\x20\x20\x20\x2e\x63\x61\x74\x63\x68\x28\x28\x65\x78\x29\x20\x3d\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72\x2c\x20\x35\x30\x30\x30\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x44\x61\x74\x61\x2e\x69\x73\x5f\x63" +"\x6f\x6e\x6e\x65\x63\x74\x65\x64\x20\x3d\x20\x66\x61\x6c\x73\x65\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x65\x72\x72\x6f\x72\x28\x27\x67\x65\x74\x73\x74\x61\x74\x75\x73\x27\x2c\x20\x65\x78\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x7d\x29\x3b\x0d\x0a\x7d\x0d\x0a\x0d\x0a\x77\x69\x6e\x64\x6f\x77\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65" +"\x72\x28\x0d\x0a\x20\x20\x22\x6c\x6f\x61\x64\x22\x2c\x0d\x0a\x20\x20\x28\x65\x76\x65\x6e\x74\x29\x20\x3d\x3e\x20\x7b\x0d\x0a\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x6c\x6f\x67\x28\x22\x70\x61\x67\x65\x20\x69\x73\x20\x66\x75\x6c\x6c\x79\x20\x6c\x6f\x61\x64\x65\x64\x22\x29\x3b\x0d\x0a\x20\x20\x20\x20\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x74\x69\x6d\x65\x72\x48\x61\x6e\x64\x6c\x65\x72" +"\x2c\x20\x35\x30\x30\x29\x3b\x0d\x0a\x7d\x29\x3b\x0d\x0a\x00\x00\x0d\x0a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x70\x70\x4c\x6f\x61\x64\x65\x64\x28\x29\x0d\x0a\x7b\x0d\x0a\x20\x20\x66\x65\x74\x63\x68\x28\x27\x2e\x2f\x61\x70\x69\x2f\x67\x65\x74\x73\x65\x74\x74\x69\x6e\x67\x73\x6a\x73\x6f\x6e\x27\x29\x0d\x0a\x20\x20\x20\x20\x2e\x74\x68\x65\x6e\x28\x28\x72\x65\x73\x70\x6f\x6e\x73\x65\x29\x20\x3d\x3e" +"\x20\x72\x65\x73\x70\x6f\x6e\x73\x65\x2e\x6a\x73\x6f\x6e\x28\x29\x29\x0d\x0a\x20\x20\x20\x20\x2e\x74\x68\x65\x6e\x28\x28\x64\x61\x74\x61\x29\x20\x3d\x3e\x0d\x0a\x20\x20\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x6c\x6f\x67\x28\x64\x61\x74\x61\x29\x3b\x0d\x0a\x20\x20\x20\x20\x20\x20\x63\x75\x72\x72\x65\x6e\x74\x41\x70\x70\x2e\x65\x6e\x74\x72\x69\x65\x73\x20\x3d\x20" +"\x64\x61\x74\x61\x2e\x65\x6e\x74\x72\x69\x65\x73\x3b\x0d\x0a\x20\x20\x20\x20\x7d\x29\x3b\x0d\x0a\x7d\x0d\x0a\x0d\x0a\x76\x61\x72\x20\x63\x75\x72\x72\x65\x6e\x74\x41\x70\x70\x20\x3d\x20\x6e\x65\x77\x20\x56\x75\x65\x28\x7b\x0d\x0a\x20\x20\x20\x20\x65\x6c\x3a\x20\x27\x23\x61\x70\x70\x27\x2c\x0d\x0a\x20\x20\x20\x20\x64\x61\x74\x61\x3a\x0d\x0a\x20\x20\x20\x20\x7b\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20" +"\x65\x6e\x74\x72\x69\x65\x73\x3a\x20\x5b\x5d\x2c\x0d\x0a\x20\x20\x20\x20\x7d\x0d\x0a\x20\x20\x7d\x29\x0d\x0a\x00\x00\x00\x00\x00\x2f\x2a\x21\x0d\x0a\x20\x2a\x20\x56\x75\x65\x2e\x6a\x73\x20\x76\x32\x2e\x36\x2e\x31\x34\x0d\x0a\x20\x2a\x20\x28\x63\x29\x20\x32\x30\x31\x34\x2d\x32\x30\x32\x31\x20\x45\x76\x61\x6e\x20\x59\x6f\x75\x0d\x0a\x20\x2a\x20\x52\x65\x6c\x65\x61\x73\x65\x64\x20\x75\x6e\x64\x65\x72" +"\x20\x74\x68\x65\x20\x4d\x49\x54\x20\x4c\x69\x63\x65\x6e\x73\x65\x2e\x0d\x0a\x20\x2a\x2f\x0d\x0a\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x78\x70\x6f\x72\x74\x73\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x6d\x6f\x64\x75\x6c\x65\x3f\x6d\x6f\x64\x75\x6c\x65\x2e\x65" +"\x78\x70\x6f\x72\x74\x73\x3d\x74\x28\x29\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x64\x65\x66\x69\x6e\x65\x26\x26\x64\x65\x66\x69\x6e\x65\x2e\x61\x6d\x64\x3f\x64\x65\x66\x69\x6e\x65\x28\x74\x29\x3a\x28\x65\x3d\x65\x7c\x7c\x73\x65\x6c\x66\x29\x2e\x56\x75\x65\x3d\x74\x28\x29\x7d\x28\x74\x68\x69\x73\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x22\x75\x73\x65" +"\x20\x73\x74\x72\x69\x63\x74\x22\x3b\x76\x61\x72\x20\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x66\x72\x65\x65\x7a\x65\x28\x7b\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x21\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20" +"\x72\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x30\x3d\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7c\x7c\x22\x6e\x75\x6d\x62\x65\x72\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7c\x7c\x22\x73\x79\x6d\x62\x6f\x6c\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7c\x7c\x22\x62" +"\x6f\x6f\x6c\x65\x61\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x21\x3d\x3d\x65\x26\x26\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x7d\x76\x61\x72\x20\x61\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x3b" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x73\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x4f\x62\x6a\x65\x63\x74\x5d\x22\x3d\x3d\x3d\x61\x2e\x63\x61\x6c\x6c\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x70\x61\x72\x73\x65\x46\x6c\x6f\x61\x74\x28\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74" +"\x3e\x3d\x30\x26\x26\x4d\x61\x74\x68\x2e\x66\x6c\x6f\x6f\x72\x28\x74\x29\x3d\x3d\x3d\x74\x26\x26\x69\x73\x46\x69\x6e\x69\x74\x65\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x65\x29\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x2e\x74\x68\x65\x6e\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22" +"\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x2e\x63\x61\x74\x63\x68\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x65\x3f\x22\x22\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x7c\x7c\x73\x28\x65\x29\x26\x26\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x3d\x3d\x3d\x61\x3f\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69" +"\x66\x79\x28\x65\x2c\x6e\x75\x6c\x6c\x2c\x32\x29\x3a\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x70\x61\x72\x73\x65\x46\x6c\x6f\x61\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x73\x4e\x61\x4e\x28\x74\x29\x3f\x65\x3a\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72" +"\x20\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x65\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x22\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x6e\x5b\x72\x5b\x69\x5d\x5d\x3d\x21\x30\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x5b\x65\x2e" +"\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x5d\x7d\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x5b\x65\x5d\x7d\x7d\x76\x61\x72\x20\x64\x3d\x70\x28\x22\x73\x6c\x6f\x74\x2c\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x22\x2c\x21\x30\x29\x2c\x76\x3d\x70\x28\x22\x6b\x65\x79\x2c\x72\x65\x66\x2c\x73\x6c\x6f\x74\x2c\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x2c\x69" +"\x73\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3b\x69\x66\x28\x6e\x3e\x2d\x31\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x70\x6c\x69\x63\x65\x28\x6e\x2c\x31\x29\x7d\x7d\x76\x61\x72\x20\x6d\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x70\x72\x6f\x74\x6f" +"\x74\x79\x70\x65\x2e\x68\x61\x73\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6d\x2e\x63\x61\x6c\x6c\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72" +"\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x5b\x6e\x5d\x7c\x7c\x28\x74\x5b\x6e\x5d\x3d\x65\x28\x6e\x29\x29\x7d\x7d\x76\x61\x72\x20\x5f\x3d\x2f\x2d\x28\x5c\x77\x29\x2f\x67\x2c\x62\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x5f\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" +"\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x74\x2e\x74\x6f\x55\x70\x70\x65\x72\x43\x61\x73\x65\x28\x29\x3a\x22\x22\x7d\x29\x7d\x29\x2c\x24\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2e\x74\x6f\x55\x70\x70\x65\x72\x43\x61\x73\x65\x28\x29\x2b\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x7d\x29\x2c\x77\x3d" +"\x2f\x5c\x42\x28\x5b\x41\x2d\x5a\x5d\x29\x2f\x67\x2c\x43\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x77\x2c\x22\x2d\x24\x31\x22\x29\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x7d\x29\x3b\x76\x61\x72\x20\x78\x3d\x46\x75\x6e\x63\x74\x69\x6f\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x62\x69\x6e\x64" +"\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x62\x69\x6e\x64\x28\x74\x29\x7d\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x3f\x72\x3e\x31\x3f\x65\x2e\x61" +"\x70\x70\x6c\x79\x28\x74\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x3a\x65\x2e\x63\x61\x6c\x6c\x28\x74\x2c\x6e\x29\x3a\x65\x2e\x63\x61\x6c\x6c\x28\x74\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x6c\x65\x6e\x67\x74\x68\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x6e\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x28\x65\x2c\x74\x29\x7b\x74\x3d\x74\x7c\x7c\x30\x3b\x66\x6f\x72\x28\x76\x61\x72\x20" +"\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x74\x2c\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x6e\x29\x3b\x6e\x2d\x2d\x3b\x29\x72\x5b\x6e\x5d\x3d\x65\x5b\x6e\x2b\x74\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x65\x5b\x6e\x5d\x3d\x74\x5b\x6e\x5d\x3b\x72\x65\x74\x75\x72" +"\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x65\x5b\x6e\x5d\x26\x26\x41\x28\x74\x2c\x65\x5b\x6e\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x7d\x76\x61\x72\x20\x54\x3d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x2c\x4e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x3d\x3d\x3d\x74\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x76\x61\x72\x20\x6e\x3d\x6f\x28\x65\x29\x2c\x72\x3d\x6f\x28\x74" +"\x29\x3b\x69\x66\x28\x21\x6e\x7c\x7c\x21\x72\x29\x72\x65\x74\x75\x72\x6e\x21\x6e\x26\x26\x21\x72\x26\x26\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x3d\x3d\x3d\x53\x74\x72\x69\x6e\x67\x28\x74\x29\x3b\x74\x72\x79\x7b\x76\x61\x72\x20\x69\x3d\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x2c\x61\x3d\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x3b\x69\x66\x28\x69\x26\x26" +"\x61\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x3d\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x65\x2e\x65\x76\x65\x72\x79\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x45\x28\x65\x2c\x74\x5b\x6e\x5d\x29\x7d\x29\x3b\x69\x66\x28\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x44\x61\x74\x65\x26\x26\x74\x20\x69\x6e\x73\x74\x61" +"\x6e\x63\x65\x6f\x66\x20\x44\x61\x74\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x67\x65\x74\x54\x69\x6d\x65\x28\x29\x3d\x3d\x3d\x74\x2e\x67\x65\x74\x54\x69\x6d\x65\x28\x29\x3b\x69\x66\x28\x69\x7c\x7c\x61\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x76\x61\x72\x20\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x63\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x3b\x72" +"\x65\x74\x75\x72\x6e\x20\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x3d\x3d\x63\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x73\x2e\x65\x76\x65\x72\x79\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x45\x28\x65\x5b\x6e\x5d\x2c\x74\x5b\x6e\x5d\x29\x7d\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x28\x65" +"\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x69\x66\x28\x45\x28\x65\x5b\x6e\x5d\x2c\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x3b\x72\x65\x74\x75\x72\x6e\x2d\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x21\x31\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e" +"\x28\x29\x7b\x74\x7c\x7c\x28\x74\x3d\x21\x30\x2c\x65\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x29\x7d\x7d\x76\x61\x72\x20\x4c\x3d\x22\x64\x61\x74\x61\x2d\x73\x65\x72\x76\x65\x72\x2d\x72\x65\x6e\x64\x65\x72\x65\x64\x22\x2c\x49\x3d\x5b\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x22\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x22\x2c\x22\x66\x69\x6c\x74\x65" +"\x72\x22\x5d\x2c\x4d\x3d\x5b\x22\x62\x65\x66\x6f\x72\x65\x43\x72\x65\x61\x74\x65\x22\x2c\x22\x63\x72\x65\x61\x74\x65\x64\x22\x2c\x22\x62\x65\x66\x6f\x72\x65\x4d\x6f\x75\x6e\x74\x22\x2c\x22\x6d\x6f\x75\x6e\x74\x65\x64\x22\x2c\x22\x62\x65\x66\x6f\x72\x65\x55\x70\x64\x61\x74\x65\x22\x2c\x22\x75\x70\x64\x61\x74\x65\x64\x22\x2c\x22\x62\x65\x66\x6f\x72\x65\x44\x65\x73\x74\x72\x6f\x79\x22\x2c\x22\x64\x65" +"\x73\x74\x72\x6f\x79\x65\x64\x22\x2c\x22\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x2c\x22\x64\x65\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x2c\x22\x65\x72\x72\x6f\x72\x43\x61\x70\x74\x75\x72\x65\x64\x22\x2c\x22\x73\x65\x72\x76\x65\x72\x50\x72\x65\x66\x65\x74\x63\x68\x22\x5d\x2c\x46\x3d\x7b\x6f\x70\x74\x69\x6f\x6e\x4d\x65\x72\x67\x65\x53\x74\x72\x61\x74\x65\x67\x69\x65\x73\x3a\x4f\x62\x6a\x65\x63\x74" +"\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x73\x69\x6c\x65\x6e\x74\x3a\x21\x31\x2c\x70\x72\x6f\x64\x75\x63\x74\x69\x6f\x6e\x54\x69\x70\x3a\x21\x31\x2c\x64\x65\x76\x74\x6f\x6f\x6c\x73\x3a\x21\x31\x2c\x70\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x3a\x21\x31\x2c\x65\x72\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x3a\x6e\x75\x6c\x6c\x2c\x77\x61\x72\x6e\x48\x61\x6e\x64\x6c\x65\x72\x3a\x6e\x75" +"\x6c\x6c\x2c\x69\x67\x6e\x6f\x72\x65\x64\x45\x6c\x65\x6d\x65\x6e\x74\x73\x3a\x5b\x5d\x2c\x6b\x65\x79\x43\x6f\x64\x65\x73\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3a\x54\x2c\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x41\x74\x74\x72\x3a\x54\x2c\x69\x73\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74" +"\x3a\x54\x2c\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x3a\x53\x2c\x70\x61\x72\x73\x65\x50\x6c\x61\x74\x66\x6f\x72\x6d\x54\x61\x67\x4e\x61\x6d\x65\x3a\x4e\x2c\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x3a\x54\x2c\x61\x73\x79\x6e\x63\x3a\x21\x30\x2c\x5f\x6c\x69\x66\x65\x63\x79\x63\x6c\x65\x48\x6f\x6f\x6b\x73\x3a\x4d\x7d\x2c\x50\x3d\x2f\x61\x2d\x7a\x41\x2d\x5a\x5c\x75\x30\x30\x42" +"\x37\x5c\x75\x30\x30\x43\x30\x2d\x5c\x75\x30\x30\x44\x36\x5c\x75\x30\x30\x44\x38\x2d\x5c\x75\x30\x30\x46\x36\x5c\x75\x30\x30\x46\x38\x2d\x5c\x75\x30\x33\x37\x44\x5c\x75\x30\x33\x37\x46\x2d\x5c\x75\x31\x46\x46\x46\x5c\x75\x32\x30\x30\x43\x2d\x5c\x75\x32\x30\x30\x44\x5c\x75\x32\x30\x33\x46\x2d\x5c\x75\x32\x30\x34\x30\x5c\x75\x32\x30\x37\x30\x2d\x5c\x75\x32\x31\x38\x46\x5c\x75\x32\x43\x30\x30\x2d\x5c" +"\x75\x32\x46\x45\x46\x5c\x75\x33\x30\x30\x31\x2d\x5c\x75\x44\x37\x46\x46\x5c\x75\x46\x39\x30\x30\x2d\x5c\x75\x46\x44\x43\x46\x5c\x75\x46\x44\x46\x30\x2d\x5c\x75\x46\x46\x46\x44\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x7b\x76\x61\x6c\x75\x65\x3a\x6e" +"\x2c\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x21\x72\x2c\x77\x72\x69\x74\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x7d\x29\x7d\x76\x61\x72\x20\x48\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5b\x5e\x22\x2b\x50\x2e\x73\x6f\x75\x72\x63\x65\x2b\x22\x2e\x24\x5f\x5c\x5c\x64\x5d\x22\x29\x3b\x76\x61\x72\x20\x42\x2c\x55\x3d\x22\x5f\x5f\x70" +"\x72\x6f\x74\x6f\x5f\x5f\x22\x69\x6e\x7b\x7d\x2c\x56\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x77\x69\x6e\x64\x6f\x77\x2c\x7a\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x57\x58\x45\x6e\x76\x69\x72\x6f\x6e\x6d\x65\x6e\x74\x26\x26\x21\x21\x57\x58\x45\x6e\x76\x69\x72\x6f\x6e\x6d\x65\x6e\x74\x2e\x70\x6c\x61\x74\x66\x6f" +"\x72\x6d\x2c\x4b\x3d\x7a\x26\x26\x57\x58\x45\x6e\x76\x69\x72\x6f\x6e\x6d\x65\x6e\x74\x2e\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x4a\x3d\x56\x26\x26\x77\x69\x6e\x64\x6f\x77\x2e\x6e\x61\x76\x69\x67\x61\x74\x6f\x72\x2e\x75\x73\x65\x72\x41\x67\x65\x6e\x74\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x71\x3d\x4a\x26\x26\x2f\x6d\x73\x69" +"\x65\x7c\x74\x72\x69\x64\x65\x6e\x74\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x2c\x57\x3d\x4a\x26\x26\x4a\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x6d\x73\x69\x65\x20\x39\x2e\x30\x22\x29\x3e\x30\x2c\x5a\x3d\x4a\x26\x26\x4a\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x65\x64\x67\x65\x2f\x22\x29\x3e\x30\x2c\x47\x3d\x28\x4a\x26\x26\x4a\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x61\x6e\x64\x72\x6f\x69\x64\x22\x29" +"\x2c\x4a\x26\x26\x2f\x69\x70\x68\x6f\x6e\x65\x7c\x69\x70\x61\x64\x7c\x69\x70\x6f\x64\x7c\x69\x6f\x73\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x7c\x7c\x22\x69\x6f\x73\x22\x3d\x3d\x3d\x4b\x29\x2c\x58\x3d\x28\x4a\x26\x26\x2f\x63\x68\x72\x6f\x6d\x65\x5c\x2f\x5c\x64\x2b\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x2c\x4a\x26\x26\x2f\x70\x68\x61\x6e\x74\x6f\x6d\x6a\x73\x2f\x2e\x74\x65\x73\x74\x28\x4a\x29\x2c\x4a\x26" +"\x26\x4a\x2e\x6d\x61\x74\x63\x68\x28\x2f\x66\x69\x72\x65\x66\x6f\x78\x5c\x2f\x28\x5c\x64\x2b\x29\x2f\x29\x29\x2c\x59\x3d\x7b\x7d\x2e\x77\x61\x74\x63\x68\x2c\x51\x3d\x21\x31\x3b\x69\x66\x28\x56\x29\x74\x72\x79\x7b\x76\x61\x72\x20\x65\x65\x3d\x7b\x7d\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x65\x2c\x22\x70\x61\x73\x73\x69\x76\x65\x22\x2c\x7b\x67" +"\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x51\x3d\x21\x30\x7d\x7d\x29\x2c\x77\x69\x6e\x64\x6f\x77\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x74\x65\x73\x74\x2d\x70\x61\x73\x73\x69\x76\x65\x22\x2c\x6e\x75\x6c\x6c\x2c\x65\x65\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d\x76\x61\x72\x20\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65" +"\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x42\x26\x26\x28\x42\x3d\x21\x56\x26\x26\x21\x7a\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x67\x6c\x6f\x62\x61\x6c\x26\x26\x28\x67\x6c\x6f\x62\x61\x6c\x2e\x70\x72\x6f\x63\x65\x73\x73\x26\x26\x22\x73\x65\x72\x76\x65\x72\x22\x3d\x3d\x3d\x67\x6c\x6f\x62\x61\x6c\x2e\x70\x72\x6f\x63\x65\x73\x73\x2e\x65" +"\x6e\x76\x2e\x56\x55\x45\x5f\x45\x4e\x56\x29\x29\x2c\x42\x7d\x2c\x6e\x65\x3d\x56\x26\x26\x77\x69\x6e\x64\x6f\x77\x2e\x5f\x5f\x56\x55\x45\x5f\x44\x45\x56\x54\x4f\x4f\x4c\x53\x5f\x47\x4c\x4f\x42\x41\x4c\x5f\x48\x4f\x4f\x4b\x5f\x5f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x65\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26" +"\x26\x2f\x6e\x61\x74\x69\x76\x65\x20\x63\x6f\x64\x65\x2f\x2e\x74\x65\x73\x74\x28\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x29\x7d\x76\x61\x72\x20\x69\x65\x2c\x6f\x65\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x53\x79\x6d\x62\x6f\x6c\x26\x26\x72\x65\x28\x53\x79\x6d\x62\x6f\x6c\x29\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70" +"\x65\x6f\x66\x20\x52\x65\x66\x6c\x65\x63\x74\x26\x26\x72\x65\x28\x52\x65\x66\x6c\x65\x63\x74\x2e\x6f\x77\x6e\x4b\x65\x79\x73\x29\x3b\x69\x65\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x53\x65\x74\x26\x26\x72\x65\x28\x53\x65\x74\x29\x3f\x53\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x29\x7b\x74\x68\x69" +"\x73\x2e\x73\x65\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x68\x61\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x30\x3d\x3d\x3d\x74\x68\x69\x73\x2e\x73\x65\x74\x5b\x65\x5d\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x61\x64\x64" +"\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x73\x65\x74\x5b\x65\x5d\x3d\x21\x30\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x63\x6c\x65\x61\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x73\x65\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x7d\x2c\x65\x7d\x28\x29\x3b\x76\x61\x72\x20\x61\x65\x3d" +"\x53\x2c\x73\x65\x3d\x30\x2c\x63\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x69\x64\x3d\x73\x65\x2b\x2b\x2c\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x3d\x5b\x5d\x7d\x3b\x63\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x61\x64\x64\x53\x75\x62\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x2e\x70\x75\x73\x68\x28\x65\x29\x7d\x2c\x63" +"\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x72\x65\x6d\x6f\x76\x65\x53\x75\x62\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x68\x28\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x2c\x65\x29\x7d\x2c\x63\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x64\x65\x70\x65\x6e\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x26\x26\x63\x65\x2e\x74\x61\x72\x67\x65" +"\x74\x2e\x61\x64\x64\x44\x65\x70\x28\x74\x68\x69\x73\x29\x7d\x2c\x63\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x6e\x6f\x74\x69\x66\x79\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x73\x75\x62\x73\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x74\x3d\x30\x2c\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x65\x5b" +"\x74\x5d\x2e\x75\x70\x64\x61\x74\x65\x28\x29\x7d\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x6e\x75\x6c\x6c\x3b\x76\x61\x72\x20\x75\x65\x3d\x5b\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x65\x28\x65\x29\x7b\x75\x65\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x65\x28\x29\x7b\x75\x65\x2e\x70\x6f\x70\x28\x29\x2c\x63" +"\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x75\x65\x5b\x75\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x7d\x76\x61\x72\x20\x70\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x29\x7b\x74\x68\x69\x73\x2e\x74\x61\x67\x3d\x65\x2c\x74\x68\x69\x73\x2e\x64\x61\x74\x61\x3d\x74\x2c\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x6e\x2c\x74\x68\x69" +"\x73\x2e\x74\x65\x78\x74\x3d\x72\x2c\x74\x68\x69\x73\x2e\x65\x6c\x6d\x3d\x69\x2c\x74\x68\x69\x73\x2e\x6e\x73\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x63\x6f\x6e\x74\x65\x78\x74\x3d\x6f\x2c\x74\x68\x69\x73\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x66" +"\x6e\x53\x63\x6f\x70\x65\x49\x64\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x3d\x74\x26\x26\x74\x2e\x6b\x65\x79\x2c\x74\x68\x69\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x61\x2c\x74\x68\x69\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x70\x61\x72\x65\x6e\x74\x3d" +"\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x72\x61\x77\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x52\x6f\x6f\x74\x49\x6e\x73\x65\x72\x74\x3d\x21\x30\x2c\x74\x68\x69\x73\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x43\x6c\x6f\x6e\x65\x64\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x69\x73\x4f" +"\x6e\x63\x65\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x3d\x73\x2c\x74\x68\x69\x73\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x3d\x76\x6f\x69\x64\x20\x30\x2c\x74\x68\x69\x73\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x3d\x21\x31\x7d\x2c\x64\x65\x3d\x7b\x63\x68\x69\x6c\x64\x3a\x7b\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65" +"\x3a\x21\x30\x7d\x7d\x3b\x64\x65\x2e\x63\x68\x69\x6c\x64\x2e\x67\x65\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7d\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x69\x65\x73\x28\x70\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x64\x65" +"\x29\x3b\x76\x61\x72\x20\x76\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x65\x26\x26\x28\x65\x3d\x22\x22\x29\x3b\x76\x61\x72\x20\x74\x3d\x6e\x65\x77\x20\x70\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x74\x65\x78\x74\x3d\x65\x2c\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x21\x30\x2c\x74\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x65\x28\x65" +"\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x70\x65\x28\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x53\x74\x72\x69\x6e\x67\x28\x65\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x65\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x6e\x65\x77\x20\x70\x65\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x64\x61\x74\x61\x2c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x26" +"\x26\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x65\x2e\x74\x65\x78\x74\x2c\x65\x2e\x65\x6c\x6d\x2c\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x2c\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x6e\x73\x3d\x65\x2e\x6e\x73\x2c\x74\x2e\x69\x73\x53" +"\x74\x61\x74\x69\x63\x3d\x65\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x2c\x74\x2e\x6b\x65\x79\x3d\x65\x2e\x6b\x65\x79\x2c\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x2c\x74\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x65\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x2c\x74\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x65\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73" +"\x2c\x74\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x3d\x65\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x2c\x74\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x3d\x65\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x2c\x74\x2e\x69\x73\x43\x6c\x6f\x6e\x65\x64\x3d\x21\x30\x2c\x74\x7d\x76\x61\x72\x20\x79\x65\x3d\x41\x72\x72\x61\x79\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x67\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72" +"\x65\x61\x74\x65\x28\x79\x65\x29\x3b\x5b\x22\x70\x75\x73\x68\x22\x2c\x22\x70\x6f\x70\x22\x2c\x22\x73\x68\x69\x66\x74\x22\x2c\x22\x75\x6e\x73\x68\x69\x66\x74\x22\x2c\x22\x73\x70\x6c\x69\x63\x65\x22\x2c\x22\x73\x6f\x72\x74\x22\x2c\x22\x72\x65\x76\x65\x72\x73\x65\x22\x5d\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x79\x65\x5b\x65\x5d\x3b" +"\x52\x28\x67\x65\x2c\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x5b\x5d\x2c\x72\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x6e\x5b\x72\x5d\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x5b\x72\x5d\x3b\x76\x61\x72\x20\x69\x2c\x6f\x3d\x74\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x6e\x29\x2c\x61\x3d\x74" +"\x68\x69\x73\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3b\x73\x77\x69\x74\x63\x68\x28\x65\x29\x7b\x63\x61\x73\x65\x22\x70\x75\x73\x68\x22\x3a\x63\x61\x73\x65\x22\x75\x6e\x73\x68\x69\x66\x74\x22\x3a\x69\x3d\x6e\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x22\x73\x70\x6c\x69\x63\x65\x22\x3a\x69\x3d\x6e\x2e\x73\x6c\x69\x63\x65\x28\x32\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x69\x26\x26\x61\x2e\x6f\x62\x73\x65\x72\x76" +"\x65\x41\x72\x72\x61\x79\x28\x69\x29\x2c\x61\x2e\x64\x65\x70\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29\x2c\x6f\x7d\x29\x7d\x29\x3b\x76\x61\x72\x20\x5f\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x67\x65\x74\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79\x4e\x61\x6d\x65\x73\x28\x67\x65\x29\x2c\x62\x65\x3d\x21\x30\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x65\x28\x65\x29\x7b\x62\x65\x3d\x65\x7d\x76\x61\x72\x20\x77" +"\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3d\x65\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x3d\x6e\x65\x77\x20\x63\x65\x2c\x74\x68\x69\x73\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x3d\x30\x2c\x52\x28\x65\x2c\x22\x5f\x5f\x6f\x62\x5f\x5f\x22\x2c\x74\x68\x69\x73\x29\x2c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f" +"\x28\x55\x3f\x28\x74\x3d\x67\x65\x2c\x65\x2e\x5f\x5f\x70\x72\x6f\x74\x6f\x5f\x5f\x3d\x74\x29\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x5b\x72\x5d\x3b\x52\x28\x65\x2c\x6f\x2c\x74\x5b\x6f\x5d\x29\x7d\x7d\x28\x65\x2c\x67" +"\x65\x2c\x5f\x65\x29\x2c\x74\x68\x69\x73\x2e\x6f\x62\x73\x65\x72\x76\x65\x41\x72\x72\x61\x79\x28\x65\x29\x29\x3a\x74\x68\x69\x73\x2e\x77\x61\x6c\x6b\x28\x65\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x65\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3b\x69\x66\x28\x6f\x28\x65\x29\x26\x26\x21\x28\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20" +"\x79\x28\x65\x2c\x22\x5f\x5f\x6f\x62\x5f\x5f\x22\x29\x26\x26\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x77\x65\x3f\x6e\x3d\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3a\x62\x65\x26\x26\x21\x74\x65\x28\x29\x26\x26\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x7c\x7c\x73\x28\x65\x29\x29\x26\x26\x4f\x62\x6a\x65\x63\x74\x2e\x69\x73\x45\x78\x74\x65\x6e" +"\x73\x69\x62\x6c\x65\x28\x65\x29\x26\x26\x21\x65\x2e\x5f\x69\x73\x56\x75\x65\x26\x26\x28\x6e\x3d\x6e\x65\x77\x20\x77\x65\x28\x65\x29\x29\x2c\x74\x26\x26\x6e\x26\x26\x6e\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x2b\x2b\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x65\x77\x20\x63\x65\x2c\x61\x3d\x4f\x62\x6a\x65\x63\x74\x2e" +"\x67\x65\x74\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79\x44\x65\x73\x63\x72\x69\x70\x74\x6f\x72\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x21\x61\x7c\x7c\x21\x31\x21\x3d\x3d\x61\x2e\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x29\x7b\x76\x61\x72\x20\x73\x3d\x61\x26\x26\x61\x2e\x67\x65\x74\x2c\x63\x3d\x61\x26\x26\x61\x2e\x73\x65\x74\x3b\x73\x26\x26\x21\x63\x7c\x7c\x32\x21\x3d\x3d\x61\x72\x67\x75\x6d" +"\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x28\x6e\x3d\x65\x5b\x74\x5d\x29\x3b\x76\x61\x72\x20\x75\x3d\x21\x69\x26\x26\x43\x65\x28\x6e\x29\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x7b\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x67\x65\x74\x3a\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x73\x3f\x73\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x6e\x3b\x72\x65\x74\x75\x72\x6e\x20\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x26\x26\x28\x6f\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x75\x26\x26\x28\x75\x2e\x64\x65\x70\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x26\x26\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x76\x6f\x69\x64\x20\x30\x2c\x72\x3d\x30\x2c\x69\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x28\x6e\x3d\x74\x5b\x72\x5d\x29\x26\x26\x6e\x2e\x5f\x5f\x6f\x62\x5f\x5f\x26\x26\x6e\x2e\x5f\x5f\x6f\x62\x5f\x5f\x2e\x64\x65\x70\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x41\x72\x72\x61\x79\x2e\x69" +"\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x26\x26\x65\x28\x6e\x29\x7d\x28\x74\x29\x29\x29\x2c\x74\x7d\x2c\x73\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x73\x3f\x73\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x6e\x3b\x74\x3d\x3d\x3d\x72\x7c\x7c\x74\x21\x3d\x74\x26\x26\x72\x21\x3d\x72\x7c\x7c\x73\x26\x26\x21\x63\x7c\x7c\x28\x63\x3f\x63\x2e\x63\x61\x6c\x6c\x28\x65\x2c\x74" +"\x29\x3a\x6e\x3d\x74\x2c\x75\x3d\x21\x69\x26\x26\x43\x65\x28\x74\x29\x2c\x6f\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29\x29\x7d\x7d\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x26\x26\x63\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x4d\x61\x74\x68\x2e" +"\x6d\x61\x78\x28\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x74\x29\x2c\x65\x2e\x73\x70\x6c\x69\x63\x65\x28\x74\x2c\x31\x2c\x6e\x29\x2c\x6e\x3b\x69\x66\x28\x74\x20\x69\x6e\x20\x65\x26\x26\x21\x28\x74\x20\x69\x6e\x20\x4f\x62\x6a\x65\x63\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x3d\x6e\x2c\x6e\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f" +"\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x5f\x69\x73\x56\x75\x65\x7c\x7c\x72\x26\x26\x72\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x3f\x6e\x3a\x72\x3f\x28\x78\x65\x28\x72\x2e\x76\x61\x6c\x75\x65\x2c\x74\x2c\x6e\x29\x2c\x72\x2e\x64\x65\x70\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29\x2c\x6e\x29\x3a\x28\x65\x5b\x74\x5d\x3d\x6e\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x65\x28\x65\x2c\x74\x29\x7b\x69\x66" +"\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x26\x26\x63\x28\x74\x29\x29\x65\x2e\x73\x70\x6c\x69\x63\x65\x28\x74\x2c\x31\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x5f\x6f\x62\x5f\x5f\x3b\x65\x2e\x5f\x69\x73\x56\x75\x65\x7c\x7c\x6e\x26\x26\x6e\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x7c\x7c\x79\x28\x65\x2c\x74\x29\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x65\x5b" +"\x74\x5d\x2c\x6e\x26\x26\x6e\x2e\x64\x65\x70\x2e\x6e\x6f\x74\x69\x66\x79\x28\x29\x29\x7d\x7d\x77\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x77\x61\x6c\x6b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x6e\x3d\x30\x3b\x6e\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x78\x65\x28" +"\x65\x2c\x74\x5b\x6e\x5d\x29\x7d\x2c\x77\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x6f\x62\x73\x65\x72\x76\x65\x41\x72\x72\x61\x79\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x2c\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x43\x65\x28\x65\x5b\x74\x5d\x29\x7d\x3b\x76\x61\x72\x20\x4f\x65\x3d\x46\x2e\x6f\x70\x74" +"\x69\x6f\x6e\x4d\x65\x72\x67\x65\x53\x74\x72\x61\x74\x65\x67\x69\x65\x73\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x65\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x2c\x6f\x3d\x6f\x65\x3f\x52\x65\x66\x6c\x65\x63\x74\x2e\x6f\x77\x6e\x4b\x65\x79\x73\x28\x74\x29\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73" +"\x28\x74\x29\x2c\x61\x3d\x30\x3b\x61\x3c\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x61\x2b\x2b\x29\x22\x5f\x5f\x6f\x62\x5f\x5f\x22\x21\x3d\x3d\x28\x6e\x3d\x6f\x5b\x61\x5d\x29\x26\x26\x28\x72\x3d\x65\x5b\x6e\x5d\x2c\x69\x3d\x74\x5b\x6e\x5d\x2c\x79\x28\x65\x2c\x6e\x29\x3f\x72\x21\x3d\x3d\x69\x26\x26\x73\x28\x72\x29\x26\x26\x73\x28\x69\x29\x26\x26\x53\x65\x28\x72\x2c\x69\x29\x3a\x6b\x65\x28\x65\x2c\x6e\x2c" +"\x69\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x54\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x72\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x2e\x63\x61\x6c\x6c\x28\x6e\x2c\x6e\x29\x3a\x74\x2c\x69\x3d\x22\x66\x75\x6e\x63" +"\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x2e\x63\x61\x6c\x6c\x28\x6e\x2c\x6e\x29\x3a\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x3f\x53\x65\x28\x72\x2c\x69\x29\x3a\x69\x7d\x3a\x74\x3f\x65\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x53\x65\x28\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x2e\x63\x61" +"\x6c\x6c\x28\x74\x68\x69\x73\x2c\x74\x68\x69\x73\x29\x3a\x74\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2c\x74\x68\x69\x73\x29\x3a\x65\x29\x7d\x3a\x74\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4e\x65\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x65\x3f\x65\x2e\x63\x6f\x6e\x63\x61\x74\x28\x74" +"\x29\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x3f\x74\x3a\x5b\x74\x5d\x3a\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x5b\x5d\x2c\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x2d\x31\x3d\x3d\x3d\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x65\x5b\x6e\x5d\x29" +"\x26\x26\x74\x2e\x70\x75\x73\x68\x28\x65\x5b\x6e\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x6e\x29\x3a\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x7c\x7c\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x41\x28\x69\x2c\x74\x29\x3a\x69\x7d\x4f\x65" +"\x2e\x64\x61\x74\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x54\x65\x28\x65\x2c\x74\x2c\x6e\x29\x3a\x74\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x65\x3a\x54\x65\x28\x65\x2c\x74\x29\x7d\x2c\x4d\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x4f\x65" +"\x5b\x65\x5d\x3d\x4e\x65\x7d\x29\x2c\x49\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x4f\x65\x5b\x65\x2b\x22\x73\x22\x5d\x3d\x45\x65\x7d\x29\x2c\x4f\x65\x2e\x77\x61\x74\x63\x68\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x65\x3d\x3d\x3d\x59\x26\x26\x28\x65\x3d\x76\x6f\x69\x64\x20\x30\x29\x2c\x74\x3d\x3d\x3d\x59\x26" +"\x26\x28\x74\x3d\x76\x6f\x69\x64\x20\x30\x29\x2c\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x7c\x7c\x6e\x75\x6c\x6c\x29\x3b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x3b\x76\x61\x72\x20\x69\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x41\x28\x69\x2c\x65\x29\x2c\x74\x29\x7b\x76\x61\x72\x20\x61\x3d\x69\x5b" +"\x6f\x5d\x2c\x73\x3d\x74\x5b\x6f\x5d\x3b\x61\x26\x26\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x61\x29\x26\x26\x28\x61\x3d\x5b\x61\x5d\x29\x2c\x69\x5b\x6f\x5d\x3d\x61\x3f\x61\x2e\x63\x6f\x6e\x63\x61\x74\x28\x73\x29\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x73\x29\x3f\x73\x3a\x5b\x73\x5d\x7d\x72\x65\x74\x75\x72\x6e\x20\x69\x7d\x2c\x4f\x65\x2e\x70\x72\x6f\x70\x73" +"\x3d\x4f\x65\x2e\x6d\x65\x74\x68\x6f\x64\x73\x3d\x4f\x65\x2e\x69\x6e\x6a\x65\x63\x74\x3d\x4f\x65\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x3b\x76\x61\x72\x20\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20" +"\x41\x28\x69\x2c\x65\x29\x2c\x74\x26\x26\x41\x28\x69\x2c\x74\x29\x2c\x69\x7d\x2c\x4f\x65\x2e\x70\x72\x6f\x76\x69\x64\x65\x3d\x54\x65\x3b\x76\x61\x72\x20\x6a\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x74\x3f\x65\x3a\x74\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28" +"\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x26\x26\x28\x74\x3d\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x2c\x6f\x3d\x7b\x7d\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28" +"\x6e\x29\x29\x66\x6f\x72\x28\x72\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x28\x69\x3d\x6e\x5b\x72\x5d\x29\x26\x26\x28\x6f\x5b\x62\x28\x69\x29\x5d\x3d\x7b\x74\x79\x70\x65\x3a\x6e\x75\x6c\x6c\x7d\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x20\x69\x6e\x20\x6e\x29\x69" +"\x3d\x6e\x5b\x61\x5d\x2c\x6f\x5b\x62\x28\x61\x29\x5d\x3d\x73\x28\x69\x29\x3f\x69\x3a\x7b\x74\x79\x70\x65\x3a\x69\x7d\x3b\x65\x2e\x70\x72\x6f\x70\x73\x3d\x6f\x7d\x7d\x28\x74\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x69\x6e\x6a\x65\x63\x74\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x69\x6e\x6a\x65\x63\x74\x3d\x7b\x7d\x3b\x69\x66" +"\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x72\x5b\x6e\x5b\x69\x5d\x5d\x3d\x7b\x66\x72\x6f\x6d\x3a\x6e\x5b\x69\x5d\x7d\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x6e\x29\x7b\x76\x61\x72\x20\x61\x3d" +"\x6e\x5b\x6f\x5d\x3b\x72\x5b\x6f\x5d\x3d\x73\x28\x61\x29\x3f\x41\x28\x7b\x66\x72\x6f\x6d\x3a\x6f\x7d\x2c\x61\x29\x3a\x7b\x66\x72\x6f\x6d\x3a\x61\x7d\x7d\x7d\x7d\x28\x74\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3b\x69\x66\x28\x74\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20" +"\x72\x3d\x74\x5b\x6e\x5d\x3b\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x26\x26\x28\x74\x5b\x6e\x5d\x3d\x7b\x62\x69\x6e\x64\x3a\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x72\x7d\x29\x7d\x7d\x28\x74\x29\x2c\x21\x74\x2e\x5f\x62\x61\x73\x65\x26\x26\x28\x74\x2e\x65\x78\x74\x65\x6e\x64\x73\x26\x26\x28\x65\x3d\x44\x65\x28\x65\x2c\x74\x2e\x65\x78\x74\x65\x6e\x64\x73\x2c\x6e" +"\x29\x29\x2c\x74\x2e\x6d\x69\x78\x69\x6e\x73\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x74\x2e\x6d\x69\x78\x69\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x65\x3d\x44\x65\x28\x65\x2c\x74\x2e\x6d\x69\x78\x69\x6e\x73\x5b\x72\x5d\x2c\x6e\x29\x3b\x76\x61\x72\x20\x6f\x2c\x61\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x20\x65\x29\x63\x28\x6f\x29\x3b" +"\x66\x6f\x72\x28\x6f\x20\x69\x6e\x20\x74\x29\x79\x28\x65\x2c\x6f\x29\x7c\x7c\x63\x28\x6f\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x4f\x65\x5b\x72\x5d\x7c\x7c\x6a\x65\x3b\x61\x5b\x72\x5d\x3d\x69\x28\x65\x5b\x72\x5d\x2c\x74\x5b\x72\x5d\x2c\x6e\x2c\x72\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x65\x28\x65\x2c\x74" +"\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6e\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x74\x5d\x3b\x69\x66\x28\x79\x28\x69\x2c\x6e\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x5b\x6e\x5d\x3b\x76\x61\x72\x20\x6f\x3d\x62\x28\x6e\x29\x3b\x69\x66\x28\x79\x28\x69\x2c\x6f\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x5b\x6f\x5d\x3b\x76\x61\x72\x20\x61" +"\x3d\x24\x28\x6f\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x79\x28\x69\x2c\x61\x29\x3f\x69\x5b\x61\x5d\x3a\x69\x5b\x6e\x5d\x7c\x7c\x69\x5b\x6f\x5d\x7c\x7c\x69\x5b\x61\x5d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x49\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x74\x5b\x65\x5d\x2c\x6f\x3d\x21\x79\x28\x6e\x2c\x65\x29\x2c\x61\x3d\x6e\x5b\x65\x5d\x2c\x73\x3d\x52\x65\x28\x42\x6f\x6f" +"\x6c\x65\x61\x6e\x2c\x69\x2e\x74\x79\x70\x65\x29\x3b\x69\x66\x28\x73\x3e\x2d\x31\x29\x69\x66\x28\x6f\x26\x26\x21\x79\x28\x69\x2c\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x29\x29\x61\x3d\x21\x31\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x22\x3d\x3d\x3d\x61\x7c\x7c\x61\x3d\x3d\x3d\x43\x28\x65\x29\x29\x7b\x76\x61\x72\x20\x63\x3d\x52\x65\x28\x53\x74\x72\x69\x6e\x67\x2c\x69\x2e\x74\x79\x70\x65\x29\x3b\x28\x63" +"\x3c\x30\x7c\x7c\x73\x3c\x63\x29\x26\x26\x28\x61\x3d\x21\x30\x29\x7d\x69\x66\x28\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x61\x29\x7b\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x21\x79\x28\x74\x2c\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x29\x29\x72\x65\x74\x75\x72\x6e\x3b\x76\x61\x72\x20\x72\x3d\x74\x2e\x64\x65\x66\x61\x75\x6c\x74\x3b\x69\x66\x28\x65\x26\x26\x65\x2e" +"\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x26\x26\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x5b\x6e\x5d\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x65\x2e\x5f\x70\x72\x6f\x70\x73\x5b\x6e\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x5f\x70\x72\x6f\x70\x73\x5b\x6e\x5d\x3b\x72\x65\x74\x75\x72\x6e" +"\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x26\x26\x22\x46\x75\x6e\x63\x74\x69\x6f\x6e\x22\x21\x3d\x3d\x46\x65\x28\x74\x2e\x74\x79\x70\x65\x29\x3f\x72\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x72\x7d\x28\x72\x2c\x69\x2c\x65\x29\x3b\x76\x61\x72\x20\x75\x3d\x62\x65\x3b\x24\x65\x28\x21\x30\x29\x2c\x43\x65\x28\x61\x29\x2c\x24\x65\x28\x75\x29\x7d\x72\x65\x74\x75\x72\x6e" +"\x20\x61\x7d\x76\x61\x72\x20\x4d\x65\x3d\x2f\x5e\x5c\x73\x2a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x5c\x77\x2b\x29\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x65\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x26\x26\x65\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x2e\x6d\x61\x74\x63\x68\x28\x4d\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3f\x74\x5b\x31\x5d\x3a\x22\x22\x7d\x66\x75\x6e\x63\x74" +"\x69\x6f\x6e\x20\x50\x65\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x46\x65\x28\x65\x29\x3d\x3d\x3d\x46\x65\x28\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x65\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x50\x65\x28\x74\x2c\x65\x29\x3f\x30\x3a\x2d\x31\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e" +"\x3d\x30\x2c\x72\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x3c\x72\x3b\x6e\x2b\x2b\x29\x69\x66\x28\x50\x65\x28\x74\x5b\x6e\x5d\x2c\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x3b\x72\x65\x74\x75\x72\x6e\x2d\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x6c\x65\x28\x29\x3b\x74\x72\x79\x7b\x69\x66\x28\x74\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x74\x3b\x72" +"\x3d\x72\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x65\x72\x72\x6f\x72\x43\x61\x70\x74\x75\x72\x65\x64\x3b\x69\x66\x28\x69\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x30\x3b\x6f\x3c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x2b\x2b\x29\x74\x72\x79\x7b\x69\x66\x28\x21\x31\x3d\x3d\x3d\x69\x5b\x6f\x5d\x2e\x63\x61\x6c\x6c\x28\x72\x2c" +"\x65\x2c\x74\x2c\x6e\x29\x29\x72\x65\x74\x75\x72\x6e\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x55\x65\x28\x65\x2c\x72\x2c\x22\x65\x72\x72\x6f\x72\x43\x61\x70\x74\x75\x72\x65\x64\x20\x68\x6f\x6f\x6b\x22\x29\x7d\x7d\x55\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x66\x65\x28\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x65\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b" +"\x76\x61\x72\x20\x6f\x3b\x74\x72\x79\x7b\x28\x6f\x3d\x6e\x3f\x65\x2e\x61\x70\x70\x6c\x79\x28\x74\x2c\x6e\x29\x3a\x65\x2e\x63\x61\x6c\x6c\x28\x74\x29\x29\x26\x26\x21\x6f\x2e\x5f\x69\x73\x56\x75\x65\x26\x26\x75\x28\x6f\x29\x26\x26\x21\x6f\x2e\x5f\x68\x61\x6e\x64\x6c\x65\x64\x26\x26\x28\x6f\x2e\x63\x61\x74\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x65" +"\x28\x65\x2c\x72\x2c\x69\x2b\x22\x20\x28\x50\x72\x6f\x6d\x69\x73\x65\x2f\x61\x73\x79\x6e\x63\x29\x22\x29\x7d\x29\x2c\x6f\x2e\x5f\x68\x61\x6e\x64\x6c\x65\x64\x3d\x21\x30\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x48\x65\x28\x65\x2c\x72\x2c\x69\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6f\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x46\x2e\x65\x72\x72\x6f" +"\x72\x48\x61\x6e\x64\x6c\x65\x72\x29\x74\x72\x79\x7b\x72\x65\x74\x75\x72\x6e\x20\x46\x2e\x65\x72\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x2e\x63\x61\x6c\x6c\x28\x6e\x75\x6c\x6c\x2c\x65\x2c\x74\x2c\x6e\x29\x7d\x63\x61\x74\x63\x68\x28\x74\x29\x7b\x74\x21\x3d\x3d\x65\x26\x26\x56\x65\x28\x74\x2c\x6e\x75\x6c\x6c\x2c\x22\x63\x6f\x6e\x66\x69\x67\x2e\x65\x72\x72\x6f\x72\x48\x61\x6e\x64\x6c\x65\x72\x22\x29" +"\x7d\x56\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x65\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x21\x56\x26\x26\x21\x7a\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x63\x6f\x6e\x73\x6f\x6c\x65\x29\x74\x68\x72\x6f\x77\x20\x65\x3b\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x65\x72\x72\x6f\x72\x28\x65\x29\x7d\x76\x61\x72\x20\x7a\x65" +"\x2c\x4b\x65\x3d\x21\x31\x2c\x4a\x65\x3d\x5b\x5d\x2c\x71\x65\x3d\x21\x31\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x65\x28\x29\x7b\x71\x65\x3d\x21\x31\x3b\x76\x61\x72\x20\x65\x3d\x4a\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x29\x3b\x4a\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x65\x5b\x74\x5d" +"\x28\x29\x7d\x69\x66\x28\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x50\x72\x6f\x6d\x69\x73\x65\x26\x26\x72\x65\x28\x50\x72\x6f\x6d\x69\x73\x65\x29\x29\x7b\x76\x61\x72\x20\x5a\x65\x3d\x50\x72\x6f\x6d\x69\x73\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x28\x29\x3b\x7a\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x5a\x65\x2e\x74\x68\x65\x6e\x28\x57\x65\x29\x2c\x47" +"\x26\x26\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x53\x29\x7d\x2c\x4b\x65\x3d\x21\x30\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x71\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x7c\x7c\x21\x72\x65\x28\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x29\x26\x26\x22\x5b\x6f\x62\x6a" +"\x65\x63\x74\x20\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x43\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x5d\x22\x21\x3d\x3d\x4d\x75\x74\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x29\x7a\x65\x3d\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x73\x65\x74\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x26" +"\x26\x72\x65\x28\x73\x65\x74\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x73\x65\x74\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x28\x57\x65\x29\x7d\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x57\x65\x2c\x30\x29\x7d\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x47\x65\x3d\x31\x2c\x58\x65\x3d\x6e\x65\x77\x20\x4d\x75\x74" +"\x61\x74\x69\x6f\x6e\x4f\x62\x73\x65\x72\x76\x65\x72\x28\x57\x65\x29\x2c\x59\x65\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x53\x74\x72\x69\x6e\x67\x28\x47\x65\x29\x29\x3b\x58\x65\x2e\x6f\x62\x73\x65\x72\x76\x65\x28\x59\x65\x2c\x7b\x63\x68\x61\x72\x61\x63\x74\x65\x72\x44\x61\x74\x61\x3a\x21\x30\x7d\x29\x2c\x7a\x65\x3d\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x29\x7b\x47\x65\x3d\x28\x47\x65\x2b\x31\x29\x25\x32\x2c\x59\x65\x2e\x64\x61\x74\x61\x3d\x53\x74\x72\x69\x6e\x67\x28\x47\x65\x29\x7d\x2c\x4b\x65\x3d\x21\x30\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x65\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3b\x69\x66\x28\x4a\x65\x2e\x70\x75\x73\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x66\x28\x65\x29\x74\x72\x79\x7b\x65\x2e\x63" +"\x61\x6c\x6c\x28\x74\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x48\x65\x28\x65\x2c\x74\x2c\x22\x6e\x65\x78\x74\x54\x69\x63\x6b\x22\x29\x7d\x65\x6c\x73\x65\x20\x6e\x26\x26\x6e\x28\x74\x29\x7d\x29\x2c\x71\x65\x7c\x7c\x28\x71\x65\x3d\x21\x30\x2c\x7a\x65\x28\x29\x29\x2c\x21\x65\x26\x26\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x50\x72\x6f\x6d\x69\x73\x65\x29\x72" +"\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x50\x72\x6f\x6d\x69\x73\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x3d\x65\x7d\x29\x7d\x76\x61\x72\x20\x65\x74\x3d\x6e\x65\x77\x20\x69\x65\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x74\x28\x65\x29\x7b\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x3b\x76\x61\x72\x20\x61\x3d\x41\x72\x72\x61" +"\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x3b\x69\x66\x28\x21\x61\x26\x26\x21\x6f\x28\x74\x29\x7c\x7c\x4f\x62\x6a\x65\x63\x74\x2e\x69\x73\x46\x72\x6f\x7a\x65\x6e\x28\x74\x29\x7c\x7c\x74\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x74\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x7b\x76\x61\x72\x20\x73\x3d\x74\x2e\x5f\x5f\x6f\x62\x5f\x5f\x2e\x64\x65" +"\x70\x2e\x69\x64\x3b\x69\x66\x28\x6e\x2e\x68\x61\x73\x28\x73\x29\x29\x72\x65\x74\x75\x72\x6e\x3b\x6e\x2e\x61\x64\x64\x28\x73\x29\x7d\x69\x66\x28\x61\x29\x66\x6f\x72\x28\x72\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x65\x28\x74\x5b\x72\x5d\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2c\x72\x3d\x69\x2e\x6c\x65" +"\x6e\x67\x74\x68\x3b\x72\x2d\x2d\x3b\x29\x65\x28\x74\x5b\x69\x5b\x72\x5d\x5d\x2c\x6e\x29\x7d\x28\x65\x2c\x65\x74\x29\x2c\x65\x74\x2e\x63\x6c\x65\x61\x72\x28\x29\x7d\x76\x61\x72\x20\x6e\x74\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x26\x22\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2c\x6e\x3d\x22\x7e\x22\x3d\x3d\x3d\x28\x65\x3d\x74\x3f\x65" +"\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x3a\x65\x29\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2c\x72\x3d\x22\x21\x22\x3d\x3d\x3d\x28\x65\x3d\x6e\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x3a\x65\x29\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x6e\x61\x6d\x65\x3a\x65\x3d\x72\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x3a\x65\x2c\x6f\x6e\x63\x65\x3a\x6e\x2c\x63\x61\x70\x74" +"\x75\x72\x65\x3a\x72\x2c\x70\x61\x73\x73\x69\x76\x65\x3a\x74\x7d\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x74\x28\x65\x2c\x74\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x72\x3d\x6e\x2e\x66\x6e\x73\x3b\x69\x66\x28\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x29\x72\x65\x74\x75\x72\x6e" +"\x20\x42\x65\x28\x72\x2c\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x74\x2c\x22\x76\x2d\x6f\x6e\x20\x68\x61\x6e\x64\x6c\x65\x72\x22\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x6f\x3d\x30\x3b\x6f\x3c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x2b\x2b\x29\x42\x65\x28\x69\x5b\x6f\x5d\x2c\x6e\x75\x6c\x6c\x2c\x65\x2c\x74\x2c\x22\x76\x2d\x6f\x6e" +"\x20\x68\x61\x6e\x64\x6c\x65\x72\x22\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x66\x6e\x73\x3d\x65\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x74\x28\x65\x2c\x6e\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x29\x7b\x76\x61\x72\x20\x63\x2c\x75\x2c\x6c\x2c\x66\x3b\x66\x6f\x72\x28\x63\x20\x69\x6e\x20\x65\x29\x75\x3d\x65\x5b\x63\x5d\x2c\x6c\x3d\x6e\x5b\x63\x5d\x2c\x66\x3d\x6e\x74\x28\x63\x29\x2c\x74\x28" +"\x75\x29\x7c\x7c\x28\x74\x28\x6c\x29\x3f\x28\x74\x28\x75\x2e\x66\x6e\x73\x29\x26\x26\x28\x75\x3d\x65\x5b\x63\x5d\x3d\x72\x74\x28\x75\x2c\x73\x29\x29\x2c\x72\x28\x66\x2e\x6f\x6e\x63\x65\x29\x26\x26\x28\x75\x3d\x65\x5b\x63\x5d\x3d\x61\x28\x66\x2e\x6e\x61\x6d\x65\x2c\x75\x2c\x66\x2e\x63\x61\x70\x74\x75\x72\x65\x29\x29\x2c\x69\x28\x66\x2e\x6e\x61\x6d\x65\x2c\x75\x2c\x66\x2e\x63\x61\x70\x74\x75\x72\x65" +"\x2c\x66\x2e\x70\x61\x73\x73\x69\x76\x65\x2c\x66\x2e\x70\x61\x72\x61\x6d\x73\x29\x29\x3a\x75\x21\x3d\x3d\x6c\x26\x26\x28\x6c\x2e\x66\x6e\x73\x3d\x75\x2c\x65\x5b\x63\x5d\x3d\x6c\x29\x29\x3b\x66\x6f\x72\x28\x63\x20\x69\x6e\x20\x6e\x29\x74\x28\x65\x5b\x63\x5d\x29\x26\x26\x6f\x28\x28\x66\x3d\x6e\x74\x28\x63\x29\x29\x2e\x6e\x61\x6d\x65\x2c\x6e\x5b\x63\x5d\x2c\x66\x2e\x63\x61\x70\x74\x75\x72\x65\x29\x7d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x74\x28\x65\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x3b\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x26\x26\x28\x65\x3d\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x7c\x7c\x28\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x3d\x7b\x7d\x29\x29\x3b\x76\x61\x72\x20\x73\x3d\x65\x5b\x69\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x28\x29\x7b" +"\x6f\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x2c\x68\x28\x61\x2e\x66\x6e\x73\x2c\x63\x29\x7d\x74\x28\x73\x29\x3f\x61\x3d\x72\x74\x28\x5b\x63\x5d\x29\x3a\x6e\x28\x73\x2e\x66\x6e\x73\x29\x26\x26\x72\x28\x73\x2e\x6d\x65\x72\x67\x65\x64\x29\x3f\x28\x61\x3d\x73\x29\x2e\x66\x6e\x73\x2e\x70\x75\x73\x68\x28\x63\x29\x3a\x61\x3d\x72\x74\x28\x5b\x73\x2c\x63\x5d" +"\x29\x2c\x61\x2e\x6d\x65\x72\x67\x65\x64\x3d\x21\x30\x2c\x65\x5b\x69\x5d\x3d\x61\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x61\x74\x28\x65\x2c\x74\x2c\x72\x2c\x69\x2c\x6f\x29\x7b\x69\x66\x28\x6e\x28\x74\x29\x29\x7b\x69\x66\x28\x79\x28\x74\x2c\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x72\x5d\x3d\x74\x5b\x72\x5d\x2c\x6f\x7c\x7c\x64\x65\x6c\x65\x74\x65\x20\x74\x5b\x72\x5d\x2c\x21\x30\x3b\x69\x66" +"\x28\x79\x28\x74\x2c\x69\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x72\x5d\x3d\x74\x5b\x69\x5d\x2c\x6f\x7c\x7c\x64\x65\x6c\x65\x74\x65\x20\x74\x5b\x69\x5d\x2c\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x73\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x69\x28\x65\x29\x3f\x5b\x68\x65\x28\x65\x29\x5d\x3a\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79" +"\x28\x65\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x6f\x2c\x61\x29\x7b\x76\x61\x72\x20\x73\x3d\x5b\x5d\x3b\x76\x61\x72\x20\x63\x2c\x75\x2c\x6c\x2c\x66\x3b\x66\x6f\x72\x28\x63\x3d\x30\x3b\x63\x3c\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x63\x2b\x2b\x29\x74\x28\x75\x3d\x6f\x5b\x63\x5d\x29\x7c\x7c\x22\x62\x6f\x6f\x6c\x65\x61\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x75\x7c\x7c\x28\x6c\x3d\x73" +"\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x66\x3d\x73\x5b\x6c\x5d\x2c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x75\x29\x3f\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x30\x26\x26\x28\x63\x74\x28\x28\x75\x3d\x65\x28\x75\x2c\x28\x61\x7c\x7c\x22\x22\x29\x2b\x22\x5f\x22\x2b\x63\x29\x29\x5b\x30\x5d\x29\x26\x26\x63\x74\x28\x66\x29\x26\x26\x28\x73\x5b\x6c\x5d\x3d\x68\x65\x28\x66\x2e\x74\x65\x78\x74" +"\x2b\x75\x5b\x30\x5d\x2e\x74\x65\x78\x74\x29\x2c\x75\x2e\x73\x68\x69\x66\x74\x28\x29\x29\x2c\x73\x2e\x70\x75\x73\x68\x2e\x61\x70\x70\x6c\x79\x28\x73\x2c\x75\x29\x29\x3a\x69\x28\x75\x29\x3f\x63\x74\x28\x66\x29\x3f\x73\x5b\x6c\x5d\x3d\x68\x65\x28\x66\x2e\x74\x65\x78\x74\x2b\x75\x29\x3a\x22\x22\x21\x3d\x3d\x75\x26\x26\x73\x2e\x70\x75\x73\x68\x28\x68\x65\x28\x75\x29\x29\x3a\x63\x74\x28\x75\x29\x26\x26" +"\x63\x74\x28\x66\x29\x3f\x73\x5b\x6c\x5d\x3d\x68\x65\x28\x66\x2e\x74\x65\x78\x74\x2b\x75\x2e\x74\x65\x78\x74\x29\x3a\x28\x72\x28\x6f\x2e\x5f\x69\x73\x56\x4c\x69\x73\x74\x29\x26\x26\x6e\x28\x75\x2e\x74\x61\x67\x29\x26\x26\x74\x28\x75\x2e\x6b\x65\x79\x29\x26\x26\x6e\x28\x61\x29\x26\x26\x28\x75\x2e\x6b\x65\x79\x3d\x22\x5f\x5f\x76\x6c\x69\x73\x74\x22\x2b\x61\x2b\x22\x5f\x22\x2b\x63\x2b\x22\x5f\x5f\x22" +"\x29\x2c\x73\x2e\x70\x75\x73\x68\x28\x75\x29\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x7d\x28\x65\x29\x3a\x76\x6f\x69\x64\x20\x30\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x65\x29\x26\x26\x6e\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x21\x31\x3d\x3d\x3d\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75" +"\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x6f\x65\x3f\x52\x65\x66\x6c\x65\x63\x74\x2e\x6f\x77\x6e\x4b\x65\x79\x73\x28\x65\x29\x3a\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b" +"\x29\x7b\x76\x61\x72\x20\x6f\x3d\x72\x5b\x69\x5d\x3b\x69\x66\x28\x22\x5f\x5f\x6f\x62\x5f\x5f\x22\x21\x3d\x3d\x6f\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x3d\x65\x5b\x6f\x5d\x2e\x66\x72\x6f\x6d\x2c\x73\x3d\x74\x3b\x73\x3b\x29\x7b\x69\x66\x28\x73\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x26\x26\x79\x28\x73\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x2c\x61\x29\x29\x7b\x6e\x5b\x6f\x5d\x3d\x73\x2e\x5f" +"\x70\x72\x6f\x76\x69\x64\x65\x64\x5b\x61\x5d\x3b\x62\x72\x65\x61\x6b\x7d\x73\x3d\x73\x2e\x24\x70\x61\x72\x65\x6e\x74\x7d\x69\x66\x28\x21\x73\x26\x26\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x69\x6e\x20\x65\x5b\x6f\x5d\x29\x7b\x76\x61\x72\x20\x63\x3d\x65\x5b\x6f\x5d\x2e\x64\x65\x66\x61\x75\x6c\x74\x3b\x6e\x5b\x6f\x5d\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x63\x3f" +"\x63\x2e\x63\x61\x6c\x6c\x28\x74\x29\x3a\x63\x7d\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x65\x7c\x7c\x21\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x72\x65\x74\x75\x72\x6e\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x7b\x7d\x2c\x72\x3d\x30\x2c\x69\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72" +"\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x5b\x72\x5d\x2c\x61\x3d\x6f\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x61\x26\x26\x61\x2e\x61\x74\x74\x72\x73\x26\x26\x61\x2e\x61\x74\x74\x72\x73\x2e\x73\x6c\x6f\x74\x26\x26\x64\x65\x6c\x65\x74\x65\x20\x61\x2e\x61\x74\x74\x72\x73\x2e\x73\x6c\x6f\x74\x2c\x6f\x2e\x63\x6f\x6e\x74\x65\x78\x74\x21\x3d\x3d\x74\x26\x26\x6f\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x21" +"\x3d\x3d\x74\x7c\x7c\x21\x61\x7c\x7c\x6e\x75\x6c\x6c\x3d\x3d\x61\x2e\x73\x6c\x6f\x74\x29\x28\x6e\x2e\x64\x65\x66\x61\x75\x6c\x74\x7c\x7c\x28\x6e\x2e\x64\x65\x66\x61\x75\x6c\x74\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x6f\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x73\x3d\x61\x2e\x73\x6c\x6f\x74\x2c\x63\x3d\x6e\x5b\x73\x5d\x7c\x7c\x28\x6e\x5b\x73\x5d\x3d\x5b\x5d\x29\x3b\x22\x74\x65\x6d\x70\x6c" +"\x61\x74\x65\x22\x3d\x3d\x3d\x6f\x2e\x74\x61\x67\x3f\x63\x2e\x70\x75\x73\x68\x2e\x61\x70\x70\x6c\x79\x28\x63\x2c\x6f\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x7c\x7c\x5b\x5d\x29\x3a\x63\x2e\x70\x75\x73\x68\x28\x6f\x29\x7d\x7d\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x20\x69\x6e\x20\x6e\x29\x6e\x5b\x75\x5d\x2e\x65\x76\x65\x72\x79\x28\x66\x74\x29\x26\x26\x64\x65\x6c\x65\x74\x65\x20\x6e\x5b\x75\x5d\x3b\x72\x65" +"\x74\x75\x72\x6e\x20\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x21\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x7c\x7c\x22\x20\x22\x3d\x3d\x3d\x65\x2e\x74\x65\x78\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x73\x43\x6f" +"\x6d\x6d\x65\x6e\x74\x26\x26\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x64\x74\x28\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x6e\x29\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x30\x2c\x61\x3d\x74\x3f\x21\x21\x74\x2e\x24\x73\x74\x61\x62\x6c\x65\x3a\x21\x6f\x2c\x73\x3d\x74\x26\x26\x74\x2e\x24" +"\x6b\x65\x79\x3b\x69\x66\x28\x74\x29\x7b\x69\x66\x28\x74\x2e\x5f\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x5f\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x3b\x69\x66\x28\x61\x26\x26\x72\x26\x26\x72\x21\x3d\x3d\x65\x26\x26\x73\x3d\x3d\x3d\x72\x2e\x24\x6b\x65\x79\x26\x26\x21\x6f\x26\x26\x21\x72\x2e\x24\x68\x61\x73\x4e\x6f\x72\x6d\x61\x6c\x29\x72\x65\x74\x75\x72\x6e" +"\x20\x72\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x63\x20\x69\x6e\x20\x69\x3d\x7b\x7d\x2c\x74\x29\x74\x5b\x63\x5d\x26\x26\x22\x24\x22\x21\x3d\x3d\x63\x5b\x30\x5d\x26\x26\x28\x69\x5b\x63\x5d\x3d\x76\x74\x28\x6e\x2c\x63\x2c\x74\x5b\x63\x5d\x29\x29\x7d\x65\x6c\x73\x65\x20\x69\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x20\x69\x6e\x20\x6e\x29\x75\x20\x69\x6e\x20\x69\x7c\x7c\x28\x69\x5b\x75\x5d\x3d" +"\x68\x74\x28\x6e\x2c\x75\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x4f\x62\x6a\x65\x63\x74\x2e\x69\x73\x45\x78\x74\x65\x6e\x73\x69\x62\x6c\x65\x28\x74\x29\x26\x26\x28\x74\x2e\x5f\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x3d\x69\x29\x2c\x52\x28\x69\x2c\x22\x24\x73\x74\x61\x62\x6c\x65\x22\x2c\x61\x29\x2c\x52\x28\x69\x2c\x22\x24\x6b\x65\x79\x22\x2c\x73\x29\x2c\x52\x28\x69\x2c\x22\x24\x68\x61" +"\x73\x4e\x6f\x72\x6d\x61\x6c\x22\x2c\x6f\x29\x2c\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3f\x6e\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x3a\x6e\x28\x7b" +"\x7d\x29\x2c\x74\x3d\x28\x65\x3d\x65\x26\x26\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26\x26\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x5b\x65\x5d\x3a\x73\x74\x28\x65\x29\x29\x26\x26\x65\x5b\x30\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x26\x26\x28\x21\x74\x7c\x7c\x31\x3d\x3d\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x74\x2e\x69\x73\x43" +"\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x21\x70\x74\x28\x74\x29\x29\x3f\x76\x6f\x69\x64\x20\x30\x3a\x65\x7d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x70\x72\x6f\x78\x79\x26\x26\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x7b\x67\x65\x74\x3a\x72\x2c\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c" +"\x65\x3a\x21\x30\x7d\x29\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x2c\x61\x2c\x73\x2c\x63\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41" +"\x72\x72\x61\x79\x28\x65\x29\x7c\x7c\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x66\x6f\x72\x28\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x69\x3d\x30\x2c\x61\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x61\x3b\x69\x2b\x2b\x29\x72\x5b\x69\x5d\x3d\x74\x28\x65\x5b\x69\x5d\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28" +"\x22\x6e\x75\x6d\x62\x65\x72\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x66\x6f\x72\x28\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x65\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x65\x3b\x69\x2b\x2b\x29\x72\x5b\x69\x5d\x3d\x74\x28\x69\x2b\x31\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x6f\x28\x65\x29\x29\x69\x66\x28\x6f\x65\x26\x26\x65\x5b\x53\x79\x6d\x62\x6f\x6c\x2e\x69\x74\x65\x72\x61\x74\x6f" +"\x72\x5d\x29\x7b\x72\x3d\x5b\x5d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x65\x5b\x53\x79\x6d\x62\x6f\x6c\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x5d\x28\x29\x2c\x6c\x3d\x75\x2e\x6e\x65\x78\x74\x28\x29\x3b\x21\x6c\x2e\x64\x6f\x6e\x65\x3b\x29\x72\x2e\x70\x75\x73\x68\x28\x74\x28\x6c\x2e\x76\x61\x6c\x75\x65\x2c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x29\x29\x2c\x6c\x3d\x75\x2e\x6e\x65\x78\x74\x28\x29\x7d\x65" +"\x6c\x73\x65\x20\x66\x6f\x72\x28\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2c\x72\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x73\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x69\x3d\x30\x2c\x61\x3d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x61\x3b\x69\x2b\x2b\x29\x63\x3d\x73\x5b\x69\x5d\x2c\x72\x5b\x69\x5d\x3d\x74\x28\x65\x5b\x63\x5d\x2c\x63\x2c\x69\x29\x3b\x72\x65\x74\x75\x72\x6e" +"\x20\x6e\x28\x72\x29\x7c\x7c\x28\x72\x3d\x5b\x5d\x29\x2c\x72\x2e\x5f\x69\x73\x56\x4c\x69\x73\x74\x3d\x21\x30\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x3d\x74\x68\x69\x73\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x5b\x65\x5d\x3b\x6f\x3f\x28\x6e\x3d\x6e\x7c\x7c\x7b\x7d\x2c\x72\x26\x26\x28\x6e\x3d\x41\x28\x41" +"\x28\x7b\x7d\x2c\x72\x29\x2c\x6e\x29\x29\x2c\x69\x3d\x6f\x28\x6e\x29\x7c\x7c\x28\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x28\x29\x3a\x74\x29\x29\x3a\x69\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x5b\x65\x5d\x7c\x7c\x28\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x28\x29\x3a\x74\x29\x3b\x76\x61\x72\x20" +"\x61\x3d\x6e\x26\x26\x6e\x2e\x73\x6c\x6f\x74\x3b\x72\x65\x74\x75\x72\x6e\x20\x61\x3f\x74\x68\x69\x73\x2e\x24\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x2c\x7b\x73\x6c\x6f\x74\x3a\x61\x7d\x2c\x69\x29\x3a\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x74\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x4c\x65\x28\x74\x68\x69\x73\x2e\x24\x6f\x70\x74" +"\x69\x6f\x6e\x73\x2c\x22\x66\x69\x6c\x74\x65\x72\x73\x22\x2c\x65\x29\x7c\x7c\x4e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x2d\x31\x3d\x3d\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3a\x65\x21\x3d\x3d\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x74\x28\x65\x2c" +"\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x46\x2e\x6b\x65\x79\x43\x6f\x64\x65\x73\x5b\x74\x5d\x7c\x7c\x6e\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x26\x26\x72\x26\x26\x21\x46\x2e\x6b\x65\x79\x43\x6f\x64\x65\x73\x5b\x74\x5d\x3f\x5f\x74\x28\x69\x2c\x72\x29\x3a\x6f\x3f\x5f\x74\x28\x6f\x2c\x65\x29\x3a\x72\x3f\x43\x28\x72\x29\x21\x3d\x3d\x74\x3a\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x65\x7d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x69\x66\x28\x6e\x29\x69\x66\x28\x6f\x28\x6e\x29\x29\x7b\x76\x61\x72\x20\x61\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x26\x26\x28\x6e\x3d\x4f\x28\x6e\x29\x29\x3b\x76\x61\x72\x20\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x69\x66\x28\x22\x63\x6c\x61\x73\x73\x22\x3d\x3d" +"\x3d\x6f\x7c\x7c\x22\x73\x74\x79\x6c\x65\x22\x3d\x3d\x3d\x6f\x7c\x7c\x76\x28\x6f\x29\x29\x61\x3d\x65\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x73\x3d\x65\x2e\x61\x74\x74\x72\x73\x26\x26\x65\x2e\x61\x74\x74\x72\x73\x2e\x74\x79\x70\x65\x3b\x61\x3d\x72\x7c\x7c\x46\x2e\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x28\x74\x2c\x73\x2c\x6f\x29\x3f\x65\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x7c\x7c\x28\x65\x2e" +"\x64\x6f\x6d\x50\x72\x6f\x70\x73\x3d\x7b\x7d\x29\x3a\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x28\x65\x2e\x61\x74\x74\x72\x73\x3d\x7b\x7d\x29\x7d\x76\x61\x72\x20\x63\x3d\x62\x28\x6f\x29\x2c\x75\x3d\x43\x28\x6f\x29\x3b\x63\x20\x69\x6e\x20\x61\x7c\x7c\x75\x20\x69\x6e\x20\x61\x7c\x7c\x28\x61\x5b\x6f\x5d\x3d\x6e\x5b\x6f\x5d\x2c\x69\x26\x26\x28\x28\x65\x2e\x6f\x6e\x7c\x7c\x28\x65\x2e\x6f\x6e\x3d\x7b\x7d\x29" +"\x29\x5b\x22\x75\x70\x64\x61\x74\x65\x3a\x22\x2b\x6f\x5d\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x5b\x6f\x5d\x3d\x65\x7d\x29\x29\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x63\x20\x69\x6e\x20\x6e\x29\x73\x28\x63\x29\x7d\x65\x6c\x73\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x77\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2e" +"\x5f\x73\x74\x61\x74\x69\x63\x54\x72\x65\x65\x73\x7c\x7c\x28\x74\x68\x69\x73\x2e\x5f\x73\x74\x61\x74\x69\x63\x54\x72\x65\x65\x73\x3d\x5b\x5d\x29\x2c\x72\x3d\x6e\x5b\x65\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x26\x26\x21\x74\x3f\x72\x3a\x28\x78\x74\x28\x72\x3d\x6e\x5b\x65\x5d\x3d\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x5b" +"\x65\x5d\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2e\x5f\x72\x65\x6e\x64\x65\x72\x50\x72\x6f\x78\x79\x2c\x6e\x75\x6c\x6c\x2c\x74\x68\x69\x73\x29\x2c\x22\x5f\x5f\x73\x74\x61\x74\x69\x63\x5f\x5f\x22\x2b\x65\x2c\x21\x31\x29\x2c\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x78\x74\x28\x65\x2c\x22\x5f\x5f\x6f\x6e\x63\x65\x5f\x5f\x22" +"\x2b\x74\x2b\x28\x6e\x3f\x22\x5f\x22\x2b\x6e\x3a\x22\x22\x29\x2c\x21\x30\x29\x2c\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x65\x5b\x72\x5d\x26\x26\x22\x73\x74\x72\x69\x6e" +"\x67\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x5b\x72\x5d\x26\x26\x6b\x74\x28\x65\x5b\x72\x5d\x2c\x74\x2b\x22\x5f\x22\x2b\x72\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x20\x6b\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x65\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x3d\x21\x30\x2c\x65\x2e\x6b\x65\x79\x3d\x74\x2c\x65\x2e\x69\x73\x4f\x6e\x63\x65" +"\x3d\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74\x29\x69\x66\x28\x73\x28\x74\x29\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x6f\x6e\x3d\x65\x2e\x6f\x6e\x3f\x41\x28\x7b\x7d\x2c\x65\x2e\x6f\x6e\x29\x3a\x7b\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20\x69\x3d\x6e\x5b\x72\x5d\x2c\x6f\x3d\x74\x5b\x72\x5d\x3b\x6e\x5b" +"\x72\x5d\x3d\x69\x3f\x5b\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x69\x2c\x6f\x29\x3a\x6f\x7d\x7d\x65\x6c\x73\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x74\x3d\x74\x7c\x7c\x7b\x24\x73\x74\x61\x62\x6c\x65\x3a\x21\x6e\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69" +"\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x5b\x69\x5d\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6f\x29\x3f\x4f\x74\x28\x6f\x2c\x74\x2c\x6e\x29\x3a\x6f\x26\x26\x28\x6f\x2e\x70\x72\x6f\x78\x79\x26\x26\x28\x6f\x2e\x66\x6e\x2e\x70\x72\x6f\x78\x79\x3d\x21\x30\x29\x2c\x74\x5b\x6f\x2e\x6b\x65\x79\x5d\x3d\x6f\x2e\x66\x6e\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x26\x26\x28\x74\x2e\x24" +"\x6b\x65\x79\x3d\x72\x29\x2c\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x74\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x3d\x32\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x5b\x6e\x5d\x3b\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x26\x26\x72\x26\x26\x28\x65\x5b\x74\x5b\x6e\x5d\x5d\x3d\x74\x5b" +"\x6e\x2b\x31\x5d\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x54\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x74\x2b\x65\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4e\x74\x28\x65\x29\x7b\x65\x2e\x5f\x6f\x3d\x43\x74\x2c\x65\x2e\x5f\x6e\x3d\x66\x2c\x65\x2e\x5f\x73\x3d\x6c\x2c" +"\x65\x2e\x5f\x6c\x3d\x6d\x74\x2c\x65\x2e\x5f\x74\x3d\x79\x74\x2c\x65\x2e\x5f\x71\x3d\x45\x2c\x65\x2e\x5f\x69\x3d\x6a\x2c\x65\x2e\x5f\x6d\x3d\x77\x74\x2c\x65\x2e\x5f\x66\x3d\x67\x74\x2c\x65\x2e\x5f\x6b\x3d\x62\x74\x2c\x65\x2e\x5f\x62\x3d\x24\x74\x2c\x65\x2e\x5f\x76\x3d\x68\x65\x2c\x65\x2e\x5f\x65\x3d\x76\x65\x2c\x65\x2e\x5f\x75\x3d\x4f\x74\x2c\x65\x2e\x5f\x67\x3d\x41\x74\x2c\x65\x2e\x5f\x64\x3d\x53" +"\x74\x2c\x65\x2e\x5f\x70\x3d\x54\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x74\x28\x74\x2c\x6e\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x76\x61\x72\x20\x73\x2c\x63\x3d\x74\x68\x69\x73\x2c\x75\x3d\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x79\x28\x6f\x2c\x22\x5f\x75\x69\x64\x22\x29\x3f\x28\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6f\x29\x29\x2e\x5f\x6f\x72\x69\x67\x69\x6e\x61\x6c" +"\x3d\x6f\x3a\x28\x73\x3d\x6f\x2c\x6f\x3d\x6f\x2e\x5f\x6f\x72\x69\x67\x69\x6e\x61\x6c\x29\x3b\x76\x61\x72\x20\x6c\x3d\x72\x28\x75\x2e\x5f\x63\x6f\x6d\x70\x69\x6c\x65\x64\x29\x2c\x66\x3d\x21\x6c\x3b\x74\x68\x69\x73\x2e\x64\x61\x74\x61\x3d\x74\x2c\x74\x68\x69\x73\x2e\x70\x72\x6f\x70\x73\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x69\x2c\x74\x68\x69\x73\x2e\x70\x61\x72\x65\x6e" +"\x74\x3d\x6f\x2c\x74\x68\x69\x73\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x74\x2e\x6f\x6e\x7c\x7c\x65\x2c\x74\x68\x69\x73\x2e\x69\x6e\x6a\x65\x63\x74\x69\x6f\x6e\x73\x3d\x75\x74\x28\x75\x2e\x69\x6e\x6a\x65\x63\x74\x2c\x6f\x29\x2c\x74\x68\x69\x73\x2e\x73\x6c\x6f\x74\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x63\x2e\x24\x73\x6c\x6f\x74\x73\x7c\x7c\x64\x74\x28" +"\x74\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x63\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x6c\x74\x28\x69\x2c\x6f\x29\x29\x2c\x63\x2e\x24\x73\x6c\x6f\x74\x73\x7d\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x74\x68\x69\x73\x2c\x22\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x22\x2c\x7b\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x67\x65" +"\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x74\x28\x74\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74\x68\x69\x73\x2e\x73\x6c\x6f\x74\x73\x28\x29\x29\x7d\x7d\x29\x2c\x6c\x26\x26\x28\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x75\x2c\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x74\x68\x69\x73\x2e\x73\x6c\x6f\x74\x73\x28\x29\x2c\x74" +"\x68\x69\x73\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x64\x74\x28\x74\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x29\x29\x2c\x75\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x3f\x74\x68\x69\x73\x2e\x5f\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x48\x74\x28\x73\x2c\x65\x2c\x74\x2c" +"\x6e\x2c\x72\x2c\x66\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x26\x26\x21\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x69\x29\x26\x26\x28\x69\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x3d\x75\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x2c\x69\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x6f\x29\x2c\x69\x7d\x3a\x74\x68\x69\x73\x2e\x5f\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e" +"\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x74\x28\x73\x2c\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x66\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x74\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6d\x65\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x3d\x6e\x2c\x6f\x2e\x66\x6e\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x72\x2c\x74\x2e" +"\x73\x6c\x6f\x74\x26\x26\x28\x28\x6f\x2e\x64\x61\x74\x61\x7c\x7c\x28\x6f\x2e\x64\x61\x74\x61\x3d\x7b\x7d\x29\x29\x2e\x73\x6c\x6f\x74\x3d\x74\x2e\x73\x6c\x6f\x74\x29\x2c\x6f\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x74\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x65\x5b\x62\x28\x6e\x29\x5d\x3d\x74\x5b\x6e\x5d\x7d\x4e\x74\x28\x45\x74\x2e\x70\x72\x6f\x74\x6f" +"\x74\x79\x70\x65\x29\x3b\x76\x61\x72\x20\x4c\x74\x3d\x7b\x69\x6e\x69\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x26\x26\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x26\x26\x65\x2e\x64\x61\x74\x61\x2e\x6b" +"\x65\x65\x70\x41\x6c\x69\x76\x65\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x3b\x4c\x74\x2e\x70\x72\x65\x70\x61\x74\x63\x68\x28\x72\x2c\x72\x29\x7d\x65\x6c\x73\x65\x7b\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x7b\x5f\x69\x73\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3a\x21\x30\x2c\x5f\x70" +"\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3a\x65\x2c\x70\x61\x72\x65\x6e\x74\x3a\x74\x7d\x2c\x69\x3d\x65\x2e\x64\x61\x74\x61\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3b\x6e\x28\x69\x29\x26\x26\x28\x72\x2e\x72\x65\x6e\x64\x65\x72\x3d\x69\x2e\x72\x65\x6e\x64\x65\x72\x2c\x72\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x69\x2e\x73\x74\x61\x74\x69\x63\x52\x65" +"\x6e\x64\x65\x72\x46\x6e\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x2e\x43\x74\x6f\x72\x28\x72\x29\x7d\x28\x65\x2c\x5a\x74\x29\x29\x2e\x24\x6d\x6f\x75\x6e\x74\x28\x74\x3f\x65\x2e\x65\x6c\x6d\x3a\x76\x6f\x69\x64\x20\x30\x2c\x74\x29\x7d\x7d\x2c\x70\x72\x65\x70\x61\x74\x63\x68\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28" +"\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x3d\x69\x2e\x64\x61\x74\x61\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x73\x3d\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x63\x3d\x21\x21\x28\x61\x26" +"\x26\x21\x61\x2e\x24\x73\x74\x61\x62\x6c\x65\x7c\x7c\x73\x21\x3d\x3d\x65\x26\x26\x21\x73\x2e\x24\x73\x74\x61\x62\x6c\x65\x7c\x7c\x61\x26\x26\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2e\x24\x6b\x65\x79\x21\x3d\x3d\x61\x2e\x24\x6b\x65\x79\x7c\x7c\x21\x61\x26\x26\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2e\x24\x6b\x65\x79\x29\x2c\x75\x3d\x21\x21\x28\x6f\x7c\x7c\x74\x2e" +"\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65\x6e\x7c\x7c\x63\x29\x3b\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3d\x69\x2c\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x69\x2c\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x26\x26\x28\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x69\x29\x3b\x69\x66\x28\x74" +"\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65\x6e\x3d\x6f\x2c\x74\x2e\x24\x61\x74\x74\x72\x73\x3d\x69\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x7c\x7c\x65\x2c\x74\x2e\x24\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x72\x7c\x7c\x65\x2c\x6e\x26\x26\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x29\x7b\x24\x65\x28\x21\x31\x29\x3b\x66" +"\x6f\x72\x28\x76\x61\x72\x20\x6c\x3d\x74\x2e\x5f\x70\x72\x6f\x70\x73\x2c\x66\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x72\x6f\x70\x4b\x65\x79\x73\x7c\x7c\x5b\x5d\x2c\x70\x3d\x30\x3b\x70\x3c\x66\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x70\x2b\x2b\x29\x7b\x76\x61\x72\x20\x64\x3d\x66\x5b\x70\x5d\x2c\x76\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x6c\x5b\x64\x5d\x3d" +"\x49\x65\x28\x64\x2c\x76\x2c\x6e\x2c\x74\x29\x7d\x24\x65\x28\x21\x30\x29\x2c\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x3d\x6e\x7d\x72\x3d\x72\x7c\x7c\x65\x3b\x76\x61\x72\x20\x68\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3b\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e" +"\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x72\x2c\x57\x74\x28\x74\x2c\x72\x2c\x68\x29\x2c\x75\x26\x26\x28\x74\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x6c\x74\x28\x6f\x2c\x69\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x74\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x29\x7d\x28\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65" +"\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2c\x72\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x2c\x72\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x2c\x6e\x2c\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x7d\x2c\x69\x6e\x73\x65\x72\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x3d\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x72\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74" +"\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x72\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x7c\x7c\x28\x72\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3d\x21\x30\x2c\x51\x74\x28\x72\x2c\x22\x6d\x6f\x75\x6e\x74\x65\x64\x22\x29\x29\x2c\x65\x2e\x64\x61\x74\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x26\x26\x28\x6e\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3f\x28\x28\x74\x3d\x72\x29\x2e\x5f\x69\x6e\x61" +"\x63\x74\x69\x76\x65\x3d\x21\x31\x2c\x74\x6e\x2e\x70\x75\x73\x68\x28\x74\x29\x29\x3a\x59\x74\x28\x72\x2c\x21\x30\x29\x29\x7d\x2c\x64\x65\x73\x74\x72\x6f\x79\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x74\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x7c\x7c\x28\x65\x2e\x64\x61\x74" +"\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x2c\x6e\x29\x7b\x69\x66\x28\x6e\x26\x26\x28\x74\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x2c\x58\x74\x28\x74\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x21\x74\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x29\x7b\x74\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21" +"\x30\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x74\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x65\x28\x74\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x72\x5d\x29\x3b\x51\x74\x28\x74\x2c\x22\x64\x65\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x29\x7d\x7d\x28\x74\x2c\x21\x30\x29\x3a\x74\x2e\x24\x64\x65\x73\x74\x72\x6f\x79\x28\x29\x29\x7d\x7d" +"\x2c\x49\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x4c\x74\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4d\x74\x28\x69\x2c\x61\x2c\x73\x2c\x63\x2c\x6c\x29\x7b\x69\x66\x28\x21\x74\x28\x69\x29\x29\x7b\x76\x61\x72\x20\x66\x3d\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x62\x61\x73\x65\x3b\x69\x66\x28\x6f\x28\x69\x29\x26\x26\x28\x69\x3d\x66\x2e\x65\x78\x74\x65\x6e\x64\x28\x69\x29\x29" +"\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x69\x29\x7b\x76\x61\x72\x20\x70\x3b\x69\x66\x28\x74\x28\x69\x2e\x63\x69\x64\x29\x26\x26\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x28\x69\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x69\x29\x7b\x69\x66\x28\x72\x28\x65\x2e\x65\x72\x72\x6f\x72\x29\x26\x26\x6e\x28\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x29\x29\x72\x65" +"\x74\x75\x72\x6e\x20\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x3b\x69\x66\x28\x6e\x28\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x3b\x76\x61\x72\x20\x61\x3d\x55\x74\x3b\x61\x26\x26\x6e\x28\x65\x2e\x6f\x77\x6e\x65\x72\x73\x29\x26\x26\x2d\x31\x3d\x3d\x3d\x65\x2e\x6f\x77\x6e\x65\x72\x73\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x61" +"\x29\x26\x26\x65\x2e\x6f\x77\x6e\x65\x72\x73\x2e\x70\x75\x73\x68\x28\x61\x29\x3b\x69\x66\x28\x72\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x29\x26\x26\x6e\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x3b\x69\x66\x28\x61\x26\x26\x21\x6e\x28\x65\x2e\x6f\x77\x6e\x65\x72\x73\x29\x29\x7b\x76\x61\x72\x20\x73" +"\x3d\x65\x2e\x6f\x77\x6e\x65\x72\x73\x3d\x5b\x61\x5d\x2c\x63\x3d\x21\x30\x2c\x6c\x3d\x6e\x75\x6c\x6c\x2c\x66\x3d\x6e\x75\x6c\x6c\x3b\x61\x2e\x24\x6f\x6e\x28\x22\x68\x6f\x6f\x6b\x3a\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x68\x28\x73\x2c\x61\x29\x7d\x29\x3b\x76\x61\x72\x20\x70\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29" +"\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x2c\x6e\x3d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c\x6e\x3b\x74\x2b\x2b\x29\x73\x5b\x74\x5d\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x3b\x65\x26\x26\x28\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x2c\x6e\x75\x6c\x6c\x21\x3d\x3d\x6c\x26\x26\x28\x63\x6c\x65\x61\x72\x54\x69\x6d\x65\x6f\x75\x74\x28\x6c\x29\x2c\x6c\x3d\x6e\x75\x6c\x6c" +"\x29\x2c\x6e\x75\x6c\x6c\x21\x3d\x3d\x66\x26\x26\x28\x63\x6c\x65\x61\x72\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x29\x2c\x66\x3d\x6e\x75\x6c\x6c\x29\x29\x7d\x2c\x64\x3d\x44\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x3d\x56\x74\x28\x74\x2c\x69\x29\x2c\x63\x3f\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x3a\x70\x28\x21\x30\x29\x7d\x29\x2c\x76\x3d\x44\x28\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x6e\x28\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x29\x26\x26\x28\x65\x2e\x65\x72\x72\x6f\x72\x3d\x21\x30\x2c\x70\x28\x21\x30\x29\x29\x7d\x29\x2c\x6d\x3d\x65\x28\x64\x2c\x76\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x28\x6d\x29\x26\x26\x28\x75\x28\x6d\x29\x3f\x74\x28\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x26\x26\x6d\x2e\x74\x68\x65\x6e\x28\x64\x2c" +"\x76\x29\x3a\x75\x28\x6d\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x26\x26\x28\x6d\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x2e\x74\x68\x65\x6e\x28\x64\x2c\x76\x29\x2c\x6e\x28\x6d\x2e\x65\x72\x72\x6f\x72\x29\x26\x26\x28\x65\x2e\x65\x72\x72\x6f\x72\x43\x6f\x6d\x70\x3d\x56\x74\x28\x6d\x2e\x65\x72\x72\x6f\x72\x2c\x69\x29\x29\x2c\x6e\x28\x6d\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x29\x26\x26\x28\x65\x2e\x6c" +"\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x3d\x56\x74\x28\x6d\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x2c\x69\x29\x2c\x30\x3d\x3d\x3d\x6d\x2e\x64\x65\x6c\x61\x79\x3f\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x3d\x21\x30\x3a\x6c\x3d\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x6c\x3d\x6e\x75\x6c\x6c\x2c\x74\x28\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x26\x26\x74\x28" +"\x65\x2e\x65\x72\x72\x6f\x72\x29\x26\x26\x28\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x3d\x21\x30\x2c\x70\x28\x21\x31\x29\x29\x7d\x2c\x6d\x2e\x64\x65\x6c\x61\x79\x7c\x7c\x32\x30\x30\x29\x29\x2c\x6e\x28\x6d\x2e\x74\x69\x6d\x65\x6f\x75\x74\x29\x26\x26\x28\x66\x3d\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x3d\x6e\x75\x6c\x6c\x2c\x74\x28\x65\x2e\x72\x65\x73" +"\x6f\x6c\x76\x65\x64\x29\x26\x26\x76\x28\x6e\x75\x6c\x6c\x29\x7d\x2c\x6d\x2e\x74\x69\x6d\x65\x6f\x75\x74\x29\x29\x29\x29\x2c\x63\x3d\x21\x31\x2c\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x3f\x65\x2e\x6c\x6f\x61\x64\x69\x6e\x67\x43\x6f\x6d\x70\x3a\x65\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x7d\x7d\x28\x70\x3d\x69\x2c\x66\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74" +"\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x76\x65\x28\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x3d\x65\x2c\x6f\x2e\x61\x73\x79\x6e\x63\x4d\x65\x74\x61\x3d\x7b\x64\x61\x74\x61\x3a\x74\x2c\x63\x6f\x6e\x74\x65\x78\x74\x3a\x6e\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x3a\x72\x2c\x74\x61\x67\x3a\x69\x7d\x2c\x6f\x7d\x28\x70\x2c\x61\x2c\x73\x2c" +"\x63\x2c\x6c\x29\x3b\x61\x3d\x61\x7c\x7c\x7b\x7d\x2c\x77\x6e\x28\x69\x29\x2c\x6e\x28\x61\x2e\x6d\x6f\x64\x65\x6c\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x6d\x6f\x64\x65\x6c\x26\x26\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x70\x72\x6f\x70\x7c\x7c\x22\x76\x61\x6c\x75\x65\x22\x2c\x69\x3d\x65\x2e\x6d\x6f\x64\x65\x6c\x26\x26\x65\x2e\x6d\x6f\x64\x65\x6c" +"\x2e\x65\x76\x65\x6e\x74\x7c\x7c\x22\x69\x6e\x70\x75\x74\x22\x3b\x28\x74\x2e\x61\x74\x74\x72\x73\x7c\x7c\x28\x74\x2e\x61\x74\x74\x72\x73\x3d\x7b\x7d\x29\x29\x5b\x72\x5d\x3d\x74\x2e\x6d\x6f\x64\x65\x6c\x2e\x76\x61\x6c\x75\x65\x3b\x76\x61\x72\x20\x6f\x3d\x74\x2e\x6f\x6e\x7c\x7c\x28\x74\x2e\x6f\x6e\x3d\x7b\x7d\x29\x2c\x61\x3d\x6f\x5b\x69\x5d\x2c\x73\x3d\x74\x2e\x6d\x6f\x64\x65\x6c\x2e\x63\x61\x6c\x6c" +"\x62\x61\x63\x6b\x3b\x6e\x28\x61\x29\x3f\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x61\x29\x3f\x2d\x31\x3d\x3d\x3d\x61\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x73\x29\x3a\x61\x21\x3d\x3d\x73\x29\x26\x26\x28\x6f\x5b\x69\x5d\x3d\x5b\x73\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x61\x29\x29\x3a\x6f\x5b\x69\x5d\x3d\x73\x7d\x28\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x61\x29\x3b\x76\x61\x72\x20" +"\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x21\x74\x28\x6f\x29\x29\x7b\x76\x61\x72\x20\x61\x3d\x7b\x7d\x2c\x73\x3d\x65\x2e\x61\x74\x74\x72\x73\x2c\x63\x3d\x65\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x6e\x28\x73\x29\x7c\x7c\x6e\x28\x63\x29\x29\x66\x6f\x72\x28\x76\x61\x72" +"\x20\x75\x20\x69\x6e\x20\x6f\x29\x7b\x76\x61\x72\x20\x6c\x3d\x43\x28\x75\x29\x3b\x61\x74\x28\x61\x2c\x63\x2c\x75\x2c\x6c\x2c\x21\x30\x29\x7c\x7c\x61\x74\x28\x61\x2c\x73\x2c\x75\x2c\x6c\x2c\x21\x31\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x7d\x28\x61\x2c\x69\x29\x3b\x69\x66\x28\x72\x28\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x66\x75\x6e\x63\x74\x69\x6f\x6e\x61\x6c\x29\x29\x72\x65\x74\x75\x72\x6e" +"\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x76\x61\x72\x20\x73\x3d\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x63\x3d\x7b\x7d\x2c\x75\x3d\x73\x2e\x70\x72\x6f\x70\x73\x3b\x69\x66\x28\x6e\x28\x75\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6c\x20\x69\x6e\x20\x75\x29\x63\x5b\x6c\x5d\x3d\x49\x65\x28\x6c\x2c\x75\x2c\x72\x7c\x7c\x65\x29\x3b\x65\x6c\x73\x65\x20\x6e\x28" +"\x69\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x44\x74\x28\x63\x2c\x69\x2e\x61\x74\x74\x72\x73\x29\x2c\x6e\x28\x69\x2e\x70\x72\x6f\x70\x73\x29\x26\x26\x44\x74\x28\x63\x2c\x69\x2e\x70\x72\x6f\x70\x73\x29\x3b\x76\x61\x72\x20\x66\x3d\x6e\x65\x77\x20\x45\x74\x28\x69\x2c\x63\x2c\x61\x2c\x6f\x2c\x74\x29\x2c\x70\x3d\x73\x2e\x72\x65\x6e\x64\x65\x72\x2e\x63\x61\x6c\x6c\x28\x6e\x75\x6c\x6c\x2c\x66\x2e\x5f\x63\x2c" +"\x66\x29\x3b\x69\x66\x28\x70\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x6a\x74\x28\x70\x2c\x69\x2c\x66\x2e\x70\x61\x72\x65\x6e\x74\x2c\x73\x29\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x70\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x64\x3d\x73\x74\x28\x70\x29\x7c\x7c\x5b\x5d\x2c\x76\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79" +"\x28\x64\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x68\x3d\x30\x3b\x68\x3c\x64\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x68\x2b\x2b\x29\x76\x5b\x68\x5d\x3d\x6a\x74\x28\x64\x5b\x68\x5d\x2c\x69\x2c\x66\x2e\x70\x61\x72\x65\x6e\x74\x2c\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x76\x7d\x7d\x28\x69\x2c\x64\x2c\x61\x2c\x73\x2c\x63\x29\x3b\x76\x61\x72\x20\x76\x3d\x61\x2e\x6f\x6e\x3b\x69\x66\x28\x61\x2e\x6f\x6e\x3d\x61\x2e" +"\x6e\x61\x74\x69\x76\x65\x4f\x6e\x2c\x72\x28\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x29\x29\x7b\x76\x61\x72\x20\x6d\x3d\x61\x2e\x73\x6c\x6f\x74\x3b\x61\x3d\x7b\x7d\x2c\x6d\x26\x26\x28\x61\x2e\x73\x6c\x6f\x74\x3d\x6d\x29\x7d\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x2e\x68\x6f\x6f\x6b\x7c\x7c\x28\x65\x2e\x68\x6f" +"\x6f\x6b\x3d\x7b\x7d\x29\x2c\x6e\x3d\x30\x3b\x6e\x3c\x49\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x49\x74\x5b\x6e\x5d\x2c\x69\x3d\x74\x5b\x72\x5d\x2c\x6f\x3d\x4c\x74\x5b\x72\x5d\x3b\x69\x3d\x3d\x3d\x6f\x7c\x7c\x69\x26\x26\x69\x2e\x5f\x6d\x65\x72\x67\x65\x64\x7c\x7c\x28\x74\x5b\x72\x5d\x3d\x69\x3f\x46\x74\x28\x6f\x2c\x69\x29\x3a\x6f\x29\x7d\x7d\x28\x61\x29\x3b" +"\x76\x61\x72\x20\x79\x3d\x69\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6e\x61\x6d\x65\x7c\x7c\x6c\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x70\x65\x28\x22\x76\x75\x65\x2d\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x2d\x22\x2b\x69\x2e\x63\x69\x64\x2b\x28\x79\x3f\x22\x2d\x22\x2b\x79\x3a\x22\x22\x29\x2c\x61\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x73\x2c\x7b" +"\x43\x74\x6f\x72\x3a\x69\x2c\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x3a\x64\x2c\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3a\x76\x2c\x74\x61\x67\x3a\x6c\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x3a\x63\x7d\x2c\x70\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x2c\x72\x29\x7b\x65\x28\x6e\x2c\x72\x29\x2c\x74\x28" +"\x6e\x2c\x72\x29\x7d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x6d\x65\x72\x67\x65\x64\x3d\x21\x30\x2c\x6e\x7d\x76\x61\x72\x20\x50\x74\x3d\x31\x2c\x52\x74\x3d\x32\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x74\x28\x65\x2c\x61\x2c\x73\x2c\x63\x2c\x75\x2c\x6c\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x73\x29\x7c\x7c\x69\x28\x73\x29\x29\x26\x26\x28" +"\x75\x3d\x63\x2c\x63\x3d\x73\x2c\x73\x3d\x76\x6f\x69\x64\x20\x30\x29\x2c\x72\x28\x6c\x29\x26\x26\x28\x75\x3d\x52\x74\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x69\x2c\x61\x2c\x73\x2c\x63\x29\x7b\x69\x66\x28\x6e\x28\x61\x29\x26\x26\x6e\x28\x61\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x65\x28\x29\x3b\x6e\x28\x61\x29\x26\x26\x6e\x28\x61\x2e\x69\x73\x29\x26\x26\x28" +"\x69\x3d\x61\x2e\x69\x73\x29\x3b\x69\x66\x28\x21\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x65\x28\x29\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x73\x29\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x73\x5b\x30\x5d\x26\x26\x28\x28\x61\x3d\x61\x7c\x7c\x7b\x7d\x29\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x7b\x64\x65\x66\x61\x75\x6c\x74" +"\x3a\x73\x5b\x30\x5d\x7d\x2c\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x29\x3b\x63\x3d\x3d\x3d\x52\x74\x3f\x73\x3d\x73\x74\x28\x73\x29\x3a\x63\x3d\x3d\x3d\x50\x74\x26\x26\x28\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79" +"\x28\x65\x5b\x74\x5d\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x63\x6f\x6e\x63\x61\x74\x2e\x61\x70\x70\x6c\x79\x28\x5b\x5d\x2c\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x28\x73\x29\x29\x3b\x76\x61\x72\x20\x75\x2c\x6c\x3b\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x69\x29\x7b\x76\x61\x72\x20\x66\x3b" +"\x6c\x3d\x65\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x65\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x6e\x73\x7c\x7c\x46\x2e\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x28\x69\x29\x2c\x75\x3d\x46\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x28\x69\x29\x3f\x6e\x65\x77\x20\x70\x65\x28\x46\x2e\x70\x61\x72\x73\x65\x50\x6c\x61\x74\x66\x6f\x72\x6d\x54\x61\x67\x4e\x61\x6d\x65\x28\x69\x29\x2c" +"\x61\x2c\x73\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x65\x29\x3a\x61\x26\x26\x61\x2e\x70\x72\x65\x7c\x7c\x21\x6e\x28\x66\x3d\x4c\x65\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x22\x2c\x69\x29\x29\x3f\x6e\x65\x77\x20\x70\x65\x28\x69\x2c\x61\x2c\x73\x2c\x76\x6f\x69\x64\x20\x30\x2c\x76\x6f\x69\x64\x20\x30\x2c\x65\x29\x3a\x4d\x74\x28" +"\x66\x2c\x61\x2c\x65\x2c\x73\x2c\x69\x29\x7d\x65\x6c\x73\x65\x20\x75\x3d\x4d\x74\x28\x69\x2c\x61\x2c\x65\x2c\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x75\x29\x3f\x75\x3a\x6e\x28\x75\x29\x3f\x28\x6e\x28\x6c\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x69\x2c\x6f\x2c\x61\x29\x7b\x69\x2e\x6e\x73\x3d\x6f\x3b\x22\x66\x6f\x72\x65\x69\x67" +"\x6e\x4f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x3d\x69\x2e\x74\x61\x67\x26\x26\x28\x6f\x3d\x76\x6f\x69\x64\x20\x30\x2c\x61\x3d\x21\x30\x29\x3b\x69\x66\x28\x6e\x28\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x3d\x30\x2c\x63\x3d\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x3c\x63\x3b\x73\x2b\x2b\x29\x7b\x76\x61\x72\x20\x75\x3d\x69\x2e" +"\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x73\x5d\x3b\x6e\x28\x75\x2e\x74\x61\x67\x29\x26\x26\x28\x74\x28\x75\x2e\x6e\x73\x29\x7c\x7c\x72\x28\x61\x29\x26\x26\x22\x73\x76\x67\x22\x21\x3d\x3d\x75\x2e\x74\x61\x67\x29\x26\x26\x65\x28\x75\x2c\x6f\x2c\x61\x29\x7d\x7d\x28\x75\x2c\x6c\x29\x2c\x6e\x28\x61\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6f\x28\x65\x2e\x73\x74\x79\x6c\x65\x29\x26\x26" +"\x74\x74\x28\x65\x2e\x73\x74\x79\x6c\x65\x29\x3b\x6f\x28\x65\x2e\x63\x6c\x61\x73\x73\x29\x26\x26\x74\x74\x28\x65\x2e\x63\x6c\x61\x73\x73\x29\x7d\x28\x61\x29\x2c\x75\x29\x3a\x76\x65\x28\x29\x7d\x28\x65\x2c\x61\x2c\x73\x2c\x63\x2c\x75\x29\x7d\x76\x61\x72\x20\x42\x74\x2c\x55\x74\x3d\x6e\x75\x6c\x6c\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x74\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x65" +"\x2e\x5f\x5f\x65\x73\x4d\x6f\x64\x75\x6c\x65\x7c\x7c\x6f\x65\x26\x26\x22\x4d\x6f\x64\x75\x6c\x65\x22\x3d\x3d\x3d\x65\x5b\x53\x79\x6d\x62\x6f\x6c\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x54\x61\x67\x5d\x29\x26\x26\x28\x65\x3d\x65\x2e\x64\x65\x66\x61\x75\x6c\x74\x29\x2c\x6f\x28\x65\x29\x3f\x74\x2e\x65\x78\x74\x65\x6e\x64\x28\x65\x29\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x74\x28\x65\x29\x7b" +"\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x5b\x74\x5d\x3b\x69\x66\x28\x6e\x28\x72\x29\x26\x26\x28\x6e\x28\x72\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x29\x7c\x7c\x70\x74\x28\x72\x29\x29\x29\x72" +"\x65\x74\x75\x72\x6e\x20\x72\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x74\x28\x65\x2c\x74\x29\x7b\x42\x74\x2e\x24\x6f\x6e\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x74\x28\x65\x2c\x74\x29\x7b\x42\x74\x2e\x24\x6f\x66\x66\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x74\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x42\x74\x3b\x72\x65\x74\x75\x72\x6e" +"\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x28\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x3d\x74\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x26\x26\x6e\x2e\x24\x6f\x66\x66\x28\x65\x2c\x72\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x74\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x42\x74\x3d\x65\x2c\x69\x74\x28\x74\x2c\x6e\x7c\x7c\x7b\x7d\x2c\x4b\x74\x2c\x4a\x74\x2c" +"\x71\x74\x2c\x65\x29\x2c\x42\x74\x3d\x76\x6f\x69\x64\x20\x30\x7d\x76\x61\x72\x20\x5a\x74\x3d\x6e\x75\x6c\x6c\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x74\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x5a\x74\x3b\x72\x65\x74\x75\x72\x6e\x20\x5a\x74\x3d\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x5a\x74\x3d\x74\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x74\x28\x65\x29\x7b\x66\x6f\x72\x28" +"\x3b\x65\x26\x26\x28\x65\x3d\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x29\x3b\x29\x69\x66\x28\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x59\x74\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74\x29\x7b\x69\x66\x28\x65\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x2c\x58" +"\x74\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x65\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x7c\x7c\x6e\x75\x6c\x6c\x3d\x3d\x3d\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x29\x7b\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x3b\x66\x6f\x72\x28" +"\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x59\x74\x28\x65\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x6e\x5d\x29\x3b\x51\x74\x28\x65\x2c\x22\x61\x63\x74\x69\x76\x61\x74\x65\x64\x22\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x74\x28\x65\x2c\x74\x29\x7b\x6c\x65\x28\x29\x3b\x76\x61\x72\x20\x6e\x3d\x65" +"\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x74\x5d\x2c\x72\x3d\x74\x2b\x22\x20\x68\x6f\x6f\x6b\x22\x3b\x69\x66\x28\x6e\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x2c\x6f\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x42\x65\x28\x6e\x5b\x69\x5d\x2c\x65\x2c\x6e\x75\x6c\x6c\x2c\x65\x2c\x72\x29\x3b\x65\x2e\x5f\x68\x61\x73\x48\x6f\x6f\x6b\x45\x76\x65\x6e\x74\x26\x26\x65\x2e" +"\x24\x65\x6d\x69\x74\x28\x22\x68\x6f\x6f\x6b\x3a\x22\x2b\x74\x29\x2c\x66\x65\x28\x29\x7d\x76\x61\x72\x20\x65\x6e\x3d\x5b\x5d\x2c\x74\x6e\x3d\x5b\x5d\x2c\x6e\x6e\x3d\x7b\x7d\x2c\x72\x6e\x3d\x21\x31\x2c\x6f\x6e\x3d\x21\x31\x2c\x61\x6e\x3d\x30\x3b\x76\x61\x72\x20\x73\x6e\x3d\x30\x2c\x63\x6e\x3d\x44\x61\x74\x65\x2e\x6e\x6f\x77\x3b\x69\x66\x28\x56\x26\x26\x21\x71\x29\x7b\x76\x61\x72\x20\x75\x6e\x3d\x77" +"\x69\x6e\x64\x6f\x77\x2e\x70\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x3b\x75\x6e\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x75\x6e\x2e\x6e\x6f\x77\x26\x26\x63\x6e\x28\x29\x3e\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x76\x65\x6e\x74\x28\x22\x45\x76\x65\x6e\x74\x22\x29\x2e\x74\x69\x6d\x65\x53\x74\x61\x6d\x70\x26\x26\x28\x63\x6e\x3d\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x75\x6e\x2e\x6e\x6f\x77\x28\x29\x7d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x2c\x74\x3b\x66\x6f\x72\x28\x73\x6e\x3d\x63\x6e\x28\x29\x2c\x6f\x6e\x3d\x21\x30\x2c\x65\x6e\x2e\x73\x6f\x72\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69" +"\x64\x2d\x74\x2e\x69\x64\x7d\x29\x2c\x61\x6e\x3d\x30\x3b\x61\x6e\x3c\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x61\x6e\x2b\x2b\x29\x28\x65\x3d\x65\x6e\x5b\x61\x6e\x5d\x29\x2e\x62\x65\x66\x6f\x72\x65\x26\x26\x65\x2e\x62\x65\x66\x6f\x72\x65\x28\x29\x2c\x74\x3d\x65\x2e\x69\x64\x2c\x6e\x6e\x5b\x74\x5d\x3d\x6e\x75\x6c\x6c\x2c\x65\x2e\x72\x75\x6e\x28\x29\x3b\x76\x61\x72\x20\x6e\x3d\x74\x6e\x2e\x73\x6c\x69" +"\x63\x65\x28\x29\x2c\x72\x3d\x65\x6e\x2e\x73\x6c\x69\x63\x65\x28\x29\x3b\x61\x6e\x3d\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x74\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x2c\x6e\x6e\x3d\x7b\x7d\x2c\x72\x6e\x3d\x6f\x6e\x3d\x21\x31\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x30\x3b\x74\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x2b\x2b\x29\x65\x5b\x74" +"\x5d\x2e\x5f\x69\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x2c\x59\x74\x28\x65\x5b\x74\x5d\x2c\x21\x30\x29\x7d\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x6f\x72\x28\x3b\x74\x2d\x2d\x3b\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x5b\x74\x5d\x2c\x72\x3d\x6e\x2e\x76\x6d\x3b\x72\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x3d\x3d\x3d" +"\x6e\x26\x26\x72\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x26\x26\x21\x72\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x26\x26\x51\x74\x28\x72\x2c\x22\x75\x70\x64\x61\x74\x65\x64\x22\x29\x7d\x7d\x28\x72\x29\x2c\x6e\x65\x26\x26\x46\x2e\x64\x65\x76\x74\x6f\x6f\x6c\x73\x26\x26\x6e\x65\x2e\x65\x6d\x69\x74\x28\x22\x66\x6c\x75\x73\x68\x22\x29\x7d\x76\x61\x72\x20\x66\x6e\x3d\x30\x2c\x70\x6e\x3d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x74\x68\x69\x73\x2e\x76\x6d\x3d\x65\x2c\x69\x26\x26\x28\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x3d\x74\x68\x69\x73\x29\x2c\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x2e\x70\x75\x73\x68\x28\x74\x68\x69\x73\x29\x2c\x72\x3f\x28\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x3d\x21\x21\x72\x2e\x64\x65\x65\x70\x2c\x74\x68\x69\x73" +"\x2e\x75\x73\x65\x72\x3d\x21\x21\x72\x2e\x75\x73\x65\x72\x2c\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x3d\x21\x21\x72\x2e\x6c\x61\x7a\x79\x2c\x74\x68\x69\x73\x2e\x73\x79\x6e\x63\x3d\x21\x21\x72\x2e\x73\x79\x6e\x63\x2c\x74\x68\x69\x73\x2e\x62\x65\x66\x6f\x72\x65\x3d\x72\x2e\x62\x65\x66\x6f\x72\x65\x29\x3a\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x3d\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x3d\x74\x68\x69\x73\x2e" +"\x6c\x61\x7a\x79\x3d\x74\x68\x69\x73\x2e\x73\x79\x6e\x63\x3d\x21\x31\x2c\x74\x68\x69\x73\x2e\x63\x62\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x69\x64\x3d\x2b\x2b\x66\x6e\x2c\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x3d\x21\x30\x2c\x74\x68\x69\x73\x2e\x64\x69\x72\x74\x79\x3d\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x3d\x5b\x5d\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65" +"\x70\x73\x3d\x5b\x5d\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x3d\x6e\x65\x77\x20\x69\x65\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x3d\x6e\x65\x77\x20\x69\x65\x2c\x74\x68\x69\x73\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3d\x22\x22\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x3d\x74" +"\x3a\x28\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x21\x48\x2e\x74\x65\x73\x74\x28\x65\x29\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x73\x70\x6c\x69\x74\x28\x22\x2e\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x74\x2e\x6c\x65\x6e\x67\x74" +"\x68\x3b\x6e\x2b\x2b\x29\x7b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x3b\x65\x3d\x65\x5b\x74\x5b\x6e\x5d\x5d\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x7d\x7d\x28\x74\x29\x2c\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x7c\x7c\x28\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x3d\x53\x29\x29\x2c\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3d\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x3f\x76\x6f\x69\x64" +"\x20\x30\x3a\x74\x68\x69\x73\x2e\x67\x65\x74\x28\x29\x7d\x3b\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x67\x65\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3b\x6c\x65\x28\x74\x68\x69\x73\x29\x3b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x76\x6d\x3b\x74\x72\x79\x7b\x65\x3d\x74\x68\x69\x73\x2e\x67\x65\x74\x74\x65\x72\x2e\x63\x61\x6c\x6c\x28\x74\x2c\x74\x29\x7d" +"\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x69\x66\x28\x21\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x29\x74\x68\x72\x6f\x77\x20\x65\x3b\x48\x65\x28\x65\x2c\x74\x2c\x27\x67\x65\x74\x74\x65\x72\x20\x66\x6f\x72\x20\x77\x61\x74\x63\x68\x65\x72\x20\x22\x27\x2b\x74\x68\x69\x73\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x27\x22\x27\x29\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x26" +"\x26\x74\x74\x28\x65\x29\x2c\x66\x65\x28\x29\x2c\x74\x68\x69\x73\x2e\x63\x6c\x65\x61\x6e\x75\x70\x44\x65\x70\x73\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x61\x64\x64\x44\x65\x70\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x69\x64\x3b\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x68" +"\x61\x73\x28\x74\x29\x7c\x7c\x28\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x61\x64\x64\x28\x74\x29\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x2e\x68\x61\x73\x28\x74\x29\x7c\x7c\x65\x2e\x61\x64\x64\x53\x75\x62\x28\x74\x68\x69\x73\x29\x29\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65" +"\x2e\x63\x6c\x65\x61\x6e\x75\x70\x44\x65\x70\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x65\x2d\x2d\x3b\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x5b\x65\x5d\x3b\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x68\x61\x73\x28\x74\x2e\x69\x64\x29" +"\x7c\x7c\x74\x2e\x72\x65\x6d\x6f\x76\x65\x53\x75\x62\x28\x74\x68\x69\x73\x29\x7d\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x3b\x74\x68\x69\x73\x2e\x64\x65\x70\x49\x64\x73\x3d\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x49\x64\x73\x2e\x63\x6c\x65" +"\x61\x72\x28\x29\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2c\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x3d\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x3d\x6e\x2c\x74\x68\x69\x73\x2e\x6e\x65\x77\x44\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x75\x70\x64\x61\x74\x65\x3d\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x6c\x61\x7a\x79\x3f\x74\x68\x69\x73\x2e\x64\x69\x72\x74\x79\x3d\x21\x30\x3a\x74\x68\x69\x73\x2e\x73\x79\x6e\x63\x3f\x74\x68\x69\x73\x2e\x72\x75\x6e\x28\x29\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x69\x64\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x3d\x3d\x6e\x6e\x5b\x74\x5d\x29\x7b\x69\x66\x28\x6e\x6e\x5b\x74" +"\x5d\x3d\x21\x30\x2c\x6f\x6e\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x3b\x6e\x3e\x61\x6e\x26\x26\x65\x6e\x5b\x6e\x5d\x2e\x69\x64\x3e\x65\x2e\x69\x64\x3b\x29\x6e\x2d\x2d\x3b\x65\x6e\x2e\x73\x70\x6c\x69\x63\x65\x28\x6e\x2b\x31\x2c\x30\x2c\x65\x29\x7d\x65\x6c\x73\x65\x20\x65\x6e\x2e\x70\x75\x73\x68\x28\x65\x29\x3b\x72\x6e\x7c\x7c\x28\x72\x6e\x3d\x21" +"\x30\x2c\x51\x65\x28\x6c\x6e\x29\x29\x7d\x7d\x28\x74\x68\x69\x73\x29\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x72\x75\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x66\x28\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x67\x65\x74\x28\x29\x3b\x69\x66\x28\x65\x21\x3d\x3d\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x7c\x7c\x6f" +"\x28\x65\x29\x7c\x7c\x74\x68\x69\x73\x2e\x64\x65\x65\x70\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3b\x69\x66\x28\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3d\x65\x2c\x74\x68\x69\x73\x2e\x75\x73\x65\x72\x29\x7b\x76\x61\x72\x20\x6e\x3d\x27\x63\x61\x6c\x6c\x62\x61\x63\x6b\x20\x66\x6f\x72\x20\x77\x61\x74\x63\x68\x65\x72\x20\x22\x27\x2b\x74\x68\x69\x73\x2e\x65\x78\x70\x72" +"\x65\x73\x73\x69\x6f\x6e\x2b\x27\x22\x27\x3b\x42\x65\x28\x74\x68\x69\x73\x2e\x63\x62\x2c\x74\x68\x69\x73\x2e\x76\x6d\x2c\x5b\x65\x2c\x74\x5d\x2c\x74\x68\x69\x73\x2e\x76\x6d\x2c\x6e\x29\x7d\x65\x6c\x73\x65\x20\x74\x68\x69\x73\x2e\x63\x62\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2e\x76\x6d\x2c\x65\x2c\x74\x29\x7d\x7d\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x65\x76\x61\x6c\x75\x61" +"\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x76\x61\x6c\x75\x65\x3d\x74\x68\x69\x73\x2e\x67\x65\x74\x28\x29\x2c\x74\x68\x69\x73\x2e\x64\x69\x72\x74\x79\x3d\x21\x31\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x64\x65\x70\x65\x6e\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x64\x65\x70" +"\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x65\x2d\x2d\x3b\x29\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x5b\x65\x5d\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x7d\x2c\x70\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x69\x66\x28\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x29\x7b\x74\x68\x69\x73\x2e\x76\x6d\x2e\x5f\x69\x73\x42\x65\x69" +"\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x7c\x7c\x68\x28\x74\x68\x69\x73\x2e\x76\x6d\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x2c\x74\x68\x69\x73\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x65\x2d\x2d\x3b\x29\x74\x68\x69\x73\x2e\x64\x65\x70\x73\x5b\x65\x5d\x2e\x72\x65\x6d\x6f\x76\x65\x53\x75\x62\x28\x74\x68\x69\x73\x29\x3b" +"\x74\x68\x69\x73\x2e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x7d\x7d\x3b\x76\x61\x72\x20\x64\x6e\x3d\x7b\x65\x6e\x75\x6d\x65\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x62\x6c\x65\x3a\x21\x30\x2c\x67\x65\x74\x3a\x53\x2c\x73\x65\x74\x3a\x53\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x64\x6e\x2e\x67\x65\x74\x3d\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x5b\x74\x5d\x5b\x6e\x5d\x7d\x2c\x64\x6e\x2e\x73\x65\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x5b\x74\x5d\x5b\x6e\x5d\x3d\x65\x7d\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x6e\x2c\x64\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x6e\x28\x65" +"\x29\x7b\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x3d\x5b\x5d\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x74\x2e\x70\x72\x6f\x70\x73\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x7c\x7c\x7b\x7d\x2c\x72\x3d\x65\x2e\x5f\x70\x72\x6f\x70\x73\x3d\x7b" +"\x7d\x2c\x69\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x72\x6f\x70\x4b\x65\x79\x73\x3d\x5b\x5d\x3b\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x26\x26\x24\x65\x28\x21\x31\x29\x3b\x76\x61\x72\x20\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x69\x2e\x70\x75\x73\x68\x28\x6f\x29\x3b\x76\x61\x72\x20\x61\x3d\x49\x65\x28\x6f\x2c\x74\x2c\x6e\x2c\x65\x29\x3b\x78\x65\x28\x72\x2c\x6f\x2c\x61" +"\x29\x2c\x6f\x20\x69\x6e\x20\x65\x7c\x7c\x76\x6e\x28\x65\x2c\x22\x5f\x70\x72\x6f\x70\x73\x22\x2c\x6f\x29\x7d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x61\x20\x69\x6e\x20\x74\x29\x6f\x28\x61\x29\x3b\x24\x65\x28\x21\x30\x29\x7d\x28\x65\x2c\x74\x2e\x70\x72\x6f\x70\x73\x29\x2c\x74\x2e\x6d\x65\x74\x68\x6f\x64\x73\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x24\x6f\x70\x74\x69\x6f" +"\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x65\x5b\x6e\x5d\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x21\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x5b\x6e\x5d\x3f\x53\x3a\x78\x28\x74\x5b\x6e\x5d\x2c\x65\x29\x7d\x28\x65\x2c\x74\x2e\x6d\x65\x74\x68\x6f\x64\x73\x29\x2c\x74\x2e\x64\x61\x74\x61\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61" +"\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x64\x61\x74\x61\x3b\x73\x28\x74\x3d\x65\x2e\x5f\x64\x61\x74\x61\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x6c\x65\x28\x29\x3b\x74\x72\x79\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x61\x6c\x6c\x28\x74\x2c\x74\x29\x7d\x63\x61\x74\x63\x68" +"\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x65\x28\x65\x2c\x74\x2c\x22\x64\x61\x74\x61\x28\x29\x22\x29\x2c\x7b\x7d\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x66\x65\x28\x29\x7d\x7d\x28\x74\x2c\x65\x29\x3a\x74\x7c\x7c\x7b\x7d\x29\x7c\x7c\x28\x74\x3d\x7b\x7d\x29\x3b\x76\x61\x72\x20\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2c\x72\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e" +"\x70\x72\x6f\x70\x73\x2c\x69\x3d\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6d\x65\x74\x68\x6f\x64\x73\x2c\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3b\x66\x6f\x72\x28\x3b\x69\x2d\x2d\x3b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x5b\x69\x5d\x3b\x72\x26\x26\x79\x28\x72\x2c\x6f\x29\x7c\x7c\x28\x61\x3d\x76\x6f\x69\x64\x20\x30\x2c\x33\x36\x21\x3d\x3d\x28\x61\x3d\x28\x6f\x2b\x22\x22\x29\x2e\x63\x68\x61\x72" +"\x43\x6f\x64\x65\x41\x74\x28\x30\x29\x29\x26\x26\x39\x35\x21\x3d\x3d\x61\x26\x26\x76\x6e\x28\x65\x2c\x22\x5f\x64\x61\x74\x61\x22\x2c\x6f\x29\x29\x7d\x76\x61\x72\x20\x61\x3b\x43\x65\x28\x74\x2c\x21\x30\x29\x7d\x28\x65\x29\x3a\x43\x65\x28\x65\x2e\x5f\x64\x61\x74\x61\x3d\x7b\x7d\x2c\x21\x30\x29\x2c\x74\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b" +"\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x63\x6f\x6d\x70\x75\x74\x65\x64\x57\x61\x74\x63\x68\x65\x72\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x74\x65\x28\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20\x6f\x3d\x74\x5b\x69\x5d\x2c\x61\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66" +"\x20\x6f\x3f\x6f\x3a\x6f\x2e\x67\x65\x74\x3b\x72\x7c\x7c\x28\x6e\x5b\x69\x5d\x3d\x6e\x65\x77\x20\x70\x6e\x28\x65\x2c\x61\x7c\x7c\x53\x2c\x53\x2c\x6d\x6e\x29\x29\x2c\x69\x20\x69\x6e\x20\x65\x7c\x7c\x79\x6e\x28\x65\x2c\x69\x2c\x6f\x29\x7d\x7d\x28\x65\x2c\x74\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x29\x2c\x74\x2e\x77\x61\x74\x63\x68\x26\x26\x74\x2e\x77\x61\x74\x63\x68\x21\x3d\x3d\x59\x26\x26\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x5b\x6e\x5d\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x62\x6e\x28\x65\x2c\x6e\x2c\x72\x5b\x69\x5d\x29\x3b\x65\x6c" +"\x73\x65\x20\x62\x6e\x28\x65\x2c\x6e\x2c\x72\x29\x7d\x7d\x28\x65\x2c\x74\x2e\x77\x61\x74\x63\x68\x29\x7d\x76\x61\x72\x20\x6d\x6e\x3d\x7b\x6c\x61\x7a\x79\x3a\x21\x30\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x21\x74\x65\x28\x29\x3b\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6e\x3f\x28\x64\x6e\x2e\x67" +"\x65\x74\x3d\x72\x3f\x67\x6e\x28\x74\x29\x3a\x5f\x6e\x28\x6e\x29\x2c\x64\x6e\x2e\x73\x65\x74\x3d\x53\x29\x3a\x28\x64\x6e\x2e\x67\x65\x74\x3d\x6e\x2e\x67\x65\x74\x3f\x72\x26\x26\x21\x31\x21\x3d\x3d\x6e\x2e\x63\x61\x63\x68\x65\x3f\x67\x6e\x28\x74\x29\x3a\x5f\x6e\x28\x6e\x2e\x67\x65\x74\x29\x3a\x53\x2c\x64\x6e\x2e\x73\x65\x74\x3d\x6e\x2e\x73\x65\x74\x7c\x7c\x53\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64" +"\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x74\x2c\x64\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x5f\x63\x6f\x6d\x70\x75\x74\x65\x64\x57\x61\x74\x63\x68\x65\x72\x73\x26\x26\x74\x68\x69\x73\x2e\x5f\x63\x6f\x6d\x70\x75\x74\x65\x64\x57" +"\x61\x74\x63\x68\x65\x72\x73\x5b\x65\x5d\x3b\x69\x66\x28\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x64\x69\x72\x74\x79\x26\x26\x74\x2e\x65\x76\x61\x6c\x75\x61\x74\x65\x28\x29\x2c\x63\x65\x2e\x74\x61\x72\x67\x65\x74\x26\x26\x74\x2e\x64\x65\x70\x65\x6e\x64\x28\x29\x2c\x74\x2e\x76\x61\x6c\x75\x65\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2c\x74\x68\x69\x73\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x73\x28\x6e\x29\x26\x26\x28\x72\x3d\x6e\x2c\x6e\x3d\x6e\x2e\x68\x61\x6e\x64\x6c\x65\x72\x29\x2c\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70" +"\x65\x6f\x66\x20\x6e\x26\x26\x28\x6e\x3d\x65\x5b\x6e\x5d\x29\x2c\x65\x2e\x24\x77\x61\x74\x63\x68\x28\x74\x2c\x6e\x2c\x72\x29\x7d\x76\x61\x72\x20\x24\x6e\x3d\x30\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x77\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x65\x2e\x73\x75\x70\x65\x72\x29\x7b\x76\x61\x72\x20\x6e\x3d\x77\x6e\x28\x65\x2e\x73\x75\x70\x65\x72" +"\x29\x3b\x69\x66\x28\x6e\x21\x3d\x3d\x65\x2e\x73\x75\x70\x65\x72\x4f\x70\x74\x69\x6f\x6e\x73\x29\x7b\x65\x2e\x73\x75\x70\x65\x72\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x6e\x3b\x76\x61\x72\x20\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x3d\x65\x2e\x73\x65\x61\x6c\x65\x64\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x66\x6f\x72\x28" +"\x76\x61\x72\x20\x69\x20\x69\x6e\x20\x6e\x29\x6e\x5b\x69\x5d\x21\x3d\x3d\x72\x5b\x69\x5d\x26\x26\x28\x74\x7c\x7c\x28\x74\x3d\x7b\x7d\x29\x2c\x74\x5b\x69\x5d\x3d\x6e\x5b\x69\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x65\x29\x3b\x72\x26\x26\x41\x28\x65\x2e\x65\x78\x74\x65\x6e\x64\x4f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x29\x2c\x28\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x6e" +"\x2c\x65\x2e\x65\x78\x74\x65\x6e\x64\x4f\x70\x74\x69\x6f\x6e\x73\x29\x29\x2e\x6e\x61\x6d\x65\x26\x26\x28\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x5b\x74\x2e\x6e\x61\x6d\x65\x5d\x3d\x65\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x5f\x69\x6e\x69\x74\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x6e" +"\x28\x65\x29\x7b\x65\x2e\x63\x69\x64\x3d\x30\x3b\x76\x61\x72\x20\x74\x3d\x31\x3b\x65\x2e\x65\x78\x74\x65\x6e\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x3d\x65\x7c\x7c\x7b\x7d\x3b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2c\x72\x3d\x6e\x2e\x63\x69\x64\x2c\x69\x3d\x65\x2e\x5f\x43\x74\x6f\x72\x7c\x7c\x28\x65\x2e\x5f\x43\x74\x6f\x72\x3d\x7b\x7d\x29\x3b\x69\x66\x28\x69\x5b\x72\x5d\x29" +"\x72\x65\x74\x75\x72\x6e\x20\x69\x5b\x72\x5d\x3b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x6e\x61\x6d\x65\x7c\x7c\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6e\x61\x6d\x65\x2c\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x5f\x69\x6e\x69\x74\x28\x65\x29\x7d\x3b\x72\x65\x74\x75\x72\x6e\x28\x61\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61" +"\x74\x65\x28\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x29\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x3d\x61\x2c\x61\x2e\x63\x69\x64\x3d\x74\x2b\x2b\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x65\x29\x2c\x61\x2e\x73\x75\x70\x65\x72\x3d\x6e\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x26\x26\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x76\x6e\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x5f\x70\x72\x6f\x70\x73\x22\x2c\x6e\x29\x7d\x28\x61\x29\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x26\x26\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x75\x74\x65\x64\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x74\x29\x79\x6e\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x6e\x2c\x74\x5b\x6e\x5d\x29\x7d\x28\x61\x29\x2c\x61\x2e\x65\x78\x74\x65\x6e\x64\x3d\x6e\x2e\x65\x78\x74\x65\x6e\x64\x2c\x61\x2e\x6d\x69\x78\x69\x6e\x3d\x6e" +"\x2e\x6d\x69\x78\x69\x6e\x2c\x61\x2e\x75\x73\x65\x3d\x6e\x2e\x75\x73\x65\x2c\x49\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x61\x5b\x65\x5d\x3d\x6e\x5b\x65\x5d\x7d\x29\x2c\x6f\x26\x26\x28\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x5b\x6f\x5d\x3d\x61\x29\x2c\x61\x2e\x73\x75\x70\x65\x72\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x6e" +"\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x61\x2e\x65\x78\x74\x65\x6e\x64\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x65\x2c\x61\x2e\x73\x65\x61\x6c\x65\x64\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x41\x28\x7b\x7d\x2c\x61\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x2c\x69\x5b\x72\x5d\x3d\x61\x2c\x61\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x26\x26\x28\x65\x2e\x43\x74\x6f" +"\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6e\x61\x6d\x65\x7c\x7c\x65\x2e\x74\x61\x67\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3e\x2d\x31\x3a\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65" +"\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x22\x29\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x74\x29\x3e\x2d\x31\x3a\x28\x6e\x3d\x65\x2c\x22\x5b\x6f\x62\x6a\x65\x63\x74\x20\x52\x65\x67\x45\x78\x70\x5d\x22\x3d\x3d\x3d\x61\x2e\x63\x61\x6c\x6c\x28\x6e\x29\x26\x26\x65\x2e\x74\x65\x73\x74\x28\x74\x29\x29\x3b\x76\x61\x72\x20\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20" +"\x6e\x3d\x65\x2e\x63\x61\x63\x68\x65\x2c\x72\x3d\x65\x2e\x6b\x65\x79\x73\x2c\x69\x3d\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x6e\x29\x7b\x76\x61\x72\x20\x61\x3d\x6e\x5b\x6f\x5d\x3b\x69\x66\x28\x61\x29\x7b\x76\x61\x72\x20\x73\x3d\x61\x2e\x6e\x61\x6d\x65\x3b\x73\x26\x26\x21\x74\x28\x73\x29\x26\x26\x53\x6e\x28\x6e\x2c\x6f\x2c\x72\x2c\x69\x29\x7d\x7d\x7d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x74\x5d\x3b\x21\x69\x7c\x7c\x72\x26\x26\x69\x2e\x74\x61\x67\x3d\x3d\x3d\x72\x2e\x74\x61\x67\x7c\x7c\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x24\x64\x65\x73\x74\x72\x6f\x79\x28\x29\x2c\x65\x5b\x74\x5d\x3d\x6e\x75\x6c\x6c\x2c\x68\x28\x6e\x2c\x74" +"\x29\x7d\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x5f\x69\x6e\x69\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x3b\x6e\x2e\x5f\x75\x69\x64\x3d\x24\x6e\x2b\x2b\x2c\x6e\x2e\x5f\x69\x73\x56\x75\x65\x3d\x21\x30\x2c\x74\x26\x26\x74\x2e\x5f\x69\x73\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3f\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x2c\x72\x3d\x74\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3b\x6e\x2e\x70\x61\x72\x65\x6e\x74\x3d\x74\x2e\x70\x61\x72\x65\x6e\x74" +"\x2c\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3d\x72\x3b\x76\x61\x72\x20\x69\x3d\x72\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x6e\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x3d\x69\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x2c\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x69\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x2c\x6e\x2e" +"\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65\x6e\x3d\x69\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x6e\x2e\x5f\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x54\x61\x67\x3d\x69\x2e\x74\x61\x67\x2c\x74\x2e\x72\x65\x6e\x64\x65\x72\x26\x26\x28\x6e\x2e\x72\x65\x6e\x64\x65\x72\x3d\x74\x2e\x72\x65\x6e\x64\x65\x72\x2c\x6e\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x74\x2e\x73\x74" +"\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x29\x7d\x28\x6e\x2c\x74\x29\x3a\x6e\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x77\x6e\x28\x6e\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x29\x2c\x74\x7c\x7c\x7b\x7d\x2c\x6e\x29\x2c\x6e\x2e\x5f\x72\x65\x6e\x64\x65\x72\x50\x72\x6f\x78\x79\x3d\x6e\x2c\x6e\x2e\x5f\x73\x65\x6c\x66\x3d\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29" +"\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x6e\x3d\x74\x2e\x70\x61\x72\x65\x6e\x74\x3b\x69\x66\x28\x6e\x26\x26\x21\x74\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x29\x7b\x66\x6f\x72\x28\x3b\x6e\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x26\x26\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x29\x6e\x3d\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x6e\x2e\x24" +"\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x75\x73\x68\x28\x65\x29\x7d\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x3d\x6e\x2c\x65\x2e\x24\x72\x6f\x6f\x74\x3d\x6e\x3f\x6e\x2e\x24\x72\x6f\x6f\x74\x3a\x65\x2c\x65\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x5b\x5d\x2c\x65\x2e\x24\x72\x65\x66\x73\x3d\x7b\x7d\x2c\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x3d\x6e\x75\x6c\x6c\x2c\x65\x2e\x5f\x69\x6e\x61\x63\x74\x69" +"\x76\x65\x3d\x6e\x75\x6c\x6c\x2c\x65\x2e\x5f\x64\x69\x72\x65\x63\x74\x49\x6e\x61\x63\x74\x69\x76\x65\x3d\x21\x31\x2c\x65\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3d\x21\x31\x2c\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x31\x2c\x65\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x31\x7d\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" +"\x29\x7b\x65\x2e\x5f\x65\x76\x65\x6e\x74\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x65\x2e\x5f\x68\x61\x73\x48\x6f\x6f\x6b\x45\x76\x65\x6e\x74\x3d\x21\x31\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3b\x74\x26\x26\x57\x74\x28\x65\x2c\x74\x29\x7d\x28\x6e\x29\x2c" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x3d\x6e\x75\x6c\x6c\x2c\x74\x2e\x5f\x73\x74\x61\x74\x69\x63\x54\x72\x65\x65\x73\x3d\x6e\x75\x6c\x6c\x3b\x76\x61\x72\x20\x6e\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x3d\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x2c\x69\x3d\x72\x26\x26\x72\x2e\x63\x6f\x6e\x74" +"\x65\x78\x74\x3b\x74\x2e\x24\x73\x6c\x6f\x74\x73\x3d\x6c\x74\x28\x6e\x2e\x5f\x72\x65\x6e\x64\x65\x72\x43\x68\x69\x6c\x64\x72\x65\x6e\x2c\x69\x29\x2c\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x65\x2c\x74\x2e\x5f\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x74\x28\x74\x2c\x65\x2c\x6e\x2c\x72\x2c\x69\x2c\x21\x31\x29" +"\x7d\x2c\x74\x2e\x24\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x48\x74\x28\x74\x2c\x65\x2c\x6e\x2c\x72\x2c\x69\x2c\x21\x30\x29\x7d\x3b\x76\x61\x72\x20\x6f\x3d\x72\x26\x26\x72\x2e\x64\x61\x74\x61\x3b\x78\x65\x28\x74\x2c\x22\x24\x61\x74\x74\x72\x73\x22\x2c\x6f\x26\x26\x6f\x2e\x61\x74\x74" +"\x72\x73\x7c\x7c\x65\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x2c\x78\x65\x28\x74\x2c\x22\x24\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x22\x2c\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x7c\x7c\x65\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x7d\x28\x6e\x29\x2c\x51\x74\x28\x6e\x2c\x22\x62\x65\x66\x6f\x72\x65\x43\x72\x65\x61\x74\x65\x22\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29" +"\x7b\x76\x61\x72\x20\x74\x3d\x75\x74\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x69\x6e\x6a\x65\x63\x74\x2c\x65\x29\x3b\x74\x26\x26\x28\x24\x65\x28\x21\x31\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x78\x65\x28\x65\x2c\x6e\x2c\x74\x5b\x6e\x5d\x29\x7d\x29\x2c\x24\x65\x28\x21\x30\x29\x29\x7d" +"\x28\x6e\x29\x2c\x68\x6e\x28\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x76\x69\x64\x65\x3b\x74\x26\x26\x28\x65\x2e\x5f\x70\x72\x6f\x76\x69\x64\x65\x64\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x74\x3f\x74\x2e\x63\x61\x6c\x6c\x28\x65\x29\x3a\x74\x29\x7d\x28\x6e\x29" +"\x2c\x51\x74\x28\x6e\x2c\x22\x63\x72\x65\x61\x74\x65\x64\x22\x29\x2c\x6e\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x65\x6c\x26\x26\x6e\x2e\x24\x6d\x6f\x75\x6e\x74\x28\x6e\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x65\x6c\x29\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75" +"\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x64\x61\x74\x61\x7d\x7d\x2c\x6e\x3d\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x70\x72\x6f\x70\x73\x7d\x7d\x3b\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x64\x61\x74\x61\x22\x2c\x74\x29\x2c" +"\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x70\x72\x6f\x70\x73\x22\x2c\x6e\x29\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x73\x65\x74\x3d\x6b\x65\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x64\x65\x6c\x65\x74\x65\x3d\x41\x65\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65" +"\x2e\x24\x77\x61\x74\x63\x68\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x73\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x62\x6e\x28\x74\x68\x69\x73\x2c\x65\x2c\x74\x2c\x6e\x29\x3b\x28\x6e\x3d\x6e\x7c\x7c\x7b\x7d\x29\x2e\x75\x73\x65\x72\x3d\x21\x30\x3b\x76\x61\x72\x20\x72\x3d\x6e\x65\x77\x20\x70\x6e\x28\x74\x68\x69\x73\x2c\x65\x2c\x74\x2c\x6e\x29\x3b\x69\x66\x28" +"\x6e\x2e\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x29\x7b\x76\x61\x72\x20\x69\x3d\x27\x63\x61\x6c\x6c\x62\x61\x63\x6b\x20\x66\x6f\x72\x20\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x20\x77\x61\x74\x63\x68\x65\x72\x20\x22\x27\x2b\x72\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x27\x22\x27\x3b\x6c\x65\x28\x29\x2c\x42\x65\x28\x74\x2c\x74\x68\x69\x73\x2c\x5b\x72\x2e\x76\x61\x6c\x75\x65\x5d\x2c\x74\x68\x69\x73" +"\x2c\x69\x29\x2c\x66\x65\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x28\x29\x7d\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x2f\x5e\x68\x6f\x6f\x6b\x3a\x2f\x3b\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6f\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" +"\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x68\x69\x73\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x2c\x6f\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x72\x2e\x24\x6f\x6e\x28\x65\x5b\x69\x5d\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x28\x72\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x7c\x7c\x28" +"\x72\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x6e\x29\x2c\x74\x2e\x74\x65\x73\x74\x28\x65\x29\x26\x26\x28\x72\x2e\x5f\x68\x61\x73\x48\x6f\x6f\x6b\x45\x76\x65\x6e\x74\x3d\x21\x30\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6f\x6e\x63\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b" +"\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x28\x29\x7b\x6e\x2e\x24\x6f\x66\x66\x28\x65\x2c\x72\x29\x2c\x74\x2e\x61\x70\x70\x6c\x79\x28\x6e\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x2e\x66\x6e\x3d\x74\x2c\x6e\x2e\x24\x6f\x6e\x28\x65\x2c\x72\x29\x2c\x6e\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6f\x66" +"\x66\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x3b\x69\x66\x28\x21\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2e\x6c\x65\x6e\x67\x74\x68\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x65\x76\x65\x6e\x74\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x6e\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72" +"\x72\x61\x79\x28\x65\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x6e\x2e\x24\x6f\x66\x66\x28\x65\x5b\x72\x5d\x2c\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x76\x61\x72\x20\x6f\x2c\x61\x3d\x6e\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3b\x69\x66\x28\x21\x61\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x3b\x69" +"\x66\x28\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3d\x6e\x75\x6c\x6c\x2c\x6e\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x3d\x61\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x2d\x2d\x3b\x29\x69\x66\x28\x28\x6f\x3d\x61\x5b\x73\x5d\x29\x3d\x3d\x3d\x74\x7c\x7c\x6f\x2e\x66\x6e\x3d\x3d\x3d\x74\x29\x7b\x61\x2e\x73\x70\x6c\x69\x63\x65\x28\x73\x2c\x31\x29\x3b\x62\x72\x65" +"\x61\x6b\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x65\x6d\x69\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x5f\x65\x76\x65\x6e\x74\x73\x5b\x65\x5d\x3b\x69\x66\x28\x74\x29\x7b\x74\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x31\x3f\x6b\x28\x74\x29\x3a\x74\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e" +"\x3d\x6b\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x31\x29\x2c\x72\x3d\x27\x65\x76\x65\x6e\x74\x20\x68\x61\x6e\x64\x6c\x65\x72\x20\x66\x6f\x72\x20\x22\x27\x2b\x65\x2b\x27\x22\x27\x2c\x69\x3d\x30\x2c\x6f\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x42\x65\x28\x74\x5b\x69\x5d\x2c\x74\x68\x69\x73\x2c\x6e\x2c\x74\x68\x69\x73\x2c\x72\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x74" +"\x68\x69\x73\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x5f\x75\x70\x64\x61\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2c\x72\x3d\x6e\x2e\x24\x65\x6c\x2c\x69\x3d\x6e\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6f\x3d\x47\x74\x28\x6e\x29\x3b\x6e\x2e\x5f\x76\x6e\x6f" +"\x64\x65\x3d\x65\x2c\x6e\x2e\x24\x65\x6c\x3d\x69\x3f\x6e\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x69\x2c\x65\x29\x3a\x6e\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x6e\x2e\x24\x65\x6c\x2c\x65\x2c\x74\x2c\x21\x31\x29\x2c\x6f\x28\x29\x2c\x72\x26\x26\x28\x72\x2e\x5f\x5f\x76\x75\x65\x5f\x5f\x3d\x6e\x75\x6c\x6c\x29\x2c\x6e\x2e\x24\x65\x6c\x26\x26\x28\x6e\x2e\x24\x65\x6c\x2e\x5f\x5f\x76\x75\x65\x5f" +"\x5f\x3d\x6e\x29\x2c\x6e\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x26\x26\x6e\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x3d\x3d\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x26\x26\x28\x6e\x2e\x24\x70\x61\x72\x65\x6e\x74\x2e\x24\x65\x6c\x3d\x6e\x2e\x24\x65\x6c\x29\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61" +"\x74\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x26\x26\x74\x68\x69\x73\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x2e\x75\x70\x64\x61\x74\x65\x28\x29\x7d\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x64\x65\x73\x74\x72\x6f\x79\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x3b\x69\x66\x28\x21" +"\x65\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x29\x7b\x51\x74\x28\x65\x2c\x22\x62\x65\x66\x6f\x72\x65\x44\x65\x73\x74\x72\x6f\x79\x22\x29\x2c\x65\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x30\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x24\x70\x61\x72\x65\x6e\x74\x3b\x21\x74\x7c\x7c\x74\x2e\x5f\x69\x73\x42\x65\x69\x6e\x67\x44\x65\x73\x74" +"\x72\x6f\x79\x65\x64\x7c\x7c\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x7c\x7c\x68\x28\x74\x2e\x24\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x65\x29\x2c\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x26\x26\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x28\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73" +"\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2d\x2d\x3b\x29\x65\x2e\x5f\x77\x61\x74\x63\x68\x65\x72\x73\x5b\x6e\x5d\x2e\x74\x65\x61\x72\x64\x6f\x77\x6e\x28\x29\x3b\x65\x2e\x5f\x64\x61\x74\x61\x2e\x5f\x5f\x6f\x62\x5f\x5f\x26\x26\x65\x2e\x5f\x64\x61\x74\x61\x2e\x5f\x5f\x6f\x62\x5f\x5f\x2e\x76\x6d\x43\x6f\x75\x6e\x74\x2d\x2d\x2c\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x3d\x21\x30\x2c\x65\x2e" +"\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6e\x75\x6c\x6c\x29\x2c\x51\x74\x28\x65\x2c\x22\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x22\x29\x2c\x65\x2e\x24\x6f\x66\x66\x28\x29\x2c\x65\x2e\x24\x65\x6c\x26\x26\x28\x65\x2e\x24\x65\x6c\x2e\x5f\x5f\x76\x75\x65\x5f\x5f\x3d\x6e\x75\x6c\x6c\x29\x2c\x65\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x28\x65\x2e\x24\x76\x6e\x6f\x64\x65\x2e" +"\x70\x61\x72\x65\x6e\x74\x3d\x6e\x75\x6c\x6c\x29\x7d\x7d\x7d\x28\x43\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x4e\x74\x28\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x29\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6e\x65\x78\x74\x54\x69\x63\x6b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x51\x65\x28\x65\x2c\x74\x68\x69\x73\x29\x7d" +"\x2c\x65\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x5f\x72\x65\x6e\x64\x65\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x2c\x74\x3d\x74\x68\x69\x73\x2c\x6e\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x72\x3d\x6e\x2e\x72\x65\x6e\x64\x65\x72\x2c\x69\x3d\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x56\x6e\x6f\x64\x65\x3b\x69\x26\x26\x28\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53" +"\x6c\x6f\x74\x73\x3d\x64\x74\x28\x69\x2e\x64\x61\x74\x61\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74\x2e\x24\x73\x6c\x6f\x74\x73\x2c\x74\x2e\x24\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x29\x29\x2c\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3d\x69\x3b\x74\x72\x79\x7b\x55\x74\x3d\x74\x2c\x65\x3d\x72\x2e\x63\x61\x6c\x6c\x28\x74\x2e\x5f\x72\x65\x6e\x64\x65\x72\x50\x72\x6f\x78\x79\x2c\x74\x2e\x24" +"\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x29\x7d\x63\x61\x74\x63\x68\x28\x6e\x29\x7b\x48\x65\x28\x6e\x2c\x74\x2c\x22\x72\x65\x6e\x64\x65\x72\x22\x29\x2c\x65\x3d\x74\x2e\x5f\x76\x6e\x6f\x64\x65\x7d\x66\x69\x6e\x61\x6c\x6c\x79\x7b\x55\x74\x3d\x6e\x75\x6c\x6c\x7d\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x26\x26\x31\x3d\x3d\x3d\x65\x2e\x6c" +"\x65\x6e\x67\x74\x68\x26\x26\x28\x65\x3d\x65\x5b\x30\x5d\x29\x2c\x65\x20\x69\x6e\x73\x74\x61\x6e\x63\x65\x6f\x66\x20\x70\x65\x7c\x7c\x28\x65\x3d\x76\x65\x28\x29\x29\x2c\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x69\x2c\x65\x7d\x7d\x28\x43\x6e\x29\x3b\x76\x61\x72\x20\x54\x6e\x3d\x5b\x53\x74\x72\x69\x6e\x67\x2c\x52\x65\x67\x45\x78\x70\x2c\x41\x72\x72\x61\x79\x5d\x2c\x4e\x6e\x3d\x7b\x4b\x65\x65\x70\x41\x6c" +"\x69\x76\x65\x3a\x7b\x6e\x61\x6d\x65\x3a\x22\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76\x65\x22\x2c\x61\x62\x73\x74\x72\x61\x63\x74\x3a\x21\x30\x2c\x70\x72\x6f\x70\x73\x3a\x7b\x69\x6e\x63\x6c\x75\x64\x65\x3a\x54\x6e\x2c\x65\x78\x63\x6c\x75\x64\x65\x3a\x54\x6e\x2c\x6d\x61\x78\x3a\x5b\x53\x74\x72\x69\x6e\x67\x2c\x4e\x75\x6d\x62\x65\x72\x5d\x7d\x2c\x6d\x65\x74\x68\x6f\x64\x73\x3a\x7b\x63\x61\x63\x68\x65\x56" +"\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x2c\x74\x3d\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x76\x6e\x6f\x64\x65\x54\x6f\x43\x61\x63\x68\x65\x2c\x72\x3d\x74\x68\x69\x73\x2e\x6b\x65\x79\x54\x6f\x43\x61\x63\x68\x65\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x69\x3d\x6e\x2e\x74\x61\x67" +"\x2c\x6f\x3d\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2c\x61\x3d\x6e\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x65\x5b\x72\x5d\x3d\x7b\x6e\x61\x6d\x65\x3a\x6b\x6e\x28\x61\x29\x2c\x74\x61\x67\x3a\x69\x2c\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3a\x6f\x7d\x2c\x74\x2e\x70\x75\x73\x68\x28\x72\x29\x2c\x74\x68" +"\x69\x73\x2e\x6d\x61\x78\x26\x26\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x70\x61\x72\x73\x65\x49\x6e\x74\x28\x74\x68\x69\x73\x2e\x6d\x61\x78\x29\x26\x26\x53\x6e\x28\x65\x2c\x74\x5b\x30\x5d\x2c\x74\x2c\x74\x68\x69\x73\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x2c\x74\x68\x69\x73\x2e\x76\x6e\x6f\x64\x65\x54\x6f\x43\x61\x63\x68\x65\x3d\x6e\x75\x6c\x6c\x7d\x7d\x7d\x2c\x63\x72\x65\x61\x74\x65\x64\x3a\x66\x75\x6e\x63" +"\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x3d\x5b\x5d\x7d\x2c\x64\x65\x73\x74\x72\x6f\x79\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x65\x20\x69\x6e\x20\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x29\x53\x6e\x28" +"\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x2c\x65\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x29\x7d\x2c\x6d\x6f\x75\x6e\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x3b\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x56\x4e\x6f\x64\x65\x28\x29\x2c\x74\x68\x69\x73\x2e\x24\x77\x61\x74\x63\x68\x28\x22\x69\x6e\x63\x6c\x75\x64\x65\x22\x2c\x66\x75\x6e\x63\x74" +"\x69\x6f\x6e\x28\x74\x29\x7b\x4f\x6e\x28\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x6e\x28\x74\x2c\x65\x29\x7d\x29\x7d\x29\x2c\x74\x68\x69\x73\x2e\x24\x77\x61\x74\x63\x68\x28\x22\x65\x78\x63\x6c\x75\x64\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x4f\x6e\x28\x65\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e" +"\x21\x41\x6e\x28\x74\x2c\x65\x29\x7d\x29\x7d\x29\x7d\x2c\x75\x70\x64\x61\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x56\x4e\x6f\x64\x65\x28\x29\x7d\x2c\x72\x65\x6e\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x2e\x64\x65\x66\x61\x75\x6c\x74\x2c\x74\x3d\x7a\x74" +"\x28\x65\x29\x2c\x6e\x3d\x74\x26\x26\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6b\x6e\x28\x6e\x29\x2c\x69\x3d\x74\x68\x69\x73\x2e\x69\x6e\x63\x6c\x75\x64\x65\x2c\x6f\x3d\x74\x68\x69\x73\x2e\x65\x78\x63\x6c\x75\x64\x65\x3b\x69\x66\x28\x69\x26\x26\x28\x21\x72\x7c\x7c\x21\x41\x6e\x28\x69\x2c\x72\x29\x29\x7c\x7c\x6f\x26" +"\x26\x72\x26\x26\x41\x6e\x28\x6f\x2c\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x3b\x76\x61\x72\x20\x61\x3d\x74\x68\x69\x73\x2e\x63\x61\x63\x68\x65\x2c\x73\x3d\x74\x68\x69\x73\x2e\x6b\x65\x79\x73\x2c\x63\x3d\x6e\x75\x6c\x6c\x3d\x3d\x74\x2e\x6b\x65\x79\x3f\x6e\x2e\x43\x74\x6f\x72\x2e\x63\x69\x64\x2b\x28\x6e\x2e\x74\x61\x67\x3f\x22\x3a\x3a\x22\x2b\x6e\x2e\x74\x61\x67\x3a\x22\x22\x29\x3a\x74\x2e\x6b" +"\x65\x79\x3b\x61\x5b\x63\x5d\x3f\x28\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x61\x5b\x63\x5d\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2c\x68\x28\x73\x2c\x63\x29\x2c\x73\x2e\x70\x75\x73\x68\x28\x63\x29\x29\x3a\x28\x74\x68\x69\x73\x2e\x76\x6e\x6f\x64\x65\x54\x6f\x43\x61\x63\x68\x65\x3d\x74\x2c\x74\x68\x69\x73\x2e\x6b\x65\x79\x54" +"\x6f\x43\x61\x63\x68\x65\x3d\x63\x29\x2c\x74\x2e\x64\x61\x74\x61\x2e\x6b\x65\x65\x70\x41\x6c\x69\x76\x65\x3d\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x65\x26\x26\x65\x5b\x30\x5d\x7d\x7d\x7d\x3b\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x46\x7d\x7d\x3b\x4f\x62\x6a" +"\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x65\x2c\x22\x63\x6f\x6e\x66\x69\x67\x22\x2c\x74\x29\x2c\x65\x2e\x75\x74\x69\x6c\x3d\x7b\x77\x61\x72\x6e\x3a\x61\x65\x2c\x65\x78\x74\x65\x6e\x64\x3a\x41\x2c\x6d\x65\x72\x67\x65\x4f\x70\x74\x69\x6f\x6e\x73\x3a\x44\x65\x2c\x64\x65\x66\x69\x6e\x65\x52\x65\x61\x63\x74\x69\x76\x65\x3a\x78\x65\x7d\x2c\x65\x2e\x73\x65\x74\x3d\x6b" +"\x65\x2c\x65\x2e\x64\x65\x6c\x65\x74\x65\x3d\x41\x65\x2c\x65\x2e\x6e\x65\x78\x74\x54\x69\x63\x6b\x3d\x51\x65\x2c\x65\x2e\x6f\x62\x73\x65\x72\x76\x61\x62\x6c\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x43\x65\x28\x65\x29\x2c\x65\x7d\x2c\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x49" +"\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x74\x2b\x22\x73\x22\x5d\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x7d\x29\x2c\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x62\x61\x73\x65\x3d\x65\x2c\x41\x28\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73" +"\x2c\x4e\x6e\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e\x75\x73\x65\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x65\x64\x50\x6c\x75\x67\x69\x6e\x73\x7c\x7c\x28\x74\x68\x69\x73\x2e\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x65\x64\x50\x6c\x75\x67\x69\x6e\x73\x3d\x5b\x5d\x29\x3b\x69\x66\x28\x74\x2e\x69\x6e" +"\x64\x65\x78\x4f\x66\x28\x65\x29\x3e\x2d\x31\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x3b\x76\x61\x72\x20\x6e\x3d\x6b\x28\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x2c\x31\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x75\x6e\x73\x68\x69\x66\x74\x28\x74\x68\x69\x73\x29\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x2e\x69\x6e\x73\x74\x61\x6c\x6c\x3f\x65\x2e\x69" +"\x6e\x73\x74\x61\x6c\x6c\x2e\x61\x70\x70\x6c\x79\x28\x65\x2c\x6e\x29\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26\x26\x65\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x6e\x29\x2c\x74\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x74\x68\x69\x73\x7d\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x65\x2e\x6d\x69\x78\x69\x6e\x3d\x66\x75\x6e\x63" +"\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x44\x65\x28\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x65\x29\x2c\x74\x68\x69\x73\x7d\x7d\x28\x65\x29\x2c\x78\x6e\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x49\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x65\x5b\x74" +"\x5d\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x28\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x22\x3d\x3d\x3d\x74\x26\x26\x73\x28\x6e\x29\x26\x26\x28\x6e\x2e\x6e\x61\x6d\x65\x3d\x6e\x2e\x6e\x61\x6d\x65\x7c\x7c\x65\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x62\x61\x73\x65\x2e\x65\x78\x74\x65\x6e\x64\x28\x6e\x29\x29\x2c\x22" +"\x64\x69\x72\x65\x63\x74\x69\x76\x65\x22\x3d\x3d\x3d\x74\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x6e\x26\x26\x28\x6e\x3d\x7b\x62\x69\x6e\x64\x3a\x6e\x2c\x75\x70\x64\x61\x74\x65\x3a\x6e\x7d\x29\x2c\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x74\x2b\x22\x73\x22\x5d\x5b\x65\x5d\x3d\x6e\x2c\x6e\x29\x3a\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73" +"\x5b\x74\x2b\x22\x73\x22\x5d\x5b\x65\x5d\x7d\x7d\x29\x7d\x28\x65\x29\x7d\x28\x43\x6e\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x69\x73\x53\x65\x72\x76\x65\x72\x22\x2c\x7b\x67\x65\x74\x3a\x74\x65\x7d\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74" +"\x79\x28\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2c\x22\x24\x73\x73\x72\x43\x6f\x6e\x74\x65\x78\x74\x22\x2c\x7b\x67\x65\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x73\x73\x72\x43\x6f\x6e\x74\x65\x78\x74\x7d\x7d\x29\x2c\x4f\x62\x6a\x65\x63\x74\x2e\x64\x65" +"\x66\x69\x6e\x65\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x6e\x2c\x22\x46\x75\x6e\x63\x74\x69\x6f\x6e\x61\x6c\x52\x65\x6e\x64\x65\x72\x43\x6f\x6e\x74\x65\x78\x74\x22\x2c\x7b\x76\x61\x6c\x75\x65\x3a\x45\x74\x7d\x29\x2c\x43\x6e\x2e\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x32\x2e\x36\x2e\x31\x34\x22\x3b\x76\x61\x72\x20\x45\x6e\x3d\x70\x28\x22\x73\x74\x79\x6c\x65\x2c\x63\x6c\x61\x73\x73\x22\x29\x2c\x6a\x6e" +"\x3d\x70\x28\x22\x69\x6e\x70\x75\x74\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x2c\x6f\x70\x74\x69\x6f\x6e\x2c\x73\x65\x6c\x65\x63\x74\x2c\x70\x72\x6f\x67\x72\x65\x73\x73\x22\x29\x2c\x44\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x76\x61\x6c\x75\x65\x22\x3d\x3d\x3d\x6e\x26\x26\x6a\x6e\x28\x65\x29\x26\x26\x22\x62\x75\x74\x74\x6f\x6e\x22\x21\x3d\x3d" +"\x74\x7c\x7c\x22\x73\x65\x6c\x65\x63\x74\x65\x64\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x6f\x70\x74\x69\x6f\x6e\x22\x3d\x3d\x3d\x65\x7c\x7c\x22\x63\x68\x65\x63\x6b\x65\x64\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x65\x7c\x7c\x22\x6d\x75\x74\x65\x64\x22\x3d\x3d\x3d\x6e\x26\x26\x22\x76\x69\x64\x65\x6f\x22\x3d\x3d\x3d\x65\x7d\x2c\x4c\x6e\x3d\x70\x28\x22\x63\x6f\x6e\x74\x65\x6e\x74" +"\x65\x64\x69\x74\x61\x62\x6c\x65\x2c\x64\x72\x61\x67\x67\x61\x62\x6c\x65\x2c\x73\x70\x65\x6c\x6c\x63\x68\x65\x63\x6b\x22\x29\x2c\x49\x6e\x3d\x70\x28\x22\x65\x76\x65\x6e\x74\x73\x2c\x63\x61\x72\x65\x74\x2c\x74\x79\x70\x69\x6e\x67\x2c\x70\x6c\x61\x69\x6e\x74\x65\x78\x74\x2d\x6f\x6e\x6c\x79\x22\x29\x2c\x4d\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x42" +"\x6e\x28\x74\x29\x7c\x7c\x22\x66\x61\x6c\x73\x65\x22\x3d\x3d\x3d\x74\x3f\x22\x66\x61\x6c\x73\x65\x22\x3a\x22\x63\x6f\x6e\x74\x65\x6e\x74\x65\x64\x69\x74\x61\x62\x6c\x65\x22\x3d\x3d\x3d\x65\x26\x26\x49\x6e\x28\x74\x29\x3f\x74\x3a\x22\x74\x72\x75\x65\x22\x7d\x2c\x46\x6e\x3d\x70\x28\x22\x61\x6c\x6c\x6f\x77\x66\x75\x6c\x6c\x73\x63\x72\x65\x65\x6e\x2c\x61\x73\x79\x6e\x63\x2c\x61\x75\x74\x6f\x66\x6f\x63" +"\x75\x73\x2c\x61\x75\x74\x6f\x70\x6c\x61\x79\x2c\x63\x68\x65\x63\x6b\x65\x64\x2c\x63\x6f\x6d\x70\x61\x63\x74\x2c\x63\x6f\x6e\x74\x72\x6f\x6c\x73\x2c\x64\x65\x63\x6c\x61\x72\x65\x2c\x64\x65\x66\x61\x75\x6c\x74\x2c\x64\x65\x66\x61\x75\x6c\x74\x63\x68\x65\x63\x6b\x65\x64\x2c\x64\x65\x66\x61\x75\x6c\x74\x6d\x75\x74\x65\x64\x2c\x64\x65\x66\x61\x75\x6c\x74\x73\x65\x6c\x65\x63\x74\x65\x64\x2c\x64\x65\x66" +"\x65\x72\x2c\x64\x69\x73\x61\x62\x6c\x65\x64\x2c\x65\x6e\x61\x62\x6c\x65\x64\x2c\x66\x6f\x72\x6d\x6e\x6f\x76\x61\x6c\x69\x64\x61\x74\x65\x2c\x68\x69\x64\x64\x65\x6e\x2c\x69\x6e\x64\x65\x74\x65\x72\x6d\x69\x6e\x61\x74\x65\x2c\x69\x6e\x65\x72\x74\x2c\x69\x73\x6d\x61\x70\x2c\x69\x74\x65\x6d\x73\x63\x6f\x70\x65\x2c\x6c\x6f\x6f\x70\x2c\x6d\x75\x6c\x74\x69\x70\x6c\x65\x2c\x6d\x75\x74\x65\x64\x2c\x6e\x6f" +"\x68\x72\x65\x66\x2c\x6e\x6f\x72\x65\x73\x69\x7a\x65\x2c\x6e\x6f\x73\x68\x61\x64\x65\x2c\x6e\x6f\x76\x61\x6c\x69\x64\x61\x74\x65\x2c\x6e\x6f\x77\x72\x61\x70\x2c\x6f\x70\x65\x6e\x2c\x70\x61\x75\x73\x65\x6f\x6e\x65\x78\x69\x74\x2c\x72\x65\x61\x64\x6f\x6e\x6c\x79\x2c\x72\x65\x71\x75\x69\x72\x65\x64\x2c\x72\x65\x76\x65\x72\x73\x65\x64\x2c\x73\x63\x6f\x70\x65\x64\x2c\x73\x65\x61\x6d\x6c\x65\x73\x73\x2c" +"\x73\x65\x6c\x65\x63\x74\x65\x64\x2c\x73\x6f\x72\x74\x61\x62\x6c\x65\x2c\x74\x72\x75\x65\x73\x70\x65\x65\x64\x2c\x74\x79\x70\x65\x6d\x75\x73\x74\x6d\x61\x74\x63\x68\x2c\x76\x69\x73\x69\x62\x6c\x65\x22\x29\x2c\x50\x6e\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x2c\x52\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29" +"\x7b\x72\x65\x74\x75\x72\x6e\x22\x3a\x22\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x35\x29\x26\x26\x22\x78\x6c\x69\x6e\x6b\x22\x3d\x3d\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x35\x29\x7d\x2c\x48\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x52\x6e\x28\x65\x29\x3f\x65\x2e\x73\x6c\x69\x63\x65\x28\x36\x2c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3a\x22\x22" +"\x7d\x2c\x42\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x65\x7c\x7c\x21\x31\x3d\x3d\x3d\x65\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x2e\x64\x61\x74\x61\x2c\x72\x3d\x65\x2c\x69\x3d\x65\x3b\x6e\x28\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e" +"\x63\x65\x29\x3b\x29\x28\x69\x3d\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x26\x26\x69\x2e\x64\x61\x74\x61\x26\x26\x28\x74\x3d\x56\x6e\x28\x69\x2e\x64\x61\x74\x61\x2c\x74\x29\x29\x3b\x66\x6f\x72\x28\x3b\x6e\x28\x72\x3d\x72\x2e\x70\x61\x72\x65\x6e\x74\x29\x3b\x29\x72\x26\x26\x72\x2e\x64\x61\x74\x61\x26\x26\x28\x74\x3d\x56\x6e\x28\x74" +"\x2c\x72\x2e\x64\x61\x74\x61\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x6e\x28\x65\x29\x7c\x7c\x6e\x28\x74\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x7a\x6e\x28\x65\x2c\x4b\x6e\x28\x74\x29\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x22\x7d\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2c\x74\x2e\x63\x6c\x61\x73\x73\x29\x7d\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x20\x56\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x3a\x7a\x6e\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2c\x74\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x29\x2c\x63\x6c\x61\x73\x73\x3a\x6e\x28\x65\x2e\x63\x6c\x61\x73\x73\x29\x3f\x5b\x65\x2e\x63\x6c\x61\x73\x73\x2c\x74\x2e\x63\x6c\x61\x73\x73\x5d\x3a" +"\x74\x2e\x63\x6c\x61\x73\x73\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x3f\x74\x3f\x65\x2b\x22\x20\x22\x2b\x74\x3a\x65\x3a\x74\x7c\x7c\x22\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e" +"\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x2c\x72\x3d\x22\x22\x2c\x69\x3d\x30\x2c\x6f\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x6e\x28\x74\x3d\x4b\x6e\x28\x65\x5b\x69\x5d\x29\x29\x26\x26\x22\x22\x21\x3d\x3d\x74\x26\x26\x28\x72\x26\x26\x28\x72\x2b\x3d\x22\x20\x22\x29\x2c\x72\x2b\x3d\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x28\x65\x29\x3a\x6f\x28\x65" +"\x29\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x22\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x20\x69\x6e\x20\x65\x29\x65\x5b\x6e\x5d\x26\x26\x28\x74\x26\x26\x28\x74\x2b\x3d\x22\x20\x22\x29\x2c\x74\x2b\x3d\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x65\x29\x3a\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x65\x3a\x22\x22\x7d" +"\x76\x61\x72\x20\x4a\x6e\x3d\x7b\x73\x76\x67\x3a\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x2c\x6d\x61\x74\x68\x3a\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x38\x2f\x4d\x61\x74\x68\x2f\x4d\x61\x74\x68\x4d\x4c\x22\x7d\x2c\x71\x6e\x3d\x70\x28\x22\x68\x74\x6d\x6c\x2c\x62\x6f\x64\x79\x2c" +"\x62\x61\x73\x65\x2c\x68\x65\x61\x64\x2c\x6c\x69\x6e\x6b\x2c\x6d\x65\x74\x61\x2c\x73\x74\x79\x6c\x65\x2c\x74\x69\x74\x6c\x65\x2c\x61\x64\x64\x72\x65\x73\x73\x2c\x61\x72\x74\x69\x63\x6c\x65\x2c\x61\x73\x69\x64\x65\x2c\x66\x6f\x6f\x74\x65\x72\x2c\x68\x65\x61\x64\x65\x72\x2c\x68\x31\x2c\x68\x32\x2c\x68\x33\x2c\x68\x34\x2c\x68\x35\x2c\x68\x36\x2c\x68\x67\x72\x6f\x75\x70\x2c\x6e\x61\x76\x2c\x73\x65\x63" +"\x74\x69\x6f\x6e\x2c\x64\x69\x76\x2c\x64\x64\x2c\x64\x6c\x2c\x64\x74\x2c\x66\x69\x67\x63\x61\x70\x74\x69\x6f\x6e\x2c\x66\x69\x67\x75\x72\x65\x2c\x70\x69\x63\x74\x75\x72\x65\x2c\x68\x72\x2c\x69\x6d\x67\x2c\x6c\x69\x2c\x6d\x61\x69\x6e\x2c\x6f\x6c\x2c\x70\x2c\x70\x72\x65\x2c\x75\x6c\x2c\x61\x2c\x62\x2c\x61\x62\x62\x72\x2c\x62\x64\x69\x2c\x62\x64\x6f\x2c\x62\x72\x2c\x63\x69\x74\x65\x2c\x63\x6f\x64\x65" +"\x2c\x64\x61\x74\x61\x2c\x64\x66\x6e\x2c\x65\x6d\x2c\x69\x2c\x6b\x62\x64\x2c\x6d\x61\x72\x6b\x2c\x71\x2c\x72\x70\x2c\x72\x74\x2c\x72\x74\x63\x2c\x72\x75\x62\x79\x2c\x73\x2c\x73\x61\x6d\x70\x2c\x73\x6d\x61\x6c\x6c\x2c\x73\x70\x61\x6e\x2c\x73\x74\x72\x6f\x6e\x67\x2c\x73\x75\x62\x2c\x73\x75\x70\x2c\x74\x69\x6d\x65\x2c\x75\x2c\x76\x61\x72\x2c\x77\x62\x72\x2c\x61\x72\x65\x61\x2c\x61\x75\x64\x69\x6f\x2c" +"\x6d\x61\x70\x2c\x74\x72\x61\x63\x6b\x2c\x76\x69\x64\x65\x6f\x2c\x65\x6d\x62\x65\x64\x2c\x6f\x62\x6a\x65\x63\x74\x2c\x70\x61\x72\x61\x6d\x2c\x73\x6f\x75\x72\x63\x65\x2c\x63\x61\x6e\x76\x61\x73\x2c\x73\x63\x72\x69\x70\x74\x2c\x6e\x6f\x73\x63\x72\x69\x70\x74\x2c\x64\x65\x6c\x2c\x69\x6e\x73\x2c\x63\x61\x70\x74\x69\x6f\x6e\x2c\x63\x6f\x6c\x2c\x63\x6f\x6c\x67\x72\x6f\x75\x70\x2c\x74\x61\x62\x6c\x65\x2c" +"\x74\x68\x65\x61\x64\x2c\x74\x62\x6f\x64\x79\x2c\x74\x64\x2c\x74\x68\x2c\x74\x72\x2c\x62\x75\x74\x74\x6f\x6e\x2c\x64\x61\x74\x61\x6c\x69\x73\x74\x2c\x66\x69\x65\x6c\x64\x73\x65\x74\x2c\x66\x6f\x72\x6d\x2c\x69\x6e\x70\x75\x74\x2c\x6c\x61\x62\x65\x6c\x2c\x6c\x65\x67\x65\x6e\x64\x2c\x6d\x65\x74\x65\x72\x2c\x6f\x70\x74\x67\x72\x6f\x75\x70\x2c\x6f\x70\x74\x69\x6f\x6e\x2c\x6f\x75\x74\x70\x75\x74\x2c\x70" +"\x72\x6f\x67\x72\x65\x73\x73\x2c\x73\x65\x6c\x65\x63\x74\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x2c\x64\x65\x74\x61\x69\x6c\x73\x2c\x64\x69\x61\x6c\x6f\x67\x2c\x6d\x65\x6e\x75\x2c\x6d\x65\x6e\x75\x69\x74\x65\x6d\x2c\x73\x75\x6d\x6d\x61\x72\x79\x2c\x63\x6f\x6e\x74\x65\x6e\x74\x2c\x65\x6c\x65\x6d\x65\x6e\x74\x2c\x73\x68\x61\x64\x6f\x77\x2c\x74\x65\x6d\x70\x6c\x61\x74\x65\x2c\x62\x6c\x6f\x63\x6b\x71\x75" +"\x6f\x74\x65\x2c\x69\x66\x72\x61\x6d\x65\x2c\x74\x66\x6f\x6f\x74\x22\x29\x2c\x57\x6e\x3d\x70\x28\x22\x73\x76\x67\x2c\x61\x6e\x69\x6d\x61\x74\x65\x2c\x63\x69\x72\x63\x6c\x65\x2c\x63\x6c\x69\x70\x70\x61\x74\x68\x2c\x63\x75\x72\x73\x6f\x72\x2c\x64\x65\x66\x73\x2c\x64\x65\x73\x63\x2c\x65\x6c\x6c\x69\x70\x73\x65\x2c\x66\x69\x6c\x74\x65\x72\x2c\x66\x6f\x6e\x74\x2d\x66\x61\x63\x65\x2c\x66\x6f\x72\x65\x69" +"\x67\x6e\x6f\x62\x6a\x65\x63\x74\x2c\x67\x2c\x67\x6c\x79\x70\x68\x2c\x69\x6d\x61\x67\x65\x2c\x6c\x69\x6e\x65\x2c\x6d\x61\x72\x6b\x65\x72\x2c\x6d\x61\x73\x6b\x2c\x6d\x69\x73\x73\x69\x6e\x67\x2d\x67\x6c\x79\x70\x68\x2c\x70\x61\x74\x68\x2c\x70\x61\x74\x74\x65\x72\x6e\x2c\x70\x6f\x6c\x79\x67\x6f\x6e\x2c\x70\x6f\x6c\x79\x6c\x69\x6e\x65\x2c\x72\x65\x63\x74\x2c\x73\x77\x69\x74\x63\x68\x2c\x73\x79\x6d\x62" +"\x6f\x6c\x2c\x74\x65\x78\x74\x2c\x74\x65\x78\x74\x70\x61\x74\x68\x2c\x74\x73\x70\x61\x6e\x2c\x75\x73\x65\x2c\x76\x69\x65\x77\x22\x2c\x21\x30\x29\x2c\x5a\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x71\x6e\x28\x65\x29\x7c\x7c\x57\x6e\x28\x65\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x57\x6e\x28\x65\x29" +"\x3f\x22\x73\x76\x67\x22\x3a\x22\x6d\x61\x74\x68\x22\x3d\x3d\x3d\x65\x3f\x22\x6d\x61\x74\x68\x22\x3a\x76\x6f\x69\x64\x20\x30\x7d\x76\x61\x72\x20\x58\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x76\x61\x72\x20\x59\x6e\x3d\x70\x28\x22\x74\x65\x78\x74\x2c\x6e\x75\x6d\x62\x65\x72\x2c\x70\x61\x73\x73\x77\x6f\x72\x64\x2c\x73\x65\x61\x72\x63\x68\x2c\x65\x6d\x61" +"\x69\x6c\x2c\x74\x65\x6c\x2c\x75\x72\x6c\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x6e\x28\x65\x29\x7b\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x71\x75\x65\x72\x79\x53\x65\x6c\x65\x63\x74\x6f\x72\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e" +"\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x7d\x76\x61\x72\x20\x65\x72\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x66\x72\x65\x65\x7a\x65\x28\x7b\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65" +"\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x73\x65\x6c\x65\x63\x74\x22\x21\x3d\x3d\x65\x3f\x6e\x3a\x28\x74\x2e\x64\x61\x74\x61\x26\x26\x74\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x74\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x26\x26\x6e\x2e\x73\x65\x74\x41\x74\x74\x72\x69" +"\x62\x75\x74\x65\x28\x22\x6d\x75\x6c\x74\x69\x70\x6c\x65\x22\x2c\x22\x6d\x75\x6c\x74\x69\x70\x6c\x65\x22\x29\x2c\x6e\x29\x7d\x2c\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x4e\x53\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x4e\x53\x28\x4a\x6e\x5b\x65\x5d\x2c" +"\x74\x29\x7d\x2c\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x65\x29\x7d\x2c\x63\x72\x65\x61\x74\x65\x43\x6f\x6d\x6d\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x64" +"\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x43\x6f\x6d\x6d\x65\x6e\x74\x28\x65\x29\x7d\x2c\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x65\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x74\x2c\x6e\x29\x7d\x2c\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74" +"\x29\x7b\x65\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x74\x29\x7d\x2c\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x74\x29\x7d\x2c\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x61\x72\x65" +"\x6e\x74\x4e\x6f\x64\x65\x7d\x2c\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x7d\x2c\x74\x61\x67\x4e\x61\x6d\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x7d\x2c\x73\x65\x74\x54\x65\x78\x74\x43" +"\x6f\x6e\x74\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x3d\x74\x7d\x2c\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x2c\x22\x22\x29\x7d\x7d\x29\x2c\x74\x72\x3d\x7b\x63\x72\x65\x61\x74\x65" +"\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x6e\x72\x28\x74\x29\x7d\x2c\x75\x70\x64\x61\x74\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x21\x3d\x3d\x74\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x26\x26\x28\x6e\x72\x28\x65\x2c\x21\x30\x29\x2c\x6e\x72\x28\x74\x29\x29\x7d\x2c\x64\x65\x73\x74\x72\x6f\x79\x3a\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x65\x29\x7b\x6e\x72\x28\x65\x2c\x21\x30\x29\x7d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x3b\x69\x66\x28\x6e\x28\x72\x29\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x6f\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7c\x7c\x65" +"\x2e\x65\x6c\x6d\x2c\x61\x3d\x69\x2e\x24\x72\x65\x66\x73\x3b\x74\x3f\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x61\x5b\x72\x5d\x29\x3f\x68\x28\x61\x5b\x72\x5d\x2c\x6f\x29\x3a\x61\x5b\x72\x5d\x3d\x3d\x3d\x6f\x26\x26\x28\x61\x5b\x72\x5d\x3d\x76\x6f\x69\x64\x20\x30\x29\x3a\x65\x2e\x64\x61\x74\x61\x2e\x72\x65\x66\x49\x6e\x46\x6f\x72\x3f\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79" +"\x28\x61\x5b\x72\x5d\x29\x3f\x61\x5b\x72\x5d\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x6f\x29\x3c\x30\x26\x26\x61\x5b\x72\x5d\x2e\x70\x75\x73\x68\x28\x6f\x29\x3a\x61\x5b\x72\x5d\x3d\x5b\x6f\x5d\x3a\x61\x5b\x72\x5d\x3d\x6f\x7d\x7d\x76\x61\x72\x20\x72\x72\x3d\x6e\x65\x77\x20\x70\x65\x28\x22\x22\x2c\x7b\x7d\x2c\x5b\x5d\x29\x2c\x69\x72\x3d\x5b\x22\x63\x72\x65\x61\x74\x65\x22\x2c\x22\x61\x63\x74\x69\x76\x61" +"\x74\x65\x22\x2c\x22\x75\x70\x64\x61\x74\x65\x22\x2c\x22\x72\x65\x6d\x6f\x76\x65\x22\x2c\x22\x64\x65\x73\x74\x72\x6f\x79\x22\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x72\x28\x65\x2c\x69\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6b\x65\x79\x3d\x3d\x3d\x69\x2e\x6b\x65\x79\x26\x26\x65\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x3d\x3d\x3d\x69\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74" +"\x6f\x72\x79\x26\x26\x28\x65\x2e\x74\x61\x67\x3d\x3d\x3d\x69\x2e\x74\x61\x67\x26\x26\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3d\x3d\x3d\x69\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x6e\x28\x65\x2e\x64\x61\x74\x61\x29\x3d\x3d\x3d\x6e\x28\x69\x2e\x64\x61\x74\x61\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x21\x3d\x3d\x65\x2e" +"\x74\x61\x67\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x76\x61\x72\x20\x72\x2c\x69\x3d\x6e\x28\x72\x3d\x65\x2e\x64\x61\x74\x61\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x72\x2e\x74\x79\x70\x65\x2c\x6f\x3d\x6e\x28\x72\x3d\x74\x2e\x64\x61\x74\x61\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x72\x2e\x74\x79\x70\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x3d" +"\x3d\x3d\x6f\x7c\x7c\x59\x6e\x28\x69\x29\x26\x26\x59\x6e\x28\x6f\x29\x7d\x28\x65\x2c\x69\x29\x7c\x7c\x72\x28\x65\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x29\x26\x26\x74\x28\x69\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x2e\x65\x72\x72\x6f\x72\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x61\x72\x28\x65\x2c\x74\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x2c" +"\x6f\x2c\x61\x3d\x7b\x7d\x3b\x66\x6f\x72\x28\x69\x3d\x74\x3b\x69\x3c\x3d\x72\x3b\x2b\x2b\x69\x29\x6e\x28\x6f\x3d\x65\x5b\x69\x5d\x2e\x6b\x65\x79\x29\x26\x26\x28\x61\x5b\x6f\x5d\x3d\x69\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x61\x7d\x76\x61\x72\x20\x73\x72\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x63\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x63\x72\x2c\x64\x65\x73\x74\x72\x6f\x79\x3a\x66\x75\x6e\x63\x74\x69\x6f" +"\x6e\x28\x65\x29\x7b\x63\x72\x28\x65\x2c\x72\x72\x29\x7d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x72\x28\x65\x2c\x74\x29\x7b\x28\x65\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x7c\x7c\x74\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x29\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x2c\x6f\x3d\x65" +"\x3d\x3d\x3d\x72\x72\x2c\x61\x3d\x74\x3d\x3d\x3d\x72\x72\x2c\x73\x3d\x6c\x72\x28\x65\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2c\x65\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x63\x3d\x6c\x72\x28\x74\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2c\x74\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x75\x3d\x5b\x5d\x2c\x6c\x3d\x5b\x5d\x3b\x66\x6f\x72\x28\x6e\x20\x69" +"\x6e\x20\x63\x29\x72\x3d\x73\x5b\x6e\x5d\x2c\x69\x3d\x63\x5b\x6e\x5d\x2c\x72\x3f\x28\x69\x2e\x6f\x6c\x64\x56\x61\x6c\x75\x65\x3d\x72\x2e\x76\x61\x6c\x75\x65\x2c\x69\x2e\x6f\x6c\x64\x41\x72\x67\x3d\x72\x2e\x61\x72\x67\x2c\x70\x72\x28\x69\x2c\x22\x75\x70\x64\x61\x74\x65\x22\x2c\x74\x2c\x65\x29\x2c\x69\x2e\x64\x65\x66\x26\x26\x69\x2e\x64\x65\x66\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61" +"\x74\x65\x64\x26\x26\x6c\x2e\x70\x75\x73\x68\x28\x69\x29\x29\x3a\x28\x70\x72\x28\x69\x2c\x22\x62\x69\x6e\x64\x22\x2c\x74\x2c\x65\x29\x2c\x69\x2e\x64\x65\x66\x26\x26\x69\x2e\x64\x65\x66\x2e\x69\x6e\x73\x65\x72\x74\x65\x64\x26\x26\x75\x2e\x70\x75\x73\x68\x28\x69\x29\x29\x3b\x69\x66\x28\x75\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x66\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f" +"\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x70\x72\x28\x75\x5b\x6e\x5d\x2c\x22\x69\x6e\x73\x65\x72\x74\x65\x64\x22\x2c\x74\x2c\x65\x29\x7d\x3b\x6f\x3f\x6f\x74\x28\x74\x2c\x22\x69\x6e\x73\x65\x72\x74\x22\x2c\x66\x29\x3a\x66\x28\x29\x7d\x6c\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x6f\x74\x28\x74\x2c\x22\x70\x6f\x73\x74\x70\x61\x74\x63\x68\x22\x2c" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x3b\x6e\x3c\x6c\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x70\x72\x28\x6c\x5b\x6e\x5d\x2c\x22\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x22\x2c\x74\x2c\x65\x29\x7d\x29\x3b\x69\x66\x28\x21\x6f\x29\x66\x6f\x72\x28\x6e\x20\x69\x6e\x20\x73\x29\x63\x5b\x6e\x5d\x7c\x7c\x70\x72\x28\x73\x5b" +"\x6e\x5d\x2c\x22\x75\x6e\x62\x69\x6e\x64\x22\x2c\x65\x2c\x65\x2c\x61\x29\x7d\x28\x65\x2c\x74\x29\x7d\x76\x61\x72\x20\x75\x72\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x69" +"\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x3b\x66\x6f\x72\x28\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x28\x72\x3d\x65\x5b\x6e\x5d\x29\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x7c\x7c\x28\x72\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3d\x75\x72\x29\x2c\x69\x5b\x66\x72\x28\x72\x29\x5d\x3d\x72\x2c\x72\x2e\x64\x65\x66\x3d\x4c\x65\x28\x74\x2e\x24\x6f\x70\x74" +"\x69\x6f\x6e\x73\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x22\x2c\x72\x2e\x6e\x61\x6d\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x72\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x61\x77\x4e\x61\x6d\x65\x7c\x7c\x65\x2e\x6e\x61\x6d\x65\x2b\x22\x2e\x22\x2b\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65" +"\x72\x73\x7c\x7c\x7b\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2e\x22\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x64\x65\x66\x26\x26\x65\x2e\x64\x65\x66\x5b\x74\x5d\x3b\x69\x66\x28\x6f\x29\x74\x72\x79\x7b\x6f\x28\x6e\x2e\x65\x6c\x6d\x2c\x65\x2c\x6e\x2c\x72\x2c\x69\x29\x7d\x63\x61\x74\x63\x68\x28\x72\x29\x7b\x48\x65" +"\x28\x72\x2c\x6e\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x20\x22\x2b\x65\x2e\x6e\x61\x6d\x65\x2b\x22\x20\x22\x2b\x74\x2b\x22\x20\x68\x6f\x6f\x6b\x22\x29\x7d\x7d\x76\x61\x72\x20\x64\x72\x3d\x5b\x74\x72\x2c\x73\x72\x5d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x72\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70" +"\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x21\x28\x6e\x28\x69\x29\x26\x26\x21\x31\x3d\x3d\x3d\x69\x2e\x43\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x69\x6e\x68\x65\x72\x69\x74\x41\x74\x74\x72\x73\x7c\x7c\x74\x28\x65\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x29\x26\x26\x74\x28\x72\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x29\x29\x29\x7b\x76\x61\x72\x20\x6f\x2c\x61\x2c\x73\x3d\x72\x2e\x65\x6c" +"\x6d\x2c\x63\x3d\x65\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x7c\x7c\x7b\x7d\x2c\x75\x3d\x72\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x7c\x7c\x7b\x7d\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x20\x6e\x28\x75\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x26\x26\x28\x75\x3d\x72\x2e\x64\x61\x74\x61\x2e\x61\x74\x74\x72\x73\x3d\x41\x28\x7b\x7d\x2c\x75\x29\x29\x2c\x75\x29\x61\x3d\x75\x5b\x6f\x5d\x2c\x63\x5b\x6f\x5d" +"\x21\x3d\x3d\x61\x26\x26\x68\x72\x28\x73\x2c\x6f\x2c\x61\x2c\x72\x2e\x64\x61\x74\x61\x2e\x70\x72\x65\x29\x3b\x66\x6f\x72\x28\x6f\x20\x69\x6e\x28\x71\x7c\x7c\x5a\x29\x26\x26\x75\x2e\x76\x61\x6c\x75\x65\x21\x3d\x3d\x63\x2e\x76\x61\x6c\x75\x65\x26\x26\x68\x72\x28\x73\x2c\x22\x76\x61\x6c\x75\x65\x22\x2c\x75\x2e\x76\x61\x6c\x75\x65\x29\x2c\x63\x29\x74\x28\x75\x5b\x6f\x5d\x29\x26\x26\x28\x52\x6e\x28\x6f" +"\x29\x3f\x73\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4e\x53\x28\x50\x6e\x2c\x48\x6e\x28\x6f\x29\x29\x3a\x4c\x6e\x28\x6f\x29\x7c\x7c\x73\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x6f\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x7c\x7c\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x2e\x69\x6e\x64\x65" +"\x78\x4f\x66\x28\x22\x2d\x22\x29\x3e\x2d\x31\x3f\x6d\x72\x28\x65\x2c\x74\x2c\x6e\x29\x3a\x46\x6e\x28\x74\x29\x3f\x42\x6e\x28\x6e\x29\x3f\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x29\x3a\x28\x6e\x3d\x22\x61\x6c\x6c\x6f\x77\x66\x75\x6c\x6c\x73\x63\x72\x65\x65\x6e\x22\x3d\x3d\x3d\x74\x26\x26\x22\x45\x4d\x42\x45\x44\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65" +"\x3f\x22\x74\x72\x75\x65\x22\x3a\x74\x2c\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x2c\x6e\x29\x29\x3a\x4c\x6e\x28\x74\x29\x3f\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x2c\x4d\x6e\x28\x74\x2c\x6e\x29\x29\x3a\x52\x6e\x28\x74\x29\x3f\x42\x6e\x28\x6e\x29\x3f\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4e\x53\x28\x50\x6e\x2c\x48\x6e" +"\x28\x74\x29\x29\x3a\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4e\x53\x28\x50\x6e\x2c\x74\x2c\x6e\x29\x3a\x6d\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x42\x6e\x28\x6e\x29\x29\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x74\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x71\x26\x26" +"\x21\x57\x26\x26\x22\x54\x45\x58\x54\x41\x52\x45\x41\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x26\x26\x22\x70\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x22\x3d\x3d\x3d\x74\x26\x26\x22\x22\x21\x3d\x3d\x6e\x26\x26\x21\x65\x2e\x5f\x5f\x69\x65\x70\x68\x29\x7b\x76\x61\x72\x20\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x73\x74\x6f\x70\x49\x6d\x6d\x65\x64\x69\x61\x74\x65\x50" +"\x72\x6f\x70\x61\x67\x61\x74\x69\x6f\x6e\x28\x29\x2c\x65\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x69\x6e\x70\x75\x74\x22\x2c\x72\x29\x7d\x3b\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x69\x6e\x70\x75\x74\x22\x2c\x72\x29\x2c\x65\x2e\x5f\x5f\x69\x65\x70\x68\x3d\x21\x30\x7d\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62" +"\x75\x74\x65\x28\x74\x2c\x6e\x29\x7d\x7d\x76\x61\x72\x20\x79\x72\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x76\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x76\x72\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x72\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x65\x6c\x6d\x2c\x6f\x3d\x72\x2e\x64\x61\x74\x61\x2c\x61\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x21\x28\x74\x28\x6f\x2e\x73\x74\x61\x74\x69" +"\x63\x43\x6c\x61\x73\x73\x29\x26\x26\x74\x28\x6f\x2e\x63\x6c\x61\x73\x73\x29\x26\x26\x28\x74\x28\x61\x29\x7c\x7c\x74\x28\x61\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x29\x26\x26\x74\x28\x61\x2e\x63\x6c\x61\x73\x73\x29\x29\x29\x29\x7b\x76\x61\x72\x20\x73\x3d\x55\x6e\x28\x72\x29\x2c\x63\x3d\x69\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x3b\x6e\x28\x63\x29\x26" +"\x26\x28\x73\x3d\x7a\x6e\x28\x73\x2c\x4b\x6e\x28\x63\x29\x29\x29\x2c\x73\x21\x3d\x3d\x69\x2e\x5f\x70\x72\x65\x76\x43\x6c\x61\x73\x73\x26\x26\x28\x69\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x2c\x73\x29\x2c\x69\x2e\x5f\x70\x72\x65\x76\x43\x6c\x61\x73\x73\x3d\x73\x29\x7d\x7d\x76\x61\x72\x20\x5f\x72\x2c\x62\x72\x2c\x24\x72\x2c\x77\x72\x2c\x43\x72\x2c\x78\x72" +"\x2c\x6b\x72\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x67\x72\x2c\x75\x70\x64\x61\x74\x65\x3a\x67\x72\x7d\x2c\x41\x72\x3d\x2f\x5b\x5c\x77\x29\x2e\x2b\x5c\x2d\x5f\x24\x5c\x5d\x5d\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x72\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x3d\x21\x31\x2c\x73\x3d\x21\x31\x2c\x63\x3d\x21\x31\x2c\x75\x3d\x21\x31\x2c\x6c\x3d\x30\x2c\x66\x3d" +"\x30\x2c\x70\x3d\x30\x2c\x64\x3d\x30\x3b\x66\x6f\x72\x28\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x69\x66\x28\x6e\x3d\x74\x2c\x74\x3d\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x72\x29\x2c\x61\x29\x33\x39\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x61\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x29\x33\x34\x3d\x3d\x3d\x74\x26" +"\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x73\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x63\x29\x39\x36\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x63\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x75\x29\x34\x37\x3d\x3d\x3d\x74\x26\x26\x39\x32\x21\x3d\x3d\x6e\x26\x26\x28\x75\x3d\x21\x31\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x31\x32\x34\x21\x3d\x3d\x74\x7c\x7c\x31" +"\x32\x34\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x72\x2b\x31\x29\x7c\x7c\x31\x32\x34\x3d\x3d\x3d\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x72\x2d\x31\x29\x7c\x7c\x6c\x7c\x7c\x66\x7c\x7c\x70\x29\x7b\x73\x77\x69\x74\x63\x68\x28\x74\x29\x7b\x63\x61\x73\x65\x20\x33\x34\x3a\x73\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x33\x39\x3a\x61\x3d\x21\x30\x3b" +"\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x39\x36\x3a\x63\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x34\x30\x3a\x70\x2b\x2b\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x34\x31\x3a\x70\x2d\x2d\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x39\x31\x3a\x66\x2b\x2b\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x39\x33\x3a\x66\x2d\x2d\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73" +"\x65\x20\x31\x32\x33\x3a\x6c\x2b\x2b\x3b\x62\x72\x65\x61\x6b\x3b\x63\x61\x73\x65\x20\x31\x32\x35\x3a\x6c\x2d\x2d\x7d\x69\x66\x28\x34\x37\x3d\x3d\x3d\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x76\x3d\x72\x2d\x31\x2c\x68\x3d\x76\x6f\x69\x64\x20\x30\x3b\x76\x3e\x3d\x30\x26\x26\x22\x20\x22\x3d\x3d\x3d\x28\x68\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x76\x29\x29\x3b\x76\x2d\x2d\x29\x3b\x68\x26\x26\x41" +"\x72\x2e\x74\x65\x73\x74\x28\x68\x29\x7c\x7c\x28\x75\x3d\x21\x30\x29\x7d\x7d\x65\x6c\x73\x65\x20\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x69\x3f\x28\x64\x3d\x72\x2b\x31\x2c\x69\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x72\x29\x2e\x74\x72\x69\x6d\x28\x29\x29\x3a\x6d\x28\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x28\x29\x7b\x28\x6f\x7c\x7c\x28\x6f\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x65" +"\x2e\x73\x6c\x69\x63\x65\x28\x64\x2c\x72\x29\x2e\x74\x72\x69\x6d\x28\x29\x29\x2c\x64\x3d\x72\x2b\x31\x7d\x69\x66\x28\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x69\x3f\x69\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x72\x29\x2e\x74\x72\x69\x6d\x28\x29\x3a\x30\x21\x3d\x3d\x64\x26\x26\x6d\x28\x29\x2c\x6f\x29\x66\x6f\x72\x28\x72\x3d\x30\x3b\x72\x3c\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x69\x3d" +"\x53\x72\x28\x69\x2c\x6f\x5b\x72\x5d\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x53\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x28\x22\x29\x3b\x69\x66\x28\x6e\x3c\x30\x29\x72\x65\x74\x75\x72\x6e\x27\x5f\x66\x28\x22\x27\x2b\x74\x2b\x27\x22\x29\x28\x27\x2b\x65\x2b\x22\x29\x22\x3b\x76\x61\x72\x20\x72\x3d\x74\x2e" +"\x73\x6c\x69\x63\x65\x28\x30\x2c\x6e\x29\x2c\x69\x3d\x74\x2e\x73\x6c\x69\x63\x65\x28\x6e\x2b\x31\x29\x3b\x72\x65\x74\x75\x72\x6e\x27\x5f\x66\x28\x22\x27\x2b\x72\x2b\x27\x22\x29\x28\x27\x2b\x65\x2b\x28\x22\x29\x22\x21\x3d\x3d\x69\x3f\x22\x2c\x22\x2b\x69\x3a\x69\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x54\x72\x28\x65\x2c\x74\x29\x7b\x63\x6f\x6e\x73\x6f\x6c\x65\x2e\x65\x72\x72\x6f\x72\x28\x22\x5b" +"\x56\x75\x65\x20\x63\x6f\x6d\x70\x69\x6c\x65\x72\x5d\x3a\x20\x22\x2b\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4e\x72\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x3f\x65\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x7d\x29\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74" +"\x75\x72\x6e\x20\x65\x7d\x29\x3a\x5b\x5d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x28\x65\x2e\x70\x72\x6f\x70\x73\x7c\x7c\x28\x65\x2e\x70\x72\x6f\x70\x73\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x48\x72\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x76\x61\x6c\x75\x65\x3a\x6e\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x69\x7d\x2c\x72\x29\x29\x2c\x65\x2e\x70" +"\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x28\x69\x3f\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x7c\x7c\x28\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x3d\x5b\x5d\x29\x3a\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x28\x65\x2e\x61\x74\x74\x72\x73\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x48\x72" +"\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x76\x61\x6c\x75\x65\x3a\x6e\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x69\x7d\x2c\x72\x29\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x3d\x6e\x2c\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2e\x70\x75\x73\x68\x28\x48\x72\x28" +"\x7b\x6e\x61\x6d\x65\x3a\x74\x2c\x76\x61\x6c\x75\x65\x3a\x6e\x7d\x2c\x72\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x29\x7b\x28\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x7c\x7c\x28\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3d\x5b\x5d\x29\x29\x2e\x70\x75\x73\x68\x28\x48\x72\x28\x7b\x6e\x61\x6d\x65\x3a\x74\x2c" +"\x72\x61\x77\x4e\x61\x6d\x65\x3a\x6e\x2c\x76\x61\x6c\x75\x65\x3a\x72\x2c\x61\x72\x67\x3a\x69\x2c\x69\x73\x44\x79\x6e\x61\x6d\x69\x63\x41\x72\x67\x3a\x6f\x2c\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3a\x61\x7d\x2c\x73\x29\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x49\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x22\x5f\x70\x28\x22" +"\x2b\x74\x2b\x27\x2c\x22\x27\x2b\x65\x2b\x27\x22\x29\x27\x3a\x65\x2b\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4d\x72\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x2c\x63\x29\x7b\x76\x61\x72\x20\x75\x3b\x28\x69\x3d\x69\x7c\x7c\x65\x29\x2e\x72\x69\x67\x68\x74\x3f\x63\x3f\x6e\x3d\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x63\x6c\x69\x63\x6b\x27\x3f\x27\x63\x6f\x6e\x74\x65\x78\x74" +"\x6d\x65\x6e\x75\x27\x3a\x28\x22\x2b\x6e\x2b\x22\x29\x22\x3a\x22\x63\x6c\x69\x63\x6b\x22\x3d\x3d\x3d\x6e\x26\x26\x28\x6e\x3d\x22\x63\x6f\x6e\x74\x65\x78\x74\x6d\x65\x6e\x75\x22\x2c\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x72\x69\x67\x68\x74\x29\x3a\x69\x2e\x6d\x69\x64\x64\x6c\x65\x26\x26\x28\x63\x3f\x6e\x3d\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x63\x6c\x69\x63\x6b\x27\x3f\x27\x6d\x6f\x75\x73" +"\x65\x75\x70\x27\x3a\x28\x22\x2b\x6e\x2b\x22\x29\x22\x3a\x22\x63\x6c\x69\x63\x6b\x22\x3d\x3d\x3d\x6e\x26\x26\x28\x6e\x3d\x22\x6d\x6f\x75\x73\x65\x75\x70\x22\x29\x29\x2c\x69\x2e\x63\x61\x70\x74\x75\x72\x65\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x63\x61\x70\x74\x75\x72\x65\x2c\x6e\x3d\x49\x72\x28\x22\x21\x22\x2c\x6e\x2c\x63\x29\x29\x2c\x69\x2e\x6f\x6e\x63\x65\x26\x26\x28\x64\x65\x6c\x65\x74" +"\x65\x20\x69\x2e\x6f\x6e\x63\x65\x2c\x6e\x3d\x49\x72\x28\x22\x7e\x22\x2c\x6e\x2c\x63\x29\x29\x2c\x69\x2e\x70\x61\x73\x73\x69\x76\x65\x26\x26\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x70\x61\x73\x73\x69\x76\x65\x2c\x6e\x3d\x49\x72\x28\x22\x26\x22\x2c\x6e\x2c\x63\x29\x29\x2c\x69\x2e\x6e\x61\x74\x69\x76\x65\x3f\x28\x64\x65\x6c\x65\x74\x65\x20\x69\x2e\x6e\x61\x74\x69\x76\x65\x2c\x75\x3d\x74\x2e\x6e\x61" +"\x74\x69\x76\x65\x45\x76\x65\x6e\x74\x73\x7c\x7c\x28\x74\x2e\x6e\x61\x74\x69\x76\x65\x45\x76\x65\x6e\x74\x73\x3d\x7b\x7d\x29\x29\x3a\x75\x3d\x74\x2e\x65\x76\x65\x6e\x74\x73\x7c\x7c\x28\x74\x2e\x65\x76\x65\x6e\x74\x73\x3d\x7b\x7d\x29\x3b\x76\x61\x72\x20\x6c\x3d\x48\x72\x28\x7b\x76\x61\x6c\x75\x65\x3a\x72\x2e\x74\x72\x69\x6d\x28\x29\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x63\x7d\x2c\x73\x29\x3b\x69\x21" +"\x3d\x3d\x65\x26\x26\x28\x6c\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3d\x69\x29\x3b\x76\x61\x72\x20\x66\x3d\x75\x5b\x6e\x5d\x3b\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x66\x29\x3f\x6f\x3f\x66\x2e\x75\x6e\x73\x68\x69\x66\x74\x28\x6c\x29\x3a\x66\x2e\x70\x75\x73\x68\x28\x6c\x29\x3a\x75\x5b\x6e\x5d\x3d\x66\x3f\x6f\x3f\x5b\x6c\x2c\x66\x5d\x3a\x5b\x66\x2c\x6c\x5d\x3a\x6c\x2c\x74\x2e\x70" +"\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x50\x72\x28\x65\x2c\x22\x3a\x22\x2b\x74\x29\x7c\x7c\x50\x72\x28\x65\x2c\x22\x76\x2d\x62\x69\x6e\x64\x3a\x22\x2b\x74\x29\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x21\x3d\x72\x29\x72\x65\x74\x75\x72\x6e\x20\x4f\x72\x28\x72\x29\x3b\x69\x66\x28\x21\x31\x21\x3d\x3d\x6e\x29\x7b\x76" +"\x61\x72\x20\x69\x3d\x50\x72\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x21\x3d\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x69\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x50\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x21\x3d\x28\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d" +"\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x6f\x3d\x30\x2c\x61\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x3c\x61\x3b\x6f\x2b\x2b\x29\x69\x66\x28\x69\x5b\x6f\x5d\x2e\x6e\x61\x6d\x65\x3d\x3d\x3d\x74\x29\x7b\x69\x2e\x73\x70\x6c\x69\x63\x65\x28\x6f\x2c\x31\x29\x3b\x62\x72\x65\x61\x6b\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x26\x26\x64\x65\x6c\x65\x74" +"\x65\x20\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x72\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x72\x3d\x30\x2c\x69\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x6f\x3d\x6e\x5b\x72\x5d\x3b\x69\x66\x28\x74\x2e\x74\x65\x73" +"\x74\x28\x6f\x2e\x6e\x61\x6d\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x73\x70\x6c\x69\x63\x65\x28\x72\x2c\x31\x29\x2c\x6f\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x72\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x28\x6e\x75\x6c\x6c\x21\x3d\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x28\x65\x2e\x73\x74\x61\x72\x74\x3d\x74\x2e\x73\x74\x61\x72\x74\x29\x2c\x6e\x75\x6c\x6c\x21" +"\x3d\x74\x2e\x65\x6e\x64\x26\x26\x28\x65\x2e\x65\x6e\x64\x3d\x74\x2e\x65\x6e\x64\x29\x29\x2c\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x7c\x7c\x7b\x7d\x2c\x69\x3d\x72\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x6f\x3d\x22\x24\x24\x76\x22\x3b\x72\x2e\x74\x72\x69\x6d\x26\x26\x28\x6f\x3d\x22\x28\x74\x79\x70\x65\x6f\x66\x20\x24\x24\x76\x20\x3d" +"\x3d\x3d\x20\x27\x73\x74\x72\x69\x6e\x67\x27\x3f\x20\x24\x24\x76\x2e\x74\x72\x69\x6d\x28\x29\x3a\x20\x24\x24\x76\x29\x22\x29\x2c\x69\x26\x26\x28\x6f\x3d\x22\x5f\x6e\x28\x22\x2b\x6f\x2b\x22\x29\x22\x29\x3b\x76\x61\x72\x20\x61\x3d\x55\x72\x28\x74\x2c\x6f\x29\x3b\x65\x2e\x6d\x6f\x64\x65\x6c\x3d\x7b\x76\x61\x6c\x75\x65\x3a\x22\x28\x22\x2b\x74\x2b\x22\x29\x22\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e" +"\x3a\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x74\x29\x2c\x63\x61\x6c\x6c\x62\x61\x63\x6b\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x24\x24\x76\x29\x20\x7b\x22\x2b\x61\x2b\x22\x7d\x22\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x72\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x3d\x65\x2e\x74\x72\x69\x6d" +"\x28\x29\x2c\x5f\x72\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x5b\x22\x29\x3c\x30\x7c\x7c\x65\x2e\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x4f\x66\x28\x22\x5d\x22\x29\x3c\x5f\x72\x2d\x31\x29\x72\x65\x74\x75\x72\x6e\x28\x77\x72\x3d\x65\x2e\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x4f\x66\x28\x22\x2e\x22\x29\x29\x3e\x2d\x31\x3f\x7b\x65\x78\x70\x3a\x65\x2e\x73\x6c\x69" +"\x63\x65\x28\x30\x2c\x77\x72\x29\x2c\x6b\x65\x79\x3a\x27\x22\x27\x2b\x65\x2e\x73\x6c\x69\x63\x65\x28\x77\x72\x2b\x31\x29\x2b\x27\x22\x27\x7d\x3a\x7b\x65\x78\x70\x3a\x65\x2c\x6b\x65\x79\x3a\x6e\x75\x6c\x6c\x7d\x3b\x62\x72\x3d\x65\x2c\x77\x72\x3d\x43\x72\x3d\x78\x72\x3d\x30\x3b\x66\x6f\x72\x28\x3b\x21\x7a\x72\x28\x29\x3b\x29\x4b\x72\x28\x24\x72\x3d\x56\x72\x28\x29\x29\x3f\x71\x72\x28\x24\x72\x29\x3a" +"\x39\x31\x3d\x3d\x3d\x24\x72\x26\x26\x4a\x72\x28\x24\x72\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x65\x78\x70\x3a\x65\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x43\x72\x29\x2c\x6b\x65\x79\x3a\x65\x2e\x73\x6c\x69\x63\x65\x28\x43\x72\x2b\x31\x2c\x78\x72\x29\x7d\x7d\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3d\x3d\x3d\x6e\x2e\x6b\x65\x79\x3f\x65\x2b\x22\x3d\x22\x2b\x74\x3a\x22\x24\x73\x65\x74" +"\x28\x22\x2b\x6e\x2e\x65\x78\x70\x2b\x22\x2c\x20\x22\x2b\x6e\x2e\x6b\x65\x79\x2b\x22\x2c\x20\x22\x2b\x74\x2b\x22\x29\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x72\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x62\x72\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x2b\x2b\x77\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x72\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x77\x72\x3e\x3d\x5f\x72\x7d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x72\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x33\x34\x3d\x3d\x3d\x65\x7c\x7c\x33\x39\x3d\x3d\x3d\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x72\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x31\x3b\x66\x6f\x72\x28\x43\x72\x3d\x77\x72\x3b\x21\x7a\x72\x28\x29\x3b\x29\x69\x66\x28\x4b\x72\x28\x65\x3d\x56\x72\x28\x29\x29\x29\x71\x72\x28\x65\x29\x3b\x65\x6c\x73" +"\x65\x20\x69\x66\x28\x39\x31\x3d\x3d\x3d\x65\x26\x26\x74\x2b\x2b\x2c\x39\x33\x3d\x3d\x3d\x65\x26\x26\x74\x2d\x2d\x2c\x30\x3d\x3d\x3d\x74\x29\x7b\x78\x72\x3d\x77\x72\x3b\x62\x72\x65\x61\x6b\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x72\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x3b\x21\x7a\x72\x28\x29\x26\x26\x28\x65\x3d\x56\x72\x28\x29\x29\x21\x3d\x3d\x74\x3b\x29\x3b\x7d\x76" +"\x61\x72\x20\x57\x72\x2c\x5a\x72\x3d\x22\x5f\x5f\x72\x22\x2c\x47\x72\x3d\x22\x5f\x5f\x63\x22\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x72\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x57\x72\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x28\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x3d\x74\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74" +"\x73\x29\x26\x26\x65\x69\x28\x65\x2c\x69\x2c\x6e\x2c\x72\x29\x7d\x7d\x76\x61\x72\x20\x59\x72\x3d\x4b\x65\x26\x26\x21\x28\x58\x26\x26\x4e\x75\x6d\x62\x65\x72\x28\x58\x5b\x31\x5d\x29\x3c\x3d\x35\x33\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x72\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x69\x66\x28\x59\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x73\x6e\x2c\x6f\x3d\x74\x3b\x74\x3d\x6f\x2e\x5f\x77\x72\x61" +"\x70\x70\x65\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x2e\x74\x61\x72\x67\x65\x74\x3d\x3d\x3d\x65\x2e\x63\x75\x72\x72\x65\x6e\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x65\x2e\x74\x69\x6d\x65\x53\x74\x61\x6d\x70\x3e\x3d\x69\x7c\x7c\x65\x2e\x74\x69\x6d\x65\x53\x74\x61\x6d\x70\x3c\x3d\x30\x7c\x7c\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x6f\x77\x6e\x65\x72\x44\x6f\x63\x75\x6d\x65" +"\x6e\x74\x21\x3d\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x61\x70\x70\x6c\x79\x28\x74\x68\x69\x73\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x7d\x7d\x57\x72\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x65\x2c\x74\x2c\x51\x3f\x7b\x63\x61\x70\x74\x75\x72\x65\x3a\x6e\x2c\x70\x61\x73\x73\x69\x76\x65\x3a\x72\x7d\x3a\x6e\x29\x7d\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x20\x65\x69\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x28\x72\x7c\x7c\x57\x72\x29\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x65\x2c\x74\x2e\x5f\x77\x72\x61\x70\x70\x65\x72\x7c\x7c\x74\x2c\x6e\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x69\x28\x65\x2c\x72\x29\x7b\x69\x66\x28\x21\x74\x28\x65\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x29\x7c\x7c" +"\x21\x74\x28\x72\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x29\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x7c\x7c\x7b\x7d\x2c\x6f\x3d\x65\x2e\x64\x61\x74\x61\x2e\x6f\x6e\x7c\x7c\x7b\x7d\x3b\x57\x72\x3d\x72\x2e\x65\x6c\x6d\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x6e\x28\x65\x5b\x5a\x72\x5d\x29\x29\x7b\x76\x61\x72\x20\x74\x3d\x71\x3f\x22\x63\x68\x61\x6e\x67\x65" +"\x22\x3a\x22\x69\x6e\x70\x75\x74\x22\x3b\x65\x5b\x74\x5d\x3d\x5b\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x5b\x5a\x72\x5d\x2c\x65\x5b\x74\x5d\x7c\x7c\x5b\x5d\x29\x2c\x64\x65\x6c\x65\x74\x65\x20\x65\x5b\x5a\x72\x5d\x7d\x6e\x28\x65\x5b\x47\x72\x5d\x29\x26\x26\x28\x65\x2e\x63\x68\x61\x6e\x67\x65\x3d\x5b\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x5b\x47\x72\x5d\x2c\x65\x2e\x63\x68\x61\x6e\x67\x65\x7c\x7c" +"\x5b\x5d\x29\x2c\x64\x65\x6c\x65\x74\x65\x20\x65\x5b\x47\x72\x5d\x29\x7d\x28\x69\x29\x2c\x69\x74\x28\x69\x2c\x6f\x2c\x51\x72\x2c\x65\x69\x2c\x58\x72\x2c\x72\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x57\x72\x3d\x76\x6f\x69\x64\x20\x30\x7d\x7d\x76\x61\x72\x20\x6e\x69\x2c\x72\x69\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x74\x69\x2c\x75\x70\x64\x61\x74\x65\x3a\x74\x69\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e" +"\x20\x69\x69\x28\x65\x2c\x72\x29\x7b\x69\x66\x28\x21\x74\x28\x65\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x29\x7c\x7c\x21\x74\x28\x72\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x29\x29\x7b\x76\x61\x72\x20\x69\x2c\x6f\x2c\x61\x3d\x72\x2e\x65\x6c\x6d\x2c\x73\x3d\x65\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x7c\x7c\x7b\x7d\x2c\x63\x3d\x72\x2e\x64\x61\x74\x61" +"\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x7c\x7c\x7b\x7d\x3b\x66\x6f\x72\x28\x69\x20\x69\x6e\x20\x6e\x28\x63\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x26\x26\x28\x63\x3d\x72\x2e\x64\x61\x74\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x3d\x41\x28\x7b\x7d\x2c\x63\x29\x29\x2c\x73\x29\x69\x20\x69\x6e\x20\x63\x7c\x7c\x28\x61\x5b\x69\x5d\x3d\x22\x22\x29\x3b\x66\x6f\x72\x28\x69\x20\x69\x6e\x20\x63\x29\x7b\x69\x66\x28\x6f" +"\x3d\x63\x5b\x69\x5d\x2c\x22\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x22\x3d\x3d\x3d\x69\x7c\x7c\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x3d\x3d\x3d\x69\x29\x7b\x69\x66\x28\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x26\x26\x28\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x30\x29\x2c\x6f\x3d\x3d\x3d\x73\x5b\x69\x5d\x29\x63\x6f\x6e\x74\x69\x6e\x75\x65\x3b\x31\x3d\x3d" +"\x3d\x61\x2e\x63\x68\x69\x6c\x64\x4e\x6f\x64\x65\x73\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x61\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x61\x2e\x63\x68\x69\x6c\x64\x4e\x6f\x64\x65\x73\x5b\x30\x5d\x29\x7d\x69\x66\x28\x22\x76\x61\x6c\x75\x65\x22\x3d\x3d\x3d\x69\x26\x26\x22\x50\x52\x4f\x47\x52\x45\x53\x53\x22\x21\x3d\x3d\x61\x2e\x74\x61\x67\x4e\x61\x6d\x65\x29\x7b\x61\x2e\x5f\x76\x61\x6c\x75" +"\x65\x3d\x6f\x3b\x76\x61\x72\x20\x75\x3d\x74\x28\x6f\x29\x3f\x22\x22\x3a\x53\x74\x72\x69\x6e\x67\x28\x6f\x29\x3b\x6f\x69\x28\x61\x2c\x75\x29\x26\x26\x28\x61\x2e\x76\x61\x6c\x75\x65\x3d\x75\x29\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x3d\x3d\x3d\x69\x26\x26\x57\x6e\x28\x61\x2e\x74\x61\x67\x4e\x61\x6d\x65\x29\x26\x26\x74\x28\x61\x2e\x69\x6e\x6e\x65\x72\x48\x54" +"\x4d\x4c\x29\x29\x7b\x28\x6e\x69\x3d\x6e\x69\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x29\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x3d\x22\x3c\x73\x76\x67\x3e\x22\x2b\x6f\x2b\x22\x3c\x2f\x73\x76\x67\x3e\x22\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6c\x3d\x6e\x69\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x3b\x61\x2e\x66" +"\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x3b\x29\x61\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x61\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x29\x3b\x66\x6f\x72\x28\x3b\x6c\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x3b\x29\x61\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x6c\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x29\x7d\x65\x6c\x73\x65\x20\x69\x66\x28\x6f\x21\x3d\x3d\x73\x5b" +"\x69\x5d\x29\x74\x72\x79\x7b\x61\x5b\x69\x5d\x3d\x6f\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x69\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x26\x26\x28\x22\x4f\x50\x54\x49\x4f\x4e\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x7c\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29" +"\x7b\x76\x61\x72\x20\x6e\x3d\x21\x30\x3b\x74\x72\x79\x7b\x6e\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x61\x63\x74\x69\x76\x65\x45\x6c\x65\x6d\x65\x6e\x74\x21\x3d\x3d\x65\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x26\x26\x65\x2e\x76\x61\x6c\x75\x65\x21\x3d\x3d\x74\x7d\x28\x65\x2c\x74\x29\x7c\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20" +"\x72\x3d\x65\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x65\x2e\x5f\x76\x4d\x6f\x64\x69\x66\x69\x65\x72\x73\x3b\x69\x66\x28\x6e\x28\x69\x29\x29\x7b\x69\x66\x28\x69\x2e\x6e\x75\x6d\x62\x65\x72\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x28\x72\x29\x21\x3d\x3d\x66\x28\x74\x29\x3b\x69\x66\x28\x69\x2e\x74\x72\x69\x6d\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x2e\x74\x72\x69\x6d\x28\x29\x21\x3d\x3d\x74\x2e\x74\x72\x69\x6d" +"\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x21\x3d\x3d\x74\x7d\x28\x65\x2c\x74\x29\x29\x7d\x76\x61\x72\x20\x61\x69\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x69\x69\x2c\x75\x70\x64\x61\x74\x65\x3a\x69\x69\x7d\x2c\x73\x69\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x2f\x3a\x28\x2e\x2b\x29\x2f\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x70\x6c" +"\x69\x74\x28\x2f\x3b\x28\x3f\x21\x5b\x5e\x28\x5d\x2a\x5c\x29\x29\x2f\x67\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x73\x70\x6c\x69\x74\x28\x6e\x29\x3b\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3e\x31\x26\x26\x28\x74\x5b\x72\x5b\x30\x5d\x2e\x74\x72\x69\x6d\x28\x29\x5d\x3d\x72\x5b\x31\x5d\x2e\x74\x72\x69\x6d" +"\x28\x29\x29\x7d\x7d\x29\x2c\x74\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x63\x69\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x75\x69\x28\x65\x2e\x73\x74\x79\x6c\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x3f\x41\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2c\x74\x29\x3a\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x69\x28\x65\x29" +"\x7b\x72\x65\x74\x75\x72\x6e\x20\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x3f\x4f\x28\x65\x29\x3a\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x3f\x73\x69\x28\x65\x29\x3a\x65\x7d\x76\x61\x72\x20\x6c\x69\x2c\x66\x69\x3d\x2f\x5e\x2d\x2d\x2f\x2c\x70\x69\x3d\x2f\x5c\x73\x2a\x21\x69\x6d\x70\x6f\x72\x74\x61\x6e\x74\x24\x2f\x2c\x64\x69\x3d\x66\x75\x6e\x63" +"\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x66\x69\x2e\x74\x65\x73\x74\x28\x74\x29\x29\x65\x2e\x73\x74\x79\x6c\x65\x2e\x73\x65\x74\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x74\x2c\x6e\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x70\x69\x2e\x74\x65\x73\x74\x28\x6e\x29\x29\x65\x2e\x73\x74\x79\x6c\x65\x2e\x73\x65\x74\x50\x72\x6f\x70\x65\x72\x74\x79\x28\x43\x28\x74\x29\x2c\x6e\x2e\x72\x65\x70" +"\x6c\x61\x63\x65\x28\x70\x69\x2c\x22\x22\x29\x2c\x22\x69\x6d\x70\x6f\x72\x74\x61\x6e\x74\x22\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x72\x3d\x68\x69\x28\x74\x29\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x6e\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x2c\x6f\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x3c\x6f\x3b\x69\x2b\x2b\x29\x65\x2e\x73\x74\x79\x6c\x65" +"\x5b\x72\x5d\x3d\x6e\x5b\x69\x5d\x3b\x65\x6c\x73\x65\x20\x65\x2e\x73\x74\x79\x6c\x65\x5b\x72\x5d\x3d\x6e\x7d\x7d\x2c\x76\x69\x3d\x5b\x22\x57\x65\x62\x6b\x69\x74\x22\x2c\x22\x4d\x6f\x7a\x22\x2c\x22\x6d\x73\x22\x5d\x2c\x68\x69\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x6c\x69\x3d\x6c\x69\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d" +"\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x2e\x73\x74\x79\x6c\x65\x2c\x22\x66\x69\x6c\x74\x65\x72\x22\x21\x3d\x3d\x28\x65\x3d\x62\x28\x65\x29\x29\x26\x26\x65\x20\x69\x6e\x20\x6c\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x65\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x2e\x74\x6f\x55\x70\x70\x65\x72\x43\x61\x73\x65\x28\x29\x2b\x65\x2e\x73\x6c\x69\x63\x65\x28\x31" +"\x29\x2c\x6e\x3d\x30\x3b\x6e\x3c\x76\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x76\x69\x5b\x6e\x5d\x2b\x74\x3b\x69\x66\x28\x72\x20\x69\x6e\x20\x6c\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x69\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x72\x2e\x64\x61\x74\x61\x2c\x6f\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69" +"\x66\x28\x21\x28\x74\x28\x69\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x29\x26\x26\x74\x28\x69\x2e\x73\x74\x79\x6c\x65\x29\x26\x26\x74\x28\x6f\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x29\x26\x26\x74\x28\x6f\x2e\x73\x74\x79\x6c\x65\x29\x29\x29\x7b\x76\x61\x72\x20\x61\x2c\x73\x2c\x63\x3d\x72\x2e\x65\x6c\x6d\x2c\x75\x3d\x6f\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2c\x6c\x3d\x6f" +"\x2e\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x53\x74\x79\x6c\x65\x7c\x7c\x6f\x2e\x73\x74\x79\x6c\x65\x7c\x7c\x7b\x7d\x2c\x66\x3d\x75\x7c\x7c\x6c\x2c\x70\x3d\x75\x69\x28\x72\x2e\x64\x61\x74\x61\x2e\x73\x74\x79\x6c\x65\x29\x7c\x7c\x7b\x7d\x3b\x72\x2e\x64\x61\x74\x61\x2e\x6e\x6f\x72\x6d\x61\x6c\x69\x7a\x65\x64\x53\x74\x79\x6c\x65\x3d\x6e\x28\x70\x2e\x5f\x5f\x6f\x62\x5f\x5f\x29\x3f\x41\x28\x7b\x7d\x2c" +"\x70\x29\x3a\x70\x3b\x76\x61\x72\x20\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3d\x7b\x7d\x3b\x69\x66\x28\x74\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x65\x3b\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x29\x28\x69\x3d\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e" +"\x6f\x64\x65\x29\x26\x26\x69\x2e\x64\x61\x74\x61\x26\x26\x28\x6e\x3d\x63\x69\x28\x69\x2e\x64\x61\x74\x61\x29\x29\x26\x26\x41\x28\x72\x2c\x6e\x29\x3b\x28\x6e\x3d\x63\x69\x28\x65\x2e\x64\x61\x74\x61\x29\x29\x26\x26\x41\x28\x72\x2c\x6e\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x65\x3b\x6f\x3d\x6f\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x6f\x2e\x64\x61\x74\x61\x26\x26\x28\x6e\x3d\x63\x69\x28\x6f\x2e" +"\x64\x61\x74\x61\x29\x29\x26\x26\x41\x28\x72\x2c\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x72\x7d\x28\x72\x2c\x21\x30\x29\x3b\x66\x6f\x72\x28\x73\x20\x69\x6e\x20\x66\x29\x74\x28\x64\x5b\x73\x5d\x29\x26\x26\x64\x69\x28\x63\x2c\x73\x2c\x22\x22\x29\x3b\x66\x6f\x72\x28\x73\x20\x69\x6e\x20\x64\x29\x28\x61\x3d\x64\x5b\x73\x5d\x29\x21\x3d\x3d\x66\x5b\x73\x5d\x26\x26\x64\x69\x28\x63\x2c\x73\x2c\x6e\x75\x6c" +"\x6c\x3d\x3d\x61\x3f\x22\x22\x3a\x61\x29\x7d\x7d\x76\x61\x72\x20\x79\x69\x3d\x7b\x63\x72\x65\x61\x74\x65\x3a\x6d\x69\x2c\x75\x70\x64\x61\x74\x65\x3a\x6d\x69\x7d\x2c\x67\x69\x3d\x2f\x5c\x73\x2b\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x69\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74\x26\x26\x28\x74\x3d\x74\x2e\x74\x72\x69\x6d\x28\x29\x29\x29\x69\x66\x28\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74" +"\x29\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x20\x22\x29\x3e\x2d\x31\x3f\x74\x2e\x73\x70\x6c\x69\x74\x28\x67\x69\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x61\x64\x64\x28\x74\x29\x7d\x29\x3a\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x61\x64\x64\x28\x74\x29\x3b\x65\x6c" +"\x73\x65\x7b\x76\x61\x72\x20\x6e\x3d\x22\x20\x22\x2b\x28\x65\x2e\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x7c\x7c\x22\x22\x29\x2b\x22\x20\x22\x3b\x6e\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x20\x22\x2b\x74\x2b\x22\x20\x22\x29\x3c\x30\x26\x26\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x2c\x28\x6e\x2b\x74\x29\x2e" +"\x74\x72\x69\x6d\x28\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x69\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x74\x26\x26\x28\x74\x3d\x74\x2e\x74\x72\x69\x6d\x28\x29\x29\x29\x69\x66\x28\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x29\x74\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x20\x22\x29\x3e\x2d\x31\x3f\x74\x2e\x73\x70\x6c\x69\x74\x28\x67\x69\x29\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x72\x65\x6d\x6f\x76\x65\x28\x74\x29\x7d\x29\x3a\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x72\x65\x6d\x6f\x76\x65\x28\x74\x29\x2c\x65\x2e\x63\x6c\x61\x73\x73\x4c\x69\x73\x74\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65" +"\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x3b\x65\x6c\x73\x65\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x22\x20\x22\x2b\x28\x65\x2e\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x7c\x7c\x22\x22\x29\x2b\x22\x20\x22\x2c\x72\x3d\x22\x20\x22\x2b\x74\x2b\x22\x20\x22\x3b\x6e\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x72\x29\x3e\x3d\x30\x3b\x29\x6e\x3d\x6e\x2e\x72\x65\x70\x6c" +"\x61\x63\x65\x28\x72\x2c\x22\x20\x22\x29\x3b\x28\x6e\x3d\x6e\x2e\x74\x72\x69\x6d\x28\x29\x29\x3f\x65\x2e\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x2c\x6e\x29\x3a\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x22\x63\x6c\x61\x73\x73\x22\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x69\x28\x65\x29\x7b\x69\x66\x28\x65\x29\x7b\x69" +"\x66\x28\x22\x6f\x62\x6a\x65\x63\x74\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x7d\x3b\x72\x65\x74\x75\x72\x6e\x21\x31\x21\x3d\x3d\x65\x2e\x63\x73\x73\x26\x26\x41\x28\x74\x2c\x77\x69\x28\x65\x2e\x6e\x61\x6d\x65\x7c\x7c\x22\x76\x22\x29\x29\x2c\x41\x28\x74\x2c\x65\x29\x2c\x74\x7d\x72\x65\x74\x75\x72\x6e\x22\x73\x74\x72\x69\x6e\x67\x22\x3d\x3d\x74\x79\x70\x65\x6f" +"\x66\x20\x65\x3f\x77\x69\x28\x65\x29\x3a\x76\x6f\x69\x64\x20\x30\x7d\x7d\x76\x61\x72\x20\x77\x69\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x65\x6e\x74\x65\x72\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x65\x6e\x74\x65\x72\x22\x2c\x65\x6e\x74\x65\x72\x54\x6f\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x65\x6e\x74\x65\x72\x2d\x74\x6f\x22\x2c\x65\x6e\x74\x65\x72" +"\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x65\x6e\x74\x65\x72\x2d\x61\x63\x74\x69\x76\x65\x22\x2c\x6c\x65\x61\x76\x65\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x6c\x65\x61\x76\x65\x22\x2c\x6c\x65\x61\x76\x65\x54\x6f\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d\x6c\x65\x61\x76\x65\x2d\x74\x6f\x22\x2c\x6c\x65\x61\x76\x65\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x65\x2b\x22\x2d" +"\x6c\x65\x61\x76\x65\x2d\x61\x63\x74\x69\x76\x65\x22\x7d\x7d\x29\x2c\x43\x69\x3d\x56\x26\x26\x21\x57\x2c\x78\x69\x3d\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c\x6b\x69\x3d\x22\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x22\x2c\x41\x69\x3d\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c\x4f\x69\x3d\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x22\x2c\x53\x69\x3d\x22\x61\x6e\x69\x6d" +"\x61\x74\x69\x6f\x6e\x22\x2c\x54\x69\x3d\x22\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x65\x6e\x64\x22\x3b\x43\x69\x26\x26\x28\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x77\x65\x62\x6b\x69\x74\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64" +"\x26\x26\x28\x41\x69\x3d\x22\x57\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c\x4f\x69\x3d\x22\x77\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x45\x6e\x64\x22\x29\x2c\x76\x6f\x69\x64\x20\x30\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f\x6e\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x6f" +"\x6e\x77\x65\x62\x6b\x69\x74\x61\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x65\x6e\x64\x26\x26\x28\x53\x69\x3d\x22\x57\x65\x62\x6b\x69\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x22\x2c\x54\x69\x3d\x22\x77\x65\x62\x6b\x69\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x45\x6e\x64\x22\x29\x29\x3b\x76\x61\x72\x20\x4e\x69\x3d\x56\x3f\x77\x69\x6e\x64\x6f\x77\x2e\x72\x65\x71\x75\x65\x73\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f" +"\x6e\x46\x72\x61\x6d\x65\x3f\x77\x69\x6e\x64\x6f\x77\x2e\x72\x65\x71\x75\x65\x73\x74\x41\x6e\x69\x6d\x61\x74\x69\x6f\x6e\x46\x72\x61\x6d\x65\x2e\x62\x69\x6e\x64\x28\x77\x69\x6e\x64\x6f\x77\x29\x3a\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x28\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x45\x69\x28\x65\x29\x7b\x4e" +"\x69\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x4e\x69\x28\x65\x29\x7d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6a\x69\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x7c\x7c\x28\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x3d\x5b\x5d\x29\x3b\x6e\x2e\x69\x6e\x64\x65\x78\x4f" +"\x66\x28\x74\x29\x3c\x30\x26\x26\x28\x6e\x2e\x70\x75\x73\x68\x28\x74\x29\x2c\x5f\x69\x28\x65\x2c\x74\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x44\x69\x28\x65\x2c\x74\x29\x7b\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x26\x26\x68\x28\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x2c\x74\x29\x2c\x62\x69\x28\x65\x2c\x74\x29" +"\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x4d\x69\x28\x65\x2c\x74\x29\x2c\x69\x3d\x72\x2e\x74\x79\x70\x65\x2c\x6f\x3d\x72\x2e\x74\x69\x6d\x65\x6f\x75\x74\x2c\x61\x3d\x72\x2e\x70\x72\x6f\x70\x43\x6f\x75\x6e\x74\x3b\x69\x66\x28\x21\x69\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x29\x3b\x76\x61\x72\x20\x73\x3d\x69\x3d\x3d\x3d\x78\x69\x3f\x4f" +"\x69\x3a\x54\x69\x2c\x63\x3d\x30\x2c\x75\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x73\x2c\x6c\x29\x2c\x6e\x28\x29\x7d\x2c\x6c\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x74\x2e\x74\x61\x72\x67\x65\x74\x3d\x3d\x3d\x65\x26\x26\x2b\x2b\x63\x3e\x3d\x61\x26\x26\x75\x28\x29\x7d\x3b\x73\x65\x74\x54\x69" +"\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x63\x3c\x61\x26\x26\x75\x28\x29\x7d\x2c\x6f\x2b\x31\x29\x2c\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x73\x2c\x6c\x29\x7d\x76\x61\x72\x20\x49\x69\x3d\x2f\x5c\x62\x28\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x7c\x61\x6c\x6c\x29\x28\x2c\x7c\x24\x29\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4d\x69\x28" +"\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x67\x65\x74\x43\x6f\x6d\x70\x75\x74\x65\x64\x53\x74\x79\x6c\x65\x28\x65\x29\x2c\x69\x3d\x28\x72\x5b\x41\x69\x2b\x22\x44\x65\x6c\x61\x79\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x6f\x3d\x28\x72\x5b\x41\x69\x2b\x22\x44\x75\x72\x61\x74\x69\x6f\x6e\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73" +"\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x61\x3d\x46\x69\x28\x69\x2c\x6f\x29\x2c\x73\x3d\x28\x72\x5b\x53\x69\x2b\x22\x44\x65\x6c\x61\x79\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x63\x3d\x28\x72\x5b\x53\x69\x2b\x22\x44\x75\x72\x61\x74\x69\x6f\x6e\x22\x5d\x7c\x7c\x22\x22\x29\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x20\x22\x29\x2c\x75\x3d\x46\x69\x28\x73\x2c\x63" +"\x29\x2c\x6c\x3d\x30\x2c\x66\x3d\x30\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3d\x3d\x3d\x78\x69\x3f\x61\x3e\x30\x26\x26\x28\x6e\x3d\x78\x69\x2c\x6c\x3d\x61\x2c\x66\x3d\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3a\x74\x3d\x3d\x3d\x6b\x69\x3f\x75\x3e\x30\x26\x26\x28\x6e\x3d\x6b\x69\x2c\x6c\x3d\x75\x2c\x66\x3d\x63\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3a\x66\x3d\x28\x6e\x3d\x28\x6c\x3d\x4d\x61\x74\x68\x2e\x6d\x61" +"\x78\x28\x61\x2c\x75\x29\x29\x3e\x30\x3f\x61\x3e\x75\x3f\x78\x69\x3a\x6b\x69\x3a\x6e\x75\x6c\x6c\x29\x3f\x6e\x3d\x3d\x3d\x78\x69\x3f\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3a\x63\x2e\x6c\x65\x6e\x67\x74\x68\x3a\x30\x2c\x7b\x74\x79\x70\x65\x3a\x6e\x2c\x74\x69\x6d\x65\x6f\x75\x74\x3a\x6c\x2c\x70\x72\x6f\x70\x43\x6f\x75\x6e\x74\x3a\x66\x2c\x68\x61\x73\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3a\x6e\x3d\x3d\x3d" +"\x78\x69\x26\x26\x49\x69\x2e\x74\x65\x73\x74\x28\x72\x5b\x41\x69\x2b\x22\x50\x72\x6f\x70\x65\x72\x74\x79\x22\x5d\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x46\x69\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x3b\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x29\x65\x3d\x65\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x4d\x61\x74\x68\x2e\x6d\x61" +"\x78\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x74\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x50\x69\x28\x74\x29\x2b\x50\x69\x28\x65\x5b\x6e\x5d\x29\x7d\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x50\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x31\x65\x33\x2a\x4e\x75\x6d\x62\x65\x72\x28\x65\x2e\x73\x6c\x69\x63\x65\x28\x30" +"\x2c\x2d\x31\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x22\x2c\x22\x2c\x22\x2e\x22\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x69\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x65\x6c\x6d\x3b\x6e\x28\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x29\x26\x26\x28\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3d\x21\x30\x2c\x69\x2e\x5f\x6c\x65\x61\x76\x65" +"\x43\x62\x28\x29\x29\x3b\x76\x61\x72\x20\x61\x3d\x24\x69\x28\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x3b\x69\x66\x28\x21\x74\x28\x61\x29\x26\x26\x21\x6e\x28\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x29\x26\x26\x31\x3d\x3d\x3d\x69\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x3d\x61\x2e\x63\x73\x73\x2c\x63\x3d\x61\x2e\x74\x79\x70\x65" +"\x2c\x75\x3d\x61\x2e\x65\x6e\x74\x65\x72\x43\x6c\x61\x73\x73\x2c\x6c\x3d\x61\x2e\x65\x6e\x74\x65\x72\x54\x6f\x43\x6c\x61\x73\x73\x2c\x70\x3d\x61\x2e\x65\x6e\x74\x65\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x2c\x64\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x43\x6c\x61\x73\x73\x2c\x76\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x54\x6f\x43\x6c\x61\x73\x73\x2c\x68\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x41\x63" +"\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x2c\x6d\x3d\x61\x2e\x62\x65\x66\x6f\x72\x65\x45\x6e\x74\x65\x72\x2c\x79\x3d\x61\x2e\x65\x6e\x74\x65\x72\x2c\x67\x3d\x61\x2e\x61\x66\x74\x65\x72\x45\x6e\x74\x65\x72\x2c\x5f\x3d\x61\x2e\x65\x6e\x74\x65\x72\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x2c\x62\x3d\x61\x2e\x62\x65\x66\x6f\x72\x65\x41\x70\x70\x65\x61\x72\x2c\x24\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x2c\x77\x3d" +"\x61\x2e\x61\x66\x74\x65\x72\x41\x70\x70\x65\x61\x72\x2c\x43\x3d\x61\x2e\x61\x70\x70\x65\x61\x72\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x2c\x78\x3d\x61\x2e\x64\x75\x72\x61\x74\x69\x6f\x6e\x2c\x6b\x3d\x5a\x74\x2c\x41\x3d\x5a\x74\x2e\x24\x76\x6e\x6f\x64\x65\x3b\x41\x26\x26\x41\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x6b\x3d\x41\x2e\x63\x6f\x6e\x74\x65\x78\x74\x2c\x41\x3d\x41\x2e\x70\x61\x72\x65\x6e\x74\x3b" +"\x76\x61\x72\x20\x4f\x3d\x21\x6b\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x7c\x7c\x21\x65\x2e\x69\x73\x52\x6f\x6f\x74\x49\x6e\x73\x65\x72\x74\x3b\x69\x66\x28\x21\x4f\x7c\x7c\x24\x7c\x7c\x22\x22\x3d\x3d\x3d\x24\x29\x7b\x76\x61\x72\x20\x53\x3d\x4f\x26\x26\x64\x3f\x64\x3a\x75\x2c\x54\x3d\x4f\x26\x26\x68\x3f\x68\x3a\x70\x2c\x4e\x3d\x4f\x26\x26\x76\x3f\x76\x3a\x6c\x2c\x45\x3d\x4f\x26\x26\x62\x7c\x7c" +"\x6d\x2c\x6a\x3d\x4f\x26\x26\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x24\x3f\x24\x3a\x79\x2c\x4c\x3d\x4f\x26\x26\x77\x7c\x7c\x67\x2c\x49\x3d\x4f\x26\x26\x43\x7c\x7c\x5f\x2c\x4d\x3d\x66\x28\x6f\x28\x78\x29\x3f\x78\x2e\x65\x6e\x74\x65\x72\x3a\x78\x29\x2c\x46\x3d\x21\x31\x21\x3d\x3d\x73\x26\x26\x21\x57\x2c\x50\x3d\x55\x69\x28\x6a\x29\x2c\x52\x3d\x69\x2e\x5f\x65\x6e" +"\x74\x65\x72\x43\x62\x3d\x44\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x46\x26\x26\x28\x44\x69\x28\x69\x2c\x4e\x29\x2c\x44\x69\x28\x69\x2c\x54\x29\x29\x2c\x52\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3f\x28\x46\x26\x26\x44\x69\x28\x69\x2c\x53\x29\x2c\x49\x26\x26\x49\x28\x69\x29\x29\x3a\x4c\x26\x26\x4c\x28\x69\x29\x2c\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x3d\x6e\x75\x6c\x6c\x7d\x29\x3b\x65" +"\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x7c\x7c\x6f\x74\x28\x65\x2c\x22\x69\x6e\x73\x65\x72\x74\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2c\x6e\x3d\x74\x26\x26\x74\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x26\x26\x74\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5b\x65\x2e\x6b\x65\x79\x5d\x3b\x6e\x26\x26\x6e\x2e\x74\x61\x67\x3d" +"\x3d\x3d\x65\x2e\x74\x61\x67\x26\x26\x6e\x2e\x65\x6c\x6d\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x26\x26\x6e\x2e\x65\x6c\x6d\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x28\x29\x2c\x6a\x26\x26\x6a\x28\x69\x2c\x52\x29\x7d\x29\x2c\x45\x26\x26\x45\x28\x69\x29\x2c\x46\x26\x26\x28\x6a\x69\x28\x69\x2c\x53\x29\x2c\x6a\x69\x28\x69\x2c\x54\x29\x2c\x45\x69\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x44\x69\x28\x69" +"\x2c\x53\x29\x2c\x52\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x7c\x7c\x28\x6a\x69\x28\x69\x2c\x4e\x29\x2c\x50\x7c\x7c\x28\x42\x69\x28\x4d\x29\x3f\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x52\x2c\x4d\x29\x3a\x4c\x69\x28\x69\x2c\x63\x2c\x52\x29\x29\x29\x7d\x29\x29\x2c\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x26\x26\x28\x72\x26\x26\x72\x28\x29\x2c\x6a\x26\x26\x6a\x28\x69\x2c\x52\x29\x29\x2c\x46" +"\x7c\x7c\x50\x7c\x7c\x52\x28\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x69\x28\x65\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x65\x6c\x6d\x3b\x6e\x28\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x29\x26\x26\x28\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3d\x21\x30\x2c\x69\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x28\x29\x29\x3b\x76\x61\x72\x20\x61\x3d" +"\x24\x69\x28\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x3b\x69\x66\x28\x74\x28\x61\x29\x7c\x7c\x31\x21\x3d\x3d\x69\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x72\x28\x29\x3b\x69\x66\x28\x21\x6e\x28\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x29\x29\x7b\x76\x61\x72\x20\x73\x3d\x61\x2e\x63\x73\x73\x2c\x63\x3d\x61\x2e\x74\x79\x70\x65\x2c\x75\x3d\x61" +"\x2e\x6c\x65\x61\x76\x65\x43\x6c\x61\x73\x73\x2c\x6c\x3d\x61\x2e\x6c\x65\x61\x76\x65\x54\x6f\x43\x6c\x61\x73\x73\x2c\x70\x3d\x61\x2e\x6c\x65\x61\x76\x65\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x2c\x64\x3d\x61\x2e\x62\x65\x66\x6f\x72\x65\x4c\x65\x61\x76\x65\x2c\x76\x3d\x61\x2e\x6c\x65\x61\x76\x65\x2c\x68\x3d\x61\x2e\x61\x66\x74\x65\x72\x4c\x65\x61\x76\x65\x2c\x6d\x3d\x61\x2e\x6c\x65\x61\x76\x65" +"\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x2c\x79\x3d\x61\x2e\x64\x65\x6c\x61\x79\x4c\x65\x61\x76\x65\x2c\x67\x3d\x61\x2e\x64\x75\x72\x61\x74\x69\x6f\x6e\x2c\x5f\x3d\x21\x31\x21\x3d\x3d\x73\x26\x26\x21\x57\x2c\x62\x3d\x55\x69\x28\x76\x29\x2c\x24\x3d\x66\x28\x6f\x28\x67\x29\x3f\x67\x2e\x6c\x65\x61\x76\x65\x3a\x67\x29\x2c\x77\x3d\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x3d\x44\x28\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x29\x7b\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x26\x26\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x26\x26\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5b\x65\x2e\x6b\x65\x79\x5d\x3d\x6e\x75\x6c\x6c\x29\x2c\x5f\x26\x26\x28\x44\x69\x28\x69\x2c\x6c\x29\x2c\x44\x69\x28\x69\x2c\x70\x29\x29\x2c\x77" +"\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x3f\x28\x5f\x26\x26\x44\x69\x28\x69\x2c\x75\x29\x2c\x6d\x26\x26\x6d\x28\x69\x29\x29\x3a\x28\x72\x28\x29\x2c\x68\x26\x26\x68\x28\x69\x29\x29\x2c\x69\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x3d\x6e\x75\x6c\x6c\x7d\x29\x3b\x79\x3f\x79\x28\x43\x29\x3a\x43\x28\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x28\x29\x7b\x77\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x7c" +"\x7c\x28\x21\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x26\x26\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x26\x26\x28\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x7c\x7c\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x2e\x5f\x70\x65\x6e\x64\x69\x6e\x67\x3d\x7b\x7d\x29\x29\x5b\x65\x2e\x6b\x65\x79\x5d\x3d\x65\x29\x2c\x64\x26\x26\x64\x28\x69\x29" +"\x2c\x5f\x26\x26\x28\x6a\x69\x28\x69\x2c\x75\x29\x2c\x6a\x69\x28\x69\x2c\x70\x29\x2c\x45\x69\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x44\x69\x28\x69\x2c\x75\x29\x2c\x77\x2e\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x7c\x7c\x28\x6a\x69\x28\x69\x2c\x6c\x29\x2c\x62\x7c\x7c\x28\x42\x69\x28\x24\x29\x3f\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x77\x2c\x24\x29\x3a\x4c\x69\x28\x69\x2c\x63\x2c\x77\x29" +"\x29\x29\x7d\x29\x29\x2c\x76\x26\x26\x76\x28\x69\x2c\x77\x29\x2c\x5f\x7c\x7c\x62\x7c\x7c\x77\x28\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x6e\x75\x6d\x62\x65\x72\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x65\x26\x26\x21\x69\x73\x4e\x61\x4e\x28\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x55\x69\x28\x65\x29\x7b\x69\x66\x28\x74\x28\x65" +"\x29\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x66\x6e\x73\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x72\x29\x3f\x55\x69\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x3f\x72\x5b\x30\x5d\x3a\x72\x29\x3a\x28\x65\x2e\x5f\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3e\x31\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x69\x28\x65" +"\x2c\x74\x29\x7b\x21\x30\x21\x3d\x3d\x74\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x26\x26\x52\x69\x28\x74\x29\x7d\x76\x61\x72\x20\x7a\x69\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x6f\x2c\x61\x2c\x73\x3d\x7b\x7d\x2c\x63\x3d\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x75\x3d\x65\x2e\x6e\x6f\x64\x65\x4f\x70\x73\x3b\x66\x6f\x72\x28\x6f\x3d\x30\x3b\x6f\x3c\x69\x72\x2e\x6c\x65\x6e" +"\x67\x74\x68\x3b\x2b\x2b\x6f\x29\x66\x6f\x72\x28\x73\x5b\x69\x72\x5b\x6f\x5d\x5d\x3d\x5b\x5d\x2c\x61\x3d\x30\x3b\x61\x3c\x63\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x61\x29\x6e\x28\x63\x5b\x61\x5d\x5b\x69\x72\x5b\x6f\x5d\x5d\x29\x26\x26\x73\x5b\x69\x72\x5b\x6f\x5d\x5d\x2e\x70\x75\x73\x68\x28\x63\x5b\x61\x5d\x5b\x69\x72\x5b\x6f\x5d\x5d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x28\x65\x29\x7b" +"\x76\x61\x72\x20\x74\x3d\x75\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x28\x65\x29\x3b\x6e\x28\x74\x29\x26\x26\x75\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x74\x2c\x65\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x2c\x61\x2c\x63\x2c\x6c\x29\x7b\x69\x66\x28\x6e\x28\x65\x2e\x65\x6c\x6d\x29\x26\x26\x6e\x28\x63\x29\x26\x26\x28\x65\x3d\x63\x5b\x6c\x5d\x3d" +"\x6d\x65\x28\x65\x29\x29\x2c\x65\x2e\x69\x73\x52\x6f\x6f\x74\x49\x6e\x73\x65\x72\x74\x3d\x21\x61\x2c\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x6e\x28\x61\x29\x29\x7b\x76\x61\x72\x20\x63\x3d\x6e\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x26\x26\x61\x2e\x6b\x65" +"\x65\x70\x41\x6c\x69\x76\x65\x3b\x69\x66\x28\x6e\x28\x61\x3d\x61\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x69\x6e\x69\x74\x29\x26\x26\x61\x28\x65\x2c\x21\x31\x29\x2c\x6e\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x64\x28\x65\x2c\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x2c\x72\x28\x63\x29\x26" +"\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x72\x2c\x69\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x2c\x61\x3d\x65\x3b\x61\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x29\x69\x66\x28\x61\x3d\x61\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6e\x28\x6f\x3d\x61\x2e\x64\x61\x74\x61\x29\x26\x26\x6e" +"\x28\x6f\x3d\x6f\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x29\x7b\x66\x6f\x72\x28\x6f\x3d\x30\x3b\x6f\x3c\x73\x2e\x61\x63\x74\x69\x76\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x6f\x29\x73\x2e\x61\x63\x74\x69\x76\x61\x74\x65\x5b\x6f\x5d\x28\x72\x72\x2c\x61\x29\x3b\x74\x2e\x70\x75\x73\x68\x28\x61\x29\x3b\x62\x72\x65\x61\x6b\x7d\x76\x28\x72\x2c\x65\x2e\x65\x6c\x6d\x2c\x69\x29\x7d\x28" +"\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x2c\x21\x30\x7d\x7d\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x29\x7b\x76\x61\x72\x20\x66\x3d\x65\x2e\x64\x61\x74\x61\x2c\x70\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x6d\x3d\x65\x2e\x74\x61\x67\x3b\x6e\x28\x6d\x29\x3f\x28\x65\x2e\x65\x6c\x6d\x3d\x65\x2e\x6e\x73\x3f\x75\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x4e\x53\x28\x65\x2e\x6e\x73\x2c\x6d\x29" +"\x3a\x75\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x6d\x2c\x65\x29\x2c\x67\x28\x65\x29\x2c\x68\x28\x65\x2c\x70\x2c\x74\x29\x2c\x6e\x28\x66\x29\x26\x26\x79\x28\x65\x2c\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x29\x3a\x72\x28\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x29\x3f\x28\x65\x2e\x65\x6c\x6d\x3d\x75\x2e\x63\x72\x65\x61\x74\x65\x43\x6f\x6d\x6d\x65\x6e\x74" +"\x28\x65\x2e\x74\x65\x78\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x29\x3a\x28\x65\x2e\x65\x6c\x6d\x3d\x75\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x65\x2e\x74\x65\x78\x74\x29\x2c\x76\x28\x69\x2c\x65\x2e\x65\x6c\x6d\x2c\x6f\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x64\x28\x65\x2c\x74\x29\x7b\x6e\x28\x65\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69" +"\x6e\x67\x49\x6e\x73\x65\x72\x74\x29\x26\x26\x28\x74\x2e\x70\x75\x73\x68\x2e\x61\x70\x70\x6c\x79\x28\x74\x2c\x65\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x29\x2c\x65\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x3d\x6e\x75\x6c\x6c\x29\x2c\x65\x2e\x65\x6c\x6d\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63" +"\x65\x2e\x24\x65\x6c\x2c\x6d\x28\x65\x29\x3f\x28\x79\x28\x65\x2c\x74\x29\x2c\x67\x28\x65\x29\x29\x3a\x28\x6e\x72\x28\x65\x29\x2c\x74\x2e\x70\x75\x73\x68\x28\x65\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x28\x65\x2c\x74\x2c\x72\x29\x7b\x6e\x28\x65\x29\x26\x26\x28\x6e\x28\x72\x29\x3f\x75\x2e\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65\x28\x72\x29\x3d\x3d\x3d\x65\x26\x26\x75\x2e\x69\x6e\x73\x65" +"\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x74\x2c\x72\x29\x3a\x75\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x65\x2c\x74\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x74\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72" +"\x29\x66\x28\x74\x5b\x72\x5d\x2c\x6e\x2c\x65\x2e\x65\x6c\x6d\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x2c\x74\x2c\x72\x29\x3b\x65\x6c\x73\x65\x20\x69\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x75\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x65\x2e\x65\x6c\x6d\x2c\x75\x2e\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4e\x6f\x64\x65\x28\x53\x74\x72\x69\x6e\x67\x28\x65\x2e\x74\x65\x78\x74\x29\x29\x29\x7d\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x29\x65\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x28\x65\x2e\x74\x61\x67\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x28\x65\x2c\x74\x29\x7b" +"\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x30\x3b\x72\x3c\x73\x2e\x63\x72\x65\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72\x29\x73\x2e\x63\x72\x65\x61\x74\x65\x5b\x72\x5d\x28\x72\x72\x2c\x65\x29\x3b\x6e\x28\x6f\x3d\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x28\x6e\x28\x6f\x2e\x63\x72\x65\x61\x74\x65\x29\x26\x26\x6f\x2e\x63\x72\x65\x61\x74\x65\x28\x72\x72\x2c\x65\x29\x2c\x6e" +"\x28\x6f\x2e\x69\x6e\x73\x65\x72\x74\x29\x26\x26\x74\x2e\x70\x75\x73\x68\x28\x65\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x67\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x69\x66\x28\x6e\x28\x74\x3d\x65\x2e\x66\x6e\x53\x63\x6f\x70\x65\x49\x64\x29\x29\x75\x2e\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x28\x65\x2e\x65\x6c\x6d\x2c\x74\x29\x3b\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x76\x61\x72" +"\x20\x72\x3d\x65\x3b\x72\x3b\x29\x6e\x28\x74\x3d\x72\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x26\x26\x6e\x28\x74\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x29\x26\x26\x75\x2e\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x28\x65\x2e\x65\x6c\x6d\x2c\x74\x29\x2c\x72\x3d\x72\x2e\x70\x61\x72\x65\x6e\x74\x3b\x6e\x28\x74\x3d\x5a\x74\x29\x26\x26\x74\x21\x3d\x3d\x65" +"\x2e\x63\x6f\x6e\x74\x65\x78\x74\x26\x26\x74\x21\x3d\x3d\x65\x2e\x66\x6e\x43\x6f\x6e\x74\x65\x78\x74\x26\x26\x6e\x28\x74\x3d\x74\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x5f\x73\x63\x6f\x70\x65\x49\x64\x29\x26\x26\x75\x2e\x73\x65\x74\x53\x74\x79\x6c\x65\x53\x63\x6f\x70\x65\x28\x65\x2e\x65\x6c\x6d\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5f\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f" +"\x29\x7b\x66\x6f\x72\x28\x3b\x72\x3c\x3d\x69\x3b\x2b\x2b\x72\x29\x66\x28\x6e\x5b\x72\x5d\x2c\x6f\x2c\x65\x2c\x74\x2c\x21\x31\x2c\x6e\x2c\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x72\x2c\x69\x3d\x65\x2e\x64\x61\x74\x61\x3b\x69\x66\x28\x6e\x28\x69\x29\x29\x66\x6f\x72\x28\x6e\x28\x74\x3d\x69\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x74\x3d\x74\x2e\x64" +"\x65\x73\x74\x72\x6f\x79\x29\x26\x26\x74\x28\x65\x29\x2c\x74\x3d\x30\x3b\x74\x3c\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x74\x29\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x5b\x74\x5d\x28\x65\x29\x3b\x69\x66\x28\x6e\x28\x74\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x66\x6f\x72\x28\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e" +"\x67\x74\x68\x3b\x2b\x2b\x72\x29\x62\x28\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x72\x5d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x24\x28\x65\x2c\x74\x2c\x72\x29\x7b\x66\x6f\x72\x28\x3b\x74\x3c\x3d\x72\x3b\x2b\x2b\x74\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x74\x5d\x3b\x6e\x28\x69\x29\x26\x26\x28\x6e\x28\x69\x2e\x74\x61\x67\x29\x3f\x28\x77\x28\x69\x29\x2c\x62\x28\x69\x29\x29\x3a\x6c\x28\x69" +"\x2e\x65\x6c\x6d\x29\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x77\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x6e\x28\x74\x29\x7c\x7c\x6e\x28\x65\x2e\x64\x61\x74\x61\x29\x29\x7b\x76\x61\x72\x20\x72\x2c\x69\x3d\x73\x2e\x72\x65\x6d\x6f\x76\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2b\x31\x3b\x66\x6f\x72\x28\x6e\x28\x74\x29\x3f\x74\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x2b\x3d\x69\x3a\x74\x3d\x66\x75\x6e\x63" +"\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x28\x29\x7b\x30\x3d\x3d\x2d\x2d\x6e\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x26\x26\x6c\x28\x65\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x6c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x74\x2c\x6e\x7d\x28\x65\x2e\x65\x6c\x6d\x2c\x69\x29\x2c\x6e\x28\x72\x3d\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e" +"\x63\x65\x29\x26\x26\x6e\x28\x72\x3d\x72\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x26\x26\x6e\x28\x72\x2e\x64\x61\x74\x61\x29\x26\x26\x77\x28\x72\x2c\x74\x29\x2c\x72\x3d\x30\x3b\x72\x3c\x73\x2e\x72\x65\x6d\x6f\x76\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x72\x29\x73\x2e\x72\x65\x6d\x6f\x76\x65\x5b\x72\x5d\x28\x65\x2c\x74\x29\x3b\x6e\x28\x72\x3d\x65\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e" +"\x28\x72\x3d\x72\x2e\x72\x65\x6d\x6f\x76\x65\x29\x3f\x72\x28\x65\x2c\x74\x29\x3a\x74\x28\x29\x7d\x65\x6c\x73\x65\x20\x6c\x28\x65\x2e\x65\x6c\x6d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x28\x65\x2c\x74\x2c\x72\x2c\x69\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x72\x3b\x6f\x3c\x69\x3b\x6f\x2b\x2b\x29\x7b\x76\x61\x72\x20\x61\x3d\x74\x5b\x6f\x5d\x3b\x69\x66\x28\x6e\x28\x61\x29\x26\x26\x6f" +"\x72\x28\x65\x2c\x61\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x28\x65\x2c\x69\x2c\x6f\x2c\x61\x2c\x63\x2c\x6c\x29\x7b\x69\x66\x28\x65\x21\x3d\x3d\x69\x29\x7b\x6e\x28\x69\x2e\x65\x6c\x6d\x29\x26\x26\x6e\x28\x61\x29\x26\x26\x28\x69\x3d\x61\x5b\x63\x5d\x3d\x6d\x65\x28\x69\x29\x29\x3b\x76\x61\x72\x20\x70\x3d\x69\x2e\x65\x6c\x6d\x3d\x65\x2e\x65\x6c\x6d\x3b" +"\x69\x66\x28\x72\x28\x65\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x29\x29\x6e\x28\x69\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x2e\x72\x65\x73\x6f\x6c\x76\x65\x64\x29\x3f\x4f\x28\x65\x2e\x65\x6c\x6d\x2c\x69\x2c\x6f\x29\x3a\x69\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x3d\x21\x30\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x72" +"\x28\x69\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x29\x26\x26\x72\x28\x65\x2e\x69\x73\x53\x74\x61\x74\x69\x63\x29\x26\x26\x69\x2e\x6b\x65\x79\x3d\x3d\x3d\x65\x2e\x6b\x65\x79\x26\x26\x28\x72\x28\x69\x2e\x69\x73\x43\x6c\x6f\x6e\x65\x64\x29\x7c\x7c\x72\x28\x69\x2e\x69\x73\x4f\x6e\x63\x65\x29\x29\x29\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3d\x65\x2e\x63\x6f\x6d\x70\x6f" +"\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x64\x2c\x76\x3d\x69\x2e\x64\x61\x74\x61\x3b\x6e\x28\x76\x29\x26\x26\x6e\x28\x64\x3d\x76\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x64\x3d\x64\x2e\x70\x72\x65\x70\x61\x74\x63\x68\x29\x26\x26\x64\x28\x65\x2c\x69\x29\x3b\x76\x61\x72\x20\x68\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x79\x3d\x69\x2e\x63\x68\x69" +"\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x6e\x28\x76\x29\x26\x26\x6d\x28\x69\x29\x29\x7b\x66\x6f\x72\x28\x64\x3d\x30\x3b\x64\x3c\x73\x2e\x75\x70\x64\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x64\x29\x73\x2e\x75\x70\x64\x61\x74\x65\x5b\x64\x5d\x28\x65\x2c\x69\x29\x3b\x6e\x28\x64\x3d\x76\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x64\x3d\x64\x2e\x75\x70\x64\x61\x74\x65\x29\x26\x26\x64\x28\x65\x2c" +"\x69\x29\x7d\x74\x28\x69\x2e\x74\x65\x78\x74\x29\x3f\x6e\x28\x68\x29\x26\x26\x6e\x28\x79\x29\x3f\x68\x21\x3d\x3d\x79\x26\x26\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x2c\x63\x2c\x6c\x2c\x70\x3d\x30\x2c\x64\x3d\x30\x2c\x76\x3d\x72\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x68\x3d\x72\x5b\x30\x5d\x2c\x6d\x3d\x72\x5b\x76\x5d\x2c" +"\x79\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x67\x3d\x69\x5b\x30\x5d\x2c\x62\x3d\x69\x5b\x79\x5d\x2c\x77\x3d\x21\x61\x3b\x70\x3c\x3d\x76\x26\x26\x64\x3c\x3d\x79\x3b\x29\x74\x28\x68\x29\x3f\x68\x3d\x72\x5b\x2b\x2b\x70\x5d\x3a\x74\x28\x6d\x29\x3f\x6d\x3d\x72\x5b\x2d\x2d\x76\x5d\x3a\x6f\x72\x28\x68\x2c\x67\x29\x3f\x28\x78\x28\x68\x2c\x67\x2c\x6f\x2c\x69\x2c\x64\x29\x2c\x68\x3d\x72\x5b\x2b\x2b" +"\x70\x5d\x2c\x67\x3d\x69\x5b\x2b\x2b\x64\x5d\x29\x3a\x6f\x72\x28\x6d\x2c\x62\x29\x3f\x28\x78\x28\x6d\x2c\x62\x2c\x6f\x2c\x69\x2c\x79\x29\x2c\x6d\x3d\x72\x5b\x2d\x2d\x76\x5d\x2c\x62\x3d\x69\x5b\x2d\x2d\x79\x5d\x29\x3a\x6f\x72\x28\x68\x2c\x62\x29\x3f\x28\x78\x28\x68\x2c\x62\x2c\x6f\x2c\x69\x2c\x79\x29\x2c\x77\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x68\x2e\x65\x6c" +"\x6d\x2c\x75\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x28\x6d\x2e\x65\x6c\x6d\x29\x29\x2c\x68\x3d\x72\x5b\x2b\x2b\x70\x5d\x2c\x62\x3d\x69\x5b\x2d\x2d\x79\x5d\x29\x3a\x6f\x72\x28\x6d\x2c\x67\x29\x3f\x28\x78\x28\x6d\x2c\x67\x2c\x6f\x2c\x69\x2c\x64\x29\x2c\x77\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x6d\x2e\x65\x6c\x6d\x2c\x68\x2e\x65\x6c\x6d\x29\x2c\x6d\x3d" +"\x72\x5b\x2d\x2d\x76\x5d\x2c\x67\x3d\x69\x5b\x2b\x2b\x64\x5d\x29\x3a\x28\x74\x28\x73\x29\x26\x26\x28\x73\x3d\x61\x72\x28\x72\x2c\x70\x2c\x76\x29\x29\x2c\x74\x28\x63\x3d\x6e\x28\x67\x2e\x6b\x65\x79\x29\x3f\x73\x5b\x67\x2e\x6b\x65\x79\x5d\x3a\x43\x28\x67\x2c\x72\x2c\x70\x2c\x76\x29\x29\x3f\x66\x28\x67\x2c\x6f\x2c\x65\x2c\x68\x2e\x65\x6c\x6d\x2c\x21\x31\x2c\x69\x2c\x64\x29\x3a\x6f\x72\x28\x6c\x3d\x72" +"\x5b\x63\x5d\x2c\x67\x29\x3f\x28\x78\x28\x6c\x2c\x67\x2c\x6f\x2c\x69\x2c\x64\x29\x2c\x72\x5b\x63\x5d\x3d\x76\x6f\x69\x64\x20\x30\x2c\x77\x26\x26\x75\x2e\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65\x28\x65\x2c\x6c\x2e\x65\x6c\x6d\x2c\x68\x2e\x65\x6c\x6d\x29\x29\x3a\x66\x28\x67\x2c\x6f\x2c\x65\x2c\x68\x2e\x65\x6c\x6d\x2c\x21\x31\x2c\x69\x2c\x64\x29\x2c\x67\x3d\x69\x5b\x2b\x2b\x64\x5d\x29\x3b\x70" +"\x3e\x76\x3f\x5f\x28\x65\x2c\x74\x28\x69\x5b\x79\x2b\x31\x5d\x29\x3f\x6e\x75\x6c\x6c\x3a\x69\x5b\x79\x2b\x31\x5d\x2e\x65\x6c\x6d\x2c\x69\x2c\x64\x2c\x79\x2c\x6f\x29\x3a\x64\x3e\x79\x26\x26\x24\x28\x72\x2c\x70\x2c\x76\x29\x7d\x28\x70\x2c\x68\x2c\x79\x2c\x6f\x2c\x6c\x29\x3a\x6e\x28\x79\x29\x3f\x28\x6e\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x75\x2e\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e" +"\x74\x28\x70\x2c\x22\x22\x29\x2c\x5f\x28\x70\x2c\x6e\x75\x6c\x6c\x2c\x79\x2c\x30\x2c\x79\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x2c\x6f\x29\x29\x3a\x6e\x28\x68\x29\x3f\x24\x28\x68\x2c\x30\x2c\x68\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x29\x3a\x6e\x28\x65\x2e\x74\x65\x78\x74\x29\x26\x26\x75\x2e\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x28\x70\x2c\x22\x22\x29\x3a\x65\x2e\x74\x65\x78\x74\x21" +"\x3d\x3d\x69\x2e\x74\x65\x78\x74\x26\x26\x75\x2e\x73\x65\x74\x54\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x28\x70\x2c\x69\x2e\x74\x65\x78\x74\x29\x2c\x6e\x28\x76\x29\x26\x26\x6e\x28\x64\x3d\x76\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x64\x3d\x64\x2e\x70\x6f\x73\x74\x70\x61\x74\x63\x68\x29\x26\x26\x64\x28\x65\x2c\x69\x29\x7d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x28\x65\x2c\x74\x2c\x69\x29" +"\x7b\x69\x66\x28\x72\x28\x69\x29\x26\x26\x6e\x28\x65\x2e\x70\x61\x72\x65\x6e\x74\x29\x29\x65\x2e\x70\x61\x72\x65\x6e\x74\x2e\x64\x61\x74\x61\x2e\x70\x65\x6e\x64\x69\x6e\x67\x49\x6e\x73\x65\x72\x74\x3d\x74\x3b\x65\x6c\x73\x65\x20\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x30\x3b\x6f\x3c\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x6f\x29\x74\x5b\x6f\x5d\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x2e\x69" +"\x6e\x73\x65\x72\x74\x28\x74\x5b\x6f\x5d\x29\x7d\x76\x61\x72\x20\x41\x3d\x70\x28\x22\x61\x74\x74\x72\x73\x2c\x63\x6c\x61\x73\x73\x2c\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2c\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x2c\x6b\x65\x79\x22\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4f\x28\x65\x2c\x74\x2c\x69\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x2c\x73\x3d\x74\x2e\x74\x61\x67\x2c\x63\x3d\x74" +"\x2e\x64\x61\x74\x61\x2c\x75\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x6f\x3d\x6f\x7c\x7c\x63\x26\x26\x63\x2e\x70\x72\x65\x2c\x74\x2e\x65\x6c\x6d\x3d\x65\x2c\x72\x28\x74\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x29\x26\x26\x6e\x28\x74\x2e\x61\x73\x79\x6e\x63\x46\x61\x63\x74\x6f\x72\x79\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x69\x73\x41\x73\x79\x6e\x63\x50\x6c\x61\x63\x65\x68" +"\x6f\x6c\x64\x65\x72\x3d\x21\x30\x2c\x21\x30\x3b\x69\x66\x28\x6e\x28\x63\x29\x26\x26\x28\x6e\x28\x61\x3d\x63\x2e\x68\x6f\x6f\x6b\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x69\x6e\x69\x74\x29\x26\x26\x61\x28\x74\x2c\x21\x30\x29\x2c\x6e\x28\x61\x3d\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x29\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x64\x28\x74\x2c\x69\x29\x2c\x21\x30\x3b\x69" +"\x66\x28\x6e\x28\x73\x29\x29\x7b\x69\x66\x28\x6e\x28\x75\x29\x29\x69\x66\x28\x65\x2e\x68\x61\x73\x43\x68\x69\x6c\x64\x4e\x6f\x64\x65\x73\x28\x29\x29\x69\x66\x28\x6e\x28\x61\x3d\x63\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x64\x6f\x6d\x50\x72\x6f\x70\x73\x29\x26\x26\x6e\x28\x61\x3d\x61\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x29\x29\x7b\x69\x66\x28\x61\x21\x3d\x3d\x65\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d" +"\x4c\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x65\x6c\x73\x65\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6c\x3d\x21\x30\x2c\x66\x3d\x65\x2e\x66\x69\x72\x73\x74\x43\x68\x69\x6c\x64\x2c\x70\x3d\x30\x3b\x70\x3c\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x70\x2b\x2b\x29\x7b\x69\x66\x28\x21\x66\x7c\x7c\x21\x4f\x28\x66\x2c\x75\x5b\x70\x5d\x2c\x69\x2c\x6f\x29\x29\x7b\x6c\x3d\x21\x31\x3b\x62\x72\x65\x61\x6b\x7d\x66\x3d" +"\x66\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x7d\x69\x66\x28\x21\x6c\x7c\x7c\x66\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x65\x6c\x73\x65\x20\x68\x28\x74\x2c\x75\x2c\x69\x29\x3b\x69\x66\x28\x6e\x28\x63\x29\x29\x7b\x76\x61\x72\x20\x76\x3d\x21\x31\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6d\x20\x69\x6e\x20\x63\x29\x69\x66\x28\x21\x41\x28\x6d\x29\x29\x7b\x76\x3d\x21\x30\x2c\x79\x28\x74\x2c\x69\x29" +"\x3b\x62\x72\x65\x61\x6b\x7d\x21\x76\x26\x26\x63\x2e\x63\x6c\x61\x73\x73\x26\x26\x74\x74\x28\x63\x2e\x63\x6c\x61\x73\x73\x29\x7d\x7d\x65\x6c\x73\x65\x20\x65\x2e\x64\x61\x74\x61\x21\x3d\x3d\x74\x2e\x74\x65\x78\x74\x26\x26\x28\x65\x2e\x64\x61\x74\x61\x3d\x74\x2e\x74\x65\x78\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x69\x2c" +"\x6f\x2c\x61\x29\x7b\x69\x66\x28\x21\x74\x28\x69\x29\x29\x7b\x76\x61\x72\x20\x63\x2c\x6c\x3d\x21\x31\x2c\x70\x3d\x5b\x5d\x3b\x69\x66\x28\x74\x28\x65\x29\x29\x6c\x3d\x21\x30\x2c\x66\x28\x69\x2c\x70\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x64\x3d\x6e\x28\x65\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x3b\x69\x66\x28\x21\x64\x26\x26\x6f\x72\x28\x65\x2c\x69\x29\x29\x78\x28\x65\x2c\x69\x2c\x70\x2c\x6e" +"\x75\x6c\x6c\x2c\x6e\x75\x6c\x6c\x2c\x61\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x64\x29\x7b\x69\x66\x28\x31\x3d\x3d\x3d\x65\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x26\x26\x65\x2e\x68\x61\x73\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x4c\x29\x26\x26\x28\x65\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x28\x4c\x29\x2c\x6f\x3d\x21\x30\x29\x2c\x72\x28\x6f\x29\x26\x26\x4f\x28\x65\x2c\x69" +"\x2c\x70\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6b\x28\x69\x2c\x70\x2c\x21\x30\x29\x2c\x65\x3b\x63\x3d\x65\x2c\x65\x3d\x6e\x65\x77\x20\x70\x65\x28\x75\x2e\x74\x61\x67\x4e\x61\x6d\x65\x28\x63\x29\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x7b\x7d\x2c\x5b\x5d\x2c\x76\x6f\x69\x64\x20\x30\x2c\x63\x29\x7d\x76\x61\x72\x20\x76\x3d\x65\x2e\x65\x6c\x6d\x2c\x68\x3d\x75\x2e\x70\x61\x72\x65\x6e" +"\x74\x4e\x6f\x64\x65\x28\x76\x29\x3b\x69\x66\x28\x66\x28\x69\x2c\x70\x2c\x76\x2e\x5f\x6c\x65\x61\x76\x65\x43\x62\x3f\x6e\x75\x6c\x6c\x3a\x68\x2c\x75\x2e\x6e\x65\x78\x74\x53\x69\x62\x6c\x69\x6e\x67\x28\x76\x29\x29\x2c\x6e\x28\x69\x2e\x70\x61\x72\x65\x6e\x74\x29\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x79\x3d\x69\x2e\x70\x61\x72\x65\x6e\x74\x2c\x67\x3d\x6d\x28\x69\x29\x3b\x79\x3b\x29\x7b\x66\x6f\x72\x28" +"\x76\x61\x72\x20\x5f\x3d\x30\x3b\x5f\x3c\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x5f\x29\x73\x2e\x64\x65\x73\x74\x72\x6f\x79\x5b\x5f\x5d\x28\x79\x29\x3b\x69\x66\x28\x79\x2e\x65\x6c\x6d\x3d\x69\x2e\x65\x6c\x6d\x2c\x67\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x77\x3d\x30\x3b\x77\x3c\x73\x2e\x63\x72\x65\x61\x74\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x2b\x2b\x77\x29\x73" +"\x2e\x63\x72\x65\x61\x74\x65\x5b\x77\x5d\x28\x72\x72\x2c\x79\x29\x3b\x76\x61\x72\x20\x43\x3d\x79\x2e\x64\x61\x74\x61\x2e\x68\x6f\x6f\x6b\x2e\x69\x6e\x73\x65\x72\x74\x3b\x69\x66\x28\x43\x2e\x6d\x65\x72\x67\x65\x64\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x41\x3d\x31\x3b\x41\x3c\x43\x2e\x66\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x41\x2b\x2b\x29\x43\x2e\x66\x6e\x73\x5b\x41\x5d\x28\x29\x7d\x65\x6c\x73\x65" +"\x20\x6e\x72\x28\x79\x29\x3b\x79\x3d\x79\x2e\x70\x61\x72\x65\x6e\x74\x7d\x6e\x28\x68\x29\x3f\x24\x28\x5b\x65\x5d\x2c\x30\x2c\x30\x29\x3a\x6e\x28\x65\x2e\x74\x61\x67\x29\x26\x26\x62\x28\x65\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6b\x28\x69\x2c\x70\x2c\x6c\x29\x2c\x69\x2e\x65\x6c\x6d\x7d\x6e\x28\x65\x29\x26\x26\x62\x28\x65\x29\x7d\x7d\x28\x7b\x6e\x6f\x64\x65\x4f\x70\x73\x3a\x65\x72\x2c\x6d\x6f\x64" +"\x75\x6c\x65\x73\x3a\x5b\x79\x72\x2c\x6b\x72\x2c\x72\x69\x2c\x61\x69\x2c\x79\x69\x2c\x56\x3f\x7b\x63\x72\x65\x61\x74\x65\x3a\x56\x69\x2c\x61\x63\x74\x69\x76\x61\x74\x65\x3a\x56\x69\x2c\x72\x65\x6d\x6f\x76\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x21\x30\x21\x3d\x3d\x65\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3f\x48\x69\x28\x65\x2c\x74\x29\x3a\x74\x28\x29\x7d\x7d\x3a\x7b\x7d" +"\x5d\x2e\x63\x6f\x6e\x63\x61\x74\x28\x64\x72\x29\x7d\x29\x3b\x57\x26\x26\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x63\x68\x61\x6e\x67\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x61\x63\x74\x69\x76\x65\x45\x6c\x65\x6d\x65\x6e" +"\x74\x3b\x65\x26\x26\x65\x2e\x76\x6d\x6f\x64\x65\x6c\x26\x26\x59\x69\x28\x65\x2c\x22\x69\x6e\x70\x75\x74\x22\x29\x7d\x29\x3b\x76\x61\x72\x20\x4b\x69\x3d\x7b\x69\x6e\x73\x65\x72\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x22\x73\x65\x6c\x65\x63\x74\x22\x3d\x3d\x3d\x6e\x2e\x74\x61\x67\x3f\x28\x72\x2e\x65\x6c\x6d\x26\x26\x21\x72\x2e\x65\x6c\x6d\x2e\x5f\x76" +"\x4f\x70\x74\x69\x6f\x6e\x73\x3f\x6f\x74\x28\x6e\x2c\x22\x70\x6f\x73\x74\x70\x61\x74\x63\x68\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x4b\x69\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x29\x3a\x4a\x69\x28\x65\x2c\x74\x2c\x6e\x2e\x63\x6f\x6e\x74\x65\x78\x74\x29\x2c\x65\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x5b\x5d\x2e\x6d\x61" +"\x70\x2e\x63\x61\x6c\x6c\x28\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x5a\x69\x29\x29\x3a\x28\x22\x74\x65\x78\x74\x61\x72\x65\x61\x22\x3d\x3d\x3d\x6e\x2e\x74\x61\x67\x7c\x7c\x59\x6e\x28\x65\x2e\x74\x79\x70\x65\x29\x29\x26\x26\x28\x65\x2e\x5f\x76\x4d\x6f\x64\x69\x66\x69\x65\x72\x73\x3d\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2c\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2e\x6c\x61\x7a\x79\x7c" +"\x7c\x28\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x63\x6f\x6d\x70\x6f\x73\x69\x74\x69\x6f\x6e\x73\x74\x61\x72\x74\x22\x2c\x47\x69\x29\x2c\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x22\x63\x6f\x6d\x70\x6f\x73\x69\x74\x69\x6f\x6e\x65\x6e\x64\x22\x2c\x58\x69\x29\x2c\x65\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e" +"\x65\x72\x28\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x58\x69\x29\x2c\x57\x26\x26\x28\x65\x2e\x76\x6d\x6f\x64\x65\x6c\x3d\x21\x30\x29\x29\x29\x7d\x2c\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x55\x70\x64\x61\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x22\x73\x65\x6c\x65\x63\x74\x22\x3d\x3d\x3d\x6e\x2e\x74\x61\x67\x29\x7b\x4a\x69\x28\x65\x2c\x74\x2c\x6e\x2e\x63" +"\x6f\x6e\x74\x65\x78\x74\x29\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e\x73\x2c\x69\x3d\x65\x2e\x5f\x76\x4f\x70\x74\x69\x6f\x6e\x73\x3d\x5b\x5d\x2e\x6d\x61\x70\x2e\x63\x61\x6c\x6c\x28\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x5a\x69\x29\x3b\x69\x66\x28\x69\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x45\x28\x65" +"\x2c\x72\x5b\x74\x5d\x29\x7d\x29\x29\x28\x65\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x3f\x74\x2e\x76\x61\x6c\x75\x65\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x57\x69\x28\x65\x2c\x69\x29\x7d\x29\x3a\x74\x2e\x76\x61\x6c\x75\x65\x21\x3d\x3d\x74\x2e\x6f\x6c\x64\x56\x61\x6c\x75\x65\x26\x26\x57\x69\x28\x74\x2e\x76\x61\x6c\x75\x65\x2c\x69\x29\x29\x26" +"\x26\x59\x69\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x29\x7d\x7d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x71\x69\x28\x65\x2c\x74\x2c\x6e\x29\x2c\x28\x71\x7c\x7c\x5a\x29\x26\x26\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x71\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7d\x2c\x30\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e" +"\x20\x71\x69\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x65\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x3b\x69\x66\x28\x21\x69\x7c\x7c\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x72\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x2c\x61\x2c\x73\x3d\x30\x2c\x63\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x3c" +"\x63\x3b\x73\x2b\x2b\x29\x69\x66\x28\x61\x3d\x65\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x5b\x73\x5d\x2c\x69\x29\x6f\x3d\x6a\x28\x72\x2c\x5a\x69\x28\x61\x29\x29\x3e\x2d\x31\x2c\x61\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x21\x3d\x3d\x6f\x26\x26\x28\x61\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x3d\x6f\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x45\x28\x5a\x69\x28\x61\x29\x2c\x72\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x76" +"\x6f\x69\x64\x28\x65\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x49\x6e\x64\x65\x78\x21\x3d\x3d\x73\x26\x26\x28\x65\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x49\x6e\x64\x65\x78\x3d\x73\x29\x29\x3b\x69\x7c\x7c\x28\x65\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x49\x6e\x64\x65\x78\x3d\x2d\x31\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x69\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x65\x76\x65" +"\x72\x79\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x45\x28\x74\x2c\x65\x29\x7d\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5a\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5f\x76\x61\x6c\x75\x65\x22\x69\x6e\x20\x65\x3f\x65\x2e\x5f\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x47\x69\x28\x65\x29\x7b\x65\x2e\x74" +"\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x3d\x21\x30\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x69\x28\x65\x29\x7b\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x26\x26\x28\x65\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x3d\x21\x31\x2c\x59\x69\x28\x65\x2e\x74\x61\x72\x67\x65\x74\x2c\x22\x69\x6e\x70\x75\x74\x22\x29\x29\x7d\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x59\x69\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x76\x65\x6e\x74\x28\x22\x48\x54\x4d\x4c\x45\x76\x65\x6e\x74\x73\x22\x29\x3b\x6e\x2e\x69\x6e\x69\x74\x45\x76\x65\x6e\x74\x28\x74\x2c\x21\x30\x2c\x21\x30\x29\x2c\x65\x2e\x64\x69\x73\x70\x61\x74\x63\x68\x45\x76\x65\x6e\x74\x28\x6e\x29\x7d\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x20\x51\x69\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7c\x7c\x65\x2e\x64\x61\x74\x61\x26\x26\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3f\x65\x3a\x51\x69\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x29\x7d\x76" +"\x61\x72\x20\x65\x6f\x3d\x7b\x6d\x6f\x64\x65\x6c\x3a\x4b\x69\x2c\x73\x68\x6f\x77\x3a\x7b\x62\x69\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x28\x6e\x3d\x51\x69\x28\x6e\x29\x29\x2e\x64\x61\x74\x61\x26\x26\x6e\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x2c\x6f\x3d\x65\x2e\x5f\x5f\x76" +"\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x3d\x22\x6e\x6f\x6e\x65\x22\x3d\x3d\x3d\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3f\x22\x22\x3a\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3b\x72\x26\x26\x69\x3f\x28\x6e\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3d\x21\x30\x2c\x52\x69\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x73" +"\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x6f\x7d\x29\x29\x3a\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x72\x3f\x6f\x3a\x22\x6e\x6f\x6e\x65\x22\x7d\x2c\x75\x70\x64\x61\x74\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x76\x61\x6c\x75\x65\x3b\x21\x72\x21\x3d\x21\x74\x2e\x6f\x6c\x64\x56\x61\x6c\x75\x65\x26\x26" +"\x28\x28\x6e\x3d\x51\x69\x28\x6e\x29\x29\x2e\x64\x61\x74\x61\x26\x26\x6e\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3f\x28\x6e\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3d\x21\x30\x2c\x72\x3f\x52\x69\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69" +"\x73\x70\x6c\x61\x79\x7d\x29\x3a\x48\x69\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x22\x6e\x6f\x6e\x65\x22\x7d\x29\x29\x3a\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x72\x3f\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x3a\x22\x6e\x6f\x6e\x65\x22\x29\x7d\x2c\x75\x6e" +"\x62\x69\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x69\x7c\x7c\x28\x65\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x65\x2e\x5f\x5f\x76\x4f\x72\x69\x67\x69\x6e\x61\x6c\x44\x69\x73\x70\x6c\x61\x79\x29\x7d\x7d\x7d\x2c\x74\x6f\x3d\x7b\x6e\x61\x6d\x65\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x3a\x42\x6f\x6f\x6c\x65\x61\x6e" +"\x2c\x63\x73\x73\x3a\x42\x6f\x6f\x6c\x65\x61\x6e\x2c\x6d\x6f\x64\x65\x3a\x53\x74\x72\x69\x6e\x67\x2c\x74\x79\x70\x65\x3a\x53\x74\x72\x69\x6e\x67\x2c\x65\x6e\x74\x65\x72\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6c\x65\x61\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x65\x6e\x74\x65\x72\x54\x6f\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6c\x65\x61\x76\x65\x54\x6f" +"\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x65\x6e\x74\x65\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x6c\x65\x61\x76\x65\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x41\x63\x74\x69\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74" +"\x72\x69\x6e\x67\x2c\x61\x70\x70\x65\x61\x72\x54\x6f\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x2c\x64\x75\x72\x61\x74\x69\x6f\x6e\x3a\x5b\x4e\x75\x6d\x62\x65\x72\x2c\x53\x74\x72\x69\x6e\x67\x2c\x4f\x62\x6a\x65\x63\x74\x5d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6e\x6f\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x26\x26\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e" +"\x73\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x74\x2e\x43\x74\x6f\x72\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x61\x62\x73\x74\x72\x61\x63\x74\x3f\x6e\x6f\x28\x7a\x74\x28\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x3a\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x72\x6f\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x66\x6f\x72\x28\x76\x61" +"\x72\x20\x72\x20\x69\x6e\x20\x6e\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x29\x74\x5b\x72\x5d\x3d\x65\x5b\x72\x5d\x3b\x76\x61\x72\x20\x69\x3d\x6e\x2e\x5f\x70\x61\x72\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x69\x29\x74\x5b\x62\x28\x6f\x29\x5d\x3d\x69\x5b\x6f\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20" +"\x69\x6f\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x2f\x5c\x64\x2d\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76\x65\x24\x2f\x2e\x74\x65\x73\x74\x28\x74\x2e\x74\x61\x67\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x28\x22\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76\x65\x22\x2c\x7b\x70\x72\x6f\x70\x73\x3a\x74\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x4f\x70\x74\x69\x6f\x6e\x73\x2e\x70\x72\x6f\x70\x73\x44\x61\x74\x61\x7d\x29\x7d" +"\x76\x61\x72\x20\x6f\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x74\x61\x67\x7c\x7c\x70\x74\x28\x65\x29\x7d\x2c\x61\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x73\x68\x6f\x77\x22\x3d\x3d\x3d\x65\x2e\x6e\x61\x6d\x65\x7d\x2c\x73\x6f\x3d\x7b\x6e\x61\x6d\x65\x3a\x22\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x22\x2c" +"\x70\x72\x6f\x70\x73\x3a\x74\x6f\x2c\x61\x62\x73\x74\x72\x61\x63\x74\x3a\x21\x30\x2c\x72\x65\x6e\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2c\x6e\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x2e\x64\x65\x66\x61\x75\x6c\x74\x3b\x69\x66\x28\x6e\x26\x26\x28\x6e\x3d\x6e\x2e\x66\x69\x6c\x74\x65\x72\x28\x6f\x6f\x29\x29\x2e\x6c\x65\x6e\x67" +"\x74\x68\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x68\x69\x73\x2e\x6d\x6f\x64\x65\x2c\x6f\x3d\x6e\x5b\x30\x5d\x3b\x69\x66\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x3d\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x69\x66\x28\x65\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x28\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64" +"\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x3b\x76\x61\x72\x20\x61\x3d\x6e\x6f\x28\x6f\x29\x3b\x69\x66\x28\x21\x61\x29\x72\x65\x74\x75\x72\x6e\x20\x6f\x3b\x69\x66\x28\x74\x68\x69\x73\x2e\x5f\x6c\x65\x61\x76\x69\x6e\x67\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x6f\x28\x65\x2c\x6f\x29\x3b\x76\x61\x72\x20\x73\x3d\x22\x5f\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x2d\x22\x2b\x74\x68\x69\x73\x2e\x5f\x75" +"\x69\x64\x2b\x22\x2d\x22\x3b\x61\x2e\x6b\x65\x79\x3d\x6e\x75\x6c\x6c\x3d\x3d\x61\x2e\x6b\x65\x79\x3f\x61\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3f\x73\x2b\x22\x63\x6f\x6d\x6d\x65\x6e\x74\x22\x3a\x73\x2b\x61\x2e\x74\x61\x67\x3a\x69\x28\x61\x2e\x6b\x65\x79\x29\x3f\x30\x3d\x3d\x3d\x53\x74\x72\x69\x6e\x67\x28\x61\x2e\x6b\x65\x79\x29\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x73\x29\x3f\x61\x2e\x6b\x65\x79" +"\x3a\x73\x2b\x61\x2e\x6b\x65\x79\x3a\x61\x2e\x6b\x65\x79\x3b\x76\x61\x72\x20\x63\x3d\x28\x61\x2e\x64\x61\x74\x61\x7c\x7c\x28\x61\x2e\x64\x61\x74\x61\x3d\x7b\x7d\x29\x29\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x72\x6f\x28\x74\x68\x69\x73\x29\x2c\x75\x3d\x74\x68\x69\x73\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x6c\x3d\x6e\x6f\x28\x75\x29\x3b\x69\x66\x28\x61\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63" +"\x74\x69\x76\x65\x73\x26\x26\x61\x2e\x64\x61\x74\x61\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2e\x73\x6f\x6d\x65\x28\x61\x6f\x29\x26\x26\x28\x61\x2e\x64\x61\x74\x61\x2e\x73\x68\x6f\x77\x3d\x21\x30\x29\x2c\x6c\x26\x26\x6c\x2e\x64\x61\x74\x61\x26\x26\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x6b\x65\x79\x3d\x3d\x3d\x65\x2e\x6b\x65\x79\x26\x26" +"\x74\x2e\x74\x61\x67\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7d\x28\x61\x2c\x6c\x29\x26\x26\x21\x70\x74\x28\x6c\x29\x26\x26\x28\x21\x6c\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x7c\x7c\x21\x6c\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x49\x6e\x73\x74\x61\x6e\x63\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x29\x29\x7b\x76\x61\x72\x20\x66\x3d\x6c\x2e" +"\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x41\x28\x7b\x7d\x2c\x63\x29\x3b\x69\x66\x28\x22\x6f\x75\x74\x2d\x69\x6e\x22\x3d\x3d\x3d\x72\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x6c\x65\x61\x76\x69\x6e\x67\x3d\x21\x30\x2c\x6f\x74\x28\x66\x2c\x22\x61\x66\x74\x65\x72\x4c\x65\x61\x76\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x74\x2e\x5f\x6c\x65\x61\x76" +"\x69\x6e\x67\x3d\x21\x31\x2c\x74\x2e\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x7d\x29\x2c\x69\x6f\x28\x65\x2c\x6f\x29\x3b\x69\x66\x28\x22\x69\x6e\x2d\x6f\x75\x74\x22\x3d\x3d\x3d\x72\x29\x7b\x69\x66\x28\x70\x74\x28\x61\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x75\x3b\x76\x61\x72\x20\x70\x2c\x64\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x70\x28\x29\x7d\x3b\x6f\x74\x28\x63\x2c\x22\x61" +"\x66\x74\x65\x72\x45\x6e\x74\x65\x72\x22\x2c\x64\x29\x2c\x6f\x74\x28\x63\x2c\x22\x65\x6e\x74\x65\x72\x43\x61\x6e\x63\x65\x6c\x6c\x65\x64\x22\x2c\x64\x29\x2c\x6f\x74\x28\x66\x2c\x22\x64\x65\x6c\x61\x79\x4c\x65\x61\x76\x65\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x70\x3d\x65\x7d\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6f\x7d\x7d\x7d\x2c\x63\x6f\x3d\x41\x28\x7b\x74\x61\x67\x3a\x53\x74" +"\x72\x69\x6e\x67\x2c\x6d\x6f\x76\x65\x43\x6c\x61\x73\x73\x3a\x53\x74\x72\x69\x6e\x67\x7d\x2c\x74\x6f\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x6f\x28\x65\x29\x7b\x65\x2e\x65\x6c\x6d\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x26\x26\x65\x2e\x65\x6c\x6d\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x28\x29\x2c\x65\x2e\x65\x6c\x6d\x2e\x5f\x65\x6e\x74\x65\x72\x43\x62\x26\x26\x65\x2e\x65\x6c\x6d\x2e\x5f\x65\x6e\x74\x65" +"\x72\x43\x62\x28\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x6f\x28\x65\x29\x7b\x65\x2e\x64\x61\x74\x61\x2e\x6e\x65\x77\x50\x6f\x73\x3d\x65\x2e\x65\x6c\x6d\x2e\x67\x65\x74\x42\x6f\x75\x6e\x64\x69\x6e\x67\x43\x6c\x69\x65\x6e\x74\x52\x65\x63\x74\x28\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x6f\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x64\x61\x74\x61\x2e\x70\x6f\x73\x2c\x6e\x3d\x65" +"\x2e\x64\x61\x74\x61\x2e\x6e\x65\x77\x50\x6f\x73\x2c\x72\x3d\x74\x2e\x6c\x65\x66\x74\x2d\x6e\x2e\x6c\x65\x66\x74\x2c\x69\x3d\x74\x2e\x74\x6f\x70\x2d\x6e\x2e\x74\x6f\x70\x3b\x69\x66\x28\x72\x7c\x7c\x69\x29\x7b\x65\x2e\x64\x61\x74\x61\x2e\x6d\x6f\x76\x65\x64\x3d\x21\x30\x3b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x65\x6c\x6d\x2e\x73\x74\x79\x6c\x65\x3b\x6f\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x6f\x2e" +"\x57\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x22\x2b\x72\x2b\x22\x70\x78\x2c\x22\x2b\x69\x2b\x22\x70\x78\x29\x22\x2c\x6f\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x44\x75\x72\x61\x74\x69\x6f\x6e\x3d\x22\x30\x73\x22\x7d\x7d\x64\x65\x6c\x65\x74\x65\x20\x63\x6f\x2e\x6d\x6f\x64\x65\x3b\x76\x61\x72\x20\x70\x6f\x3d\x7b\x54\x72\x61\x6e\x73" +"\x69\x74\x69\x6f\x6e\x3a\x73\x6f\x2c\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x47\x72\x6f\x75\x70\x3a\x7b\x70\x72\x6f\x70\x73\x3a\x63\x6f\x2c\x62\x65\x66\x6f\x72\x65\x4d\x6f\x75\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2c\x74\x3d\x74\x68\x69\x73\x2e\x5f\x75\x70\x64\x61\x74\x65\x3b\x74\x68\x69\x73\x2e\x5f\x75\x70\x64\x61\x74\x65\x3d\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x28\x6e\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x47\x74\x28\x65\x29\x3b\x65\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x28\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x2c\x65\x2e\x6b\x65\x70\x74\x2c\x21\x31\x2c\x21\x30\x29\x2c\x65\x2e\x5f\x76\x6e\x6f\x64\x65\x3d\x65\x2e\x6b\x65\x70\x74\x2c\x69\x28\x29\x2c\x74\x2e\x63\x61\x6c\x6c\x28\x65\x2c\x6e\x2c\x72\x29\x7d\x7d\x2c\x72\x65\x6e\x64\x65\x72" +"\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x74\x68\x69\x73\x2e\x74\x61\x67\x7c\x7c\x74\x68\x69\x73\x2e\x24\x76\x6e\x6f\x64\x65\x2e\x64\x61\x74\x61\x2e\x74\x61\x67\x7c\x7c\x22\x73\x70\x61\x6e\x22\x2c\x6e\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x2c\x72\x3d\x74\x68\x69\x73\x2e\x70\x72\x65\x76\x43\x68\x69\x6c\x64" +"\x72\x65\x6e\x3d\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x69\x3d\x74\x68\x69\x73\x2e\x24\x73\x6c\x6f\x74\x73\x2e\x64\x65\x66\x61\x75\x6c\x74\x7c\x7c\x5b\x5d\x2c\x6f\x3d\x74\x68\x69\x73\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x5b\x5d\x2c\x61\x3d\x72\x6f\x28\x74\x68\x69\x73\x29\x2c\x73\x3d\x30\x3b\x73\x3c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x73\x2b\x2b\x29\x7b\x76\x61\x72\x20\x63\x3d" +"\x69\x5b\x73\x5d\x3b\x63\x2e\x74\x61\x67\x26\x26\x6e\x75\x6c\x6c\x21\x3d\x63\x2e\x6b\x65\x79\x26\x26\x30\x21\x3d\x3d\x53\x74\x72\x69\x6e\x67\x28\x63\x2e\x6b\x65\x79\x29\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x5f\x5f\x76\x6c\x69\x73\x74\x22\x29\x26\x26\x28\x6f\x2e\x70\x75\x73\x68\x28\x63\x29\x2c\x6e\x5b\x63\x2e\x6b\x65\x79\x5d\x3d\x63\x2c\x28\x63\x2e\x64\x61\x74\x61\x7c\x7c\x28\x63\x2e\x64\x61\x74" +"\x61\x3d\x7b\x7d\x29\x29\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x61\x29\x7d\x69\x66\x28\x72\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x5b\x5d\x2c\x6c\x3d\x5b\x5d\x2c\x66\x3d\x30\x3b\x66\x3c\x72\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x2b\x2b\x29\x7b\x76\x61\x72\x20\x70\x3d\x72\x5b\x66\x5d\x3b\x70\x2e\x64\x61\x74\x61\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x3d\x61\x2c\x70\x2e\x64\x61" +"\x74\x61\x2e\x70\x6f\x73\x3d\x70\x2e\x65\x6c\x6d\x2e\x67\x65\x74\x42\x6f\x75\x6e\x64\x69\x6e\x67\x43\x6c\x69\x65\x6e\x74\x52\x65\x63\x74\x28\x29\x2c\x6e\x5b\x70\x2e\x6b\x65\x79\x5d\x3f\x75\x2e\x70\x75\x73\x68\x28\x70\x29\x3a\x6c\x2e\x70\x75\x73\x68\x28\x70\x29\x7d\x74\x68\x69\x73\x2e\x6b\x65\x70\x74\x3d\x65\x28\x74\x2c\x6e\x75\x6c\x6c\x2c\x75\x29\x2c\x74\x68\x69\x73\x2e\x72\x65\x6d\x6f\x76\x65\x64" +"\x3d\x6c\x7d\x72\x65\x74\x75\x72\x6e\x20\x65\x28\x74\x2c\x6e\x75\x6c\x6c\x2c\x6f\x29\x7d\x2c\x75\x70\x64\x61\x74\x65\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x76\x61\x72\x20\x65\x3d\x74\x68\x69\x73\x2e\x70\x72\x65\x76\x43\x68\x69\x6c\x64\x72\x65\x6e\x2c\x74\x3d\x74\x68\x69\x73\x2e\x6d\x6f\x76\x65\x43\x6c\x61\x73\x73\x7c\x7c\x28\x74\x68\x69\x73\x2e\x6e\x61\x6d\x65\x7c\x7c\x22\x76\x22\x29" +"\x2b\x22\x2d\x6d\x6f\x76\x65\x22\x3b\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x74\x68\x69\x73\x2e\x68\x61\x73\x4d\x6f\x76\x65\x28\x65\x5b\x30\x5d\x2e\x65\x6c\x6d\x2c\x74\x29\x26\x26\x28\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x75\x6f\x29\x2c\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x6c\x6f\x29\x2c\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x6f\x29\x2c\x74\x68\x69\x73\x2e\x5f\x72\x65\x66\x6c\x6f\x77" +"\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x62\x6f\x64\x79\x2e\x6f\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74\x2c\x65\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x2e\x64\x61\x74\x61\x2e\x6d\x6f\x76\x65\x64\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x65\x6c\x6d\x2c\x72\x3d\x6e\x2e\x73\x74\x79\x6c\x65\x3b\x6a\x69\x28\x6e\x2c\x74\x29\x2c\x72\x2e\x74" +"\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x72\x2e\x57\x65\x62\x6b\x69\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x72\x2e\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x44\x75\x72\x61\x74\x69\x6f\x6e\x3d\x22\x22\x2c\x6e\x2e\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x4f\x69\x2c\x6e\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x72\x29\x7b\x72\x26\x26" +"\x72\x2e\x74\x61\x72\x67\x65\x74\x21\x3d\x3d\x6e\x7c\x7c\x72\x26\x26\x21\x2f\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x24\x2f\x2e\x74\x65\x73\x74\x28\x72\x2e\x70\x72\x6f\x70\x65\x72\x74\x79\x4e\x61\x6d\x65\x29\x7c\x7c\x28\x6e\x2e\x72\x65\x6d\x6f\x76\x65\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72\x28\x4f\x69\x2c\x65\x29\x2c\x6e\x2e\x5f\x6d\x6f\x76\x65\x43\x62\x3d\x6e\x75\x6c\x6c\x2c\x44\x69\x28" +"\x6e\x2c\x74\x29\x29\x7d\x29\x7d\x7d\x29\x29\x7d\x2c\x6d\x65\x74\x68\x6f\x64\x73\x3a\x7b\x68\x61\x73\x4d\x6f\x76\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x21\x43\x69\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x74\x68\x69\x73\x2e\x5f\x68\x61\x73\x4d\x6f\x76\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x5f\x68\x61\x73\x4d\x6f\x76\x65\x3b\x76\x61" +"\x72\x20\x6e\x3d\x65\x2e\x63\x6c\x6f\x6e\x65\x4e\x6f\x64\x65\x28\x29\x3b\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x26\x26\x65\x2e\x5f\x74\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x43\x6c\x61\x73\x73\x65\x73\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x62\x69\x28\x6e\x2c\x65\x29\x7d\x29\x2c\x5f\x69\x28\x6e\x2c\x74\x29\x2c\x6e" +"\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x22\x6e\x6f\x6e\x65\x22\x2c\x74\x68\x69\x73\x2e\x24\x65\x6c\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x6e\x29\x3b\x76\x61\x72\x20\x72\x3d\x4d\x69\x28\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x2e\x24\x65\x6c\x2e\x72\x65\x6d\x6f\x76\x65\x43\x68\x69\x6c\x64\x28\x6e\x29\x2c\x74\x68\x69\x73\x2e\x5f\x68\x61\x73\x4d\x6f" +"\x76\x65\x3d\x72\x2e\x68\x61\x73\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x7d\x7d\x7d\x7d\x3b\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x3d\x44\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3d\x5a\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x41\x74\x74\x72\x3d\x45" +"\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x3d\x47\x6e\x2c\x43\x6e\x2e\x63\x6f\x6e\x66\x69\x67\x2e\x69\x73\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x21\x56\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x69\x66\x28\x5a\x6e\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e" +"\x21\x31\x3b\x69\x66\x28\x65\x3d\x65\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x6e\x75\x6c\x6c\x21\x3d\x58\x6e\x5b\x65\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x58\x6e\x5b\x65\x5d\x3b\x76\x61\x72\x20\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x2d" +"\x22\x29\x3e\x2d\x31\x3f\x58\x6e\x5b\x65\x5d\x3d\x74\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x48\x54\x4d\x4c\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x7c\x7c\x74\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x3d\x3d\x3d\x77\x69\x6e\x64\x6f\x77\x2e\x48\x54\x4d\x4c\x45\x6c\x65\x6d\x65\x6e\x74\x3a\x58\x6e\x5b\x65\x5d\x3d\x2f\x48\x54\x4d" +"\x4c\x55\x6e\x6b\x6e\x6f\x77\x6e\x45\x6c\x65\x6d\x65\x6e\x74\x2f\x2e\x74\x65\x73\x74\x28\x74\x2e\x74\x6f\x53\x74\x72\x69\x6e\x67\x28\x29\x29\x7d\x2c\x41\x28\x43\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x2c\x65\x6f\x29\x2c\x41\x28\x43\x6e\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x73\x2c\x70\x6f\x29\x2c\x43\x6e\x2e\x70\x72\x6f\x74" +"\x6f\x74\x79\x70\x65\x2e\x5f\x5f\x70\x61\x74\x63\x68\x5f\x5f\x3d\x56\x3f\x7a\x69\x3a\x53\x2c\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6d\x6f\x75\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x24\x65\x6c\x3d\x74" +"\x2c\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x72\x65\x6e\x64\x65\x72\x7c\x7c\x28\x65\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x72\x65\x6e\x64\x65\x72\x3d\x76\x65\x29\x2c\x51\x74\x28\x65\x2c\x22\x62\x65\x66\x6f\x72\x65\x4d\x6f\x75\x6e\x74\x22\x29\x2c\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x5f\x75\x70\x64\x61\x74\x65\x28\x65\x2e\x5f\x72\x65\x6e\x64\x65\x72\x28\x29\x2c\x6e\x29" +"\x7d\x2c\x6e\x65\x77\x20\x70\x6e\x28\x65\x2c\x72\x2c\x53\x2c\x7b\x62\x65\x66\x6f\x72\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x65\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x26\x26\x21\x65\x2e\x5f\x69\x73\x44\x65\x73\x74\x72\x6f\x79\x65\x64\x26\x26\x51\x74\x28\x65\x2c\x22\x62\x65\x66\x6f\x72\x65\x55\x70\x64\x61\x74\x65\x22\x29\x7d\x7d\x2c\x21\x30\x29\x2c\x6e\x3d\x21\x31\x2c\x6e\x75\x6c" +"\x6c\x3d\x3d\x65\x2e\x24\x76\x6e\x6f\x64\x65\x26\x26\x28\x65\x2e\x5f\x69\x73\x4d\x6f\x75\x6e\x74\x65\x64\x3d\x21\x30\x2c\x51\x74\x28\x65\x2c\x22\x6d\x6f\x75\x6e\x74\x65\x64\x22\x29\x29\x2c\x65\x7d\x28\x74\x68\x69\x73\x2c\x65\x3d\x65\x26\x26\x56\x3f\x51\x6e\x28\x65\x29\x3a\x76\x6f\x69\x64\x20\x30\x2c\x74\x29\x7d\x2c\x56\x26\x26\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x28\x66\x75\x6e\x63\x74\x69\x6f" +"\x6e\x28\x29\x7b\x46\x2e\x64\x65\x76\x74\x6f\x6f\x6c\x73\x26\x26\x6e\x65\x26\x26\x6e\x65\x2e\x65\x6d\x69\x74\x28\x22\x69\x6e\x69\x74\x22\x2c\x43\x6e\x29\x7d\x2c\x30\x29\x3b\x76\x61\x72\x20\x76\x6f\x3d\x2f\x5c\x7b\x5c\x7b\x28\x28\x3f\x3a\x2e\x7c\x5c\x72\x3f\x5c\x6e\x29\x2b\x3f\x29\x5c\x7d\x5c\x7d\x2f\x67\x2c\x68\x6f\x3d\x2f\x5b\x2d\x2e\x2a\x2b\x3f\x5e\x24\x7b\x7d\x28\x29\x7c\x5b\x5c\x5d\x5c\x2f\x5c" +"\x5c\x5d\x2f\x67\x2c\x6d\x6f\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x5b\x30\x5d\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x68\x6f\x2c\x22\x5c\x5c\x24\x26\x22\x29\x2c\x6e\x3d\x65\x5b\x31\x5d\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x68\x6f\x2c\x22\x5c\x5c\x24\x26\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x74\x2b\x22\x28" +"\x28\x3f\x3a\x2e\x7c\x5c\x5c\x6e\x29\x2b\x3f\x29\x22\x2b\x6e\x2c\x22\x67\x22\x29\x7d\x29\x3b\x76\x61\x72\x20\x79\x6f\x3d\x7b\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x3a\x5b\x22\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x22\x5d\x2c\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x77\x61\x72\x6e\x3b\x76\x61\x72\x20\x6e\x3d\x50" +"\x72\x28\x65\x2c\x22\x63\x6c\x61\x73\x73\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x3d\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6e\x29\x29\x3b\x76\x61\x72\x20\x72\x3d\x46\x72\x28\x65\x2c\x22\x63\x6c\x61\x73\x73\x22\x2c\x21\x31\x29\x3b\x72\x26\x26\x28\x65\x2e\x63\x6c\x61\x73\x73\x42\x69\x6e\x64\x69\x6e\x67\x3d\x72\x29\x7d\x2c\x67\x65\x6e\x44" +"\x61\x74\x61\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x26\x26\x28\x74\x2b\x3d\x22\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x3a\x22\x2b\x65\x2e\x73\x74\x61\x74\x69\x63\x43\x6c\x61\x73\x73\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x63\x6c\x61\x73\x73\x42\x69\x6e\x64\x69\x6e\x67\x26" +"\x26\x28\x74\x2b\x3d\x22\x63\x6c\x61\x73\x73\x3a\x22\x2b\x65\x2e\x63\x6c\x61\x73\x73\x42\x69\x6e\x64\x69\x6e\x67\x2b\x22\x2c\x22\x29\x2c\x74\x7d\x7d\x3b\x76\x61\x72\x20\x67\x6f\x2c\x5f\x6f\x3d\x7b\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x3a\x5b\x22\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x22\x5d\x2c\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65" +"\x2c\x74\x29\x7b\x74\x2e\x77\x61\x72\x6e\x3b\x76\x61\x72\x20\x6e\x3d\x50\x72\x28\x65\x2c\x22\x73\x74\x79\x6c\x65\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x3d\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x73\x69\x28\x6e\x29\x29\x29\x3b\x76\x61\x72\x20\x72\x3d\x46\x72\x28\x65\x2c\x22\x73\x74\x79\x6c\x65\x22\x2c\x21\x31\x29\x3b\x72\x26\x26\x28\x65" +"\x2e\x73\x74\x79\x6c\x65\x42\x69\x6e\x64\x69\x6e\x67\x3d\x72\x29\x7d\x2c\x67\x65\x6e\x44\x61\x74\x61\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x26\x26\x28\x74\x2b\x3d\x22\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c\x65\x3a\x22\x2b\x65\x2e\x73\x74\x61\x74\x69\x63\x53\x74\x79\x6c" +"\x65\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x73\x74\x79\x6c\x65\x42\x69\x6e\x64\x69\x6e\x67\x26\x26\x28\x74\x2b\x3d\x22\x73\x74\x79\x6c\x65\x3a\x28\x22\x2b\x65\x2e\x73\x74\x79\x6c\x65\x42\x69\x6e\x64\x69\x6e\x67\x2b\x22\x29\x2c\x22\x29\x2c\x74\x7d\x7d\x2c\x62\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x67\x6f\x3d\x67\x6f\x7c\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e" +"\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x29\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x3d\x65\x2c\x67\x6f\x2e\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x7d\x2c\x24\x6f\x3d\x70\x28\x22\x61\x72\x65\x61\x2c\x62\x61\x73\x65\x2c\x62\x72\x2c\x63\x6f\x6c\x2c\x65\x6d\x62\x65\x64\x2c\x66\x72\x61\x6d\x65\x2c\x68\x72\x2c\x69\x6d\x67\x2c\x69\x6e\x70\x75\x74\x2c\x69\x73" +"\x69\x6e\x64\x65\x78\x2c\x6b\x65\x79\x67\x65\x6e\x2c\x6c\x69\x6e\x6b\x2c\x6d\x65\x74\x61\x2c\x70\x61\x72\x61\x6d\x2c\x73\x6f\x75\x72\x63\x65\x2c\x74\x72\x61\x63\x6b\x2c\x77\x62\x72\x22\x29\x2c\x77\x6f\x3d\x70\x28\x22\x63\x6f\x6c\x67\x72\x6f\x75\x70\x2c\x64\x64\x2c\x64\x74\x2c\x6c\x69\x2c\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x70\x2c\x74\x64\x2c\x74\x66\x6f\x6f\x74\x2c\x74\x68\x2c\x74\x68\x65\x61\x64\x2c" +"\x74\x72\x2c\x73\x6f\x75\x72\x63\x65\x22\x29\x2c\x43\x6f\x3d\x70\x28\x22\x61\x64\x64\x72\x65\x73\x73\x2c\x61\x72\x74\x69\x63\x6c\x65\x2c\x61\x73\x69\x64\x65\x2c\x62\x61\x73\x65\x2c\x62\x6c\x6f\x63\x6b\x71\x75\x6f\x74\x65\x2c\x62\x6f\x64\x79\x2c\x63\x61\x70\x74\x69\x6f\x6e\x2c\x63\x6f\x6c\x2c\x63\x6f\x6c\x67\x72\x6f\x75\x70\x2c\x64\x64\x2c\x64\x65\x74\x61\x69\x6c\x73\x2c\x64\x69\x61\x6c\x6f\x67\x2c" +"\x64\x69\x76\x2c\x64\x6c\x2c\x64\x74\x2c\x66\x69\x65\x6c\x64\x73\x65\x74\x2c\x66\x69\x67\x63\x61\x70\x74\x69\x6f\x6e\x2c\x66\x69\x67\x75\x72\x65\x2c\x66\x6f\x6f\x74\x65\x72\x2c\x66\x6f\x72\x6d\x2c\x68\x31\x2c\x68\x32\x2c\x68\x33\x2c\x68\x34\x2c\x68\x35\x2c\x68\x36\x2c\x68\x65\x61\x64\x2c\x68\x65\x61\x64\x65\x72\x2c\x68\x67\x72\x6f\x75\x70\x2c\x68\x72\x2c\x68\x74\x6d\x6c\x2c\x6c\x65\x67\x65\x6e\x64" +"\x2c\x6c\x69\x2c\x6d\x65\x6e\x75\x69\x74\x65\x6d\x2c\x6d\x65\x74\x61\x2c\x6f\x70\x74\x67\x72\x6f\x75\x70\x2c\x6f\x70\x74\x69\x6f\x6e\x2c\x70\x61\x72\x61\x6d\x2c\x72\x70\x2c\x72\x74\x2c\x73\x6f\x75\x72\x63\x65\x2c\x73\x74\x79\x6c\x65\x2c\x73\x75\x6d\x6d\x61\x72\x79\x2c\x74\x62\x6f\x64\x79\x2c\x74\x64\x2c\x74\x66\x6f\x6f\x74\x2c\x74\x68\x2c\x74\x68\x65\x61\x64\x2c\x74\x69\x74\x6c\x65\x2c\x74\x72\x2c" +"\x74\x72\x61\x63\x6b\x22\x29\x2c\x78\x6f\x3d\x2f\x5e\x5c\x73\x2a\x28\x5b\x5e\x5c\x73\x22\x27\x3c\x3e\x5c\x2f\x3d\x5d\x2b\x29\x28\x3f\x3a\x5c\x73\x2a\x28\x3d\x29\x5c\x73\x2a\x28\x3f\x3a\x22\x28\x5b\x5e\x22\x5d\x2a\x29\x22\x2b\x7c\x27\x28\x5b\x5e\x27\x5d\x2a\x29\x27\x2b\x7c\x28\x5b\x5e\x5c\x73\x22\x27\x3d\x3c\x3e\x60\x5d\x2b\x29\x29\x29\x3f\x2f\x2c\x6b\x6f\x3d\x2f\x5e\x5c\x73\x2a\x28\x28\x3f\x3a\x76" +"\x2d\x5b\x5c\x77\x2d\x5d\x2b\x3a\x7c\x40\x7c\x3a\x7c\x23\x29\x5c\x5b\x5b\x5e\x3d\x5d\x2b\x3f\x5c\x5d\x5b\x5e\x5c\x73\x22\x27\x3c\x3e\x5c\x2f\x3d\x5d\x2a\x29\x28\x3f\x3a\x5c\x73\x2a\x28\x3d\x29\x5c\x73\x2a\x28\x3f\x3a\x22\x28\x5b\x5e\x22\x5d\x2a\x29\x22\x2b\x7c\x27\x28\x5b\x5e\x27\x5d\x2a\x29\x27\x2b\x7c\x28\x5b\x5e\x5c\x73\x22\x27\x3d\x3c\x3e\x60\x5d\x2b\x29\x29\x29\x3f\x2f\x2c\x41\x6f\x3d\x22\x5b" +"\x61\x2d\x7a\x41\x2d\x5a\x5f\x5d\x5b\x5c\x5c\x2d\x5c\x5c\x2e\x30\x2d\x39\x5f\x61\x2d\x7a\x41\x2d\x5a\x22\x2b\x50\x2e\x73\x6f\x75\x72\x63\x65\x2b\x22\x5d\x2a\x22\x2c\x4f\x6f\x3d\x22\x28\x28\x3f\x3a\x22\x2b\x41\x6f\x2b\x22\x5c\x5c\x3a\x29\x3f\x22\x2b\x41\x6f\x2b\x22\x29\x22\x2c\x53\x6f\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5e\x3c\x22\x2b\x4f\x6f\x29\x2c\x54\x6f\x3d\x2f\x5e\x5c\x73\x2a" +"\x28\x5c\x2f\x3f\x29\x3e\x2f\x2c\x4e\x6f\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5e\x3c\x5c\x5c\x2f\x22\x2b\x4f\x6f\x2b\x22\x5b\x5e\x3e\x5d\x2a\x3e\x22\x29\x2c\x45\x6f\x3d\x2f\x5e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x5b\x5e\x3e\x5d\x2b\x3e\x2f\x69\x2c\x6a\x6f\x3d\x2f\x5e\x3c\x21\x5c\x2d\x2d\x2f\x2c\x44\x6f\x3d\x2f\x5e\x3c\x21\x5c\x5b\x2f\x2c\x4c\x6f\x3d\x70\x28\x22\x73\x63\x72\x69" +"\x70\x74\x2c\x73\x74\x79\x6c\x65\x2c\x74\x65\x78\x74\x61\x72\x65\x61\x22\x2c\x21\x30\x29\x2c\x49\x6f\x3d\x7b\x7d\x2c\x4d\x6f\x3d\x7b\x22\x26\x6c\x74\x3b\x22\x3a\x22\x3c\x22\x2c\x22\x26\x67\x74\x3b\x22\x3a\x22\x3e\x22\x2c\x22\x26\x71\x75\x6f\x74\x3b\x22\x3a\x27\x22\x27\x2c\x22\x26\x61\x6d\x70\x3b\x22\x3a\x22\x26\x22\x2c\x22\x26\x23\x31\x30\x3b\x22\x3a\x22\x5c\x6e\x22\x2c\x22\x26\x23\x39\x3b\x22\x3a" +"\x22\x5c\x74\x22\x2c\x22\x26\x23\x33\x39\x3b\x22\x3a\x22\x27\x22\x7d\x2c\x46\x6f\x3d\x2f\x26\x28\x3f\x3a\x6c\x74\x7c\x67\x74\x7c\x71\x75\x6f\x74\x7c\x61\x6d\x70\x7c\x23\x33\x39\x29\x3b\x2f\x67\x2c\x50\x6f\x3d\x2f\x26\x28\x3f\x3a\x6c\x74\x7c\x67\x74\x7c\x71\x75\x6f\x74\x7c\x61\x6d\x70\x7c\x23\x33\x39\x7c\x23\x31\x30\x7c\x23\x39\x29\x3b\x2f\x67\x2c\x52\x6f\x3d\x70\x28\x22\x70\x72\x65\x2c\x74\x65\x78" +"\x74\x61\x72\x65\x61\x22\x2c\x21\x30\x29\x2c\x48\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x26\x26\x52\x6f\x28\x65\x29\x26\x26\x22\x5c\x6e\x22\x3d\x3d\x3d\x74\x5b\x30\x5d\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x6f\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x50\x6f\x3a\x46\x6f\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65" +"\x70\x6c\x61\x63\x65\x28\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x4d\x6f\x5b\x65\x5d\x7d\x29\x7d\x76\x61\x72\x20\x55\x6f\x2c\x56\x6f\x2c\x7a\x6f\x2c\x4b\x6f\x2c\x4a\x6f\x2c\x71\x6f\x2c\x57\x6f\x2c\x5a\x6f\x2c\x47\x6f\x3d\x2f\x5e\x40\x7c\x5e\x76\x2d\x6f\x6e\x3a\x2f\x2c\x58\x6f\x3d\x2f\x5e\x76\x2d\x7c\x5e\x40\x7c\x5e\x3a\x7c\x5e\x23\x2f\x2c\x59\x6f\x3d\x2f" +"\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x3f\x29\x5c\x73\x2b\x28\x3f\x3a\x69\x6e\x7c\x6f\x66\x29\x5c\x73\x2b\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x29\x2f\x2c\x51\x6f\x3d\x2f\x2c\x28\x5b\x5e\x2c\x5c\x7d\x5c\x5d\x5d\x2a\x29\x28\x3f\x3a\x2c\x28\x5b\x5e\x2c\x5c\x7d\x5c\x5d\x5d\x2a\x29\x29\x3f\x24\x2f\x2c\x65\x61\x3d\x2f\x5e\x5c\x28\x7c\x5c\x29\x24\x2f\x67\x2c\x74\x61\x3d\x2f\x5e\x5c\x5b\x2e\x2a\x5c\x5d\x24\x2f\x2c" +"\x6e\x61\x3d\x2f\x3a\x28\x2e\x2a\x29\x24\x2f\x2c\x72\x61\x3d\x2f\x5e\x3a\x7c\x5e\x5c\x2e\x7c\x5e\x76\x2d\x62\x69\x6e\x64\x3a\x2f\x2c\x69\x61\x3d\x2f\x5c\x2e\x5b\x5e\x2e\x5c\x5d\x5d\x2b\x28\x3f\x3d\x5b\x5e\x5c\x5d\x5d\x2a\x24\x29\x2f\x67\x2c\x6f\x61\x3d\x2f\x5e\x76\x2d\x73\x6c\x6f\x74\x28\x3a\x7c\x24\x29\x7c\x5e\x23\x2f\x2c\x61\x61\x3d\x2f\x5b\x5c\x72\x5c\x6e\x5d\x2f\x2c\x73\x61\x3d\x2f\x5b\x20\x5c" +"\x66\x5c\x74\x5c\x72\x5c\x6e\x5d\x2b\x2f\x67\x2c\x63\x61\x3d\x67\x28\x62\x6f\x29\x2c\x75\x61\x3d\x22\x5f\x65\x6d\x70\x74\x79\x5f\x22\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6c\x61\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x74\x79\x70\x65\x3a\x31\x2c\x74\x61\x67\x3a\x65\x2c\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x3a\x74\x2c\x61\x74\x74\x72\x73\x4d\x61\x70\x3a\x79\x61\x28\x74\x29\x2c" +"\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x3a\x7b\x7d\x2c\x70\x61\x72\x65\x6e\x74\x3a\x6e\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x3a\x5b\x5d\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x66\x61\x28\x65\x2c\x74\x29\x7b\x55\x6f\x3d\x74\x2e\x77\x61\x72\x6e\x7c\x7c\x54\x72\x2c\x71\x6f\x3d\x74\x2e\x69\x73\x50\x72\x65\x54\x61\x67\x7c\x7c\x54\x2c\x57\x6f\x3d\x74\x2e\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f" +"\x70\x7c\x7c\x54\x2c\x5a\x6f\x3d\x74\x2e\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x7c\x7c\x54\x3b\x74\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3b\x7a\x6f\x3d\x4e\x72\x28\x74\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x22\x29\x2c\x4b\x6f\x3d\x4e\x72\x28\x74\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x70\x72\x65\x54\x72" +"\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x22\x29\x2c\x4a\x6f\x3d\x4e\x72\x28\x74\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x70\x6f\x73\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x22\x29\x2c\x56\x6f\x3d\x74\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x3b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x5b\x5d\x2c\x6f\x3d\x21\x31\x21\x3d\x3d\x74\x2e\x70\x72\x65\x73\x65\x72\x76\x65\x57\x68\x69" +"\x74\x65\x73\x70\x61\x63\x65\x2c\x61\x3d\x74\x2e\x77\x68\x69\x74\x65\x73\x70\x61\x63\x65\x2c\x73\x3d\x21\x31\x2c\x63\x3d\x21\x31\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x75\x28\x65\x29\x7b\x69\x66\x28\x6c\x28\x65\x29\x2c\x73\x7c\x7c\x65\x2e\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x7c\x7c\x28\x65\x3d\x70\x61\x28\x65\x2c\x74\x29\x29\x2c\x69\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x65\x3d\x3d\x3d\x6e\x7c\x7c" +"\x6e\x2e\x69\x66\x26\x26\x28\x65\x2e\x65\x6c\x73\x65\x69\x66\x7c\x7c\x65\x2e\x65\x6c\x73\x65\x29\x26\x26\x76\x61\x28\x6e\x2c\x7b\x65\x78\x70\x3a\x65\x2e\x65\x6c\x73\x65\x69\x66\x2c\x62\x6c\x6f\x63\x6b\x3a\x65\x7d\x29\x2c\x72\x26\x26\x21\x65\x2e\x66\x6f\x72\x62\x69\x64\x64\x65\x6e\x29\x69\x66\x28\x65\x2e\x65\x6c\x73\x65\x69\x66\x7c\x7c\x65\x2e\x65\x6c\x73\x65\x29\x61\x3d\x65\x2c\x28\x75\x3d\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x6f\x72\x28\x3b\x74\x2d\x2d\x3b\x29\x7b\x69\x66\x28\x31\x3d\x3d\x3d\x65\x5b\x74\x5d\x2e\x74\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x5b\x74\x5d\x3b\x65\x2e\x70\x6f\x70\x28\x29\x7d\x7d\x28\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x29\x26\x26\x75\x2e\x69\x66\x26\x26\x76\x61\x28\x75\x2c" +"\x7b\x65\x78\x70\x3a\x61\x2e\x65\x6c\x73\x65\x69\x66\x2c\x62\x6c\x6f\x63\x6b\x3a\x61\x7d\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x3b\x28\x72\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x7c\x7c\x28\x72\x2e\x73\x63\x6f\x70" +"\x65\x64\x53\x6c\x6f\x74\x73\x3d\x7b\x7d\x29\x29\x5b\x6f\x5d\x3d\x65\x7d\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x75\x73\x68\x28\x65\x29\x2c\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x72\x7d\x76\x61\x72\x20\x61\x2c\x75\x3b\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74" +"\x75\x72\x6e\x21\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x7d\x29\x2c\x6c\x28\x65\x29\x2c\x65\x2e\x70\x72\x65\x26\x26\x28\x73\x3d\x21\x31\x29\x2c\x71\x6f\x28\x65\x2e\x74\x61\x67\x29\x26\x26\x28\x63\x3d\x21\x31\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x66\x3d\x30\x3b\x66\x3c\x4a\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x2b\x2b\x29\x4a\x6f\x5b\x66\x5d\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x20\x6c\x28\x65\x29\x7b\x69\x66\x28\x21\x63\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3b\x28\x74\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x29\x26\x26\x33\x3d\x3d\x3d\x74\x2e\x74\x79\x70\x65\x26\x26\x22\x20\x22\x3d\x3d\x3d\x74\x2e\x74\x65\x78\x74\x3b\x29\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x6f" +"\x70\x28\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x5b\x5d\x2c\x6f\x3d\x74\x2e\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x2c\x61\x3d\x74\x2e\x69\x73\x55\x6e\x61\x72\x79\x54\x61\x67\x7c\x7c\x54\x2c\x73\x3d\x74\x2e\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x7c\x7c\x54\x2c\x63" +"\x3d\x30\x3b\x65\x3b\x29\x7b\x69\x66\x28\x6e\x3d\x65\x2c\x72\x26\x26\x4c\x6f\x28\x72\x29\x29\x7b\x76\x61\x72\x20\x75\x3d\x30\x2c\x6c\x3d\x72\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x66\x3d\x49\x6f\x5b\x6c\x5d\x7c\x7c\x28\x49\x6f\x5b\x6c\x5d\x3d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x28\x5b\x5c\x5c\x73\x5c\x5c\x53\x5d\x2a\x3f\x29\x28\x3c\x2f\x22\x2b\x6c\x2b\x22\x5b\x5e" +"\x3e\x5d\x2a\x3e\x29\x22\x2c\x22\x69\x22\x29\x29\x2c\x70\x3d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x66\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x75\x3d\x72\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x4c\x6f\x28\x6c\x29\x7c\x7c\x22\x6e\x6f\x73\x63\x72\x69\x70\x74\x22\x3d\x3d\x3d\x6c\x7c\x7c\x28\x6e\x3d\x6e\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x3c\x21" +"\x5c\x2d\x2d\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x3f\x29\x2d\x2d\x3e\x2f\x67\x2c\x22\x24\x31\x22\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x3c\x21\x5c\x5b\x43\x44\x41\x54\x41\x5c\x5b\x28\x5b\x5c\x73\x5c\x53\x5d\x2a\x3f\x29\x5d\x5d\x3e\x2f\x67\x2c\x22\x24\x31\x22\x29\x29\x2c\x48\x6f\x28\x6c\x2c\x6e\x29\x26\x26\x28\x6e\x3d\x6e\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x29\x2c\x74\x2e\x63\x68\x61\x72\x73\x26" +"\x26\x74\x2e\x63\x68\x61\x72\x73\x28\x6e\x29\x2c\x22\x22\x7d\x29\x3b\x63\x2b\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x70\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x65\x3d\x70\x2c\x41\x28\x6c\x2c\x63\x2d\x75\x2c\x63\x29\x7d\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x64\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x3c\x22\x29\x3b\x69\x66\x28\x30\x3d\x3d\x3d\x64\x29\x7b\x69\x66\x28\x6a\x6f\x2e\x74\x65\x73\x74\x28" +"\x65\x29\x29\x7b\x76\x61\x72\x20\x76\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x2d\x2d\x5c\x78\x33\x65\x22\x29\x3b\x69\x66\x28\x76\x3e\x3d\x30\x29\x7b\x74\x2e\x73\x68\x6f\x75\x6c\x64\x4b\x65\x65\x70\x43\x6f\x6d\x6d\x65\x6e\x74\x26\x26\x74\x2e\x63\x6f\x6d\x6d\x65\x6e\x74\x28\x65\x2e\x73\x75\x62\x73\x74\x72\x69\x6e\x67\x28\x34\x2c\x76\x29\x2c\x63\x2c\x63\x2b\x76\x2b\x33\x29\x2c\x43\x28\x76\x2b" +"\x33\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x7d\x69\x66\x28\x44\x6f\x2e\x74\x65\x73\x74\x28\x65\x29\x29\x7b\x76\x61\x72\x20\x68\x3d\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x5d\x3e\x22\x29\x3b\x69\x66\x28\x68\x3e\x3d\x30\x29\x7b\x43\x28\x68\x2b\x32\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x7d\x76\x61\x72\x20\x6d\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x45\x6f\x29\x3b\x69\x66\x28\x6d\x29\x7b" +"\x43\x28\x6d\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x76\x61\x72\x20\x79\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x4e\x6f\x29\x3b\x69\x66\x28\x79\x29\x7b\x76\x61\x72\x20\x67\x3d\x63\x3b\x43\x28\x79\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x41\x28\x79\x5b\x31\x5d\x2c\x67\x2c\x63\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x76\x61\x72\x20\x5f\x3d\x78\x28" +"\x29\x3b\x69\x66\x28\x5f\x29\x7b\x6b\x28\x5f\x29\x2c\x48\x6f\x28\x5f\x2e\x74\x61\x67\x4e\x61\x6d\x65\x2c\x65\x29\x26\x26\x43\x28\x31\x29\x3b\x63\x6f\x6e\x74\x69\x6e\x75\x65\x7d\x7d\x76\x61\x72\x20\x62\x3d\x76\x6f\x69\x64\x20\x30\x2c\x24\x3d\x76\x6f\x69\x64\x20\x30\x2c\x77\x3d\x76\x6f\x69\x64\x20\x30\x3b\x69\x66\x28\x64\x3e\x3d\x30\x29\x7b\x66\x6f\x72\x28\x24\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x64" +"\x29\x3b\x21\x28\x4e\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x53\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x6a\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x44\x6f\x2e\x74\x65\x73\x74\x28\x24\x29\x7c\x7c\x28\x77\x3d\x24\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x3c\x22\x2c\x31\x29\x29\x3c\x30\x29\x3b\x29\x64\x2b\x3d\x77\x2c\x24\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x64\x29\x3b\x62\x3d\x65\x2e\x73" +"\x75\x62\x73\x74\x72\x69\x6e\x67\x28\x30\x2c\x64\x29\x7d\x64\x3c\x30\x26\x26\x28\x62\x3d\x65\x29\x2c\x62\x26\x26\x43\x28\x62\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x74\x2e\x63\x68\x61\x72\x73\x26\x26\x62\x26\x26\x74\x2e\x63\x68\x61\x72\x73\x28\x62\x2c\x63\x2d\x62\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x63\x29\x7d\x69\x66\x28\x65\x3d\x3d\x3d\x6e\x29\x7b\x74\x2e\x63\x68\x61\x72\x73\x26\x26\x74\x2e\x63\x68\x61" +"\x72\x73\x28\x65\x29\x3b\x62\x72\x65\x61\x6b\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x43\x28\x74\x29\x7b\x63\x2b\x3d\x74\x2c\x65\x3d\x65\x2e\x73\x75\x62\x73\x74\x72\x69\x6e\x67\x28\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x78\x28\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x53\x6f\x29\x3b\x69\x66\x28\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x2c\x69\x3d\x7b\x74\x61\x67" +"\x4e\x61\x6d\x65\x3a\x74\x5b\x31\x5d\x2c\x61\x74\x74\x72\x73\x3a\x5b\x5d\x2c\x73\x74\x61\x72\x74\x3a\x63\x7d\x3b\x66\x6f\x72\x28\x43\x28\x74\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x3b\x21\x28\x6e\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x54\x6f\x29\x29\x26\x26\x28\x72\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x6b\x6f\x29\x7c\x7c\x65\x2e\x6d\x61\x74\x63\x68\x28\x78\x6f\x29\x29\x3b\x29\x72\x2e\x73\x74\x61" +"\x72\x74\x3d\x63\x2c\x43\x28\x72\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x72\x2e\x65\x6e\x64\x3d\x63\x2c\x69\x2e\x61\x74\x74\x72\x73\x2e\x70\x75\x73\x68\x28\x72\x29\x3b\x69\x66\x28\x6e\x29\x72\x65\x74\x75\x72\x6e\x20\x69\x2e\x75\x6e\x61\x72\x79\x53\x6c\x61\x73\x68\x3d\x6e\x5b\x31\x5d\x2c\x43\x28\x6e\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x29\x2c\x69\x2e\x65\x6e\x64\x3d\x63\x2c\x69\x7d\x7d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6b\x28\x65\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x74\x61\x67\x4e\x61\x6d\x65\x2c\x63\x3d\x65\x2e\x75\x6e\x61\x72\x79\x53\x6c\x61\x73\x68\x3b\x6f\x26\x26\x28\x22\x70\x22\x3d\x3d\x3d\x72\x26\x26\x43\x6f\x28\x6e\x29\x26\x26\x41\x28\x72\x29\x2c\x73\x28\x6e\x29\x26\x26\x72\x3d\x3d\x3d\x6e\x26\x26\x41\x28\x6e\x29\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x61" +"\x28\x6e\x29\x7c\x7c\x21\x21\x63\x2c\x6c\x3d\x65\x2e\x61\x74\x74\x72\x73\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x66\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x6c\x29\x2c\x70\x3d\x30\x3b\x70\x3c\x6c\x3b\x70\x2b\x2b\x29\x7b\x76\x61\x72\x20\x64\x3d\x65\x2e\x61\x74\x74\x72\x73\x5b\x70\x5d\x2c\x76\x3d\x64\x5b\x33\x5d\x7c\x7c\x64\x5b\x34\x5d\x7c\x7c\x64\x5b\x35\x5d\x7c\x7c\x22\x22\x2c\x68\x3d\x22\x61\x22\x3d" +"\x3d\x3d\x6e\x26\x26\x22\x68\x72\x65\x66\x22\x3d\x3d\x3d\x64\x5b\x31\x5d\x3f\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x3a\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x3b\x66\x5b\x70\x5d\x3d\x7b\x6e\x61\x6d\x65\x3a\x64\x5b\x31\x5d\x2c\x76\x61\x6c\x75\x65\x3a\x42\x6f\x28\x76\x2c\x68" +"\x29\x7d\x7d\x75\x7c\x7c\x28\x69\x2e\x70\x75\x73\x68\x28\x7b\x74\x61\x67\x3a\x6e\x2c\x6c\x6f\x77\x65\x72\x43\x61\x73\x65\x64\x54\x61\x67\x3a\x6e\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x61\x74\x74\x72\x73\x3a\x66\x2c\x73\x74\x61\x72\x74\x3a\x65\x2e\x73\x74\x61\x72\x74\x2c\x65\x6e\x64\x3a\x65\x2e\x65\x6e\x64\x7d\x29\x2c\x72\x3d\x6e\x29\x2c\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x74" +"\x2e\x73\x74\x61\x72\x74\x28\x6e\x2c\x66\x2c\x75\x2c\x65\x2e\x73\x74\x61\x72\x74\x2c\x65\x2e\x65\x6e\x64\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x28\x65\x2c\x6e\x2c\x6f\x29\x7b\x76\x61\x72\x20\x61\x2c\x73\x3b\x69\x66\x28\x6e\x75\x6c\x6c\x3d\x3d\x6e\x26\x26\x28\x6e\x3d\x63\x29\x2c\x6e\x75\x6c\x6c\x3d\x3d\x6f\x26\x26\x28\x6f\x3d\x63\x29\x2c\x65\x29\x66\x6f\x72\x28\x73\x3d\x65\x2e\x74\x6f\x4c" +"\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x2c\x61\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x3b\x61\x3e\x3d\x30\x26\x26\x69\x5b\x61\x5d\x2e\x6c\x6f\x77\x65\x72\x43\x61\x73\x65\x64\x54\x61\x67\x21\x3d\x3d\x73\x3b\x61\x2d\x2d\x29\x3b\x65\x6c\x73\x65\x20\x61\x3d\x30\x3b\x69\x66\x28\x61\x3e\x3d\x30\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x75\x3d\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x3b\x75\x3e\x3d" +"\x61\x3b\x75\x2d\x2d\x29\x74\x2e\x65\x6e\x64\x26\x26\x74\x2e\x65\x6e\x64\x28\x69\x5b\x75\x5d\x2e\x74\x61\x67\x2c\x6e\x2c\x6f\x29\x3b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x3d\x61\x2c\x72\x3d\x61\x26\x26\x69\x5b\x61\x2d\x31\x5d\x2e\x74\x61\x67\x7d\x65\x6c\x73\x65\x22\x62\x72\x22\x3d\x3d\x3d\x73\x3f\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x74\x2e\x73\x74\x61\x72\x74\x28\x65\x2c\x5b\x5d\x2c\x21\x30\x2c\x6e\x2c" +"\x6f\x29\x3a\x22\x70\x22\x3d\x3d\x3d\x73\x26\x26\x28\x74\x2e\x73\x74\x61\x72\x74\x26\x26\x74\x2e\x73\x74\x61\x72\x74\x28\x65\x2c\x5b\x5d\x2c\x21\x31\x2c\x6e\x2c\x6f\x29\x2c\x74\x2e\x65\x6e\x64\x26\x26\x74\x2e\x65\x6e\x64\x28\x65\x2c\x6e\x2c\x6f\x29\x29\x7d\x41\x28\x29\x7d\x28\x65\x2c\x7b\x77\x61\x72\x6e\x3a\x55\x6f\x2c\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x3a\x74\x2e\x65\x78\x70\x65\x63\x74\x48" +"\x54\x4d\x4c\x2c\x69\x73\x55\x6e\x61\x72\x79\x54\x61\x67\x3a\x74\x2e\x69\x73\x55\x6e\x61\x72\x79\x54\x61\x67\x2c\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x3a\x74\x2e\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x3a\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e" +"\x65\x77\x6c\x69\x6e\x65\x73\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x3a\x74\x2e\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x2c\x73\x68\x6f\x75\x6c\x64\x4b\x65\x65\x70\x43\x6f\x6d\x6d\x65\x6e\x74\x3a\x74\x2e\x63\x6f\x6d\x6d\x65\x6e\x74\x73\x2c\x6f\x75\x74\x70\x75" +"\x74\x53\x6f\x75\x72\x63\x65\x52\x61\x6e\x67\x65\x3a\x74\x2e\x6f\x75\x74\x70\x75\x74\x53\x6f\x75\x72\x63\x65\x52\x61\x6e\x67\x65\x2c\x73\x74\x61\x72\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x6f\x2c\x61\x2c\x6c\x2c\x66\x29\x7b\x76\x61\x72\x20\x70\x3d\x72\x26\x26\x72\x2e\x6e\x73\x7c\x7c\x5a\x6f\x28\x65\x29\x3b\x71\x26\x26\x22\x73\x76\x67\x22\x3d\x3d\x3d\x70\x26\x26\x28\x6f\x3d\x66\x75\x6e" +"\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x5b\x5d\x2c\x6e\x3d\x30\x3b\x6e\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x2b\x2b\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x5b\x6e\x5d\x3b\x67\x61\x2e\x74\x65\x73\x74\x28\x72\x2e\x6e\x61\x6d\x65\x29\x7c\x7c\x28\x72\x2e\x6e\x61\x6d\x65\x3d\x72\x2e\x6e\x61\x6d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x5f\x61\x2c\x22\x22\x29\x2c" +"\x74\x2e\x70\x75\x73\x68\x28\x72\x29\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x28\x6f\x29\x29\x3b\x76\x61\x72\x20\x64\x2c\x76\x3d\x6c\x61\x28\x65\x2c\x6f\x2c\x72\x29\x3b\x70\x26\x26\x28\x76\x2e\x6e\x73\x3d\x70\x29\x2c\x22\x73\x74\x79\x6c\x65\x22\x21\x3d\x3d\x28\x64\x3d\x76\x29\x2e\x74\x61\x67\x26\x26\x28\x22\x73\x63\x72\x69\x70\x74\x22\x21\x3d\x3d\x64\x2e\x74\x61\x67\x7c\x7c\x64\x2e\x61\x74\x74" +"\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x26\x26\x22\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22\x21\x3d\x3d\x64\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x29\x7c\x7c\x74\x65\x28\x29\x7c\x7c\x28\x76\x2e\x66\x6f\x72\x62\x69\x64\x64\x65\x6e\x3d\x21\x30\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x68\x3d\x30\x3b\x68\x3c\x4b\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x68\x2b\x2b" +"\x29\x76\x3d\x4b\x6f\x5b\x68\x5d\x28\x76\x2c\x74\x29\x7c\x7c\x76\x3b\x73\x7c\x7c\x28\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x70\x72\x65\x22\x29\x26\x26\x28\x65\x2e\x70\x72\x65\x3d\x21\x30\x29\x7d\x28\x76\x29\x2c\x76\x2e\x70\x72\x65\x26\x26\x28\x73\x3d\x21\x30\x29\x29\x2c\x71\x6f\x28\x76\x2e\x74\x61\x67\x29\x26\x26\x28\x63\x3d\x21" +"\x30\x29\x2c\x73\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x6e\x3d\x74\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x66\x28\x6e\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x3d\x6e\x65\x77\x20\x41\x72\x72\x61\x79\x28\x6e\x29\x2c\x69\x3d\x30\x3b\x69\x3c\x6e\x3b\x69\x2b\x2b\x29\x72\x5b\x69\x5d\x3d\x7b" +"\x6e\x61\x6d\x65\x3a\x74\x5b\x69\x5d\x2e\x6e\x61\x6d\x65\x2c\x76\x61\x6c\x75\x65\x3a\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x74\x5b\x69\x5d\x2e\x76\x61\x6c\x75\x65\x29\x7d\x2c\x6e\x75\x6c\x6c\x21\x3d\x74\x5b\x69\x5d\x2e\x73\x74\x61\x72\x74\x26\x26\x28\x72\x5b\x69\x5d\x2e\x73\x74\x61\x72\x74\x3d\x74\x5b\x69\x5d\x2e\x73\x74\x61\x72\x74\x2c\x72\x5b\x69\x5d\x2e\x65\x6e\x64\x3d\x74" +"\x5b\x69\x5d\x2e\x65\x6e\x64\x29\x3b\x65\x6c\x73\x65\x20\x65\x2e\x70\x72\x65\x7c\x7c\x28\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x30\x29\x7d\x28\x76\x29\x3a\x76\x2e\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x7c\x7c\x28\x64\x61\x28\x76\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x69\x66\x22\x29\x3b\x69\x66\x28\x74\x29\x65\x2e\x69\x66\x3d\x74" +"\x2c\x76\x61\x28\x65\x2c\x7b\x65\x78\x70\x3a\x74\x2c\x62\x6c\x6f\x63\x6b\x3a\x65\x7d\x29\x3b\x65\x6c\x73\x65\x7b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x22\x29\x26\x26\x28\x65\x2e\x65\x6c\x73\x65\x3d\x21\x30\x29\x3b\x76\x61\x72\x20\x6e\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x2d\x69\x66\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x65\x6c\x73\x65\x69\x66\x3d\x6e" +"\x29\x7d\x7d\x28\x76\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x6f\x6e\x63\x65\x22\x29\x26\x26\x28\x65\x2e\x6f\x6e\x63\x65\x3d\x21\x30\x29\x7d\x28\x76\x29\x29\x2c\x6e\x7c\x7c\x28\x6e\x3d\x76\x29\x2c\x61\x3f\x75\x28\x76\x29\x3a\x28\x72\x3d\x76\x2c\x69\x2e\x70\x75\x73\x68\x28\x76\x29\x29\x7d\x2c\x65\x6e\x64\x3a\x66\x75\x6e\x63\x74" +"\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x6f\x3d\x69\x5b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x3b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x3d\x31\x2c\x72\x3d\x69\x5b\x69\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d\x2c\x75\x28\x6f\x29\x7d\x2c\x63\x68\x61\x72\x73\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x72\x26\x26\x28\x21\x71\x7c\x7c\x22\x74" +"\x65\x78\x74\x61\x72\x65\x61\x22\x21\x3d\x3d\x72\x2e\x74\x61\x67\x7c\x7c\x72\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x70\x6c\x61\x63\x65\x68\x6f\x6c\x64\x65\x72\x21\x3d\x3d\x65\x29\x29\x7b\x76\x61\x72\x20\x69\x2c\x75\x2c\x6c\x2c\x66\x3d\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x65\x3d\x63\x7c\x7c\x65\x2e\x74\x72\x69\x6d\x28\x29\x3f\x22\x73\x63\x72\x69\x70\x74\x22\x3d\x3d\x3d\x28\x69" +"\x3d\x72\x29\x2e\x74\x61\x67\x7c\x7c\x22\x73\x74\x79\x6c\x65\x22\x3d\x3d\x3d\x69\x2e\x74\x61\x67\x3f\x65\x3a\x63\x61\x28\x65\x29\x3a\x66\x2e\x6c\x65\x6e\x67\x74\x68\x3f\x61\x3f\x22\x63\x6f\x6e\x64\x65\x6e\x73\x65\x22\x3d\x3d\x3d\x61\x26\x26\x61\x61\x2e\x74\x65\x73\x74\x28\x65\x29\x3f\x22\x22\x3a\x22\x20\x22\x3a\x6f\x3f\x22\x20\x22\x3a\x22\x22\x3a\x22\x22\x29\x63\x7c\x7c\x22\x63\x6f\x6e\x64\x65\x6e" +"\x73\x65\x22\x21\x3d\x3d\x61\x7c\x7c\x28\x65\x3d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x73\x61\x2c\x22\x20\x22\x29\x29\x2c\x21\x73\x26\x26\x22\x20\x22\x21\x3d\x3d\x65\x26\x26\x28\x75\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x74\x3f\x6d\x6f\x28\x74\x29\x3a\x76\x6f\x3b\x69\x66\x28\x6e\x2e\x74\x65\x73\x74\x28\x65\x29\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20" +"\x72\x2c\x69\x2c\x6f\x2c\x61\x3d\x5b\x5d\x2c\x73\x3d\x5b\x5d\x2c\x63\x3d\x6e\x2e\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x3d\x30\x3b\x72\x3d\x6e\x2e\x65\x78\x65\x63\x28\x65\x29\x3b\x29\x7b\x28\x69\x3d\x72\x2e\x69\x6e\x64\x65\x78\x29\x3e\x63\x26\x26\x28\x73\x2e\x70\x75\x73\x68\x28\x6f\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x63\x2c\x69\x29\x29\x2c\x61\x2e\x70\x75\x73\x68\x28\x4a\x53\x4f\x4e\x2e\x73\x74\x72" +"\x69\x6e\x67\x69\x66\x79\x28\x6f\x29\x29\x29\x3b\x76\x61\x72\x20\x75\x3d\x4f\x72\x28\x72\x5b\x31\x5d\x2e\x74\x72\x69\x6d\x28\x29\x29\x3b\x61\x2e\x70\x75\x73\x68\x28\x22\x5f\x73\x28\x22\x2b\x75\x2b\x22\x29\x22\x29\x2c\x73\x2e\x70\x75\x73\x68\x28\x7b\x22\x40\x62\x69\x6e\x64\x69\x6e\x67\x22\x3a\x75\x7d\x29\x2c\x63\x3d\x69\x2b\x72\x5b\x30\x5d\x2e\x6c\x65\x6e\x67\x74\x68\x7d\x72\x65\x74\x75\x72\x6e\x20" +"\x63\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x73\x2e\x70\x75\x73\x68\x28\x6f\x3d\x65\x2e\x73\x6c\x69\x63\x65\x28\x63\x29\x29\x2c\x61\x2e\x70\x75\x73\x68\x28\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x29\x29\x29\x2c\x7b\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x61\x2e\x6a\x6f\x69\x6e\x28\x22\x2b\x22\x29\x2c\x74\x6f\x6b\x65\x6e\x73\x3a\x73\x7d\x7d\x7d\x28\x65\x2c\x56" +"\x6f\x29\x29\x3f\x6c\x3d\x7b\x74\x79\x70\x65\x3a\x32\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x75\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2c\x74\x6f\x6b\x65\x6e\x73\x3a\x75\x2e\x74\x6f\x6b\x65\x6e\x73\x2c\x74\x65\x78\x74\x3a\x65\x7d\x3a\x22\x20\x22\x3d\x3d\x3d\x65\x26\x26\x66\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x22\x20\x22\x3d\x3d\x3d\x66\x5b\x66\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x5d" +"\x2e\x74\x65\x78\x74\x7c\x7c\x28\x6c\x3d\x7b\x74\x79\x70\x65\x3a\x33\x2c\x74\x65\x78\x74\x3a\x65\x7d\x29\x2c\x6c\x26\x26\x66\x2e\x70\x75\x73\x68\x28\x6c\x29\x7d\x7d\x2c\x63\x6f\x6d\x6d\x65\x6e\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x69\x66\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x7b\x74\x79\x70\x65\x3a\x33\x2c\x74\x65\x78\x74\x3a\x65\x2c\x69\x73\x43\x6f\x6d\x6d\x65" +"\x6e\x74\x3a\x21\x30\x7d\x3b\x72\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x70\x75\x73\x68\x28\x69\x29\x7d\x7d\x7d\x29\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3b\x28\x72\x3d\x46\x72\x28\x6e\x3d\x65\x2c\x22\x6b\x65\x79\x22\x29\x29\x26\x26\x28\x6e\x2e\x6b\x65\x79\x3d\x72\x29\x2c\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x65\x2e\x6b\x65\x79" +"\x26\x26\x21\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x26\x26\x21\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2e\x6c\x65\x6e\x67\x74\x68\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x46\x72\x28\x65\x2c\x22\x72\x65\x66\x22\x29\x3b\x74\x26\x26\x28\x65\x2e\x72\x65\x66\x3d\x74\x2c\x65\x2e\x72\x65\x66\x49\x6e\x46\x6f\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28" +"\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x3b\x66\x6f\x72\x28\x3b\x74\x3b\x29\x7b\x69\x66\x28\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x74\x2e\x66\x6f\x72\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x74\x3d\x74\x2e\x70\x61\x72\x65\x6e\x74\x7d\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x28\x65\x29\x29\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x22\x74\x65\x6d\x70\x6c" +"\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x3f\x28\x74\x3d\x50\x72\x28\x65\x2c\x22\x73\x63\x6f\x70\x65\x22\x29\x2c\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x74\x7c\x7c\x50\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x22\x29\x29\x3a\x28\x74\x3d\x50\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x2d\x73\x63\x6f\x70\x65\x22\x29\x29\x26\x26\x28\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70" +"\x65\x3d\x74\x29\x3b\x76\x61\x72\x20\x6e\x3d\x46\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x22\x29\x3b\x6e\x26\x26\x28\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x3d\x27\x22\x22\x27\x3d\x3d\x3d\x6e\x3f\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x3a\x6e\x2c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x3d\x21\x28\x21\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x3a" +"\x73\x6c\x6f\x74\x22\x5d\x26\x26\x21\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x76\x2d\x62\x69\x6e\x64\x3a\x73\x6c\x6f\x74\x22\x5d\x29\x2c\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x7c\x7c\x6a\x72\x28\x65\x2c\x22\x73\x6c\x6f\x74\x22\x2c\x6e\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74" +"\x75\x72\x6e\x20\x65\x2e\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x3a\x22\x2b\x74\x5d\x7c\x7c\x65\x2e\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x76\x2d\x62\x69\x6e\x64\x3a\x22\x2b\x74\x5d\x7c\x7c\x65\x2e\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x5b\x74\x5d\x7d\x28\x65\x2c\x22\x73\x6c\x6f\x74\x22\x29\x29\x29\x3b\x69\x66\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d" +"\x65\x2e\x74\x61\x67\x29\x7b\x76\x61\x72\x20\x72\x3d\x52\x72\x28\x65\x2c\x6f\x61\x29\x3b\x69\x66\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x68\x61\x28\x72\x29\x2c\x6f\x3d\x69\x2e\x6e\x61\x6d\x65\x2c\x61\x3d\x69\x2e\x64\x79\x6e\x61\x6d\x69\x63\x3b\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x3d\x6f\x2c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x3d\x61\x2c\x65\x2e" +"\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x72\x2e\x76\x61\x6c\x75\x65\x7c\x7c\x75\x61\x7d\x7d\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x73\x3d\x52\x72\x28\x65\x2c\x6f\x61\x29\x3b\x69\x66\x28\x73\x29\x7b\x76\x61\x72\x20\x63\x3d\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x7c\x7c\x28\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3d\x7b\x7d\x29\x2c\x75\x3d\x68\x61\x28\x73\x29\x2c\x6c\x3d\x75" +"\x2e\x6e\x61\x6d\x65\x2c\x66\x3d\x75\x2e\x64\x79\x6e\x61\x6d\x69\x63\x2c\x70\x3d\x63\x5b\x6c\x5d\x3d\x6c\x61\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x2c\x5b\x5d\x2c\x65\x29\x3b\x70\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x3d\x6c\x2c\x70\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x3d\x66\x2c\x70\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x65\x2e\x63\x68\x69\x6c\x64" +"\x72\x65\x6e\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x21\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x61\x72\x65\x6e\x74\x3d\x70\x2c\x21\x30\x7d\x29\x2c\x70\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x73\x2e\x76\x61\x6c\x75\x65\x7c\x7c\x75\x61\x2c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x3d\x5b\x5d\x2c" +"\x65\x2e\x70\x6c\x61\x69\x6e\x3d\x21\x31\x7d\x7d\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x22\x73\x6c\x6f\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x26\x26\x28\x65\x2e\x73\x6c\x6f\x74\x4e\x61\x6d\x65\x3d\x46\x72\x28\x65\x2c\x22\x6e\x61\x6d\x65\x22\x29\x29\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b\x28\x74\x3d\x46\x72\x28\x65" +"\x2c\x22\x69\x73\x22\x29\x29\x26\x26\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3d\x74\x29\x3b\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x69\x6e\x6c\x69\x6e\x65\x2d\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x29\x26\x26\x28\x65\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3d\x21\x30\x29\x7d\x28\x65\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x7a\x6f\x2e\x6c" +"\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x65\x3d\x7a\x6f\x5b\x69\x5d\x28\x65\x2c\x74\x29\x7c\x7c\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x2c\x6e\x2c\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x2c\x63\x2c\x75\x3d\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x3b\x66\x6f\x72\x28\x74\x3d\x30\x2c\x6e\x3d\x75\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x74\x3c" +"\x6e\x3b\x74\x2b\x2b\x29\x69\x66\x28\x72\x3d\x69\x3d\x75\x5b\x74\x5d\x2e\x6e\x61\x6d\x65\x2c\x6f\x3d\x75\x5b\x74\x5d\x2e\x76\x61\x6c\x75\x65\x2c\x58\x6f\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x69\x66\x28\x65\x2e\x68\x61\x73\x42\x69\x6e\x64\x69\x6e\x67\x73\x3d\x21\x30\x2c\x28\x61\x3d\x6d\x61\x28\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x58\x6f\x2c\x22\x22\x29\x29\x29\x26\x26\x28\x72\x3d\x72\x2e\x72\x65" +"\x70\x6c\x61\x63\x65\x28\x69\x61\x2c\x22\x22\x29\x29\x2c\x72\x61\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x72\x61\x2c\x22\x22\x29\x2c\x6f\x3d\x4f\x72\x28\x6f\x29\x2c\x28\x63\x3d\x74\x61\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x26\x26\x28\x72\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x29\x2c\x61\x26\x26\x28\x61\x2e\x70\x72\x6f\x70\x26\x26\x21\x63" +"\x26\x26\x22\x69\x6e\x6e\x65\x72\x48\x74\x6d\x6c\x22\x3d\x3d\x3d\x28\x72\x3d\x62\x28\x72\x29\x29\x26\x26\x28\x72\x3d\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x29\x2c\x61\x2e\x63\x61\x6d\x65\x6c\x26\x26\x21\x63\x26\x26\x28\x72\x3d\x62\x28\x72\x29\x29\x2c\x61\x2e\x73\x79\x6e\x63\x26\x26\x28\x73\x3d\x55\x72\x28\x6f\x2c\x22\x24\x65\x76\x65\x6e\x74\x22\x29\x2c\x63\x3f\x4d\x72\x28\x65\x2c\x27\x22\x75" +"\x70\x64\x61\x74\x65\x3a\x22\x2b\x28\x27\x2b\x72\x2b\x22\x29\x22\x2c\x73\x2c\x6e\x75\x6c\x6c\x2c\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x2c\x21\x30\x29\x3a\x28\x4d\x72\x28\x65\x2c\x22\x75\x70\x64\x61\x74\x65\x3a\x22\x2b\x62\x28\x72\x29\x2c\x73\x2c\x6e\x75\x6c\x6c\x2c\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x29\x2c\x43\x28\x72\x29\x21\x3d\x3d\x62\x28\x72\x29\x26\x26\x4d\x72\x28\x65\x2c\x22\x75\x70\x64\x61" +"\x74\x65\x3a\x22\x2b\x43\x28\x72\x29\x2c\x73\x2c\x6e\x75\x6c\x6c\x2c\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x29\x29\x29\x29\x2c\x61\x26\x26\x61\x2e\x70\x72\x6f\x70\x7c\x7c\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x26\x26\x57\x6f\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x2c\x72\x29\x3f\x45\x72\x28\x65\x2c\x72\x2c\x6f\x2c\x75\x5b\x74\x5d\x2c\x63\x29" +"\x3a\x6a\x72\x28\x65\x2c\x72\x2c\x6f\x2c\x75\x5b\x74\x5d\x2c\x63\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x47\x6f\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x47\x6f\x2c\x22\x22\x29\x2c\x28\x63\x3d\x74\x61\x2e\x74\x65\x73\x74\x28\x72\x29\x29\x26\x26\x28\x72\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x29\x2c\x4d\x72\x28\x65\x2c\x72\x2c\x6f\x2c\x61" +"\x2c\x21\x31\x2c\x30\x2c\x75\x5b\x74\x5d\x2c\x63\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x6c\x3d\x28\x72\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x58\x6f\x2c\x22\x22\x29\x29\x2e\x6d\x61\x74\x63\x68\x28\x6e\x61\x29\x2c\x66\x3d\x6c\x26\x26\x6c\x5b\x31\x5d\x3b\x63\x3d\x21\x31\x2c\x66\x26\x26\x28\x72\x3d\x72\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x28\x66\x2e\x6c\x65\x6e\x67\x74\x68\x2b\x31\x29" +"\x29\x2c\x74\x61\x2e\x74\x65\x73\x74\x28\x66\x29\x26\x26\x28\x66\x3d\x66\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x2c\x63\x3d\x21\x30\x29\x29\x2c\x4c\x72\x28\x65\x2c\x72\x2c\x69\x2c\x6f\x2c\x66\x2c\x63\x2c\x61\x2c\x75\x5b\x74\x5d\x29\x7d\x65\x6c\x73\x65\x20\x6a\x72\x28\x65\x2c\x72\x2c\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x29\x2c\x75\x5b\x74\x5d\x29\x2c\x21\x65\x2e" +"\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x26\x26\x22\x6d\x75\x74\x65\x64\x22\x3d\x3d\x3d\x72\x26\x26\x57\x6f\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x2c\x72\x29\x26\x26\x45\x72\x28\x65\x2c\x72\x2c\x22\x74\x72\x75\x65\x22\x2c\x75\x5b\x74\x5d\x29\x7d\x28\x65\x29\x2c\x65\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x64\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3b" +"\x69\x66\x28\x74\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x66\x6f\x72\x22\x29\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x59\x6f\x29\x3b\x69\x66\x28\x21\x74\x29\x72\x65\x74\x75\x72\x6e\x3b\x76\x61\x72\x20\x6e\x3d\x7b\x7d\x3b\x6e\x2e\x66\x6f\x72\x3d\x74\x5b\x32\x5d\x2e\x74\x72\x69\x6d\x28\x29\x3b\x76\x61\x72\x20" +"\x72\x3d\x74\x5b\x31\x5d\x2e\x74\x72\x69\x6d\x28\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x65\x61\x2c\x22\x22\x29\x2c\x69\x3d\x72\x2e\x6d\x61\x74\x63\x68\x28\x51\x6f\x29\x3b\x69\x3f\x28\x6e\x2e\x61\x6c\x69\x61\x73\x3d\x72\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x51\x6f\x2c\x22\x22\x29\x2e\x74\x72\x69\x6d\x28\x29\x2c\x6e\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x31\x3d\x69\x5b\x31\x5d\x2e\x74\x72\x69\x6d\x28" +"\x29\x2c\x69\x5b\x32\x5d\x26\x26\x28\x6e\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x32\x3d\x69\x5b\x32\x5d\x2e\x74\x72\x69\x6d\x28\x29\x29\x29\x3a\x6e\x2e\x61\x6c\x69\x61\x73\x3d\x72\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x28\x74\x29\x3b\x6e\x26\x26\x41\x28\x65\x2c\x6e\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x76\x61\x28\x65\x2c\x74\x29\x7b\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73" +"\x7c\x7c\x28\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x3d\x5b\x5d\x29\x2c\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x70\x75\x73\x68\x28\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x68\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6e\x61\x6d\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x6f\x61\x2c\x22\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x22\x23" +"\x22\x21\x3d\x3d\x65\x2e\x6e\x61\x6d\x65\x5b\x30\x5d\x26\x26\x28\x74\x3d\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x29\x2c\x74\x61\x2e\x74\x65\x73\x74\x28\x74\x29\x3f\x7b\x6e\x61\x6d\x65\x3a\x74\x2e\x73\x6c\x69\x63\x65\x28\x31\x2c\x2d\x31\x29\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x21\x30\x7d\x3a\x7b\x6e\x61\x6d\x65\x3a\x27\x22\x27\x2b\x74\x2b\x27\x22\x27\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x21\x31\x7d\x7d" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6d\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x65\x2e\x6d\x61\x74\x63\x68\x28\x69\x61\x29\x3b\x69\x66\x28\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x7b\x7d\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x66\x6f\x72\x45\x61\x63\x68\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x6e\x5b\x65\x2e\x73\x6c\x69\x63\x65\x28\x31\x29\x5d\x3d\x21\x30\x7d\x29\x2c\x6e\x7d\x7d\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x20\x79\x61\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d\x7b\x7d\x2c\x6e\x3d\x30\x2c\x72\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6e\x3c\x72\x3b\x6e\x2b\x2b\x29\x74\x5b\x65\x5b\x6e\x5d\x2e\x6e\x61\x6d\x65\x5d\x3d\x65\x5b\x6e\x5d\x2e\x76\x61\x6c\x75\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x7d\x76\x61\x72\x20\x67\x61\x3d\x2f\x5e\x78\x6d\x6c\x6e\x73\x3a\x4e\x53" +"\x5c\x64\x2b\x2f\x2c\x5f\x61\x3d\x2f\x5e\x4e\x53\x5c\x64\x2b\x3a\x2f\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x62\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6c\x61\x28\x65\x2e\x74\x61\x67\x2c\x65\x2e\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x65\x2e\x70\x61\x72\x65\x6e\x74\x29\x7d\x76\x61\x72\x20\x24\x61\x3d\x5b\x79\x6f\x2c\x5f\x6f\x2c\x7b\x70\x72\x65\x54\x72\x61" +"\x6e\x73\x66\x6f\x72\x6d\x4e\x6f\x64\x65\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x29\x7b\x76\x61\x72\x20\x6e\x2c\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x3b\x69\x66\x28\x21\x72\x5b\x22\x76\x2d\x6d\x6f\x64\x65\x6c\x22\x5d\x29\x72\x65\x74\x75\x72\x6e\x3b\x69\x66\x28\x28\x72\x5b\x22\x3a\x74\x79\x70\x65" +"\x22\x5d\x7c\x7c\x72\x5b\x22\x76\x2d\x62\x69\x6e\x64\x3a\x74\x79\x70\x65\x22\x5d\x29\x26\x26\x28\x6e\x3d\x46\x72\x28\x65\x2c\x22\x74\x79\x70\x65\x22\x29\x29\x2c\x72\x2e\x74\x79\x70\x65\x7c\x7c\x6e\x7c\x7c\x21\x72\x5b\x22\x76\x2d\x62\x69\x6e\x64\x22\x5d\x7c\x7c\x28\x6e\x3d\x22\x28\x22\x2b\x72\x5b\x22\x76\x2d\x62\x69\x6e\x64\x22\x5d\x2b\x22\x29\x2e\x74\x79\x70\x65\x22\x29\x2c\x6e\x29\x7b\x76\x61\x72" +"\x20\x69\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x69\x66\x22\x2c\x21\x30\x29\x2c\x6f\x3d\x69\x3f\x22\x26\x26\x28\x22\x2b\x69\x2b\x22\x29\x22\x3a\x22\x22\x2c\x61\x3d\x6e\x75\x6c\x6c\x21\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x22\x2c\x21\x30\x29\x2c\x73\x3d\x50\x72\x28\x65\x2c\x22\x76\x2d\x65\x6c\x73\x65\x2d\x69\x66\x22\x2c\x21\x30\x29\x2c\x63\x3d\x62\x61\x28\x65\x29\x3b\x64\x61\x28\x63\x29" +"\x2c\x44\x72\x28\x63\x2c\x22\x74\x79\x70\x65\x22\x2c\x22\x63\x68\x65\x63\x6b\x62\x6f\x78\x22\x29\x2c\x70\x61\x28\x63\x2c\x74\x29\x2c\x63\x2e\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x63\x2e\x69\x66\x3d\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x63\x68\x65\x63\x6b\x62\x6f\x78\x27\x22\x2b\x6f\x2c\x76\x61\x28\x63\x2c\x7b\x65\x78\x70\x3a\x63\x2e\x69\x66\x2c\x62\x6c\x6f\x63\x6b\x3a\x63" +"\x7d\x29\x3b\x76\x61\x72\x20\x75\x3d\x62\x61\x28\x65\x29\x3b\x50\x72\x28\x75\x2c\x22\x76\x2d\x66\x6f\x72\x22\x2c\x21\x30\x29\x2c\x44\x72\x28\x75\x2c\x22\x74\x79\x70\x65\x22\x2c\x22\x72\x61\x64\x69\x6f\x22\x29\x2c\x70\x61\x28\x75\x2c\x74\x29\x2c\x76\x61\x28\x63\x2c\x7b\x65\x78\x70\x3a\x22\x28\x22\x2b\x6e\x2b\x22\x29\x3d\x3d\x3d\x27\x72\x61\x64\x69\x6f\x27\x22\x2b\x6f\x2c\x62\x6c\x6f\x63\x6b\x3a\x75" +"\x7d\x29\x3b\x76\x61\x72\x20\x6c\x3d\x62\x61\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x50\x72\x28\x6c\x2c\x22\x76\x2d\x66\x6f\x72\x22\x2c\x21\x30\x29\x2c\x44\x72\x28\x6c\x2c\x22\x3a\x74\x79\x70\x65\x22\x2c\x6e\x29\x2c\x70\x61\x28\x6c\x2c\x74\x29\x2c\x76\x61\x28\x63\x2c\x7b\x65\x78\x70\x3a\x69\x2c\x62\x6c\x6f\x63\x6b\x3a\x6c\x7d\x29\x2c\x61\x3f\x63\x2e\x65\x6c\x73\x65\x3d\x21\x30\x3a\x73\x26\x26" +"\x28\x63\x2e\x65\x6c\x73\x65\x69\x66\x3d\x73\x29\x2c\x63\x7d\x7d\x7d\x7d\x5d\x3b\x76\x61\x72\x20\x77\x61\x2c\x43\x61\x2c\x78\x61\x3d\x7b\x65\x78\x70\x65\x63\x74\x48\x54\x4d\x4c\x3a\x21\x30\x2c\x6d\x6f\x64\x75\x6c\x65\x73\x3a\x24\x61\x2c\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3a\x7b\x6d\x6f\x64\x65\x6c\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74" +"\x2e\x76\x61\x6c\x75\x65\x2c\x69\x3d\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2c\x6f\x3d\x65\x2e\x74\x61\x67\x2c\x61\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x3b\x69\x66\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x72\x28\x65\x2c\x72\x2c\x69\x29\x2c\x21\x31\x3b\x69\x66\x28\x22\x73\x65\x6c\x65\x63\x74\x22\x3d\x3d\x3d\x6f\x29\x21\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x27\x76\x61\x72\x20\x24\x24\x73\x65\x6c\x65\x63\x74\x65\x64\x56\x61\x6c\x20\x3d\x20\x41\x72\x72\x61\x79\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x66\x69\x6c\x74\x65\x72\x2e\x63\x61\x6c\x6c\x28\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e" +"\x28\x6f\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x73\x65\x6c\x65\x63\x74\x65\x64\x7d\x29\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6f\x29\x7b\x76\x61\x72\x20\x76\x61\x6c\x20\x3d\x20\x22\x5f\x76\x61\x6c\x75\x65\x22\x20\x69\x6e\x20\x6f\x20\x3f\x20\x6f\x2e\x5f\x76\x61\x6c\x75\x65\x20\x3a\x20\x6f\x2e\x76\x61\x6c\x75\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x27\x2b\x28\x6e\x26\x26\x6e\x2e" +"\x6e\x75\x6d\x62\x65\x72\x3f\x22\x5f\x6e\x28\x76\x61\x6c\x29\x22\x3a\x22\x76\x61\x6c\x22\x29\x2b\x22\x7d\x29\x3b\x22\x3b\x72\x3d\x72\x2b\x22\x20\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x6d\x75\x6c\x74\x69\x70\x6c\x65\x20\x3f\x20\x24\x24\x73\x65\x6c\x65\x63\x74\x65\x64\x56\x61\x6c\x20\x3a\x20\x24\x24\x73\x65\x6c\x65\x63\x74\x65\x64\x56\x61\x6c\x5b\x30" +"\x5d\x22\x29\x2c\x4d\x72\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x72\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x6f\x26\x26\x22\x63\x68\x65\x63\x6b\x62\x6f\x78\x22\x3d\x3d\x3d\x61\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x26\x26\x6e" +"\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x69\x3d\x46\x72\x28\x65\x2c\x22\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x6e\x75\x6c\x6c\x22\x2c\x6f\x3d\x46\x72\x28\x65\x2c\x22\x74\x72\x75\x65\x2d\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x74\x72\x75\x65\x22\x2c\x61\x3d\x46\x72\x28\x65\x2c\x22\x66\x61\x6c\x73\x65\x2d\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x66\x61\x6c\x73\x65\x22\x3b\x45\x72\x28\x65\x2c\x22\x63\x68" +"\x65\x63\x6b\x65\x64\x22\x2c\x22\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x22\x2b\x74\x2b\x22\x29\x3f\x5f\x69\x28\x22\x2b\x74\x2b\x22\x2c\x22\x2b\x69\x2b\x22\x29\x3e\x2d\x31\x22\x2b\x28\x22\x74\x72\x75\x65\x22\x3d\x3d\x3d\x6f\x3f\x22\x3a\x28\x22\x2b\x74\x2b\x22\x29\x22\x3a\x22\x3a\x5f\x71\x28\x22\x2b\x74\x2b\x22\x2c\x22\x2b\x6f\x2b\x22\x29\x22\x29\x29\x2c\x4d\x72\x28\x65\x2c\x22\x63" +"\x68\x61\x6e\x67\x65\x22\x2c\x22\x76\x61\x72\x20\x24\x24\x61\x3d\x22\x2b\x74\x2b\x22\x2c\x24\x24\x65\x6c\x3d\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2c\x24\x24\x63\x3d\x24\x24\x65\x6c\x2e\x63\x68\x65\x63\x6b\x65\x64\x3f\x28\x22\x2b\x6f\x2b\x22\x29\x3a\x28\x22\x2b\x61\x2b\x22\x29\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x24\x24\x61\x29\x29\x7b\x76\x61\x72" +"\x20\x24\x24\x76\x3d\x22\x2b\x28\x72\x3f\x22\x5f\x6e\x28\x22\x2b\x69\x2b\x22\x29\x22\x3a\x69\x29\x2b\x22\x2c\x24\x24\x69\x3d\x5f\x69\x28\x24\x24\x61\x2c\x24\x24\x76\x29\x3b\x69\x66\x28\x24\x24\x65\x6c\x2e\x63\x68\x65\x63\x6b\x65\x64\x29\x7b\x24\x24\x69\x3c\x30\x26\x26\x28\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x24\x61\x2e\x63\x6f\x6e\x63\x61\x74\x28\x5b\x24\x24\x76\x5d\x29\x22\x29\x2b\x22\x29\x7d\x65" +"\x6c\x73\x65\x7b\x24\x24\x69\x3e\x2d\x31\x26\x26\x28\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x24\x61\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x24\x24\x69\x29\x2e\x63\x6f\x6e\x63\x61\x74\x28\x24\x24\x61\x2e\x73\x6c\x69\x63\x65\x28\x24\x24\x69\x2b\x31\x29\x29\x22\x29\x2b\x22\x29\x7d\x7d\x65\x6c\x73\x65\x7b\x22\x2b\x55\x72\x28\x74\x2c\x22\x24\x24\x63\x22\x29\x2b\x22\x7d\x22\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29" +"\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x6f\x26\x26\x22\x72\x61\x64\x69\x6f\x22\x3d\x3d\x3d\x61\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x26\x26\x6e\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x69\x3d\x46\x72\x28\x65\x2c\x22\x76\x61\x6c\x75\x65\x22\x29\x7c\x7c\x22\x6e\x75\x6c\x6c\x22" +"\x3b\x45\x72\x28\x65\x2c\x22\x63\x68\x65\x63\x6b\x65\x64\x22\x2c\x22\x5f\x71\x28\x22\x2b\x74\x2b\x22\x2c\x22\x2b\x28\x69\x3d\x72\x3f\x22\x5f\x6e\x28\x22\x2b\x69\x2b\x22\x29\x22\x3a\x69\x29\x2b\x22\x29\x22\x29\x2c\x4d\x72\x28\x65\x2c\x22\x63\x68\x61\x6e\x67\x65\x22\x2c\x55\x72\x28\x74\x2c\x69\x29\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28" +"\x22\x69\x6e\x70\x75\x74\x22\x3d\x3d\x3d\x6f\x7c\x7c\x22\x74\x65\x78\x74\x61\x72\x65\x61\x22\x3d\x3d\x3d\x6f\x29\x21\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x2e\x74\x79\x70\x65\x2c\x69\x3d\x6e\x7c\x7c\x7b\x7d\x2c\x6f\x3d\x69\x2e\x6c\x61\x7a\x79\x2c\x61\x3d\x69\x2e\x6e\x75\x6d\x62\x65\x72\x2c\x73\x3d\x69\x2e\x74" +"\x72\x69\x6d\x2c\x63\x3d\x21\x6f\x26\x26\x22\x72\x61\x6e\x67\x65\x22\x21\x3d\x3d\x72\x2c\x75\x3d\x6f\x3f\x22\x63\x68\x61\x6e\x67\x65\x22\x3a\x22\x72\x61\x6e\x67\x65\x22\x3d\x3d\x3d\x72\x3f\x5a\x72\x3a\x22\x69\x6e\x70\x75\x74\x22\x2c\x6c\x3d\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x76\x61\x6c\x75\x65\x22\x3b\x73\x26\x26\x28\x6c\x3d\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67" +"\x65\x74\x2e\x76\x61\x6c\x75\x65\x2e\x74\x72\x69\x6d\x28\x29\x22\x29\x2c\x61\x26\x26\x28\x6c\x3d\x22\x5f\x6e\x28\x22\x2b\x6c\x2b\x22\x29\x22\x29\x3b\x76\x61\x72\x20\x66\x3d\x55\x72\x28\x74\x2c\x6c\x29\x3b\x63\x26\x26\x28\x66\x3d\x22\x69\x66\x28\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x2e\x63\x6f\x6d\x70\x6f\x73\x69\x6e\x67\x29\x72\x65\x74\x75\x72\x6e\x3b\x22\x2b\x66\x29\x2c\x45\x72\x28" +"\x65\x2c\x22\x76\x61\x6c\x75\x65\x22\x2c\x22\x28\x22\x2b\x74\x2b\x22\x29\x22\x29\x2c\x4d\x72\x28\x65\x2c\x75\x2c\x66\x2c\x6e\x75\x6c\x6c\x2c\x21\x30\x29\x2c\x28\x73\x7c\x7c\x61\x29\x26\x26\x4d\x72\x28\x65\x2c\x22\x62\x6c\x75\x72\x22\x2c\x22\x24\x66\x6f\x72\x63\x65\x55\x70\x64\x61\x74\x65\x28\x29\x22\x29\x7d\x28\x65\x2c\x72\x2c\x69\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x21\x46\x2e\x69\x73\x52\x65" +"\x73\x65\x72\x76\x65\x64\x54\x61\x67\x28\x6f\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x72\x28\x65\x2c\x72\x2c\x69\x29\x2c\x21\x31\x3b\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x2c\x74\x65\x78\x74\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x76\x61\x6c\x75\x65\x26\x26\x45\x72\x28\x65\x2c\x22\x74\x65\x78\x74\x43\x6f\x6e\x74\x65\x6e\x74\x22\x2c\x22\x5f\x73\x28\x22\x2b\x74\x2e\x76\x61" +"\x6c\x75\x65\x2b\x22\x29\x22\x2c\x74\x29\x7d\x2c\x68\x74\x6d\x6c\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x74\x2e\x76\x61\x6c\x75\x65\x26\x26\x45\x72\x28\x65\x2c\x22\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x22\x2c\x22\x5f\x73\x28\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x22\x2c\x74\x29\x7d\x7d\x2c\x69\x73\x50\x72\x65\x54\x61\x67\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29" +"\x7b\x72\x65\x74\x75\x72\x6e\x22\x70\x72\x65\x22\x3d\x3d\x3d\x65\x7d\x2c\x69\x73\x55\x6e\x61\x72\x79\x54\x61\x67\x3a\x24\x6f\x2c\x6d\x75\x73\x74\x55\x73\x65\x50\x72\x6f\x70\x3a\x44\x6e\x2c\x63\x61\x6e\x42\x65\x4c\x65\x66\x74\x4f\x70\x65\x6e\x54\x61\x67\x3a\x77\x6f\x2c\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x3a\x5a\x6e\x2c\x67\x65\x74\x54\x61\x67\x4e\x61\x6d\x65\x73\x70\x61\x63\x65\x3a" +"\x47\x6e\x2c\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72\x65\x64\x75\x63\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x63\x6f\x6e\x63\x61\x74\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x7c\x7c\x5b\x5d\x29\x7d\x2c\x5b\x5d\x29\x2e\x6a\x6f\x69\x6e\x28" +"\x22\x2c\x22\x29\x7d\x28\x24\x61\x29\x7d\x2c\x6b\x61\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x70\x28\x22\x74\x79\x70\x65\x2c\x74\x61\x67\x2c\x61\x74\x74\x72\x73\x4c\x69\x73\x74\x2c\x61\x74\x74\x72\x73\x4d\x61\x70\x2c\x70\x6c\x61\x69\x6e\x2c\x70\x61\x72\x65\x6e\x74\x2c\x63\x68\x69\x6c\x64\x72\x65\x6e\x2c\x61\x74\x74\x72\x73\x2c\x73\x74\x61\x72\x74\x2c" +"\x65\x6e\x64\x2c\x72\x61\x77\x41\x74\x74\x72\x73\x4d\x61\x70\x22\x2b\x28\x65\x3f\x22\x2c\x22\x2b\x65\x3a\x22\x22\x29\x29\x7d\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x41\x61\x28\x65\x2c\x74\x29\x7b\x65\x26\x26\x28\x77\x61\x3d\x6b\x61\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x4b\x65\x79\x73\x7c\x7c\x22\x22\x29\x2c\x43\x61\x3d\x74\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x7c\x7c\x54\x2c" +"\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x29\x7b\x74\x2e\x73\x74\x61\x74\x69\x63\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x32\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x33\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x3b\x72\x65\x74\x75\x72\x6e\x21\x28\x21\x65\x2e\x70\x72\x65\x26\x26\x28\x65\x2e" +"\x68\x61\x73\x42\x69\x6e\x64\x69\x6e\x67\x73\x7c\x7c\x65\x2e\x69\x66\x7c\x7c\x65\x2e\x66\x6f\x72\x7c\x7c\x64\x28\x65\x2e\x74\x61\x67\x29\x7c\x7c\x21\x43\x61\x28\x65\x2e\x74\x61\x67\x29\x7c\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x6f\x72\x28\x3b\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x29\x7b\x69\x66\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x21\x3d\x3d\x28\x65\x3d\x65\x2e\x70\x61\x72" +"\x65\x6e\x74\x29\x2e\x74\x61\x67\x29\x72\x65\x74\x75\x72\x6e\x21\x31\x3b\x69\x66\x28\x65\x2e\x66\x6f\x72\x29\x72\x65\x74\x75\x72\x6e\x21\x30\x7d\x72\x65\x74\x75\x72\x6e\x21\x31\x7d\x28\x65\x29\x7c\x7c\x21\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x65\x29\x2e\x65\x76\x65\x72\x79\x28\x77\x61\x29\x29\x29\x7d\x28\x74\x29\x3b\x69\x66\x28\x31\x3d\x3d\x3d\x74\x2e\x74\x79\x70\x65\x29\x7b\x69\x66\x28" +"\x21\x43\x61\x28\x74\x2e\x74\x61\x67\x29\x26\x26\x22\x73\x6c\x6f\x74\x22\x21\x3d\x3d\x74\x2e\x74\x61\x67\x26\x26\x6e\x75\x6c\x6c\x3d\x3d\x74\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x69\x6e\x6c\x69\x6e\x65\x2d\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x5d\x29\x72\x65\x74\x75\x72\x6e\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x2c\x72\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67" +"\x74\x68\x3b\x6e\x3c\x72\x3b\x6e\x2b\x2b\x29\x7b\x76\x61\x72\x20\x69\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x6e\x5d\x3b\x65\x28\x69\x29\x2c\x69\x2e\x73\x74\x61\x74\x69\x63\x7c\x7c\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x3d\x21\x31\x29\x7d\x69\x66\x28\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x31\x2c\x61\x3d\x74\x2e\x69\x66\x43\x6f\x6e" +"\x64\x69\x74\x69\x6f\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x3c\x61\x3b\x6f\x2b\x2b\x29\x7b\x76\x61\x72\x20\x73\x3d\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x5b\x6f\x5d\x2e\x62\x6c\x6f\x63\x6b\x3b\x65\x28\x73\x29\x2c\x73\x2e\x73\x74\x61\x74\x69\x63\x7c\x7c\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x3d\x21\x31\x29\x7d\x7d\x7d\x28\x65\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28" +"\x74\x2c\x6e\x29\x7b\x69\x66\x28\x31\x3d\x3d\x3d\x74\x2e\x74\x79\x70\x65\x29\x7b\x69\x66\x28\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x7c\x7c\x74\x2e\x6f\x6e\x63\x65\x29\x26\x26\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x49\x6e\x46\x6f\x72\x3d\x6e\x29\x2c\x74\x2e\x73\x74\x61\x74\x69\x63\x26\x26\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x31\x21\x3d\x3d\x74\x2e\x63\x68\x69" +"\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x7c\x7c\x33\x21\x3d\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x30\x5d\x2e\x74\x79\x70\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x6f\x6f\x74\x3d\x21\x30\x29\x3b\x69\x66\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x6f\x6f\x74\x3d\x21\x31\x2c\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x29\x66\x6f\x72" +"\x28\x76\x61\x72\x20\x72\x3d\x30\x2c\x69\x3d\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x65\x28\x74\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x72\x5d\x2c\x6e\x7c\x7c\x21\x21\x74\x2e\x66\x6f\x72\x29\x3b\x69\x66\x28\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x31\x2c\x61\x3d\x74\x2e\x69" +"\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x3c\x61\x3b\x6f\x2b\x2b\x29\x65\x28\x74\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x5b\x6f\x5d\x2e\x62\x6c\x6f\x63\x6b\x2c\x6e\x29\x7d\x7d\x28\x65\x2c\x21\x31\x29\x29\x7d\x76\x61\x72\x20\x4f\x61\x3d\x2f\x5e\x28\x5b\x5c\x77\x24\x5f\x5d\x2b\x7c\x5c\x28\x5b\x5e\x29\x5d\x2a\x3f\x5c\x29\x29\x5c\x73\x2a\x3d\x3e\x7c" +"\x5e\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x3f\x3a\x5c\x73\x2b\x5b\x5c\x77\x24\x5d\x2b\x29\x3f\x5c\x73\x2a\x5c\x28\x2f\x2c\x53\x61\x3d\x2f\x5c\x28\x5b\x5e\x29\x5d\x2a\x3f\x5c\x29\x3b\x2a\x24\x2f\x2c\x54\x61\x3d\x2f\x5e\x5b\x41\x2d\x5a\x61\x2d\x7a\x5f\x24\x5d\x5b\x5c\x77\x24\x5d\x2a\x28\x3f\x3a\x5c\x2e\x5b\x41\x2d\x5a\x61\x2d\x7a\x5f\x24\x5d\x5b\x5c\x77\x24\x5d\x2a\x7c\x5c\x5b\x27\x5b\x5e\x27\x5d\x2a" +"\x3f\x27\x5d\x7c\x5c\x5b\x22\x5b\x5e\x22\x5d\x2a\x3f\x22\x5d\x7c\x5c\x5b\x5c\x64\x2b\x5d\x7c\x5c\x5b\x5b\x41\x2d\x5a\x61\x2d\x7a\x5f\x24\x5d\x5b\x5c\x77\x24\x5d\x2a\x5d\x29\x2a\x24\x2f\x2c\x4e\x61\x3d\x7b\x65\x73\x63\x3a\x32\x37\x2c\x74\x61\x62\x3a\x39\x2c\x65\x6e\x74\x65\x72\x3a\x31\x33\x2c\x73\x70\x61\x63\x65\x3a\x33\x32\x2c\x75\x70\x3a\x33\x38\x2c\x6c\x65\x66\x74\x3a\x33\x37\x2c\x72\x69\x67\x68" +"\x74\x3a\x33\x39\x2c\x64\x6f\x77\x6e\x3a\x34\x30\x2c\x64\x65\x6c\x65\x74\x65\x3a\x5b\x38\x2c\x34\x36\x5d\x7d\x2c\x45\x61\x3d\x7b\x65\x73\x63\x3a\x5b\x22\x45\x73\x63\x22\x2c\x22\x45\x73\x63\x61\x70\x65\x22\x5d\x2c\x74\x61\x62\x3a\x22\x54\x61\x62\x22\x2c\x65\x6e\x74\x65\x72\x3a\x22\x45\x6e\x74\x65\x72\x22\x2c\x73\x70\x61\x63\x65\x3a\x5b\x22\x20\x22\x2c\x22\x53\x70\x61\x63\x65\x62\x61\x72\x22\x5d\x2c" +"\x75\x70\x3a\x5b\x22\x55\x70\x22\x2c\x22\x41\x72\x72\x6f\x77\x55\x70\x22\x5d\x2c\x6c\x65\x66\x74\x3a\x5b\x22\x4c\x65\x66\x74\x22\x2c\x22\x41\x72\x72\x6f\x77\x4c\x65\x66\x74\x22\x5d\x2c\x72\x69\x67\x68\x74\x3a\x5b\x22\x52\x69\x67\x68\x74\x22\x2c\x22\x41\x72\x72\x6f\x77\x52\x69\x67\x68\x74\x22\x5d\x2c\x64\x6f\x77\x6e\x3a\x5b\x22\x44\x6f\x77\x6e\x22\x2c\x22\x41\x72\x72\x6f\x77\x44\x6f\x77\x6e\x22\x5d" +"\x2c\x64\x65\x6c\x65\x74\x65\x3a\x5b\x22\x42\x61\x63\x6b\x73\x70\x61\x63\x65\x22\x2c\x22\x44\x65\x6c\x65\x74\x65\x22\x2c\x22\x44\x65\x6c\x22\x5d\x7d\x2c\x6a\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x69\x66\x28\x22\x2b\x65\x2b\x22\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3b\x22\x7d\x2c\x44\x61\x3d\x7b\x73\x74\x6f\x70\x3a\x22\x24\x65\x76\x65\x6e\x74" +"\x2e\x73\x74\x6f\x70\x50\x72\x6f\x70\x61\x67\x61\x74\x69\x6f\x6e\x28\x29\x3b\x22\x2c\x70\x72\x65\x76\x65\x6e\x74\x3a\x22\x24\x65\x76\x65\x6e\x74\x2e\x70\x72\x65\x76\x65\x6e\x74\x44\x65\x66\x61\x75\x6c\x74\x28\x29\x3b\x22\x2c\x73\x65\x6c\x66\x3a\x6a\x61\x28\x22\x24\x65\x76\x65\x6e\x74\x2e\x74\x61\x72\x67\x65\x74\x20\x21\x3d\x3d\x20\x24\x65\x76\x65\x6e\x74\x2e\x63\x75\x72\x72\x65\x6e\x74\x54\x61\x72" +"\x67\x65\x74\x22\x29\x2c\x63\x74\x72\x6c\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x63\x74\x72\x6c\x4b\x65\x79\x22\x29\x2c\x73\x68\x69\x66\x74\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x73\x68\x69\x66\x74\x4b\x65\x79\x22\x29\x2c\x61\x6c\x74\x3a\x6a\x61\x28\x22\x21\x24\x65\x76\x65\x6e\x74\x2e\x61\x6c\x74\x4b\x65\x79\x22\x29\x2c\x6d\x65\x74\x61\x3a\x6a\x61\x28\x22\x21\x24\x65\x76" +"\x65\x6e\x74\x2e\x6d\x65\x74\x61\x4b\x65\x79\x22\x29\x2c\x6c\x65\x66\x74\x3a\x6a\x61\x28\x22\x27\x62\x75\x74\x74\x6f\x6e\x27\x20\x69\x6e\x20\x24\x65\x76\x65\x6e\x74\x20\x26\x26\x20\x24\x65\x76\x65\x6e\x74\x2e\x62\x75\x74\x74\x6f\x6e\x20\x21\x3d\x3d\x20\x30\x22\x29\x2c\x6d\x69\x64\x64\x6c\x65\x3a\x6a\x61\x28\x22\x27\x62\x75\x74\x74\x6f\x6e\x27\x20\x69\x6e\x20\x24\x65\x76\x65\x6e\x74\x20\x26\x26\x20" +"\x24\x65\x76\x65\x6e\x74\x2e\x62\x75\x74\x74\x6f\x6e\x20\x21\x3d\x3d\x20\x31\x22\x29\x2c\x72\x69\x67\x68\x74\x3a\x6a\x61\x28\x22\x27\x62\x75\x74\x74\x6f\x6e\x27\x20\x69\x6e\x20\x24\x65\x76\x65\x6e\x74\x20\x26\x26\x20\x24\x65\x76\x65\x6e\x74\x2e\x62\x75\x74\x74\x6f\x6e\x20\x21\x3d\x3d\x20\x32\x22\x29\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4c\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d" +"\x74\x3f\x22\x6e\x61\x74\x69\x76\x65\x4f\x6e\x3a\x22\x3a\x22\x6f\x6e\x3a\x22\x2c\x72\x3d\x22\x22\x2c\x69\x3d\x22\x22\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x20\x69\x6e\x20\x65\x29\x7b\x76\x61\x72\x20\x61\x3d\x49\x61\x28\x65\x5b\x6f\x5d\x29\x3b\x65\x5b\x6f\x5d\x26\x26\x65\x5b\x6f\x5d\x2e\x64\x79\x6e\x61\x6d\x69\x63\x3f\x69\x2b\x3d\x6f\x2b\x22\x2c\x22\x2b\x61\x2b\x22\x2c\x22\x3a\x72\x2b\x3d\x27\x22" +"\x27\x2b\x6f\x2b\x27\x22\x3a\x27\x2b\x61\x2b\x22\x2c\x22\x7d\x72\x65\x74\x75\x72\x6e\x20\x72\x3d\x22\x7b\x22\x2b\x72\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x7d\x22\x2c\x69\x3f\x6e\x2b\x22\x5f\x64\x28\x22\x2b\x72\x2b\x22\x2c\x5b\x22\x2b\x69\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x5d\x29\x22\x3a\x6e\x2b\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x49\x61\x28\x65\x29" +"\x7b\x69\x66\x28\x21\x65\x29\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x7d\x22\x3b\x69\x66\x28\x41\x72\x72\x61\x79\x2e\x69\x73\x41\x72\x72\x61\x79\x28\x65\x29\x29\x72\x65\x74\x75\x72\x6e\x22\x5b\x22\x2b\x65\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x49\x61\x28\x65\x29\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29" +"\x2b\x22\x5d\x22\x3b\x76\x61\x72\x20\x74\x3d\x54\x61\x2e\x74\x65\x73\x74\x28\x65\x2e\x76\x61\x6c\x75\x65\x29\x2c\x6e\x3d\x4f\x61\x2e\x74\x65\x73\x74\x28\x65\x2e\x76\x61\x6c\x75\x65\x29\x2c\x72\x3d\x54\x61\x2e\x74\x65\x73\x74\x28\x65\x2e\x76\x61\x6c\x75\x65\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x53\x61\x2c\x22\x22\x29\x29\x3b\x69\x66\x28\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x29\x7b\x76\x61\x72" +"\x20\x69\x3d\x22\x22\x2c\x6f\x3d\x22\x22\x2c\x61\x3d\x5b\x5d\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x73\x20\x69\x6e\x20\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x29\x69\x66\x28\x44\x61\x5b\x73\x5d\x29\x6f\x2b\x3d\x44\x61\x5b\x73\x5d\x2c\x4e\x61\x5b\x73\x5d\x26\x26\x61\x2e\x70\x75\x73\x68\x28\x73\x29\x3b\x65\x6c\x73\x65\x20\x69\x66\x28\x22\x65\x78\x61\x63\x74\x22\x3d\x3d\x3d\x73\x29\x7b\x76\x61\x72" +"\x20\x63\x3d\x65\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3b\x6f\x2b\x3d\x6a\x61\x28\x5b\x22\x63\x74\x72\x6c\x22\x2c\x22\x73\x68\x69\x66\x74\x22\x2c\x22\x61\x6c\x74\x22\x2c\x22\x6d\x65\x74\x61\x22\x5d\x2e\x66\x69\x6c\x74\x65\x72\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x63\x5b\x65\x5d\x7d\x29\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b" +"\x72\x65\x74\x75\x72\x6e\x22\x24\x65\x76\x65\x6e\x74\x2e\x22\x2b\x65\x2b\x22\x4b\x65\x79\x22\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x7c\x7c\x22\x29\x29\x7d\x65\x6c\x73\x65\x20\x61\x2e\x70\x75\x73\x68\x28\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x61\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x28\x69\x2b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x69\x66\x28\x21\x24\x65\x76" +"\x65\x6e\x74\x2e\x74\x79\x70\x65\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x27\x6b\x65\x79\x27\x29\x26\x26\x22\x2b\x65\x2e\x6d\x61\x70\x28\x4d\x61\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x26\x26\x22\x29\x2b\x22\x29\x72\x65\x74\x75\x72\x6e\x20\x6e\x75\x6c\x6c\x3b\x22\x7d\x28\x61\x29\x29\x2c\x6f\x26\x26\x28\x69\x2b\x3d\x6f\x29\x2c\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x24\x65\x76\x65\x6e\x74\x29\x7b\x22\x2b\x69" +"\x2b\x28\x74\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x2b\x22\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x20\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x22\x3a\x6e\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x28\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x2e\x61\x70\x70\x6c\x79\x28\x6e\x75\x6c\x6c\x2c\x20\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x29\x22\x3a\x72\x3f\x22\x72" +"\x65\x74\x75\x72\x6e\x20\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x29\x2b\x22\x7d\x22\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x7c\x7c\x6e\x3f\x65\x2e\x76\x61\x6c\x75\x65\x3a\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x24\x65\x76\x65\x6e\x74\x29\x7b\x22\x2b\x28\x72\x3f\x22\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x65\x2e\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x29\x2b\x22" +"\x7d\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4d\x61\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x70\x61\x72\x73\x65\x49\x6e\x74\x28\x65\x2c\x31\x30\x29\x3b\x69\x66\x28\x74\x29\x72\x65\x74\x75\x72\x6e\x22\x24\x65\x76\x65\x6e\x74\x2e\x6b\x65\x79\x43\x6f\x64\x65\x21\x3d\x3d\x22\x2b\x74\x3b\x76\x61\x72\x20\x6e\x3d\x4e\x61\x5b\x65\x5d\x2c\x72\x3d\x45\x61\x5b\x65\x5d\x3b\x72\x65\x74\x75\x72\x6e\x22\x5f" +"\x6b\x28\x24\x65\x76\x65\x6e\x74\x2e\x6b\x65\x79\x43\x6f\x64\x65\x2c\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x65\x29\x2b\x22\x2c\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6e\x29\x2b\x22\x2c\x24\x65\x76\x65\x6e\x74\x2e\x6b\x65\x79\x2c\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x72\x29\x2b\x22\x29\x22\x7d\x76\x61\x72\x20" +"\x46\x61\x3d\x7b\x6f\x6e\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x65\x2e\x77\x72\x61\x70\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5f\x67\x28\x22\x2b\x65\x2b\x22\x2c\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x22\x7d\x7d\x2c\x62\x69\x6e\x64\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b" +"\x65\x2e\x77\x72\x61\x70\x44\x61\x74\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x5f\x62\x28\x22\x2b\x6e\x2b\x22\x2c\x27\x22\x2b\x65\x2e\x74\x61\x67\x2b\x22\x27\x2c\x22\x2b\x74\x2e\x76\x61\x6c\x75\x65\x2b\x22\x2c\x22\x2b\x28\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x26\x26\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2e\x70\x72\x6f\x70\x3f\x22\x74\x72\x75" +"\x65\x22\x3a\x22\x66\x61\x6c\x73\x65\x22\x29\x2b\x28\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x26\x26\x74\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x2e\x73\x79\x6e\x63\x3f\x22\x2c\x74\x72\x75\x65\x22\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x7d\x2c\x63\x6c\x6f\x61\x6b\x3a\x53\x7d\x2c\x50\x61\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x74\x68\x69\x73\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x3d\x65\x2c" +"\x74\x68\x69\x73\x2e\x77\x61\x72\x6e\x3d\x65\x2e\x77\x61\x72\x6e\x7c\x7c\x54\x72\x2c\x74\x68\x69\x73\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x73\x3d\x4e\x72\x28\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x43\x6f\x64\x65\x22\x29\x2c\x74\x68\x69\x73\x2e\x64\x61\x74\x61\x47\x65\x6e\x46\x6e\x73\x3d\x4e\x72\x28\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x2c\x22\x67\x65\x6e" +"\x44\x61\x74\x61\x22\x29\x2c\x74\x68\x69\x73\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3d\x41\x28\x41\x28\x7b\x7d\x2c\x46\x61\x29\x2c\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x29\x3b\x76\x61\x72\x20\x74\x3d\x65\x2e\x69\x73\x52\x65\x73\x65\x72\x76\x65\x64\x54\x61\x67\x7c\x7c\x54\x3b\x74\x68\x69\x73\x2e\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f" +"\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x21\x21\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x7c\x7c\x21\x74\x28\x65\x2e\x74\x61\x67\x29\x7d\x2c\x74\x68\x69\x73\x2e\x6f\x6e\x63\x65\x49\x64\x3d\x30\x2c\x74\x68\x69\x73\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x5b\x5d\x2c\x74\x68\x69\x73\x2e\x70\x72\x65\x3d\x21\x31\x7d\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x52\x61\x28" +"\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x6e\x65\x77\x20\x50\x61\x28\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x72\x65\x6e\x64\x65\x72\x3a\x22\x77\x69\x74\x68\x28\x74\x68\x69\x73\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x28\x65\x3f\x22\x73\x63\x72\x69\x70\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x3f\x22\x6e\x75\x6c\x6c\x22\x3a\x48\x61\x28\x65\x2c\x6e\x29\x3a\x27\x5f\x63\x28\x22\x64\x69\x76\x22" +"\x29\x27\x29\x2b\x22\x7d\x22\x2c\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3a\x6e\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x48\x61\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x70\x61\x72\x65\x6e\x74\x26\x26\x28\x65\x2e\x70\x72\x65\x3d\x65\x2e\x70\x72\x65\x7c\x7c\x65\x2e\x70\x61\x72\x65\x6e\x74\x2e\x70\x72\x65\x29" +"\x2c\x65\x2e\x73\x74\x61\x74\x69\x63\x52\x6f\x6f\x74\x26\x26\x21\x65\x2e\x73\x74\x61\x74\x69\x63\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x42\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x6f\x6e\x63\x65\x26\x26\x21\x65\x2e\x6f\x6e\x63\x65\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x55\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x66\x6f\x72" +"\x26\x26\x21\x65\x2e\x66\x6f\x72\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x7a\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x69\x66\x26\x26\x21\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x56\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x21\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x65\x2e\x73\x6c\x6f" +"\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x74\x2e\x70\x72\x65\x29\x7b\x69\x66\x28\x22\x73\x6c\x6f\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x29\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x73\x6c\x6f\x74\x4e\x61\x6d\x65\x7c\x7c\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x2c\x72\x3d\x57\x61\x28\x65\x2c\x74\x29\x2c\x69\x3d\x22\x5f\x74" +"\x28\x22\x2b\x6e\x2b\x28\x72\x3f\x22\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x72\x2b\x22\x7d\x22\x3a\x22\x22\x29\x2c\x6f\x3d\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x3f\x58\x61\x28\x28\x65\x2e\x61\x74\x74\x72\x73\x7c\x7c\x5b\x5d\x29\x2e\x63\x6f\x6e\x63\x61\x74\x28\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41" +"\x74\x74\x72\x73\x7c\x7c\x5b\x5d\x29\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x7b\x6e\x61\x6d\x65\x3a\x62\x28\x65\x2e\x6e\x61\x6d\x65\x29\x2c\x76\x61\x6c\x75\x65\x3a\x65\x2e\x76\x61\x6c\x75\x65\x2c\x64\x79\x6e\x61\x6d\x69\x63\x3a\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x7d\x7d\x29\x29\x3a\x6e\x75\x6c\x6c\x2c\x61\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61" +"\x70\x5b\x22\x76\x2d\x62\x69\x6e\x64\x22\x5d\x3b\x21\x6f\x26\x26\x21\x61\x7c\x7c\x72\x7c\x7c\x28\x69\x2b\x3d\x22\x2c\x6e\x75\x6c\x6c\x22\x29\x3b\x6f\x26\x26\x28\x69\x2b\x3d\x22\x2c\x22\x2b\x6f\x29\x3b\x61\x26\x26\x28\x69\x2b\x3d\x28\x6f\x3f\x22\x22\x3a\x22\x2c\x6e\x75\x6c\x6c\x22\x29\x2b\x22\x2c\x22\x2b\x61\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x69\x2b\x22\x29\x22\x7d\x28\x65\x2c\x74\x29\x3b\x76\x61" +"\x72\x20\x6e\x3b\x69\x66\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x74\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3f\x6e\x75\x6c\x6c\x3a\x57\x61\x28\x74\x2c\x6e\x2c\x21\x30\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x5f\x63\x28\x22\x2b\x65\x2b\x22\x2c\x22\x2b\x4b\x61\x28\x74\x2c\x6e" +"\x29\x2b\x28\x72\x3f\x22\x2c\x22\x2b\x72\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x28\x65\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x2c\x65\x2c\x74\x29\x3b\x65\x6c\x73\x65\x7b\x76\x61\x72\x20\x72\x3b\x28\x21\x65\x2e\x70\x6c\x61\x69\x6e\x7c\x7c\x65\x2e\x70\x72\x65\x26\x26\x74\x2e\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x28\x65\x29\x29\x26\x26\x28\x72\x3d\x4b\x61\x28\x65\x2c\x74\x29\x29\x3b" +"\x76\x61\x72\x20\x69\x3d\x65\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3f\x6e\x75\x6c\x6c\x3a\x57\x61\x28\x65\x2c\x74\x2c\x21\x30\x29\x3b\x6e\x3d\x22\x5f\x63\x28\x27\x22\x2b\x65\x2e\x74\x61\x67\x2b\x22\x27\x22\x2b\x28\x72\x3f\x22\x2c\x22\x2b\x72\x3a\x22\x22\x29\x2b\x28\x69\x3f\x22\x2c\x22\x2b\x69\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x30\x3b" +"\x6f\x3c\x74\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x6f\x2b\x2b\x29\x6e\x3d\x74\x2e\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x73\x5b\x6f\x5d\x28\x65\x2c\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x72\x65\x74\x75\x72\x6e\x20\x57\x61\x28\x65\x2c\x74\x29\x7c\x7c\x22\x76\x6f\x69\x64\x20\x30\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x42\x61\x28\x65\x2c\x74\x29\x7b" +"\x65\x2e\x73\x74\x61\x74\x69\x63\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x3b\x76\x61\x72\x20\x6e\x3d\x74\x2e\x70\x72\x65\x3b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x70\x72\x65\x26\x26\x28\x74\x2e\x70\x72\x65\x3d\x65\x2e\x70\x72\x65\x29\x2c\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x70\x75\x73\x68\x28\x22\x77\x69\x74\x68\x28\x74\x68\x69\x73\x29\x7b\x72\x65\x74\x75" +"\x72\x6e\x20\x22\x2b\x48\x61\x28\x65\x2c\x74\x29\x2b\x22\x7d\x22\x29\x2c\x74\x2e\x70\x72\x65\x3d\x6e\x2c\x22\x5f\x6d\x28\x22\x2b\x28\x74\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x2d\x31\x29\x2b\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x49\x6e\x46\x6f\x72\x3f\x22\x2c\x74\x72\x75\x65\x22\x3a\x22\x22\x29\x2b\x22\x29\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e" +"\x20\x55\x61\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x65\x2e\x6f\x6e\x63\x65\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x65\x2e\x69\x66\x26\x26\x21\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x56\x61\x28\x65\x2c\x74\x29\x3b\x69\x66\x28\x65\x2e\x73\x74\x61\x74\x69\x63\x49\x6e\x46\x6f\x72\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x22\x22\x2c\x72\x3d" +"\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x72\x3b\x29\x7b\x69\x66\x28\x72\x2e\x66\x6f\x72\x29\x7b\x6e\x3d\x72\x2e\x6b\x65\x79\x3b\x62\x72\x65\x61\x6b\x7d\x72\x3d\x72\x2e\x70\x61\x72\x65\x6e\x74\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x3f\x22\x5f\x6f\x28\x22\x2b\x48\x61\x28\x65\x2c\x74\x29\x2b\x22\x2c\x22\x2b\x74\x2e\x6f\x6e\x63\x65\x49\x64\x2b\x2b\x2b\x22\x2c\x22\x2b\x6e\x2b\x22\x29\x22\x3a\x48\x61\x28\x65" +"\x2c\x74\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x42\x61\x28\x65\x2c\x74\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x56\x61\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x69\x66\x28\x21\x74\x2e\x6c\x65\x6e\x67\x74\x68\x29\x72\x65\x74" +"\x75\x72\x6e\x20\x69\x7c\x7c\x22\x5f\x65\x28\x29\x22\x3b\x76\x61\x72\x20\x6f\x3d\x74\x2e\x73\x68\x69\x66\x74\x28\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x6f\x2e\x65\x78\x70\x3f\x22\x28\x22\x2b\x6f\x2e\x65\x78\x70\x2b\x22\x29\x3f\x22\x2b\x61\x28\x6f\x2e\x62\x6c\x6f\x63\x6b\x29\x2b\x22\x3a\x22\x2b\x65\x28\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x3a\x22\x22\x2b\x61\x28\x6f\x2e\x62\x6c\x6f\x63\x6b\x29\x3b\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x20\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x72\x3f\x72\x28\x65\x2c\x6e\x29\x3a\x65\x2e\x6f\x6e\x63\x65\x3f\x55\x61\x28\x65\x2c\x6e\x29\x3a\x48\x61\x28\x65\x2c\x6e\x29\x7d\x7d\x28\x65\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x73\x6c\x69\x63\x65\x28\x29\x2c\x74\x2c\x6e\x2c\x72\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x7a\x61\x28\x65\x2c\x74\x2c\x6e" +"\x2c\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x2e\x66\x6f\x72\x2c\x6f\x3d\x65\x2e\x61\x6c\x69\x61\x73\x2c\x61\x3d\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x31\x3f\x22\x2c\x22\x2b\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x31\x3a\x22\x22\x2c\x73\x3d\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x32\x3f\x22\x2c\x22\x2b\x65\x2e\x69\x74\x65\x72\x61\x74\x6f\x72\x32\x3a\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x20\x65" +"\x2e\x66\x6f\x72\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x3d\x21\x30\x2c\x28\x72\x7c\x7c\x22\x5f\x6c\x22\x29\x2b\x22\x28\x28\x22\x2b\x69\x2b\x22\x29\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x22\x2b\x6f\x2b\x61\x2b\x73\x2b\x22\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x28\x6e\x7c\x7c\x48\x61\x29\x28\x65\x2c\x74\x29\x2b\x22\x7d\x29\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4b\x61\x28\x65\x2c\x74\x29" +"\x7b\x76\x61\x72\x20\x6e\x3d\x22\x7b\x22\x2c\x72\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3b\x69\x66\x28\x21\x6e\x29\x72\x65\x74\x75\x72\x6e\x3b\x76\x61\x72\x20\x72\x2c\x69\x2c\x6f\x2c\x61\x2c\x73\x3d\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3a\x5b\x22\x2c\x63\x3d\x21\x31\x3b\x66\x6f\x72\x28\x72\x3d\x30" +"\x2c\x69\x3d\x6e\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x3c\x69\x3b\x72\x2b\x2b\x29\x7b\x6f\x3d\x6e\x5b\x72\x5d\x2c\x61\x3d\x21\x30\x3b\x76\x61\x72\x20\x75\x3d\x74\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x5b\x6f\x2e\x6e\x61\x6d\x65\x5d\x3b\x75\x26\x26\x28\x61\x3d\x21\x21\x75\x28\x65\x2c\x6f\x2c\x74\x2e\x77\x61\x72\x6e\x29\x29\x2c\x61\x26\x26\x28\x63\x3d\x21\x30\x2c\x73\x2b\x3d\x27\x7b\x6e\x61\x6d" +"\x65\x3a\x22\x27\x2b\x6f\x2e\x6e\x61\x6d\x65\x2b\x27\x22\x2c\x72\x61\x77\x4e\x61\x6d\x65\x3a\x22\x27\x2b\x6f\x2e\x72\x61\x77\x4e\x61\x6d\x65\x2b\x27\x22\x27\x2b\x28\x6f\x2e\x76\x61\x6c\x75\x65\x3f\x22\x2c\x76\x61\x6c\x75\x65\x3a\x28\x22\x2b\x6f\x2e\x76\x61\x6c\x75\x65\x2b\x22\x29\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f" +"\x2e\x76\x61\x6c\x75\x65\x29\x3a\x22\x22\x29\x2b\x28\x6f\x2e\x61\x72\x67\x3f\x22\x2c\x61\x72\x67\x3a\x22\x2b\x28\x6f\x2e\x69\x73\x44\x79\x6e\x61\x6d\x69\x63\x41\x72\x67\x3f\x6f\x2e\x61\x72\x67\x3a\x27\x22\x27\x2b\x6f\x2e\x61\x72\x67\x2b\x27\x22\x27\x29\x3a\x22\x22\x29\x2b\x28\x6f\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3f\x22\x2c\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x3a\x22\x2b\x4a\x53\x4f\x4e\x2e" +"\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6f\x2e\x6d\x6f\x64\x69\x66\x69\x65\x72\x73\x29\x3a\x22\x22\x29\x2b\x22\x7d\x2c\x22\x29\x7d\x69\x66\x28\x63\x29\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x5d\x22\x7d\x28\x65\x2c\x74\x29\x3b\x72\x26\x26\x28\x6e\x2b\x3d\x72\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x6b\x65\x79\x26\x26\x28\x6e\x2b\x3d\x22\x6b\x65\x79\x3a\x22" +"\x2b\x65\x2e\x6b\x65\x79\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x72\x65\x66\x26\x26\x28\x6e\x2b\x3d\x22\x72\x65\x66\x3a\x22\x2b\x65\x2e\x72\x65\x66\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x72\x65\x66\x49\x6e\x46\x6f\x72\x26\x26\x28\x6e\x2b\x3d\x22\x72\x65\x66\x49\x6e\x46\x6f\x72\x3a\x74\x72\x75\x65\x2c\x22\x29\x2c\x65\x2e\x70\x72\x65\x26\x26\x28\x6e\x2b\x3d\x22\x70\x72\x65\x3a\x74\x72\x75\x65\x2c\x22\x29\x2c\x65" +"\x2e\x63\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x26\x26\x28\x6e\x2b\x3d\x27\x74\x61\x67\x3a\x22\x27\x2b\x65\x2e\x74\x61\x67\x2b\x27\x22\x2c\x27\x29\x3b\x66\x6f\x72\x28\x76\x61\x72\x20\x69\x3d\x30\x3b\x69\x3c\x74\x2e\x64\x61\x74\x61\x47\x65\x6e\x46\x6e\x73\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x69\x2b\x2b\x29\x6e\x2b\x3d\x74\x2e\x64\x61\x74\x61\x47\x65\x6e\x46\x6e\x73\x5b\x69\x5d\x28\x65\x29\x3b\x69\x66\x28\x65" +"\x2e\x61\x74\x74\x72\x73\x26\x26\x28\x6e\x2b\x3d\x22\x61\x74\x74\x72\x73\x3a\x22\x2b\x58\x61\x28\x65\x2e\x61\x74\x74\x72\x73\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x70\x72\x6f\x70\x73\x26\x26\x28\x6e\x2b\x3d\x22\x64\x6f\x6d\x50\x72\x6f\x70\x73\x3a\x22\x2b\x58\x61\x28\x65\x2e\x70\x72\x6f\x70\x73\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x65\x76\x65\x6e\x74\x73\x26\x26\x28\x6e\x2b\x3d\x4c\x61\x28\x65\x2e\x65" +"\x76\x65\x6e\x74\x73\x2c\x21\x31\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x6e\x61\x74\x69\x76\x65\x45\x76\x65\x6e\x74\x73\x26\x26\x28\x6e\x2b\x3d\x4c\x61\x28\x65\x2e\x6e\x61\x74\x69\x76\x65\x45\x76\x65\x6e\x74\x73\x2c\x21\x30\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x26\x26\x21\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x26\x26\x28\x6e\x2b\x3d\x22\x73\x6c\x6f\x74\x3a" +"\x22\x2b\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x26\x26\x28\x6e\x2b\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x65\x2e\x66\x6f\x72\x7c\x7c\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b" +"\x76\x61\x72\x20\x6e\x3d\x74\x5b\x65\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x6e\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x44\x79\x6e\x61\x6d\x69\x63\x7c\x7c\x6e\x2e\x69\x66\x7c\x7c\x6e\x2e\x66\x6f\x72\x7c\x7c\x4a\x61\x28\x6e\x29\x7d\x29\x2c\x69\x3d\x21\x21\x65\x2e\x69\x66\x3b\x69\x66\x28\x21\x72\x29\x66\x6f\x72\x28\x76\x61\x72\x20\x6f\x3d\x65\x2e\x70\x61\x72\x65\x6e\x74\x3b\x6f\x3b\x29\x7b\x69\x66" +"\x28\x6f\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x26\x26\x6f\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x21\x3d\x3d\x75\x61\x7c\x7c\x6f\x2e\x66\x6f\x72\x29\x7b\x72\x3d\x21\x30\x3b\x62\x72\x65\x61\x6b\x7d\x6f\x2e\x69\x66\x26\x26\x28\x69\x3d\x21\x30\x29\x2c\x6f\x3d\x6f\x2e\x70\x61\x72\x65\x6e\x74\x7d\x76\x61\x72\x20\x61\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x6b\x65\x79\x73\x28\x74\x29\x2e\x6d\x61\x70\x28\x66" +"\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x71\x61\x28\x74\x5b\x65\x5d\x2c\x6e\x29\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x3a\x5f\x75\x28\x5b\x22\x2b\x61\x2b\x22\x5d\x22\x2b\x28\x72\x3f\x22\x2c\x6e\x75\x6c\x6c\x2c\x74\x72\x75\x65\x22\x3a\x22\x22\x29\x2b\x28\x21\x72\x26\x26\x69\x3f\x22" +"\x2c\x6e\x75\x6c\x6c\x2c\x66\x61\x6c\x73\x65\x2c\x22\x2b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x35\x33\x38\x31\x2c\x6e\x3d\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x66\x6f\x72\x28\x3b\x6e\x3b\x29\x74\x3d\x33\x33\x2a\x74\x5e\x65\x2e\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74\x28\x2d\x2d\x6e\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x3e\x3e\x3e\x30\x7d\x28\x61\x29\x3a\x22\x22" +"\x29\x2b\x22\x29\x22\x7d\x28\x65\x2c\x65\x2e\x73\x63\x6f\x70\x65\x64\x53\x6c\x6f\x74\x73\x2c\x74\x29\x2b\x22\x2c\x22\x29\x2c\x65\x2e\x6d\x6f\x64\x65\x6c\x26\x26\x28\x6e\x2b\x3d\x22\x6d\x6f\x64\x65\x6c\x3a\x7b\x76\x61\x6c\x75\x65\x3a\x22\x2b\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x76\x61\x6c\x75\x65\x2b\x22\x2c\x63\x61\x6c\x6c\x62\x61\x63\x6b\x3a\x22\x2b\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x63\x61\x6c\x6c\x62" +"\x61\x63\x6b\x2b\x22\x2c\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x22\x2b\x65\x2e\x6d\x6f\x64\x65\x6c\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x2b\x22\x7d\x2c\x22\x29\x2c\x65\x2e\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x29\x7b\x76\x61\x72\x20\x6f\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x5b\x30" +"\x5d\x3b\x69\x66\x28\x6e\x26\x26\x31\x3d\x3d\x3d\x6e\x2e\x74\x79\x70\x65\x29\x7b\x76\x61\x72\x20\x72\x3d\x52\x61\x28\x6e\x2c\x74\x2e\x6f\x70\x74\x69\x6f\x6e\x73\x29\x3b\x72\x65\x74\x75\x72\x6e\x22\x69\x6e\x6c\x69\x6e\x65\x54\x65\x6d\x70\x6c\x61\x74\x65\x3a\x7b\x72\x65\x6e\x64\x65\x72\x3a\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x22\x2b\x72\x2e\x72\x65\x6e\x64\x65\x72\x2b\x22\x7d\x2c\x73\x74\x61" +"\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3a\x5b\x22\x2b\x72\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x7b\x22\x2b\x65\x2b\x22\x7d\x22\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c\x22\x29\x2b\x22\x5d\x7d\x22\x7d\x7d\x28\x65\x2c\x74\x29\x3b" +"\x6f\x26\x26\x28\x6e\x2b\x3d\x6f\x2b\x22\x2c\x22\x29\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x3d\x6e\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x2c\x24\x2f\x2c\x22\x22\x29\x2b\x22\x7d\x22\x2c\x65\x2e\x64\x79\x6e\x61\x6d\x69\x63\x41\x74\x74\x72\x73\x26\x26\x28\x6e\x3d\x22\x5f\x62\x28\x22\x2b\x6e\x2b\x27\x2c\x22\x27\x2b\x65\x2e\x74\x61\x67\x2b\x27\x22\x2c\x27\x2b\x58\x61\x28\x65\x2e\x64\x79\x6e\x61\x6d\x69" +"\x63\x41\x74\x74\x72\x73\x29\x2b\x22\x29\x22\x29\x2c\x65\x2e\x77\x72\x61\x70\x44\x61\x74\x61\x26\x26\x28\x6e\x3d\x65\x2e\x77\x72\x61\x70\x44\x61\x74\x61\x28\x6e\x29\x29\x2c\x65\x2e\x77\x72\x61\x70\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x26\x26\x28\x6e\x3d\x65\x2e\x77\x72\x61\x70\x4c\x69\x73\x74\x65\x6e\x65\x72\x73\x28\x6e\x29\x29\x2c\x6e\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x4a\x61\x28\x65\x29\x7b" +"\x72\x65\x74\x75\x72\x6e\x20\x31\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x26\x26\x28\x22\x73\x6c\x6f\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x65\x2e\x63\x68\x69\x6c\x64\x72\x65\x6e\x2e\x73\x6f\x6d\x65\x28\x4a\x61\x29\x29\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x71\x61\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x65\x2e\x61\x74\x74\x72\x73\x4d\x61\x70\x5b\x22\x73\x6c\x6f\x74\x2d\x73\x63\x6f" +"\x70\x65\x22\x5d\x3b\x69\x66\x28\x65\x2e\x69\x66\x26\x26\x21\x65\x2e\x69\x66\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x26\x26\x21\x6e\x29\x72\x65\x74\x75\x72\x6e\x20\x56\x61\x28\x65\x2c\x74\x2c\x71\x61\x2c\x22\x6e\x75\x6c\x6c\x22\x29\x3b\x69\x66\x28\x65\x2e\x66\x6f\x72\x26\x26\x21\x65\x2e\x66\x6f\x72\x50\x72\x6f\x63\x65\x73\x73\x65\x64\x29\x72\x65\x74\x75\x72\x6e\x20\x7a\x61\x28\x65\x2c\x74\x2c\x71\x61" +"\x29\x3b\x76\x61\x72\x20\x72\x3d\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x3d\x3d\x3d\x75\x61\x3f\x22\x22\x3a\x53\x74\x72\x69\x6e\x67\x28\x65\x2e\x73\x6c\x6f\x74\x53\x63\x6f\x70\x65\x29\x2c\x69\x3d\x22\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x22\x2b\x72\x2b\x22\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x22\x2b\x28\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x3f\x65\x2e\x69\x66" +"\x26\x26\x6e\x3f\x22\x28\x22\x2b\x65\x2e\x69\x66\x2b\x22\x29\x3f\x22\x2b\x28\x57\x61\x28\x65\x2c\x74\x29\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x29\x2b\x22\x3a\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3a\x57\x61\x28\x65\x2c\x74\x29\x7c\x7c\x22\x75\x6e\x64\x65\x66\x69\x6e\x65\x64\x22\x3a\x48\x61\x28\x65\x2c\x74\x29\x29\x2b\x22\x7d\x22\x2c\x6f\x3d\x72\x3f\x22\x22\x3a\x22\x2c\x70\x72\x6f" +"\x78\x79\x3a\x74\x72\x75\x65\x22\x3b\x72\x65\x74\x75\x72\x6e\x22\x7b\x6b\x65\x79\x3a\x22\x2b\x28\x65\x2e\x73\x6c\x6f\x74\x54\x61\x72\x67\x65\x74\x7c\x7c\x27\x22\x64\x65\x66\x61\x75\x6c\x74\x22\x27\x29\x2b\x22\x2c\x66\x6e\x3a\x22\x2b\x69\x2b\x6f\x2b\x22\x7d\x22\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x57\x61\x28\x65\x2c\x74\x2c\x6e\x2c\x72\x2c\x69\x29\x7b\x76\x61\x72\x20\x6f\x3d\x65\x2e\x63\x68\x69" +"\x6c\x64\x72\x65\x6e\x3b\x69\x66\x28\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x29\x7b\x76\x61\x72\x20\x61\x3d\x6f\x5b\x30\x5d\x3b\x69\x66\x28\x31\x3d\x3d\x3d\x6f\x2e\x6c\x65\x6e\x67\x74\x68\x26\x26\x61\x2e\x66\x6f\x72\x26\x26\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x21\x3d\x3d\x61\x2e\x74\x61\x67\x26\x26\x22\x73\x6c\x6f\x74\x22\x21\x3d\x3d\x61\x2e\x74\x61\x67\x29\x7b\x76\x61\x72\x20\x73\x3d\x6e\x3f\x74\x2e" +"\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x28\x61\x29\x3f\x22\x2c\x31\x22\x3a\x22\x2c\x30\x22\x3a\x22\x22\x3b\x72\x65\x74\x75\x72\x6e\x22\x22\x2b\x28\x72\x7c\x7c\x48\x61\x29\x28\x61\x2c\x74\x29\x2b\x73\x7d\x76\x61\x72\x20\x63\x3d\x6e\x3f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x6e\x3d\x30\x2c\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e" +"\x67\x74\x68\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x72\x5d\x3b\x69\x66\x28\x31\x3d\x3d\x3d\x69\x2e\x74\x79\x70\x65\x29\x7b\x69\x66\x28\x5a\x61\x28\x69\x29\x7c\x7c\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x26\x26\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20" +"\x5a\x61\x28\x65\x2e\x62\x6c\x6f\x63\x6b\x29\x7d\x29\x29\x7b\x6e\x3d\x32\x3b\x62\x72\x65\x61\x6b\x7d\x28\x74\x28\x69\x29\x7c\x7c\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x26\x26\x69\x2e\x69\x66\x43\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x73\x2e\x73\x6f\x6d\x65\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x28\x65\x2e\x62\x6c\x6f\x63\x6b\x29\x7d\x29\x29" +"\x26\x26\x28\x6e\x3d\x31\x29\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x6e\x7d\x28\x6f\x2c\x74\x2e\x6d\x61\x79\x62\x65\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x29\x3a\x30\x2c\x75\x3d\x69\x7c\x7c\x47\x61\x3b\x72\x65\x74\x75\x72\x6e\x22\x5b\x22\x2b\x6f\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x75\x28\x65\x2c\x74\x29\x7d\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x2c" +"\x22\x29\x2b\x22\x5d\x22\x2b\x28\x63\x3f\x22\x2c\x22\x2b\x63\x3a\x22\x22\x29\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x5a\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x76\x6f\x69\x64\x20\x30\x21\x3d\x3d\x65\x2e\x66\x6f\x72\x7c\x7c\x22\x74\x65\x6d\x70\x6c\x61\x74\x65\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7c\x7c\x22\x73\x6c\x6f\x74\x22\x3d\x3d\x3d\x65\x2e\x74\x61\x67\x7d\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x20\x47\x61\x28\x65\x2c\x74\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x31\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x3f\x48\x61\x28\x65\x2c\x74\x29\x3a\x33\x3d\x3d\x3d\x65\x2e\x74\x79\x70\x65\x26\x26\x65\x2e\x69\x73\x43\x6f\x6d\x6d\x65\x6e\x74\x3f\x28\x72\x3d\x65\x2c\x22\x5f\x65\x28\x22\x2b\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x72\x2e\x74\x65\x78\x74\x29\x2b\x22\x29\x22\x29\x3a" +"\x22\x5f\x76\x28\x22\x2b\x28\x32\x3d\x3d\x3d\x28\x6e\x3d\x65\x29\x2e\x74\x79\x70\x65\x3f\x6e\x2e\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x3a\x59\x61\x28\x4a\x53\x4f\x4e\x2e\x73\x74\x72\x69\x6e\x67\x69\x66\x79\x28\x6e\x2e\x74\x65\x78\x74\x29\x29\x29\x2b\x22\x29\x22\x3b\x76\x61\x72\x20\x6e\x2c\x72\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x58\x61\x28\x65\x29\x7b\x66\x6f\x72\x28\x76\x61\x72\x20\x74\x3d" +"\x22\x22\x2c\x6e\x3d\x22\x22\x2c\x72\x3d\x30\x3b\x72\x3c\x65\x2e\x6c\x65\x6e\x67\x74\x68\x3b\x72\x2b\x2b\x29\x7b\x76\x61\x72\x20\x69\x3d\x65\x5b\x72\x5d\x2c\x6f\x3d\x59\x61\x28\x69\x2e\x76\x61\x6c\x75\x65\x29\x3b\x69\x2e\x64\x79\x6e\x61\x6d\x69\x63\x3f\x6e\x2b\x3d\x69\x2e\x6e\x61\x6d\x65\x2b\x22\x2c\x22\x2b\x6f\x2b\x22\x2c\x22\x3a\x74\x2b\x3d\x27\x22\x27\x2b\x69\x2e\x6e\x61\x6d\x65\x2b\x27\x22\x3a" +"\x27\x2b\x6f\x2b\x22\x2c\x22\x7d\x72\x65\x74\x75\x72\x6e\x20\x74\x3d\x22\x7b\x22\x2b\x74\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x7d\x22\x2c\x6e\x3f\x22\x5f\x64\x28\x22\x2b\x74\x2b\x22\x2c\x5b\x22\x2b\x6e\x2e\x73\x6c\x69\x63\x65\x28\x30\x2c\x2d\x31\x29\x2b\x22\x5d\x29\x22\x3a\x74\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x59\x61\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x72" +"\x65\x70\x6c\x61\x63\x65\x28\x2f\x5c\x75\x32\x30\x32\x38\x2f\x67\x2c\x22\x5c\x5c\x75\x32\x30\x32\x38\x22\x29\x2e\x72\x65\x70\x6c\x61\x63\x65\x28\x2f\x5c\x75\x32\x30\x32\x39\x2f\x67\x2c\x22\x5c\x5c\x75\x32\x30\x32\x39\x22\x29\x7d\x6e\x65\x77\x20\x52\x65\x67\x45\x78\x70\x28\x22\x5c\x5c\x62\x22\x2b\x22\x64\x6f\x2c\x69\x66\x2c\x66\x6f\x72\x2c\x6c\x65\x74\x2c\x6e\x65\x77\x2c\x74\x72\x79\x2c\x76\x61\x72" +"\x2c\x63\x61\x73\x65\x2c\x65\x6c\x73\x65\x2c\x77\x69\x74\x68\x2c\x61\x77\x61\x69\x74\x2c\x62\x72\x65\x61\x6b\x2c\x63\x61\x74\x63\x68\x2c\x63\x6c\x61\x73\x73\x2c\x63\x6f\x6e\x73\x74\x2c\x73\x75\x70\x65\x72\x2c\x74\x68\x72\x6f\x77\x2c\x77\x68\x69\x6c\x65\x2c\x79\x69\x65\x6c\x64\x2c\x64\x65\x6c\x65\x74\x65\x2c\x65\x78\x70\x6f\x72\x74\x2c\x69\x6d\x70\x6f\x72\x74\x2c\x72\x65\x74\x75\x72\x6e\x2c\x73\x77" +"\x69\x74\x63\x68\x2c\x64\x65\x66\x61\x75\x6c\x74\x2c\x65\x78\x74\x65\x6e\x64\x73\x2c\x66\x69\x6e\x61\x6c\x6c\x79\x2c\x63\x6f\x6e\x74\x69\x6e\x75\x65\x2c\x64\x65\x62\x75\x67\x67\x65\x72\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x2c\x61\x72\x67\x75\x6d\x65\x6e\x74\x73\x22\x2e\x73\x70\x6c\x69\x74\x28\x22\x2c\x22\x29\x2e\x6a\x6f\x69\x6e\x28\x22\x5c\x5c\x62\x7c\x5c\x5c\x62\x22\x29\x2b\x22\x5c\x5c\x62\x22\x29" +"\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x51\x61\x28\x65\x2c\x74\x29\x7b\x74\x72\x79\x7b\x72\x65\x74\x75\x72\x6e\x20\x6e\x65\x77\x20\x46\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7d\x63\x61\x74\x63\x68\x28\x6e\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x70\x75\x73\x68\x28\x7b\x65\x72\x72\x3a\x6e\x2c\x63\x6f\x64\x65\x3a\x65\x7d\x29\x2c\x53\x7d\x7d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x65\x73\x28\x65" +"\x29\x7b\x76\x61\x72\x20\x74\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x6e\x75\x6c\x6c\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x6e\x2c\x72\x2c\x69\x29\x7b\x28\x72\x3d\x41\x28\x7b\x7d\x2c\x72\x29\x29\x2e\x77\x61\x72\x6e\x3b\x64\x65\x6c\x65\x74\x65\x20\x72\x2e\x77\x61\x72\x6e\x3b\x76\x61\x72\x20\x6f\x3d\x72\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73" +"\x3f\x53\x74\x72\x69\x6e\x67\x28\x72\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x29\x2b\x6e\x3a\x6e\x3b\x69\x66\x28\x74\x5b\x6f\x5d\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x5b\x6f\x5d\x3b\x76\x61\x72\x20\x61\x3d\x65\x28\x6e\x2c\x72\x29\x2c\x73\x3d\x7b\x7d\x2c\x63\x3d\x5b\x5d\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x72\x65\x6e\x64\x65\x72\x3d\x51\x61\x28\x61\x2e\x72\x65\x6e\x64\x65\x72\x2c\x63\x29\x2c" +"\x73\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x61\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x2e\x6d\x61\x70\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x20\x51\x61\x28\x65\x2c\x63\x29\x7d\x29\x2c\x74\x5b\x6f\x5d\x3d\x73\x7d\x7d\x76\x61\x72\x20\x74\x73\x2c\x6e\x73\x2c\x72\x73\x3d\x28\x74\x73\x3d\x66\x75\x6e\x63\x74\x69" +"\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x76\x61\x72\x20\x6e\x3d\x66\x61\x28\x65\x2e\x74\x72\x69\x6d\x28\x29\x2c\x74\x29\x3b\x21\x31\x21\x3d\x3d\x74\x2e\x6f\x70\x74\x69\x6d\x69\x7a\x65\x26\x26\x41\x61\x28\x6e\x2c\x74\x29\x3b\x76\x61\x72\x20\x72\x3d\x52\x61\x28\x6e\x2c\x74\x29\x3b\x72\x65\x74\x75\x72\x6e\x7b\x61\x73\x74\x3a\x6e\x2c\x72\x65\x6e\x64\x65\x72\x3a\x72\x2e\x72\x65\x6e\x64\x65\x72\x2c\x73\x74\x61" +"\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3a\x72\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x7d\x7d\x2c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x74\x28\x74\x2c\x6e\x29\x7b\x76\x61\x72\x20\x72\x3d\x4f\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x29\x2c\x69\x3d\x5b\x5d\x2c\x6f\x3d\x5b\x5d\x3b\x69\x66\x28\x6e\x29\x66" +"\x6f\x72\x28\x76\x61\x72\x20\x61\x20\x69\x6e\x20\x6e\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x26\x26\x28\x72\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x3d\x28\x65\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x7c\x7c\x5b\x5d\x29\x2e\x63\x6f\x6e\x63\x61\x74\x28\x6e\x2e\x6d\x6f\x64\x75\x6c\x65\x73\x29\x29\x2c\x6e\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x26\x26\x28\x72\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x3d\x41\x28\x4f" +"\x62\x6a\x65\x63\x74\x2e\x63\x72\x65\x61\x74\x65\x28\x65\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x7c\x7c\x6e\x75\x6c\x6c\x29\x2c\x6e\x2e\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x29\x29\x2c\x6e\x29\x22\x6d\x6f\x64\x75\x6c\x65\x73\x22\x21\x3d\x3d\x61\x26\x26\x22\x64\x69\x72\x65\x63\x74\x69\x76\x65\x73\x22\x21\x3d\x3d\x61\x26\x26\x28\x72\x5b\x61\x5d\x3d\x6e\x5b\x61\x5d\x29\x3b\x72\x2e\x77\x61\x72" +"\x6e\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x2c\x6e\x29\x7b\x28\x6e\x3f\x6f\x3a\x69\x29\x2e\x70\x75\x73\x68\x28\x65\x29\x7d\x3b\x76\x61\x72\x20\x73\x3d\x74\x73\x28\x74\x2e\x74\x72\x69\x6d\x28\x29\x2c\x72\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x73\x2e\x65\x72\x72\x6f\x72\x73\x3d\x69\x2c\x73\x2e\x74\x69\x70\x73\x3d\x6f\x2c\x73\x7d\x72\x65\x74\x75\x72\x6e\x7b\x63\x6f\x6d\x70\x69\x6c\x65\x3a" +"\x74\x2c\x63\x6f\x6d\x70\x69\x6c\x65\x54\x6f\x46\x75\x6e\x63\x74\x69\x6f\x6e\x73\x3a\x65\x73\x28\x74\x29\x7d\x7d\x29\x28\x78\x61\x29\x2c\x69\x73\x3d\x28\x72\x73\x2e\x63\x6f\x6d\x70\x69\x6c\x65\x2c\x72\x73\x2e\x63\x6f\x6d\x70\x69\x6c\x65\x54\x6f\x46\x75\x6e\x63\x74\x69\x6f\x6e\x73\x29\x3b\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x6f\x73\x28\x65\x29\x7b\x72\x65\x74\x75\x72\x6e\x28\x6e\x73\x3d\x6e\x73\x7c" +"\x7c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x29\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x3d\x65\x3f\x27\x3c\x61\x20\x68\x72\x65\x66\x3d\x22\x5c\x6e\x22\x2f\x3e\x27\x3a\x27\x3c\x64\x69\x76\x20\x61\x3d\x22\x5c\x6e\x22\x2f\x3e\x27\x2c\x6e\x73\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x26" +"\x23\x31\x30\x3b\x22\x29\x3e\x30\x7d\x76\x61\x72\x20\x61\x73\x3d\x21\x21\x56\x26\x26\x6f\x73\x28\x21\x31\x29\x2c\x73\x73\x3d\x21\x21\x56\x26\x26\x6f\x73\x28\x21\x30\x29\x2c\x63\x73\x3d\x67\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x76\x61\x72\x20\x74\x3d\x51\x6e\x28\x65\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x26\x26\x74\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x7d\x29\x2c\x75\x73\x3d\x43" +"\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6d\x6f\x75\x6e\x74\x3b\x72\x65\x74\x75\x72\x6e\x20\x43\x6e\x2e\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x24\x6d\x6f\x75\x6e\x74\x3d\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x65\x2c\x74\x29\x7b\x69\x66\x28\x28\x65\x3d\x65\x26\x26\x51\x6e\x28\x65\x29\x29\x3d\x3d\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x62\x6f\x64\x79\x7c\x7c\x65\x3d\x3d\x3d\x64\x6f\x63" +"\x75\x6d\x65\x6e\x74\x2e\x64\x6f\x63\x75\x6d\x65\x6e\x74\x45\x6c\x65\x6d\x65\x6e\x74\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x3b\x76\x61\x72\x20\x6e\x3d\x74\x68\x69\x73\x2e\x24\x6f\x70\x74\x69\x6f\x6e\x73\x3b\x69\x66\x28\x21\x6e\x2e\x72\x65\x6e\x64\x65\x72\x29\x7b\x76\x61\x72\x20\x72\x3d\x6e\x2e\x74\x65\x6d\x70\x6c\x61\x74\x65\x3b\x69\x66\x28\x72\x29\x69\x66\x28\x22\x73\x74\x72\x69\x6e\x67" +"\x22\x3d\x3d\x74\x79\x70\x65\x6f\x66\x20\x72\x29\x22\x23\x22\x3d\x3d\x3d\x72\x2e\x63\x68\x61\x72\x41\x74\x28\x30\x29\x26\x26\x28\x72\x3d\x63\x73\x28\x72\x29\x29\x3b\x65\x6c\x73\x65\x7b\x69\x66\x28\x21\x72\x2e\x6e\x6f\x64\x65\x54\x79\x70\x65\x29\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x3b\x72\x3d\x72\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x7d\x65\x6c\x73\x65\x20\x65\x26\x26\x28\x72\x3d\x66\x75" +"\x6e\x63\x74\x69\x6f\x6e\x28\x65\x29\x7b\x69\x66\x28\x65\x2e\x6f\x75\x74\x65\x72\x48\x54\x4d\x4c\x29\x72\x65\x74\x75\x72\x6e\x20\x65\x2e\x6f\x75\x74\x65\x72\x48\x54\x4d\x4c\x3b\x76\x61\x72\x20\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x22\x64\x69\x76\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x20\x74\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64" +"\x28\x65\x2e\x63\x6c\x6f\x6e\x65\x4e\x6f\x64\x65\x28\x21\x30\x29\x29\x2c\x74\x2e\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c\x7d\x28\x65\x29\x29\x3b\x69\x66\x28\x72\x29\x7b\x76\x61\x72\x20\x69\x3d\x69\x73\x28\x72\x2c\x7b\x6f\x75\x74\x70\x75\x74\x53\x6f\x75\x72\x63\x65\x52\x61\x6e\x67\x65\x3a\x21\x31\x2c\x73\x68\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x3a\x61\x73\x2c\x73\x68" +"\x6f\x75\x6c\x64\x44\x65\x63\x6f\x64\x65\x4e\x65\x77\x6c\x69\x6e\x65\x73\x46\x6f\x72\x48\x72\x65\x66\x3a\x73\x73\x2c\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x3a\x6e\x2e\x64\x65\x6c\x69\x6d\x69\x74\x65\x72\x73\x2c\x63\x6f\x6d\x6d\x65\x6e\x74\x73\x3a\x6e\x2e\x63\x6f\x6d\x6d\x65\x6e\x74\x73\x7d\x2c\x74\x68\x69\x73\x29\x2c\x6f\x3d\x69\x2e\x72\x65\x6e\x64\x65\x72\x2c\x61\x3d\x69\x2e\x73\x74\x61\x74\x69" +"\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3b\x6e\x2e\x72\x65\x6e\x64\x65\x72\x3d\x6f\x2c\x6e\x2e\x73\x74\x61\x74\x69\x63\x52\x65\x6e\x64\x65\x72\x46\x6e\x73\x3d\x61\x7d\x7d\x72\x65\x74\x75\x72\x6e\x20\x75\x73\x2e\x63\x61\x6c\x6c\x28\x74\x68\x69\x73\x2c\x65\x2c\x74\x29\x7d\x2c\x43\x6e\x2e\x63\x6f\x6d\x70\x69\x6c\x65\x3d\x69\x73\x2c\x43\x6e\x7d\x29\x3b\x0d\x0a\x00\x00"; diff --git a/Source/base-fw/main/webserver/WebAPI.c b/Source/base-fw/main/webserver/WebAPI.c index a6c531f..d8109ec 100644 --- a/Source/base-fw/main/webserver/WebAPI.c +++ b/Source/base-fw/main/webserver/WebAPI.c @@ -4,6 +4,7 @@ #include "SoundFX.h" #include "GateControl.h" #include "Settings.h" +#include "HelperMacro.h" #include "GPIO.h" #include #include @@ -13,6 +14,7 @@ #include "lwip/sys.h" #include "esp_system.h" #include "esp_chip_info.h" +#include "esp_netif_types.h" #include "Main.h" #include "esp_ota_ops.h" #include "ApiURL.h" @@ -174,6 +176,19 @@ static char* GetSysInfo() cJSON_AddItemToObject(pEntryJSON9, "value", cJSON_CreateString(buff)); cJSON_AddItemToArray(pEntries, pEntryJSON9); + esp_ip6_addr_t if_ip6[CONFIG_LWIP_IPV6_NUM_ADDRESSES] = {0}; + const int32_t s32IPv6Count = MAIN_GetWiFiSTAIPv6(if_ip6); + for(int i = 0; i < HELPERMACRO_MIN(s32IPv6Count, 2); i++) + { + char ipv6String[45+1] = {0,}; + snprintf(ipv6String, sizeof(ipv6String)-1, IPV6STR, IPV62STR(if_ip6[i])); + + cJSON* pEntryJSONIPv6 = cJSON_CreateObject(); + cJSON_AddItemToObject(pEntryJSONIPv6, "name", cJSON_CreateString("WiFi (STA) IPv6")); + cJSON_AddItemToObject(pEntryJSONIPv6, "value", cJSON_CreateString(ipv6String)); + cJSON_AddItemToArray(pEntries, pEntryJSONIPv6); + } + // WiFi-Soft AP (IP address) cJSON* pEntryJSON10 = cJSON_CreateObject(); cJSON_AddItemToObject(pEntryJSON10, "name", cJSON_CreateString("WiFi (Soft-AP)")); diff --git a/Source/base-fw/main/webserver/WebServer.c b/Source/base-fw/main/webserver/WebServer.c index 2673bba..994732b 100644 --- a/Source/base-fw/main/webserver/WebServer.c +++ b/Source/base-fw/main/webserver/WebServer.c @@ -1,4 +1,5 @@ #include "WebServer.h" +#include "HelperMacro.h" #include "esp_log.h" //#include "esp_vfs.h" #include @@ -11,6 +12,7 @@ #include "cJSON.h" #include "Settings.h" #include "GateControl.h" +#include "FWConfig.h" #include "Main.h" #include "GPIO.h" #include "GateStepper.h" @@ -82,6 +84,7 @@ void WEBSERVER_Init() config.lru_purge_enable = true; config.uri_match_fn = httpd_uri_match_wildcard; config.max_open_sockets = 13; + config.task_priority = FWCONFIG_WEBSERVERTASK_PRIORITY_DEFAULT; // Start the httpd server ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port); @@ -136,7 +139,7 @@ static esp_err_t file_get_handler(httpd_req_t *req) while(u32Index < pFile->u32Length) { - const uint32_t n = MIN(pFile->u32Length - u32Index, HTTPSERVER_BUFFERSIZE); + const uint32_t n = HELPERMACRO_MIN(pFile->u32Length - u32Index, HTTPSERVER_BUFFERSIZE); if (n > 0) { /* Send the buffer contents as HTTP response m_u8Buffers */ diff --git a/Source/base-fw/managed_components/espressif__led_strip/.component_hash b/Source/base-fw/managed_components/espressif__led_strip/.component_hash new file mode 100644 index 0000000..d6abe9d --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/.component_hash @@ -0,0 +1 @@ +c240f82567a37357bef313f76b0df93cb2da025835e525006096ea7e0fd61b4f \ No newline at end of file diff --git a/Source/base-fw/managed_components/espressif__led_strip/CHANGELOG.md b/Source/base-fw/managed_components/espressif__led_strip/CHANGELOG.md new file mode 100644 index 0000000..494cad2 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/CHANGELOG.md @@ -0,0 +1,32 @@ +## 2.4.0 + +- Support configurable SPI mode to contorl leds + - recommend to enable DMA when using SPI mode + +## 2.3.0 + +- Support configurable RMT channel size by setting `mem_block_symbols` + +## 2.2.0 + +- Support for 4 components RGBW leds (SK6812): + - in led_strip_config_t new fields + led_pixel_format, controlling byte format (LED_PIXEL_FORMAT_GRB, LED_PIXEL_FORMAT_GRBW) + led_model, used to configure bit timing (LED_MODEL_WS2812, LED_MODEL_SK6812) + - new API led_strip_set_pixel_rgbw + - new interface type set_pixel_rgbw + +## 2.1.0 + +- Support DMA feature, which offloads the CPU by a lot when it comes to drive a bunch of LEDs +- Support various RMT clock sources +- Acquire and release the power management lock before and after each refresh +- New driver flag: `invert_out` which can invert the led control signal by hardware + +## 2.0.0 + +- Reimplemented the driver using the new RMT driver (`driver/rmt_tx.h`) + +## 1.0.0 + +- Initial driver version, based on the legacy RMT driver (`driver/rmt.h`) diff --git a/Source/base-fw/managed_components/espressif__led_strip/CMakeLists.txt b/Source/base-fw/managed_components/espressif__led_strip/CMakeLists.txt new file mode 100644 index 0000000..bd122c2 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/CMakeLists.txt @@ -0,0 +1,18 @@ +include($ENV{IDF_PATH}/tools/cmake/version.cmake) + +set(srcs "src/led_strip_api.c") + +if(CONFIG_SOC_RMT_SUPPORTED) + list(APPEND srcs "src/led_strip_rmt_dev.c" "src/led_strip_rmt_encoder.c") +endif() + +# the SPI backend driver relies on something that was added in IDF 5.1 +if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "5.1") + if(CONFIG_SOC_GPSPI_SUPPORTED) + list(APPEND srcs "src/led_strip_spi_dev.c") + endif() +endif() + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS "include" "interface" + REQUIRES "driver") diff --git a/Source/base-fw/managed_components/espressif__led_strip/LICENSE b/Source/base-fw/managed_components/espressif__led_strip/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Source/base-fw/managed_components/espressif__led_strip/README.md b/Source/base-fw/managed_components/espressif__led_strip/README.md new file mode 100644 index 0000000..6f9f8f3 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/README.md @@ -0,0 +1,90 @@ +# LED Strip Driver + +[![Component Registry](https://components.espressif.com/components/espressif/led_strip/badge.svg)](https://components.espressif.com/components/espressif/led_strip) + +This driver is designed for addressable LEDs like [WS2812](http://www.world-semi.com/Certifications/WS2812B.html), where each LED is controlled by a single data line. + +## Backend Controllers + +### The [RMT](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html) Peripheral + +This is the most economical way to drive the LEDs because it only consumes one RMT channel, leaving other channels free to use. However, the memory usage increases dramatically with the number of LEDs. If the RMT hardware can't be assist by DMA, the driver will going into interrupt very frequently, thus result in a high CPU usage. What's worse, if the RMT interrupt is delayed or not serviced in time (e.g. if Wi-Fi interrupt happens on the same CPU core), the RMT transaction will be corrupted and the LEDs will display incorrect colors. If you want to use RMT to drive a large number of LEDs, you'd better to enable the DMA feature if possible [^1]. + +#### Allocate LED Strip Object with RMT Backend + +```c +#define BLINK_GPIO 0 + +led_strip_handle_t led_strip; + +/* LED strip initialization with the GPIO and pixels number*/ +led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = 1, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter) +}; + +led_strip_rmt_config_t rmt_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .resolution_hz = 10 * 1000 * 1000, // 10MHz + .flags.with_dma = false, // whether to enable the DMA feature +}; +ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); +``` + +You can create multiple LED strip objects with different GPIOs and pixel numbers. The backend driver will automatically allocate the RMT channel for you if there is more available. + +### The [SPI](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html) Peripheral + +SPI peripheral can also be used to generate the timing required by the LED strip. However this backend is not as economical as the RMT one, because it will take up the whole **bus**, unlike the RMT just takes one **channel**. You **CANT** connect other devices to the same SPI bus if it's been used by the led_strip, because the led_strip doesn't have the concept of "Chip Select". + +Please note, the SPI backend has a dependency of **ESP-IDF >= 5.1** + +#### Allocate LED Strip Object with SPI Backend + +```c +#define BLINK_GPIO 0 + +led_strip_handle_t led_strip; + +/* LED strip initialization with the GPIO and pixels number*/ +led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = 1, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter) +}; + +led_strip_spi_config_t spi_config = { + .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs + .spi_bus = SPI2_HOST, // SPI bus ID +}; +ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip)); +``` + +The number of LED strip objects can be created depends on how many free SPI buses are free to use in your project. + +## FAQ + +* Which led_strip backend should I choose? + * It depends on your application requirement and target chip's ability. + + ```mermaid + flowchart LR + A{Is RMT supported?} + A --> |No| B[SPI backend] + B --> C{Does the led strip has \n a larger number of LEDs?} + C --> |No| D[Don't have to enable the DMA of the backend] + C --> |Yes| E[Enable the DMA of the backend] + A --> |Yes| F{Does the led strip has \n a larger number of LEDs?} + F --> |Yes| G{Does RMT support DMA?} + G --> |Yes| E + G --> |No| B + F --> |No| H[RMT backend] --> D + ``` + +[^1]: The RMT DMA feature is not available on all ESP chips. Please check the data sheet before using it. diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt new file mode 100644 index 0000000..fc2dfc7 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_strip_rmt_ws2812) diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md new file mode 100644 index 0000000..ad52235 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md @@ -0,0 +1,31 @@ +# LED Strip Example (RMT backend + WS2812) + +This example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component. + +## How to Use Example + +### Hardware Required + +* A development board with Espressif SoC +* A USB cable for Power supply and programming +* WS2812 LED strip + +### Configure the Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. Then assign the proper GPIO in the [source file](main/led_strip_rmt_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number. + +### Build and Flash + +Run `idf.py -p PORT build flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```text +I (299) gpio: GPIO[8]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (309) example: Created LED strip object with RMT backend +I (309) example: Start blinking LED strip +``` diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt new file mode 100644 index 0000000..37b9c14 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_strip_rmt_ws2812_main.c" + INCLUDE_DIRS ".") diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml new file mode 100644 index 0000000..916c366 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml @@ -0,0 +1,5 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: + version: '^2' + override_path: '../../../' diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c new file mode 100644 index 0000000..62293d5 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "led_strip.h" +#include "esp_log.h" +#include "esp_err.h" + +// GPIO assignment +#define LED_STRIP_BLINK_GPIO 2 +// Numbers of the LED in the strip +#define LED_STRIP_LED_NUMBERS 24 +// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution) +#define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000) + +static const char *TAG = "example"; + +led_strip_handle_t configure_led(void) +{ + // LED strip general initialization, according to your led board design + led_strip_config_t strip_config = { + .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal + }; + + // LED strip backend configuration: RMT + led_strip_rmt_config_t rmt_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .resolution_hz = LED_STRIP_RMT_RES_HZ, // RMT counter clock frequency + .flags.with_dma = false, // DMA feature is available on ESP target like ESP32-S3 + }; + + // LED Strip object handle + led_strip_handle_t led_strip; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + ESP_LOGI(TAG, "Created LED strip object with RMT backend"); + return led_strip; +} + +void app_main(void) +{ + led_strip_handle_t led_strip = configure_led(); + bool led_on_off = false; + + ESP_LOGI(TAG, "Start blinking LED strip"); + while (1) { + if (led_on_off) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5)); + } + /* Refresh the strip to send data */ + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); + ESP_LOGI(TAG, "LED ON!"); + } else { + /* Set all LED off to clear all pixels */ + ESP_ERROR_CHECK(led_strip_clear(led_strip)); + ESP_LOGI(TAG, "LED OFF!"); + } + + led_on_off = !led_on_off; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt new file mode 100644 index 0000000..7d3af2d --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_strip_spi_ws2812) diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md new file mode 100644 index 0000000..c545c84 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md @@ -0,0 +1,31 @@ +# LED Strip Example (SPI backend + WS2812) + +This example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component. + +## How to Use Example + +### Hardware Required + +* A development board with Espressif SoC +* A USB cable for Power supply and programming +* WS2812 LED strip + +### Configure the Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. Then assign the proper GPIO in the [source file](main/led_strip_spi_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number. + +### Build and Flash + +Run `idf.py -p PORT build flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```text +I (299) gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (309) example: Created LED strip object with SPI backend +I (309) example: Start blinking LED strip +``` diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt new file mode 100644 index 0000000..5ad7dd5 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_strip_spi_ws2812_main.c" + INCLUDE_DIRS ".") diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml new file mode 100644 index 0000000..050d8d2 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml @@ -0,0 +1,6 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: + version: '^2.4' + override_path: '../../../' + idf: ">=5.1" diff --git a/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c new file mode 100644 index 0000000..69b780c --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "led_strip.h" +#include "esp_log.h" +#include "esp_err.h" + +// GPIO assignment +#define LED_STRIP_BLINK_GPIO 2 +// Numbers of the LED in the strip +#define LED_STRIP_LED_NUMBERS 24 + +static const char *TAG = "example"; + +led_strip_handle_t configure_led(void) +{ + // LED strip general initialization, according to your led board design + led_strip_config_t strip_config = { + .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal + }; + + // LED strip backend configuration: SPI + led_strip_spi_config_t spi_config = { + .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs + .spi_bus = SPI2_HOST, // SPI bus ID + }; + + // LED Strip object handle + led_strip_handle_t led_strip; + ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip)); + ESP_LOGI(TAG, "Created LED strip object with SPI backend"); + return led_strip; +} + +void app_main(void) +{ + led_strip_handle_t led_strip = configure_led(); + bool led_on_off = false; + + ESP_LOGI(TAG, "Start blinking LED strip"); + while (1) { + if (led_on_off) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5)); + } + /* Refresh the strip to send data */ + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); + ESP_LOGI(TAG, "LED ON!"); + } else { + /* Set all LED off to clear all pixels */ + ESP_ERROR_CHECK(led_strip_clear(led_strip)); + ESP_LOGI(TAG, "LED OFF!"); + } + + led_on_off = !led_on_off; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/Source/base-fw/managed_components/espressif__led_strip/idf_component.yml b/Source/base-fw/managed_components/espressif__led_strip/idf_component.yml new file mode 100644 index 0000000..e973e89 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/idf_component.yml @@ -0,0 +1,6 @@ +dependencies: + idf: + version: '>=5.0' +description: Driver for Addressable LED Strip (WS2812, etc) +url: https://github.com/espressif/idf-extra-components/tree/master/led_strip +version: 2.4.3 diff --git a/Source/base-fw/managed_components/espressif__led_strip/include/led_strip.h b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip.h new file mode 100644 index 0000000..234b637 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip.h @@ -0,0 +1,91 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "led_strip_rmt.h" +#include "led_strip_spi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set RGB for a specific pixel + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * + * @return + * - ESP_OK: Set RGB for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters + * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred + */ +esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); + +/** + * @brief Set RGBW for a specific pixel + * + * @note Only call this function if your led strip does have the white component (e.g. SK6812-RGBW) + * @note Also see `led_strip_set_pixel` if you only want to specify the RGB part of the color and bypass the white component + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * @param white: separate white component + * + * @return + * - ESP_OK: Set RGBW color for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument + * - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred + */ +esp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white); + +/** + * @brief Refresh memory colors to LEDs + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Refresh successfully + * - ESP_FAIL: Refresh failed because some other error occurred + * + * @note: + * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. + */ +esp_err_t led_strip_refresh(led_strip_handle_t strip); + +/** + * @brief Clear LED strip (turn off all LEDs) + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Clear LEDs successfully + * - ESP_FAIL: Clear LEDs failed because some other error occurred + */ +esp_err_t led_strip_clear(led_strip_handle_t strip); + +/** + * @brief Free LED strip resources + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ +esp_err_t led_strip_del(led_strip_handle_t strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_rmt.h b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_rmt.h new file mode 100644 index 0000000..69ff7cd --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_rmt.h @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "driver/rmt_types.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED Strip RMT specific configuration + */ +typedef struct { + rmt_clock_source_t clk_src; /*!< RMT clock source */ + uint32_t resolution_hz; /*!< RMT tick resolution, if set to zero, a default resolution (10MHz) will be applied */ + size_t mem_block_symbols; /*!< How many RMT symbols can one RMT channel hold at one time. Set to 0 will fallback to use the default size. */ + struct { + uint32_t with_dma: 1; /*!< Use DMA to transmit data */ + } flags; +} led_strip_rmt_config_t; + +/** + * @brief Create LED strip based on RMT TX channel + * + * @param led_config LED strip configuration + * @param rmt_config RMT specific configuration + * @param ret_strip Returned LED strip handle + * @return + * - ESP_OK: create LED strip handle successfully + * - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument + * - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory + * - ESP_FAIL: create LED strip handle failed because some other error + */ +esp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_spi.h b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_spi.h new file mode 100644 index 0000000..6b5b1dc --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_spi.h @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "driver/spi_master.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED Strip SPI specific configuration + */ +typedef struct { + spi_clock_source_t clk_src; /*!< SPI clock source */ + spi_host_device_t spi_bus; /*!< SPI bus ID. Which buses are available depends on the specific chip */ + struct { + uint32_t with_dma: 1; /*!< Use DMA to transmit data */ + } flags; +} led_strip_spi_config_t; + +/** + * @brief Create LED strip based on SPI MOSI channel + * @note Although only the MOSI line is used for generating the signal, the whole SPI bus can't be used for other purposes. + * + * @param led_config LED strip configuration + * @param spi_config SPI specific configuration + * @param ret_strip Returned LED strip handle + * @return + * - ESP_OK: create LED strip handle successfully + * - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument + * - ESP_ERR_NOT_SUPPORTED: create LED strip handle failed because of unsupported configuration + * - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory + * - ESP_FAIL: create LED strip handle failed because some other error + */ +esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_types.h b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_types.h new file mode 100644 index 0000000..d5b8052 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/include/led_strip_types.h @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED strip pixel format + */ +typedef enum { + LED_PIXEL_FORMAT_GRB, /*!< Pixel format: GRB */ + LED_PIXEL_FORMAT_GRBW, /*!< Pixel format: GRBW */ + LED_PIXEL_FORMAT_INVALID /*!< Invalid pixel format */ +} led_pixel_format_t; + +/** + * @brief LED strip model + * @note Different led model may have different timing parameters, so we need to distinguish them. + */ +typedef enum { + LED_MODEL_WS2812, /*!< LED strip model: WS2812 */ + LED_MODEL_SK6812, /*!< LED strip model: SK6812 */ + LED_MODEL_INVALID /*!< Invalid LED strip model */ +} led_model_t; + +/** + * @brief LED strip handle + */ +typedef struct led_strip_t *led_strip_handle_t; + +/** + * @brief LED Strip Configuration + */ +typedef struct { + int strip_gpio_num; /*!< GPIO number that used by LED strip */ + uint32_t max_leds; /*!< Maximum LEDs in a single strip */ + led_pixel_format_t led_pixel_format; /*!< LED pixel format */ + led_model_t led_model; /*!< LED model */ + + struct { + uint32_t invert_out: 1; /*!< Invert output signal */ + } flags; +} led_strip_config_t; + +#ifdef __cplusplus +} +#endif diff --git a/Source/base-fw/managed_components/espressif__led_strip/interface/led_strip_interface.h b/Source/base-fw/managed_components/espressif__led_strip/interface/led_strip_interface.h new file mode 100644 index 0000000..3de4c27 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/interface/led_strip_interface.h @@ -0,0 +1,95 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct led_strip_t led_strip_t; /*!< Type of LED strip */ + +/** + * @brief LED strip interface definition + */ +struct led_strip_t { + /** + * @brief Set RGB for a specific pixel + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * + * @return + * - ESP_OK: Set RGB for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters + * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred + */ + esp_err_t (*set_pixel)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); + + /** + * @brief Set RGBW for a specific pixel. Similar to `set_pixel` but also set the white component + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * @param white: separate white component + * + * @return + * - ESP_OK: Set RGBW color for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument + * - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred + */ + esp_err_t (*set_pixel_rgbw)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white); + + /** + * @brief Refresh memory colors to LEDs + * + * @param strip: LED strip + * @param timeout_ms: timeout value for refreshing task + * + * @return + * - ESP_OK: Refresh successfully + * - ESP_FAIL: Refresh failed because some other error occurred + * + * @note: + * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. + */ + esp_err_t (*refresh)(led_strip_t *strip); + + /** + * @brief Clear LED strip (turn off all LEDs) + * + * @param strip: LED strip + * @param timeout_ms: timeout value for clearing task + * + * @return + * - ESP_OK: Clear LEDs successfully + * - ESP_FAIL: Clear LEDs failed because some other error occurred + */ + esp_err_t (*clear)(led_strip_t *strip); + + /** + * @brief Free LED strip resources + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ + esp_err_t (*del)(led_strip_t *strip); +}; + +#ifdef __cplusplus +} +#endif diff --git a/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_api.c b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_api.c new file mode 100644 index 0000000..4a6a6c3 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_api.c @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "esp_log.h" +#include "esp_check.h" +#include "led_strip.h" +#include "led_strip_interface.h" + +static const char *TAG = "led_strip"; + +esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->set_pixel(strip, index, red, green, blue); +} + +esp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->set_pixel_rgbw(strip, index, red, green, blue, white); +} + +esp_err_t led_strip_refresh(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->refresh(strip); +} + +esp_err_t led_strip_clear(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->clear(strip); +} + +esp_err_t led_strip_del(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->del(strip); +} diff --git a/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c new file mode 100644 index 0000000..1cbf0e4 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c @@ -0,0 +1,164 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "driver/rmt_tx.h" +#include "led_strip.h" +#include "led_strip_interface.h" +#include "led_strip_rmt_encoder.h" + +#define LED_STRIP_RMT_DEFAULT_RESOLUTION 10000000 // 10MHz resolution +#define LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE 4 +// the memory size of each RMT channel, in words (4 bytes) +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 +#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 64 +#else +#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 48 +#endif + +static const char *TAG = "led_strip_rmt"; + +typedef struct { + led_strip_t base; + rmt_channel_handle_t rmt_chan; + rmt_encoder_handle_t strip_encoder; + uint32_t strip_len; + uint8_t bytes_per_pixel; + uint8_t pixel_buf[]; +} led_strip_rmt_obj; + +static esp_err_t led_strip_rmt_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + uint32_t start = index * rmt_strip->bytes_per_pixel; + // In thr order of GRB, as LED strip like WS2812 sends out pixels in this order + rmt_strip->pixel_buf[start + 0] = green & 0xFF; + rmt_strip->pixel_buf[start + 1] = red & 0xFF; + rmt_strip->pixel_buf[start + 2] = blue & 0xFF; + if (rmt_strip->bytes_per_pixel > 3) { + rmt_strip->pixel_buf[start + 3] = 0; + } + return ESP_OK; +} + +static esp_err_t led_strip_rmt_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + ESP_RETURN_ON_FALSE(rmt_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, "wrong LED pixel format, expected 4 bytes per pixel"); + uint8_t *buf_start = rmt_strip->pixel_buf + index * 4; + // SK6812 component order is GRBW + *buf_start = green & 0xFF; + *++buf_start = red & 0xFF; + *++buf_start = blue & 0xFF; + *++buf_start = white & 0xFF; + return ESP_OK; +} + +static esp_err_t led_strip_rmt_refresh(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + rmt_transmit_config_t tx_conf = { + .loop_count = 0, + }; + + ESP_RETURN_ON_ERROR(rmt_enable(rmt_strip->rmt_chan), TAG, "enable RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_transmit(rmt_strip->rmt_chan, rmt_strip->strip_encoder, rmt_strip->pixel_buf, + rmt_strip->strip_len * rmt_strip->bytes_per_pixel, &tx_conf), TAG, "transmit pixels by RMT failed"); + ESP_RETURN_ON_ERROR(rmt_tx_wait_all_done(rmt_strip->rmt_chan, -1), TAG, "flush RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_disable(rmt_strip->rmt_chan), TAG, "disable RMT channel failed"); + return ESP_OK; +} + +static esp_err_t led_strip_rmt_clear(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + // Write zero to turn off all leds + memset(rmt_strip->pixel_buf, 0, rmt_strip->strip_len * rmt_strip->bytes_per_pixel); + return led_strip_rmt_refresh(strip); +} + +static esp_err_t led_strip_rmt_del(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_ERROR(rmt_del_channel(rmt_strip->rmt_chan), TAG, "delete RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_del_encoder(rmt_strip->strip_encoder), TAG, "delete strip encoder failed"); + free(rmt_strip); + return ESP_OK; +} + +esp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip) +{ + led_strip_rmt_obj *rmt_strip = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(led_config && rmt_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led_pixel_format"); + uint8_t bytes_per_pixel = 3; + if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) { + bytes_per_pixel = 4; + } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) { + bytes_per_pixel = 3; + } else { + assert(false); + } + rmt_strip = calloc(1, sizeof(led_strip_rmt_obj) + led_config->max_leds * bytes_per_pixel); + ESP_GOTO_ON_FALSE(rmt_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for rmt strip"); + uint32_t resolution = rmt_config->resolution_hz ? rmt_config->resolution_hz : LED_STRIP_RMT_DEFAULT_RESOLUTION; + + // for backward compatibility, if the user does not set the clk_src, use the default value + rmt_clock_source_t clk_src = RMT_CLK_SRC_DEFAULT; + if (rmt_config->clk_src) { + clk_src = rmt_config->clk_src; + } + size_t mem_block_symbols = LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS; + // override the default value if the user sets it + if (rmt_config->mem_block_symbols) { + mem_block_symbols = rmt_config->mem_block_symbols; + } + rmt_tx_channel_config_t rmt_chan_config = { + .clk_src = clk_src, + .gpio_num = led_config->strip_gpio_num, + .mem_block_symbols = mem_block_symbols, + .resolution_hz = resolution, + .trans_queue_depth = LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE, + .flags.with_dma = rmt_config->flags.with_dma, + .flags.invert_out = led_config->flags.invert_out, + }; + ESP_GOTO_ON_ERROR(rmt_new_tx_channel(&rmt_chan_config, &rmt_strip->rmt_chan), err, TAG, "create RMT TX channel failed"); + + led_strip_encoder_config_t strip_encoder_conf = { + .resolution = resolution, + .led_model = led_config->led_model + }; + ESP_GOTO_ON_ERROR(rmt_new_led_strip_encoder(&strip_encoder_conf, &rmt_strip->strip_encoder), err, TAG, "create LED strip encoder failed"); + + + rmt_strip->bytes_per_pixel = bytes_per_pixel; + rmt_strip->strip_len = led_config->max_leds; + rmt_strip->base.set_pixel = led_strip_rmt_set_pixel; + rmt_strip->base.set_pixel_rgbw = led_strip_rmt_set_pixel_rgbw; + rmt_strip->base.refresh = led_strip_rmt_refresh; + rmt_strip->base.clear = led_strip_rmt_clear; + rmt_strip->base.del = led_strip_rmt_del; + + *ret_strip = &rmt_strip->base; + return ESP_OK; +err: + if (rmt_strip) { + if (rmt_strip->rmt_chan) { + rmt_del_channel(rmt_strip->rmt_chan); + } + if (rmt_strip->strip_encoder) { + rmt_del_encoder(rmt_strip->strip_encoder); + } + free(rmt_strip); + } + return ret; +} diff --git a/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c new file mode 100644 index 0000000..d352ac0 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c @@ -0,0 +1,146 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "led_strip_rmt_encoder.h" + +static const char *TAG = "led_rmt_encoder"; + +typedef struct { + rmt_encoder_t base; + rmt_encoder_t *bytes_encoder; + rmt_encoder_t *copy_encoder; + int state; + rmt_symbol_word_t reset_code; +} rmt_led_strip_encoder_t; + +static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder; + rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder; + rmt_encode_state_t session_state = 0; + rmt_encode_state_t state = 0; + size_t encoded_symbols = 0; + switch (led_encoder->state) { + case 0: // send RGB data + encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state); + if (session_state & RMT_ENCODING_COMPLETE) { + led_encoder->state = 1; // switch to next state when current encoding session finished + } + if (session_state & RMT_ENCODING_MEM_FULL) { + state |= RMT_ENCODING_MEM_FULL; + goto out; // yield if there's no free space for encoding artifacts + } + // fall-through + case 1: // send reset code + encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code, + sizeof(led_encoder->reset_code), &session_state); + if (session_state & RMT_ENCODING_COMPLETE) { + led_encoder->state = 0; // back to the initial encoding session + state |= RMT_ENCODING_COMPLETE; + } + if (session_state & RMT_ENCODING_MEM_FULL) { + state |= RMT_ENCODING_MEM_FULL; + goto out; // yield if there's no free space for encoding artifacts + } + } +out: + *ret_state = state; + return encoded_symbols; +} + +static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_del_encoder(led_encoder->bytes_encoder); + rmt_del_encoder(led_encoder->copy_encoder); + free(led_encoder); + return ESP_OK; +} + +static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_reset(led_encoder->bytes_encoder); + rmt_encoder_reset(led_encoder->copy_encoder); + led_encoder->state = 0; + return ESP_OK; +} + +esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder) +{ + esp_err_t ret = ESP_OK; + rmt_led_strip_encoder_t *led_encoder = NULL; + ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(config->led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led model"); + led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t)); + ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder"); + led_encoder->base.encode = rmt_encode_led_strip; + led_encoder->base.del = rmt_del_led_strip_encoder; + led_encoder->base.reset = rmt_led_strip_encoder_reset; + rmt_bytes_encoder_config_t bytes_encoder_config; + if (config->led_model == LED_MODEL_SK6812) { + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.6 * config->resolution / 1000000, // T1H=0.6us + .level1 = 0, + .duration1 = 0.6 * config->resolution / 1000000, // T1L=0.6us + }, + .flags.msb_first = 1 // SK6812 transfer bit order: G7...G0R7...R0B7...B0(W7...W0) + }; + } else if (config->led_model == LED_MODEL_WS2812) { + // different led strip might have its own timing requirements, following parameter is for WS2812 + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us + .level1 = 0, + .duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us + }, + .flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0 + }; + } else { + assert(false); + } + ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed"); + rmt_copy_encoder_config_t copy_encoder_config = {}; + ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed"); + + uint32_t reset_ticks = config->resolution / 1000000 * 50 / 2; // reset code duration defaults to 50us + led_encoder->reset_code = (rmt_symbol_word_t) { + .level0 = 0, + .duration0 = reset_ticks, + .level1 = 0, + .duration1 = reset_ticks, + }; + *ret_encoder = &led_encoder->base; + return ESP_OK; +err: + if (led_encoder) { + if (led_encoder->bytes_encoder) { + rmt_del_encoder(led_encoder->bytes_encoder); + } + if (led_encoder->copy_encoder) { + rmt_del_encoder(led_encoder->copy_encoder); + } + free(led_encoder); + } + return ret; +} diff --git a/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h new file mode 100644 index 0000000..ba71e60 --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "driver/rmt_encoder.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Type of led strip encoder configuration + */ +typedef struct { + uint32_t resolution; /*!< Encoder resolution, in Hz */ + led_model_t led_model; /*!< LED model */ +} led_strip_encoder_config_t; + +/** + * @brief Create RMT encoder for encoding LED strip pixels into RMT symbols + * + * @param[in] config Encoder configuration + * @param[out] ret_encoder Returned encoder handle + * @return + * - ESP_ERR_INVALID_ARG for any invalid arguments + * - ESP_ERR_NO_MEM out of memory when creating led strip encoder + * - ESP_OK if creating encoder successfully + */ +esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder); + +#ifdef __cplusplus +} +#endif diff --git a/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_spi_dev.c b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_spi_dev.c new file mode 100644 index 0000000..12ea8fb --- /dev/null +++ b/Source/base-fw/managed_components/espressif__led_strip/src/led_strip_spi_dev.c @@ -0,0 +1,209 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "esp_rom_gpio.h" +#include "soc/spi_periph.h" +#include "led_strip.h" +#include "led_strip_interface.h" +#include "hal/spi_hal.h" + +#define LED_STRIP_SPI_DEFAULT_RESOLUTION (2.5 * 1000 * 1000) // 2.5MHz resolution +#define LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE 4 + +#define SPI_BYTES_PER_COLOR_BYTE 3 +#define SPI_BITS_PER_COLOR_BYTE (SPI_BYTES_PER_COLOR_BYTE * 8) + +static const char *TAG = "led_strip_spi"; + +typedef struct { + led_strip_t base; + spi_host_device_t spi_host; + spi_device_handle_t spi_device; + uint32_t strip_len; + uint8_t bytes_per_pixel; + uint8_t pixel_buf[]; +} led_strip_spi_obj; + +// please make sure to zero-initialize the buf before calling this function +static void __led_strip_spi_bit(uint8_t data, uint8_t *buf) +{ + // Each color of 1 bit is represented by 3 bits of SPI, low_level:100 ,high_level:110 + // So a color byte occupies 3 bytes of SPI. + *(buf + 2) |= data & BIT(0) ? BIT(2) | BIT(1) : BIT(2); + *(buf + 2) |= data & BIT(1) ? BIT(5) | BIT(4) : BIT(5); + *(buf + 2) |= data & BIT(2) ? BIT(7) : 0x00; + *(buf + 1) |= BIT(0); + *(buf + 1) |= data & BIT(3) ? BIT(3) | BIT(2) : BIT(3); + *(buf + 1) |= data & BIT(4) ? BIT(6) | BIT(5) : BIT(6); + *(buf + 0) |= data & BIT(5) ? BIT(1) | BIT(0) : BIT(1); + *(buf + 0) |= data & BIT(6) ? BIT(4) | BIT(3) : BIT(4); + *(buf + 0) |= data & BIT(7) ? BIT(7) | BIT(6) : BIT(7); +} + +static esp_err_t led_strip_spi_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + // LED_PIXEL_FORMAT_GRB takes 72bits(9bytes) + uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; + memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]); + __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]); + __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]); + if (spi_strip->bytes_per_pixel > 3) { + __led_strip_spi_bit(0, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]); + } + return ESP_OK; +} + +static esp_err_t led_strip_spi_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + ESP_RETURN_ON_FALSE(spi_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, "wrong LED pixel format, expected 4 bytes per pixel"); + // LED_PIXEL_FORMAT_GRBW takes 96bits(12bytes) + uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; + // SK6812 component order is GRBW + memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]); + __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]); + __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]); + __led_strip_spi_bit(white, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]); + + return ESP_OK; +} + +static esp_err_t led_strip_spi_refresh(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + spi_transaction_t tx_conf; + memset(&tx_conf, 0, sizeof(tx_conf)); + + tx_conf.length = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BITS_PER_COLOR_BYTE; + tx_conf.tx_buffer = spi_strip->pixel_buf; + tx_conf.rx_buffer = NULL; + ESP_RETURN_ON_ERROR(spi_device_transmit(spi_strip->spi_device, &tx_conf), TAG, "transmit pixels by SPI failed"); + + return ESP_OK; +} + +static esp_err_t led_strip_spi_clear(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + //Write zero to turn off all leds + memset(spi_strip->pixel_buf, 0, spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + uint8_t *buf = spi_strip->pixel_buf; + for (int index = 0; index < spi_strip->strip_len * spi_strip->bytes_per_pixel; index++) { + __led_strip_spi_bit(0, buf); + buf += SPI_BYTES_PER_COLOR_BYTE; + } + + return led_strip_spi_refresh(strip); +} + +static esp_err_t led_strip_spi_del(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + + ESP_RETURN_ON_ERROR(spi_bus_remove_device(spi_strip->spi_device), TAG, "delete spi device failed"); + ESP_RETURN_ON_ERROR(spi_bus_free(spi_strip->spi_host), TAG, "free spi bus failed"); + + free(spi_strip); + return ESP_OK; +} + +esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip) +{ + led_strip_spi_obj *spi_strip = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(led_config && spi_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led_pixel_format"); + uint8_t bytes_per_pixel = 3; + if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) { + bytes_per_pixel = 4; + } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) { + bytes_per_pixel = 3; + } else { + assert(false); + } + uint32_t mem_caps = MALLOC_CAP_DEFAULT; + if (spi_config->flags.with_dma) { + // DMA buffer must be placed in internal SRAM + mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; + } + spi_strip = heap_caps_calloc(1, sizeof(led_strip_spi_obj) + led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, mem_caps); + + ESP_GOTO_ON_FALSE(spi_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for spi strip"); + + spi_strip->spi_host = spi_config->spi_bus; + // for backward compatibility, if the user does not set the clk_src, use the default value + spi_clock_source_t clk_src = SPI_CLK_SRC_DEFAULT; + if (spi_config->clk_src) { + clk_src = spi_config->clk_src; + } + + spi_bus_config_t spi_bus_cfg = { + .mosi_io_num = led_config->strip_gpio_num, + //Only use MOSI to generate the signal, set -1 when other pins are not used. + .miso_io_num = -1, + .sclk_io_num = -1, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, + }; + ESP_GOTO_ON_ERROR(spi_bus_initialize(spi_strip->spi_host, &spi_bus_cfg, spi_config->flags.with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED), err, TAG, "create SPI bus failed"); + + if (led_config->flags.invert_out == true) { + esp_rom_gpio_connect_out_signal(led_config->strip_gpio_num, spi_periph_signal[spi_strip->spi_host].spid_out, true, false); + } + + spi_device_interface_config_t spi_dev_cfg = { + .clock_source = clk_src, + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .clock_speed_hz = LED_STRIP_SPI_DEFAULT_RESOLUTION, + .mode = 0, + //set -1 when CS is not used + .spics_io_num = -1, + .queue_size = LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE, + }; + + ESP_GOTO_ON_ERROR(spi_bus_add_device(spi_strip->spi_host, &spi_dev_cfg, &spi_strip->spi_device), err, TAG, "Failed to add spi device"); + + int clock_resolution_khz = 0; + spi_device_get_actual_freq(spi_strip->spi_device, &clock_resolution_khz); + // TODO: ideally we should decide the SPI_BYTES_PER_COLOR_BYTE by the real clock resolution + // But now, let's fixed the resolution, the downside is, we don't support a clock source whose frequency is not multiple of LED_STRIP_SPI_DEFAULT_RESOLUTION + ESP_GOTO_ON_FALSE(clock_resolution_khz == LED_STRIP_SPI_DEFAULT_RESOLUTION / 1000, ESP_ERR_NOT_SUPPORTED, err, + TAG, "unsupported clock resolution:%dKHz", clock_resolution_khz); + + spi_strip->bytes_per_pixel = bytes_per_pixel; + spi_strip->strip_len = led_config->max_leds; + spi_strip->base.set_pixel = led_strip_spi_set_pixel; + spi_strip->base.set_pixel_rgbw = led_strip_spi_set_pixel_rgbw; + spi_strip->base.refresh = led_strip_spi_refresh; + spi_strip->base.clear = led_strip_spi_clear; + spi_strip->base.del = led_strip_spi_del; + + *ret_strip = &spi_strip->base; + return ESP_OK; +err: + if (spi_strip) { + if (spi_strip->spi_device) { + spi_bus_remove_device(spi_strip->spi_device); + } + if (spi_strip->spi_host) { + spi_bus_free(spi_strip->spi_host); + } + free(spi_strip); + } + return ret; +} diff --git a/Source/base-fw/webserver-assets/js/app.js b/Source/base-fw/webserver-assets/js/app.js index 6ea241f..c0a29f0 100644 --- a/Source/base-fw/webserver-assets/js/app.js +++ b/Source/base-fw/webserver-assets/js/app.js @@ -67,7 +67,7 @@ let allsymbols = [ ]; let alladdresses = [ - { symbolIndexes: [10, 15, 20, 26, 28, 13, 18, 32, 30], name: 'Earth' }, + { symbolIndexes: [10, 15, 20, 26, 28, 13, 18, 32, 30], name: 'Earth', wormhole: 5 }, { symbolIndexes: [3, 34, 12, 7, 19, 6, 29], name: 'Jungle Planet' }, { symbolIndexes: [7, 8, 14, 17, 32, 23, 33], name: 'Desert Planet' }, { symbolIndexes: [15, 35, 8, 30, 31, 29, 33], name: 'Hoth' }, @@ -80,7 +80,6 @@ let alladdresses = [ { symbolIndexes: [5, 17, 23, 25, 1, 28, 33], name: 'Novus Colony Planet' }, { symbolIndexes: [6, 26, 28, 10, 31, 12, 33], name: 'Last Planet' }, { symbolIndexes: [5, 13, 34, 18, 31, 7, 4], name: 'Wormhole', wormhole: 3 }, - { symbolIndexes: [2, 10, 35, 9, 29, 23, 15], name: 'Hell', wormhole: 2 }, // { symbolIndexes: [1, 36, 2, 35, 3, 34], name: 'Test #1' }, ]; diff --git a/Source/common/components/SGU/HelperMacro.h b/Source/common/components/SGU/HelperMacro.h new file mode 100644 index 0000000..973f806 --- /dev/null +++ b/Source/common/components/SGU/HelperMacro.h @@ -0,0 +1,11 @@ +#ifndef _HELPERMACRO_H_ +#define _HELPERMACRO_H_ + +#include + +#define HELPERMACRO_LEDLOGADJ(_valuePerc,_maxPerc) ((pow(10.0f, _valuePerc) - 1.0f)/9.0f*_maxPerc) + +#define HELPERMACRO_MIN(a,b) (((a)<(b))?(a):(b)) +#define HELPERMACRO_MAX(a,b) (((a)>(b))?(a):(b)) + +#endif \ No newline at end of file diff --git a/Source/common/components/SGU/SGUBRProtocol.h b/Source/common/components/SGU/SGUBRProtocol.h index 0c3d201..2c71775 100644 --- a/Source/common/components/SGU/SGUBRProtocol.h +++ b/Source/common/components/SGU/SGUBRProtocol.h @@ -31,6 +31,8 @@ typedef enum SGUBRPROTOCOL_ECHEVRONANIM_FadeOut = 1, SGUBRPROTOCOL_ECHEVRONANIM_ErrorToWhite = 2, SGUBRPROTOCOL_ECHEVRONANIM_ErrorToOff = 3, + SGUBRPROTOCOL_ECHEVRONANIM_AllSymbolsOn = 4, + SGUBRPROTOCOL_ECHEVRONANIM_Suicide = 5, SGUBRPROTOCOL_ECHEVRONANIM_Count } SGUBRPROTOCOL_ECHEVRONANIM; diff --git a/Source/common/components/SGU/SGUHelper.c b/Source/common/components/SGU/SGUHelper.c index 2ad4e53..7e9bb44 100644 --- a/Source/common/components/SGU/SGUHelper.c +++ b/Source/common/components/SGU/SGUHelper.c @@ -1,6 +1,6 @@ #include "SGUHelper.h" -double SGUHELPER_LEDIndexToDeg(int ledIndex) +double SGUHELPER_LEDIndexToDeg(int32_t ledIndex) { if (ledIndex < 0 || ledIndex >= 45) return 0.0d; @@ -11,20 +11,25 @@ double SGUHELPER_LEDIndexToDeg(int ledIndex) return (ledIndex / 5) * _1of9 + (((ledIndex % 5) != 0) ? 10 + ((ledIndex % 5)-1) * _1of54 : 0); } -int SGUHELPER_ChevronIndexToLedIndex(int chevronIndexOneBased) +int32_t SGUHELPER_ChevronIndexToLedIndex(int32_t chevronIndexOneBased) { if (chevronIndexOneBased < 1 || chevronIndexOneBased > 9) return 0; - int chevronIndex0Based = chevronIndexOneBased - 1; + const int32_t chevronIndex0Based = chevronIndexOneBased - 1; return chevronIndex0Based * 5; } -int SGUHELPER_SymbolIndexToLedIndex(int symbolIndexOneBased) +int32_t SGUHELPER_SymbolIndexToLedIndex(int32_t symbolIndexOneBased) { if (symbolIndexOneBased < 1 || symbolIndexOneBased > 36) return 0; - int symbolIndex0Based = symbolIndexOneBased - 1; + const int32_t symbolIndex0Based = symbolIndexOneBased - 1; return symbolIndexOneBased + (symbolIndex0Based / 4); } + +bool SGUHELPER_IsLEDIndexChevron(int32_t ledIndex) +{ + return ((ledIndex % 5) == 0); +} \ No newline at end of file diff --git a/Source/common/components/SGU/SGUHelper.h b/Source/common/components/SGU/SGUHelper.h index 42713b0..325f3a7 100644 --- a/Source/common/components/SGU/SGUHelper.h +++ b/Source/common/components/SGU/SGUHelper.h @@ -5,11 +5,16 @@ extern "C" { #endif -double SGUHELPER_LEDIndexToDeg(int ledIndex); +#include +#include -int SGUHELPER_ChevronIndexToLedIndex(int chevronIndexOneBased); +double SGUHELPER_LEDIndexToDeg(int32_t ledIndex); -int SGUHELPER_SymbolIndexToLedIndex(int symbolIndexOneBased); +int32_t SGUHELPER_ChevronIndexToLedIndex(int32_t chevronIndexOneBased); + +int32_t SGUHELPER_SymbolIndexToLedIndex(int32_t symbolIndexOneBased); + +bool SGUHELPER_IsLEDIndexChevron(int32_t ledIndex); #ifdef __cplusplus } diff --git a/Source/common/components/led_strip/CMakeLists.txt b/Source/common/components/led_strip/CMakeLists.txt deleted file mode 100644 index fe4ca41..0000000 --- a/Source/common/components/led_strip/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -idf_component_register(SRCS "led_strip_rmt_ws2812.c" - INCLUDE_DIRS "include" - PRIV_REQUIRES "driver" - ) diff --git a/Source/common/components/led_strip/README.md b/Source/common/components/led_strip/README.md deleted file mode 100644 index abf0789..0000000 --- a/Source/common/components/led_strip/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# LED Strip Component - -This directory contains an implementation for addressable LEDs using the RMT peripheral. - -It's compatible with: - -* [WS2812](http://www.world-semi.com/Certifications/WS2812B.html) -* SK68XX - -This component is used as part of the following ESP-IDF examples: -- [Blink Example](../../get-started/blink). -- [LED Strip Example](../../peripherals/rmt/led_strip). - -To learn more about how to use this component, please check API Documentation from header file [led_strip.h](./include/led_strip.h). - -Please note that this component is not considered to be a part of ESP-IDF stable API. It may change and it may be removed in the future releases. diff --git a/Source/common/components/led_strip/include/led_strip.h b/Source/common/components/led_strip/include/led_strip.h deleted file mode 100644 index 2e1d633..0000000 --- a/Source/common/components/led_strip/include/led_strip.h +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "esp_err.h" - -/** -* @brief LED Strip Type -* -*/ -typedef struct led_strip_s led_strip_t; - -/** -* @brief LED Strip Device Type -* -*/ -typedef void *led_strip_dev_t; - -/** -* @brief Declare of LED Strip Type -* -*/ -struct led_strip_s { - /** - * @brief Set RGB for a specific pixel - * - * @param strip: LED strip - * @param index: index of pixel to set - * @param red: red part of color - * @param green: green part of color - * @param blue: blue part of color - * - * @return - * - ESP_OK: Set RGB for a specific pixel successfully - * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters - * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred - */ - esp_err_t (*set_pixel)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); - - /** - * @brief Refresh memory colors to LEDs - * - * @param strip: LED strip - * @param timeout_ms: timeout value for refreshing task - * - * @return - * - ESP_OK: Refresh successfully - * - ESP_ERR_TIMEOUT: Refresh failed because of timeout - * - ESP_FAIL: Refresh failed because some other error occurred - * - * @note: - * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. - */ - esp_err_t (*refresh)(led_strip_t *strip, uint32_t timeout_ms); - - /** - * @brief Clear LED strip (turn off all LEDs) - * - * @param strip: LED strip - * @param timeout_ms: timeout value for clearing task - * - * @return - * - ESP_OK: Clear LEDs successfully - * - ESP_ERR_TIMEOUT: Clear LEDs failed because of timeout - * - ESP_FAIL: Clear LEDs failed because some other error occurred - */ - esp_err_t (*clear)(led_strip_t *strip, uint32_t timeout_ms); - - /** - * @brief Free LED strip resources - * - * @param strip: LED strip - * - * @return - * - ESP_OK: Free resources successfully - * - ESP_FAIL: Free resources failed because error occurred - */ - esp_err_t (*del)(led_strip_t *strip); -}; - -/** -* @brief LED Strip Configuration Type -* -*/ -typedef struct { - uint32_t max_leds; /*!< Maximum LEDs in a single strip */ - led_strip_dev_t dev; /*!< LED strip device (e.g. RMT channel, PWM channel, etc) */ -} led_strip_config_t; - -/** - * @brief Default configuration for LED strip - * - */ -#define LED_STRIP_DEFAULT_CONFIG(number, dev_hdl) \ - { \ - .max_leds = number, \ - .dev = dev_hdl, \ - } - -/** -* @brief Install a new ws2812 driver (based on RMT peripheral) -* -* @param config: LED strip configuration -* @return -* LED strip instance or NULL -*/ -led_strip_t *led_strip_new_rmt_ws2812(const led_strip_config_t *config); - -/** - * @brief Init the RMT peripheral and LED strip configuration. - * - * @param[in] channel: RMT peripheral channel number. - * @param[in] gpio: GPIO number for the RMT data output. - * @param[in] led_num: number of addressable LEDs. - * @return - * LED strip instance or NULL - */ -led_strip_t * led_strip_init(uint8_t channel, uint8_t gpio, uint16_t led_num); - -/** - * @brief Denit the RMT peripheral. - * - * @param[in] strip: LED strip - * @return - * - ESP_OK - * - ESP_FAIL - */ -esp_err_t led_strip_denit(led_strip_t *strip); - -#ifdef __cplusplus -} -#endif diff --git a/Source/common/components/led_strip/led_strip_rmt_ws2812.c b/Source/common/components/led_strip/led_strip_rmt_ws2812.c deleted file mode 100644 index 4beaf78..0000000 --- a/Source/common/components/led_strip/led_strip_rmt_ws2812.c +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#include -#include -#include -#include "esp_log.h" -#include "esp_attr.h" -#include "led_strip.h" -#include "driver/rmt.h" - -#define RMT_TX_CHANNEL RMT_CHANNEL_0 - -static const char *TAG = "ws2812"; -#define STRIP_CHECK(a, str, goto_tag, ret_value, ...) \ - do \ - { \ - if (!(a)) \ - { \ - ESP_LOGE(TAG, "%s(%d): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ - ret = ret_value; \ - goto goto_tag; \ - } \ - } while (0) - -#define WS2812_T0H_NS (350) -#define WS2812_T0L_NS (1000) -#define WS2812_T1H_NS (1000) -#define WS2812_T1L_NS (350) -#define WS2812_RESET_US (280) - -static uint32_t ws2812_t0h_ticks = 0; -static uint32_t ws2812_t1h_ticks = 0; -static uint32_t ws2812_t0l_ticks = 0; -static uint32_t ws2812_t1l_ticks = 0; - -typedef struct { - led_strip_t parent; - rmt_channel_t rmt_channel; - uint32_t strip_len; - uint8_t buffer[0]; -} ws2812_t; - -/** - * @brief Conver RGB data to RMT format. - * - * @note For WS2812, R,G,B each contains 256 different choices (i.e. uint8_t) - * - * @param[in] src: source data, to converted to RMT format - * @param[in] dest: place where to store the convert result - * @param[in] src_size: size of source data - * @param[in] wanted_num: number of RMT items that want to get - * @param[out] translated_size: number of source data that got converted - * @param[out] item_num: number of RMT items which are converted from source data - */ -static void IRAM_ATTR ws2812_rmt_adapter(const void *src, rmt_item32_t *dest, size_t src_size, - size_t wanted_num, size_t *translated_size, size_t *item_num) -{ - if (src == NULL || dest == NULL) { - *translated_size = 0; - *item_num = 0; - return; - } - const rmt_item32_t bit0 = {{{ ws2812_t0h_ticks, 1, ws2812_t0l_ticks, 0 }}}; //Logical 0 - const rmt_item32_t bit1 = {{{ ws2812_t1h_ticks, 1, ws2812_t1l_ticks, 0 }}}; //Logical 1 - size_t size = 0; - size_t num = 0; - uint8_t *psrc = (uint8_t *)src; - rmt_item32_t *pdest = dest; - while (size < src_size && num < wanted_num) { - for (int i = 0; i < 8; i++) { - // MSB first - if (*psrc & (1 << (7 - i))) { - pdest->val = bit1.val; - } else { - pdest->val = bit0.val; - } - num++; - pdest++; - } - size++; - psrc++; - } - *translated_size = size; - *item_num = num; -} - -static esp_err_t ws2812_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) -{ - esp_err_t ret = ESP_OK; - ws2812_t *ws2812 = __containerof(strip, ws2812_t, parent); - STRIP_CHECK(index < ws2812->strip_len, "index out of the maximum number of leds", err, ESP_ERR_INVALID_ARG); - uint32_t start = index * 3; - // In thr order of GRB - ws2812->buffer[start + 0] = green & 0xFF; - ws2812->buffer[start + 1] = red & 0xFF; - ws2812->buffer[start + 2] = blue & 0xFF; - return ESP_OK; -err: - return ret; -} - -static esp_err_t ws2812_refresh(led_strip_t *strip, uint32_t timeout_ms) -{ - esp_err_t ret = ESP_OK; - ws2812_t *ws2812 = __containerof(strip, ws2812_t, parent); - STRIP_CHECK(rmt_write_sample(ws2812->rmt_channel, ws2812->buffer, ws2812->strip_len * 3, true) == ESP_OK, - "transmit RMT samples failed", err, ESP_FAIL); - return rmt_wait_tx_done(ws2812->rmt_channel, pdMS_TO_TICKS(timeout_ms)); -err: - return ret; -} - -static esp_err_t ws2812_clear(led_strip_t *strip, uint32_t timeout_ms) -{ - ws2812_t *ws2812 = __containerof(strip, ws2812_t, parent); - // Write zero to turn off all leds - memset(ws2812->buffer, 0, ws2812->strip_len * 3); - return ws2812_refresh(strip, timeout_ms); -} - -static esp_err_t ws2812_del(led_strip_t *strip) -{ - ws2812_t *ws2812 = __containerof(strip, ws2812_t, parent); - free(ws2812); - return ESP_OK; -} - -led_strip_t *led_strip_new_rmt_ws2812(const led_strip_config_t *config) -{ - led_strip_t *ret = NULL; - STRIP_CHECK(config, "configuration can't be null", err, NULL); - - // 24 bits per led - uint32_t ws2812_size = sizeof(ws2812_t) + config->max_leds * 3; - ws2812_t *ws2812 = calloc(1, ws2812_size); - STRIP_CHECK(ws2812, "request memory for ws2812 failed", err, NULL); - - uint32_t counter_clk_hz = 0; - STRIP_CHECK(rmt_get_counter_clock((rmt_channel_t)config->dev, &counter_clk_hz) == ESP_OK, - "get rmt counter clock failed", err, NULL); - // ns -> ticks - float ratio = (float)counter_clk_hz / 1e9; - ws2812_t0h_ticks = (uint32_t)(ratio * WS2812_T0H_NS); - ws2812_t0l_ticks = (uint32_t)(ratio * WS2812_T0L_NS); - ws2812_t1h_ticks = (uint32_t)(ratio * WS2812_T1H_NS); - ws2812_t1l_ticks = (uint32_t)(ratio * WS2812_T1L_NS); - - // set ws2812 to rmt adapter - rmt_translator_init((rmt_channel_t)config->dev, ws2812_rmt_adapter); - - ws2812->rmt_channel = (rmt_channel_t)config->dev; - ws2812->strip_len = config->max_leds; - - ws2812->parent.set_pixel = ws2812_set_pixel; - ws2812->parent.refresh = ws2812_refresh; - ws2812->parent.clear = ws2812_clear; - ws2812->parent.del = ws2812_del; - - return &ws2812->parent; -err: - return ret; -} - -led_strip_t * led_strip_init(uint8_t channel, uint8_t gpio, uint16_t led_num) -{ - static led_strip_t *pStrip; - - rmt_config_t config = RMT_DEFAULT_CONFIG_TX(gpio, channel); - // set counter clock to 40MHz - config.clk_div = 2; - - ESP_ERROR_CHECK(rmt_config(&config)); - ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0)); - - // install ws2812 driver - led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(led_num, (led_strip_dev_t)config.channel); - - pStrip = led_strip_new_rmt_ws2812(&strip_config); - - if ( !pStrip ) { - ESP_LOGE(TAG, "install WS2812 driver failed"); - return NULL; - } - - // Clear LED strip (turn off all LEDs) - ESP_ERROR_CHECK(pStrip->clear(pStrip, 100)); - - return pStrip; -} - -esp_err_t led_strip_denit(led_strip_t *strip) -{ - ws2812_t *ws2812 = __containerof(strip, ws2812_t, parent); - ESP_ERROR_CHECK(rmt_driver_uninstall(ws2812->rmt_channel)); - return strip->del(strip); -} diff --git a/Source/ring-factory/dependencies.lock b/Source/ring-factory/dependencies.lock new file mode 100644 index 0000000..add085d --- /dev/null +++ b/Source/ring-factory/dependencies.lock @@ -0,0 +1,15 @@ +dependencies: + espressif/led_strip: + component_hash: c240f82567a37357bef313f76b0df93cb2da025835e525006096ea7e0fd61b4f + source: + service_url: https://api.components.espressif.com/ + type: service + version: 2.4.3 + idf: + component_hash: null + source: + type: idf + version: 5.1.1 +manifest_hash: 1e23ce33a87e2e6bf01e970cf1cbdf4cf98a4898d8855f3af2a1322206852abc +target: esp32 +version: 1.0.0 diff --git a/Source/ring-factory/main/HelperMacro.h b/Source/ring-factory/main/HelperMacro.h new file mode 100644 index 0000000..3a6c67b --- /dev/null +++ b/Source/ring-factory/main/HelperMacro.h @@ -0,0 +1,7 @@ +#ifndef _HELPERMACRO_H_ +#define _HELPERMACRO_H_ + +#define HELPERMACRO_MIN(a,b) (((a)<(b))?(a):(b)) +#define HELPERMACRO_MAX(a,b) (((a)>(b))?(a):(b)) + +#endif \ No newline at end of file diff --git a/Source/ring-factory/main/fwconfig.h b/Source/ring-factory/main/fwconfig.h index b8c15b0..c328884 100644 --- a/Source/ring-factory/main/fwconfig.h +++ b/Source/ring-factory/main/fwconfig.h @@ -15,7 +15,6 @@ // WS1228 as sanity led #define CONFIG_WS1228B_PIN GPIO_NUM_18 -#define CONFIG_WS1228B_RMT_TX_CHANNEL RMT_CHANNEL_0 #define CONFIG_WS1228B_LEDCOUNT (45) #endif \ No newline at end of file diff --git a/Source/ring-factory/main/gpio.c b/Source/ring-factory/main/gpio.c index a75d693..1190089 100644 --- a/Source/ring-factory/main/gpio.c +++ b/Source/ring-factory/main/gpio.c @@ -7,7 +7,7 @@ #define TAG "GPIO" -static led_strip_t* m_strip = NULL; +static led_strip_handle_t led_strip; void GPIO_Init() { @@ -21,36 +21,30 @@ void GPIO_Init() gpio_set_direction(CONFIG_SWITCH_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(CONFIG_SWITCH_PIN, GPIO_PULLUP_ONLY); - // Initialize LED drivers - rmt_config_t config = RMT_DEFAULT_CONFIG_TX(CONFIG_WS1228B_PIN, CONFIG_WS1228B_RMT_TX_CHANNEL); - // set counter clock to 40MHz - config.clk_div = 2; - - ESP_ERROR_CHECK(rmt_config(&config)); - ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0)); - - // ----------------------- - // install ws2812 driver - led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(CONFIG_WS1228B_LEDCOUNT, (led_strip_dev_t)config.channel); - m_strip = led_strip_new_rmt_ws2812(&strip_config); - if (!m_strip) { - ESP_LOGE(TAG, "install WS2812 driver failed"); - } - // Clear LED strip (turn off all LEDs) - ESP_ERROR_CHECK(m_strip->clear(m_strip, 100)); + /* LED strip initialization with the GPIO and pixels number*/ + led_strip_config_t strip_config = { + .strip_gpio_num = CONFIG_WS1228B_PIN, + .max_leds = CONFIG_WS1228B_LEDCOUNT, // sanity LED + at least one LED on board + }; + led_strip_rmt_config_t rmt_config = { + .resolution_hz = 10 * 1000 * 1000, // 10MHz + }; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); } void GPIO_SetPixel(uint32_t u32Index, uint8_t u8Red, uint8_t u8Green, uint8_t u8Blue) { - ESP_ERROR_CHECK(m_strip->set_pixel(m_strip, u32Index, u8Red, u8Green, u8Blue)); + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, u32Index, u8Red, u8Green, u8Blue)); } void GPIO_ClearAllPixels() { - ESP_ERROR_CHECK(m_strip->clear(m_strip, 50)); + ESP_ERROR_CHECK(led_strip_clear(led_strip)); } void GPIO_RefreshPixels() { - ESP_ERROR_CHECK(m_strip->refresh(m_strip, 100)); + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); } \ No newline at end of file diff --git a/Source/ring-factory/main/idf_component.yml b/Source/ring-factory/main/idf_component.yml new file mode 100644 index 0000000..fbf50c7 --- /dev/null +++ b/Source/ring-factory/main/idf_component.yml @@ -0,0 +1,17 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: "*" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/Source/ring-factory/main/webserver.c b/Source/ring-factory/main/webserver.c index a6d0507..848cf21 100644 --- a/Source/ring-factory/main/webserver.c +++ b/Source/ring-factory/main/webserver.c @@ -1,4 +1,5 @@ #include "webserver.h" +#include "HelperMacro.h" #include "esp_log.h" #include "esp_chip_info.h" #include "esp_system.h" @@ -125,7 +126,7 @@ static esp_err_t file_get_handler(httpd_req_t *req) while(u32Index < pFile->u32Length) { - const uint32_t n = MIN(pFile->u32Length - u32Index, HTTPSERVER_BUFFERSIZE); + const uint32_t n = HELPERMACRO_MIN(pFile->u32Length - u32Index, HTTPSERVER_BUFFERSIZE); if (n > 0) { /* Send the buffer contents as HTTP response m_u8Buffers */ diff --git a/Source/ring-factory/managed_components/espressif__led_strip/.component_hash b/Source/ring-factory/managed_components/espressif__led_strip/.component_hash new file mode 100644 index 0000000..d6abe9d --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/.component_hash @@ -0,0 +1 @@ +c240f82567a37357bef313f76b0df93cb2da025835e525006096ea7e0fd61b4f \ No newline at end of file diff --git a/Source/ring-factory/managed_components/espressif__led_strip/CHANGELOG.md b/Source/ring-factory/managed_components/espressif__led_strip/CHANGELOG.md new file mode 100644 index 0000000..494cad2 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/CHANGELOG.md @@ -0,0 +1,32 @@ +## 2.4.0 + +- Support configurable SPI mode to contorl leds + - recommend to enable DMA when using SPI mode + +## 2.3.0 + +- Support configurable RMT channel size by setting `mem_block_symbols` + +## 2.2.0 + +- Support for 4 components RGBW leds (SK6812): + - in led_strip_config_t new fields + led_pixel_format, controlling byte format (LED_PIXEL_FORMAT_GRB, LED_PIXEL_FORMAT_GRBW) + led_model, used to configure bit timing (LED_MODEL_WS2812, LED_MODEL_SK6812) + - new API led_strip_set_pixel_rgbw + - new interface type set_pixel_rgbw + +## 2.1.0 + +- Support DMA feature, which offloads the CPU by a lot when it comes to drive a bunch of LEDs +- Support various RMT clock sources +- Acquire and release the power management lock before and after each refresh +- New driver flag: `invert_out` which can invert the led control signal by hardware + +## 2.0.0 + +- Reimplemented the driver using the new RMT driver (`driver/rmt_tx.h`) + +## 1.0.0 + +- Initial driver version, based on the legacy RMT driver (`driver/rmt.h`) diff --git a/Source/ring-factory/managed_components/espressif__led_strip/CMakeLists.txt b/Source/ring-factory/managed_components/espressif__led_strip/CMakeLists.txt new file mode 100644 index 0000000..bd122c2 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/CMakeLists.txt @@ -0,0 +1,18 @@ +include($ENV{IDF_PATH}/tools/cmake/version.cmake) + +set(srcs "src/led_strip_api.c") + +if(CONFIG_SOC_RMT_SUPPORTED) + list(APPEND srcs "src/led_strip_rmt_dev.c" "src/led_strip_rmt_encoder.c") +endif() + +# the SPI backend driver relies on something that was added in IDF 5.1 +if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "5.1") + if(CONFIG_SOC_GPSPI_SUPPORTED) + list(APPEND srcs "src/led_strip_spi_dev.c") + endif() +endif() + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS "include" "interface" + REQUIRES "driver") diff --git a/Source/ring-factory/managed_components/espressif__led_strip/LICENSE b/Source/ring-factory/managed_components/espressif__led_strip/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Source/ring-factory/managed_components/espressif__led_strip/README.md b/Source/ring-factory/managed_components/espressif__led_strip/README.md new file mode 100644 index 0000000..6f9f8f3 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/README.md @@ -0,0 +1,90 @@ +# LED Strip Driver + +[![Component Registry](https://components.espressif.com/components/espressif/led_strip/badge.svg)](https://components.espressif.com/components/espressif/led_strip) + +This driver is designed for addressable LEDs like [WS2812](http://www.world-semi.com/Certifications/WS2812B.html), where each LED is controlled by a single data line. + +## Backend Controllers + +### The [RMT](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html) Peripheral + +This is the most economical way to drive the LEDs because it only consumes one RMT channel, leaving other channels free to use. However, the memory usage increases dramatically with the number of LEDs. If the RMT hardware can't be assist by DMA, the driver will going into interrupt very frequently, thus result in a high CPU usage. What's worse, if the RMT interrupt is delayed or not serviced in time (e.g. if Wi-Fi interrupt happens on the same CPU core), the RMT transaction will be corrupted and the LEDs will display incorrect colors. If you want to use RMT to drive a large number of LEDs, you'd better to enable the DMA feature if possible [^1]. + +#### Allocate LED Strip Object with RMT Backend + +```c +#define BLINK_GPIO 0 + +led_strip_handle_t led_strip; + +/* LED strip initialization with the GPIO and pixels number*/ +led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = 1, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter) +}; + +led_strip_rmt_config_t rmt_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .resolution_hz = 10 * 1000 * 1000, // 10MHz + .flags.with_dma = false, // whether to enable the DMA feature +}; +ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); +``` + +You can create multiple LED strip objects with different GPIOs and pixel numbers. The backend driver will automatically allocate the RMT channel for you if there is more available. + +### The [SPI](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html) Peripheral + +SPI peripheral can also be used to generate the timing required by the LED strip. However this backend is not as economical as the RMT one, because it will take up the whole **bus**, unlike the RMT just takes one **channel**. You **CANT** connect other devices to the same SPI bus if it's been used by the led_strip, because the led_strip doesn't have the concept of "Chip Select". + +Please note, the SPI backend has a dependency of **ESP-IDF >= 5.1** + +#### Allocate LED Strip Object with SPI Backend + +```c +#define BLINK_GPIO 0 + +led_strip_handle_t led_strip; + +/* LED strip initialization with the GPIO and pixels number*/ +led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = 1, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter) +}; + +led_strip_spi_config_t spi_config = { + .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs + .spi_bus = SPI2_HOST, // SPI bus ID +}; +ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip)); +``` + +The number of LED strip objects can be created depends on how many free SPI buses are free to use in your project. + +## FAQ + +* Which led_strip backend should I choose? + * It depends on your application requirement and target chip's ability. + + ```mermaid + flowchart LR + A{Is RMT supported?} + A --> |No| B[SPI backend] + B --> C{Does the led strip has \n a larger number of LEDs?} + C --> |No| D[Don't have to enable the DMA of the backend] + C --> |Yes| E[Enable the DMA of the backend] + A --> |Yes| F{Does the led strip has \n a larger number of LEDs?} + F --> |Yes| G{Does RMT support DMA?} + G --> |Yes| E + G --> |No| B + F --> |No| H[RMT backend] --> D + ``` + +[^1]: The RMT DMA feature is not available on all ESP chips. Please check the data sheet before using it. diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt new file mode 100644 index 0000000..fc2dfc7 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_strip_rmt_ws2812) diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md new file mode 100644 index 0000000..ad52235 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md @@ -0,0 +1,31 @@ +# LED Strip Example (RMT backend + WS2812) + +This example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component. + +## How to Use Example + +### Hardware Required + +* A development board with Espressif SoC +* A USB cable for Power supply and programming +* WS2812 LED strip + +### Configure the Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. Then assign the proper GPIO in the [source file](main/led_strip_rmt_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number. + +### Build and Flash + +Run `idf.py -p PORT build flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```text +I (299) gpio: GPIO[8]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (309) example: Created LED strip object with RMT backend +I (309) example: Start blinking LED strip +``` diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt new file mode 100644 index 0000000..37b9c14 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_strip_rmt_ws2812_main.c" + INCLUDE_DIRS ".") diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml new file mode 100644 index 0000000..916c366 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml @@ -0,0 +1,5 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: + version: '^2' + override_path: '../../../' diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c new file mode 100644 index 0000000..62293d5 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "led_strip.h" +#include "esp_log.h" +#include "esp_err.h" + +// GPIO assignment +#define LED_STRIP_BLINK_GPIO 2 +// Numbers of the LED in the strip +#define LED_STRIP_LED_NUMBERS 24 +// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution) +#define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000) + +static const char *TAG = "example"; + +led_strip_handle_t configure_led(void) +{ + // LED strip general initialization, according to your led board design + led_strip_config_t strip_config = { + .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal + }; + + // LED strip backend configuration: RMT + led_strip_rmt_config_t rmt_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .resolution_hz = LED_STRIP_RMT_RES_HZ, // RMT counter clock frequency + .flags.with_dma = false, // DMA feature is available on ESP target like ESP32-S3 + }; + + // LED Strip object handle + led_strip_handle_t led_strip; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + ESP_LOGI(TAG, "Created LED strip object with RMT backend"); + return led_strip; +} + +void app_main(void) +{ + led_strip_handle_t led_strip = configure_led(); + bool led_on_off = false; + + ESP_LOGI(TAG, "Start blinking LED strip"); + while (1) { + if (led_on_off) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5)); + } + /* Refresh the strip to send data */ + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); + ESP_LOGI(TAG, "LED ON!"); + } else { + /* Set all LED off to clear all pixels */ + ESP_ERROR_CHECK(led_strip_clear(led_strip)); + ESP_LOGI(TAG, "LED OFF!"); + } + + led_on_off = !led_on_off; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt new file mode 100644 index 0000000..7d3af2d --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_strip_spi_ws2812) diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md new file mode 100644 index 0000000..c545c84 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md @@ -0,0 +1,31 @@ +# LED Strip Example (SPI backend + WS2812) + +This example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component. + +## How to Use Example + +### Hardware Required + +* A development board with Espressif SoC +* A USB cable for Power supply and programming +* WS2812 LED strip + +### Configure the Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. Then assign the proper GPIO in the [source file](main/led_strip_spi_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number. + +### Build and Flash + +Run `idf.py -p PORT build flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```text +I (299) gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (309) example: Created LED strip object with SPI backend +I (309) example: Start blinking LED strip +``` diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt new file mode 100644 index 0000000..5ad7dd5 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_strip_spi_ws2812_main.c" + INCLUDE_DIRS ".") diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml new file mode 100644 index 0000000..050d8d2 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml @@ -0,0 +1,6 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: + version: '^2.4' + override_path: '../../../' + idf: ">=5.1" diff --git a/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c new file mode 100644 index 0000000..69b780c --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "led_strip.h" +#include "esp_log.h" +#include "esp_err.h" + +// GPIO assignment +#define LED_STRIP_BLINK_GPIO 2 +// Numbers of the LED in the strip +#define LED_STRIP_LED_NUMBERS 24 + +static const char *TAG = "example"; + +led_strip_handle_t configure_led(void) +{ + // LED strip general initialization, according to your led board design + led_strip_config_t strip_config = { + .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal + }; + + // LED strip backend configuration: SPI + led_strip_spi_config_t spi_config = { + .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs + .spi_bus = SPI2_HOST, // SPI bus ID + }; + + // LED Strip object handle + led_strip_handle_t led_strip; + ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip)); + ESP_LOGI(TAG, "Created LED strip object with SPI backend"); + return led_strip; +} + +void app_main(void) +{ + led_strip_handle_t led_strip = configure_led(); + bool led_on_off = false; + + ESP_LOGI(TAG, "Start blinking LED strip"); + while (1) { + if (led_on_off) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5)); + } + /* Refresh the strip to send data */ + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); + ESP_LOGI(TAG, "LED ON!"); + } else { + /* Set all LED off to clear all pixels */ + ESP_ERROR_CHECK(led_strip_clear(led_strip)); + ESP_LOGI(TAG, "LED OFF!"); + } + + led_on_off = !led_on_off; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/Source/ring-factory/managed_components/espressif__led_strip/idf_component.yml b/Source/ring-factory/managed_components/espressif__led_strip/idf_component.yml new file mode 100644 index 0000000..e973e89 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/idf_component.yml @@ -0,0 +1,6 @@ +dependencies: + idf: + version: '>=5.0' +description: Driver for Addressable LED Strip (WS2812, etc) +url: https://github.com/espressif/idf-extra-components/tree/master/led_strip +version: 2.4.3 diff --git a/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip.h b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip.h new file mode 100644 index 0000000..234b637 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip.h @@ -0,0 +1,91 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "led_strip_rmt.h" +#include "led_strip_spi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set RGB for a specific pixel + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * + * @return + * - ESP_OK: Set RGB for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters + * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred + */ +esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); + +/** + * @brief Set RGBW for a specific pixel + * + * @note Only call this function if your led strip does have the white component (e.g. SK6812-RGBW) + * @note Also see `led_strip_set_pixel` if you only want to specify the RGB part of the color and bypass the white component + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * @param white: separate white component + * + * @return + * - ESP_OK: Set RGBW color for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument + * - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred + */ +esp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white); + +/** + * @brief Refresh memory colors to LEDs + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Refresh successfully + * - ESP_FAIL: Refresh failed because some other error occurred + * + * @note: + * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. + */ +esp_err_t led_strip_refresh(led_strip_handle_t strip); + +/** + * @brief Clear LED strip (turn off all LEDs) + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Clear LEDs successfully + * - ESP_FAIL: Clear LEDs failed because some other error occurred + */ +esp_err_t led_strip_clear(led_strip_handle_t strip); + +/** + * @brief Free LED strip resources + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ +esp_err_t led_strip_del(led_strip_handle_t strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_rmt.h b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_rmt.h new file mode 100644 index 0000000..69ff7cd --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_rmt.h @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "driver/rmt_types.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED Strip RMT specific configuration + */ +typedef struct { + rmt_clock_source_t clk_src; /*!< RMT clock source */ + uint32_t resolution_hz; /*!< RMT tick resolution, if set to zero, a default resolution (10MHz) will be applied */ + size_t mem_block_symbols; /*!< How many RMT symbols can one RMT channel hold at one time. Set to 0 will fallback to use the default size. */ + struct { + uint32_t with_dma: 1; /*!< Use DMA to transmit data */ + } flags; +} led_strip_rmt_config_t; + +/** + * @brief Create LED strip based on RMT TX channel + * + * @param led_config LED strip configuration + * @param rmt_config RMT specific configuration + * @param ret_strip Returned LED strip handle + * @return + * - ESP_OK: create LED strip handle successfully + * - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument + * - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory + * - ESP_FAIL: create LED strip handle failed because some other error + */ +esp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_spi.h b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_spi.h new file mode 100644 index 0000000..6b5b1dc --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_spi.h @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "driver/spi_master.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED Strip SPI specific configuration + */ +typedef struct { + spi_clock_source_t clk_src; /*!< SPI clock source */ + spi_host_device_t spi_bus; /*!< SPI bus ID. Which buses are available depends on the specific chip */ + struct { + uint32_t with_dma: 1; /*!< Use DMA to transmit data */ + } flags; +} led_strip_spi_config_t; + +/** + * @brief Create LED strip based on SPI MOSI channel + * @note Although only the MOSI line is used for generating the signal, the whole SPI bus can't be used for other purposes. + * + * @param led_config LED strip configuration + * @param spi_config SPI specific configuration + * @param ret_strip Returned LED strip handle + * @return + * - ESP_OK: create LED strip handle successfully + * - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument + * - ESP_ERR_NOT_SUPPORTED: create LED strip handle failed because of unsupported configuration + * - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory + * - ESP_FAIL: create LED strip handle failed because some other error + */ +esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_types.h b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_types.h new file mode 100644 index 0000000..d5b8052 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/include/led_strip_types.h @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED strip pixel format + */ +typedef enum { + LED_PIXEL_FORMAT_GRB, /*!< Pixel format: GRB */ + LED_PIXEL_FORMAT_GRBW, /*!< Pixel format: GRBW */ + LED_PIXEL_FORMAT_INVALID /*!< Invalid pixel format */ +} led_pixel_format_t; + +/** + * @brief LED strip model + * @note Different led model may have different timing parameters, so we need to distinguish them. + */ +typedef enum { + LED_MODEL_WS2812, /*!< LED strip model: WS2812 */ + LED_MODEL_SK6812, /*!< LED strip model: SK6812 */ + LED_MODEL_INVALID /*!< Invalid LED strip model */ +} led_model_t; + +/** + * @brief LED strip handle + */ +typedef struct led_strip_t *led_strip_handle_t; + +/** + * @brief LED Strip Configuration + */ +typedef struct { + int strip_gpio_num; /*!< GPIO number that used by LED strip */ + uint32_t max_leds; /*!< Maximum LEDs in a single strip */ + led_pixel_format_t led_pixel_format; /*!< LED pixel format */ + led_model_t led_model; /*!< LED model */ + + struct { + uint32_t invert_out: 1; /*!< Invert output signal */ + } flags; +} led_strip_config_t; + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-factory/managed_components/espressif__led_strip/interface/led_strip_interface.h b/Source/ring-factory/managed_components/espressif__led_strip/interface/led_strip_interface.h new file mode 100644 index 0000000..3de4c27 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/interface/led_strip_interface.h @@ -0,0 +1,95 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct led_strip_t led_strip_t; /*!< Type of LED strip */ + +/** + * @brief LED strip interface definition + */ +struct led_strip_t { + /** + * @brief Set RGB for a specific pixel + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * + * @return + * - ESP_OK: Set RGB for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters + * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred + */ + esp_err_t (*set_pixel)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); + + /** + * @brief Set RGBW for a specific pixel. Similar to `set_pixel` but also set the white component + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * @param white: separate white component + * + * @return + * - ESP_OK: Set RGBW color for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument + * - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred + */ + esp_err_t (*set_pixel_rgbw)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white); + + /** + * @brief Refresh memory colors to LEDs + * + * @param strip: LED strip + * @param timeout_ms: timeout value for refreshing task + * + * @return + * - ESP_OK: Refresh successfully + * - ESP_FAIL: Refresh failed because some other error occurred + * + * @note: + * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. + */ + esp_err_t (*refresh)(led_strip_t *strip); + + /** + * @brief Clear LED strip (turn off all LEDs) + * + * @param strip: LED strip + * @param timeout_ms: timeout value for clearing task + * + * @return + * - ESP_OK: Clear LEDs successfully + * - ESP_FAIL: Clear LEDs failed because some other error occurred + */ + esp_err_t (*clear)(led_strip_t *strip); + + /** + * @brief Free LED strip resources + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ + esp_err_t (*del)(led_strip_t *strip); +}; + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_api.c b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_api.c new file mode 100644 index 0000000..4a6a6c3 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_api.c @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "esp_log.h" +#include "esp_check.h" +#include "led_strip.h" +#include "led_strip_interface.h" + +static const char *TAG = "led_strip"; + +esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->set_pixel(strip, index, red, green, blue); +} + +esp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->set_pixel_rgbw(strip, index, red, green, blue, white); +} + +esp_err_t led_strip_refresh(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->refresh(strip); +} + +esp_err_t led_strip_clear(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->clear(strip); +} + +esp_err_t led_strip_del(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->del(strip); +} diff --git a/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c new file mode 100644 index 0000000..1cbf0e4 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c @@ -0,0 +1,164 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "driver/rmt_tx.h" +#include "led_strip.h" +#include "led_strip_interface.h" +#include "led_strip_rmt_encoder.h" + +#define LED_STRIP_RMT_DEFAULT_RESOLUTION 10000000 // 10MHz resolution +#define LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE 4 +// the memory size of each RMT channel, in words (4 bytes) +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 +#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 64 +#else +#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 48 +#endif + +static const char *TAG = "led_strip_rmt"; + +typedef struct { + led_strip_t base; + rmt_channel_handle_t rmt_chan; + rmt_encoder_handle_t strip_encoder; + uint32_t strip_len; + uint8_t bytes_per_pixel; + uint8_t pixel_buf[]; +} led_strip_rmt_obj; + +static esp_err_t led_strip_rmt_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + uint32_t start = index * rmt_strip->bytes_per_pixel; + // In thr order of GRB, as LED strip like WS2812 sends out pixels in this order + rmt_strip->pixel_buf[start + 0] = green & 0xFF; + rmt_strip->pixel_buf[start + 1] = red & 0xFF; + rmt_strip->pixel_buf[start + 2] = blue & 0xFF; + if (rmt_strip->bytes_per_pixel > 3) { + rmt_strip->pixel_buf[start + 3] = 0; + } + return ESP_OK; +} + +static esp_err_t led_strip_rmt_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + ESP_RETURN_ON_FALSE(rmt_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, "wrong LED pixel format, expected 4 bytes per pixel"); + uint8_t *buf_start = rmt_strip->pixel_buf + index * 4; + // SK6812 component order is GRBW + *buf_start = green & 0xFF; + *++buf_start = red & 0xFF; + *++buf_start = blue & 0xFF; + *++buf_start = white & 0xFF; + return ESP_OK; +} + +static esp_err_t led_strip_rmt_refresh(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + rmt_transmit_config_t tx_conf = { + .loop_count = 0, + }; + + ESP_RETURN_ON_ERROR(rmt_enable(rmt_strip->rmt_chan), TAG, "enable RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_transmit(rmt_strip->rmt_chan, rmt_strip->strip_encoder, rmt_strip->pixel_buf, + rmt_strip->strip_len * rmt_strip->bytes_per_pixel, &tx_conf), TAG, "transmit pixels by RMT failed"); + ESP_RETURN_ON_ERROR(rmt_tx_wait_all_done(rmt_strip->rmt_chan, -1), TAG, "flush RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_disable(rmt_strip->rmt_chan), TAG, "disable RMT channel failed"); + return ESP_OK; +} + +static esp_err_t led_strip_rmt_clear(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + // Write zero to turn off all leds + memset(rmt_strip->pixel_buf, 0, rmt_strip->strip_len * rmt_strip->bytes_per_pixel); + return led_strip_rmt_refresh(strip); +} + +static esp_err_t led_strip_rmt_del(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_ERROR(rmt_del_channel(rmt_strip->rmt_chan), TAG, "delete RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_del_encoder(rmt_strip->strip_encoder), TAG, "delete strip encoder failed"); + free(rmt_strip); + return ESP_OK; +} + +esp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip) +{ + led_strip_rmt_obj *rmt_strip = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(led_config && rmt_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led_pixel_format"); + uint8_t bytes_per_pixel = 3; + if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) { + bytes_per_pixel = 4; + } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) { + bytes_per_pixel = 3; + } else { + assert(false); + } + rmt_strip = calloc(1, sizeof(led_strip_rmt_obj) + led_config->max_leds * bytes_per_pixel); + ESP_GOTO_ON_FALSE(rmt_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for rmt strip"); + uint32_t resolution = rmt_config->resolution_hz ? rmt_config->resolution_hz : LED_STRIP_RMT_DEFAULT_RESOLUTION; + + // for backward compatibility, if the user does not set the clk_src, use the default value + rmt_clock_source_t clk_src = RMT_CLK_SRC_DEFAULT; + if (rmt_config->clk_src) { + clk_src = rmt_config->clk_src; + } + size_t mem_block_symbols = LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS; + // override the default value if the user sets it + if (rmt_config->mem_block_symbols) { + mem_block_symbols = rmt_config->mem_block_symbols; + } + rmt_tx_channel_config_t rmt_chan_config = { + .clk_src = clk_src, + .gpio_num = led_config->strip_gpio_num, + .mem_block_symbols = mem_block_symbols, + .resolution_hz = resolution, + .trans_queue_depth = LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE, + .flags.with_dma = rmt_config->flags.with_dma, + .flags.invert_out = led_config->flags.invert_out, + }; + ESP_GOTO_ON_ERROR(rmt_new_tx_channel(&rmt_chan_config, &rmt_strip->rmt_chan), err, TAG, "create RMT TX channel failed"); + + led_strip_encoder_config_t strip_encoder_conf = { + .resolution = resolution, + .led_model = led_config->led_model + }; + ESP_GOTO_ON_ERROR(rmt_new_led_strip_encoder(&strip_encoder_conf, &rmt_strip->strip_encoder), err, TAG, "create LED strip encoder failed"); + + + rmt_strip->bytes_per_pixel = bytes_per_pixel; + rmt_strip->strip_len = led_config->max_leds; + rmt_strip->base.set_pixel = led_strip_rmt_set_pixel; + rmt_strip->base.set_pixel_rgbw = led_strip_rmt_set_pixel_rgbw; + rmt_strip->base.refresh = led_strip_rmt_refresh; + rmt_strip->base.clear = led_strip_rmt_clear; + rmt_strip->base.del = led_strip_rmt_del; + + *ret_strip = &rmt_strip->base; + return ESP_OK; +err: + if (rmt_strip) { + if (rmt_strip->rmt_chan) { + rmt_del_channel(rmt_strip->rmt_chan); + } + if (rmt_strip->strip_encoder) { + rmt_del_encoder(rmt_strip->strip_encoder); + } + free(rmt_strip); + } + return ret; +} diff --git a/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c new file mode 100644 index 0000000..d352ac0 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c @@ -0,0 +1,146 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "led_strip_rmt_encoder.h" + +static const char *TAG = "led_rmt_encoder"; + +typedef struct { + rmt_encoder_t base; + rmt_encoder_t *bytes_encoder; + rmt_encoder_t *copy_encoder; + int state; + rmt_symbol_word_t reset_code; +} rmt_led_strip_encoder_t; + +static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder; + rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder; + rmt_encode_state_t session_state = 0; + rmt_encode_state_t state = 0; + size_t encoded_symbols = 0; + switch (led_encoder->state) { + case 0: // send RGB data + encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state); + if (session_state & RMT_ENCODING_COMPLETE) { + led_encoder->state = 1; // switch to next state when current encoding session finished + } + if (session_state & RMT_ENCODING_MEM_FULL) { + state |= RMT_ENCODING_MEM_FULL; + goto out; // yield if there's no free space for encoding artifacts + } + // fall-through + case 1: // send reset code + encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code, + sizeof(led_encoder->reset_code), &session_state); + if (session_state & RMT_ENCODING_COMPLETE) { + led_encoder->state = 0; // back to the initial encoding session + state |= RMT_ENCODING_COMPLETE; + } + if (session_state & RMT_ENCODING_MEM_FULL) { + state |= RMT_ENCODING_MEM_FULL; + goto out; // yield if there's no free space for encoding artifacts + } + } +out: + *ret_state = state; + return encoded_symbols; +} + +static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_del_encoder(led_encoder->bytes_encoder); + rmt_del_encoder(led_encoder->copy_encoder); + free(led_encoder); + return ESP_OK; +} + +static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_reset(led_encoder->bytes_encoder); + rmt_encoder_reset(led_encoder->copy_encoder); + led_encoder->state = 0; + return ESP_OK; +} + +esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder) +{ + esp_err_t ret = ESP_OK; + rmt_led_strip_encoder_t *led_encoder = NULL; + ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(config->led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led model"); + led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t)); + ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder"); + led_encoder->base.encode = rmt_encode_led_strip; + led_encoder->base.del = rmt_del_led_strip_encoder; + led_encoder->base.reset = rmt_led_strip_encoder_reset; + rmt_bytes_encoder_config_t bytes_encoder_config; + if (config->led_model == LED_MODEL_SK6812) { + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.6 * config->resolution / 1000000, // T1H=0.6us + .level1 = 0, + .duration1 = 0.6 * config->resolution / 1000000, // T1L=0.6us + }, + .flags.msb_first = 1 // SK6812 transfer bit order: G7...G0R7...R0B7...B0(W7...W0) + }; + } else if (config->led_model == LED_MODEL_WS2812) { + // different led strip might have its own timing requirements, following parameter is for WS2812 + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us + .level1 = 0, + .duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us + }, + .flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0 + }; + } else { + assert(false); + } + ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed"); + rmt_copy_encoder_config_t copy_encoder_config = {}; + ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed"); + + uint32_t reset_ticks = config->resolution / 1000000 * 50 / 2; // reset code duration defaults to 50us + led_encoder->reset_code = (rmt_symbol_word_t) { + .level0 = 0, + .duration0 = reset_ticks, + .level1 = 0, + .duration1 = reset_ticks, + }; + *ret_encoder = &led_encoder->base; + return ESP_OK; +err: + if (led_encoder) { + if (led_encoder->bytes_encoder) { + rmt_del_encoder(led_encoder->bytes_encoder); + } + if (led_encoder->copy_encoder) { + rmt_del_encoder(led_encoder->copy_encoder); + } + free(led_encoder); + } + return ret; +} diff --git a/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h new file mode 100644 index 0000000..ba71e60 --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "driver/rmt_encoder.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Type of led strip encoder configuration + */ +typedef struct { + uint32_t resolution; /*!< Encoder resolution, in Hz */ + led_model_t led_model; /*!< LED model */ +} led_strip_encoder_config_t; + +/** + * @brief Create RMT encoder for encoding LED strip pixels into RMT symbols + * + * @param[in] config Encoder configuration + * @param[out] ret_encoder Returned encoder handle + * @return + * - ESP_ERR_INVALID_ARG for any invalid arguments + * - ESP_ERR_NO_MEM out of memory when creating led strip encoder + * - ESP_OK if creating encoder successfully + */ +esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_spi_dev.c b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_spi_dev.c new file mode 100644 index 0000000..12ea8fb --- /dev/null +++ b/Source/ring-factory/managed_components/espressif__led_strip/src/led_strip_spi_dev.c @@ -0,0 +1,209 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "esp_rom_gpio.h" +#include "soc/spi_periph.h" +#include "led_strip.h" +#include "led_strip_interface.h" +#include "hal/spi_hal.h" + +#define LED_STRIP_SPI_DEFAULT_RESOLUTION (2.5 * 1000 * 1000) // 2.5MHz resolution +#define LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE 4 + +#define SPI_BYTES_PER_COLOR_BYTE 3 +#define SPI_BITS_PER_COLOR_BYTE (SPI_BYTES_PER_COLOR_BYTE * 8) + +static const char *TAG = "led_strip_spi"; + +typedef struct { + led_strip_t base; + spi_host_device_t spi_host; + spi_device_handle_t spi_device; + uint32_t strip_len; + uint8_t bytes_per_pixel; + uint8_t pixel_buf[]; +} led_strip_spi_obj; + +// please make sure to zero-initialize the buf before calling this function +static void __led_strip_spi_bit(uint8_t data, uint8_t *buf) +{ + // Each color of 1 bit is represented by 3 bits of SPI, low_level:100 ,high_level:110 + // So a color byte occupies 3 bytes of SPI. + *(buf + 2) |= data & BIT(0) ? BIT(2) | BIT(1) : BIT(2); + *(buf + 2) |= data & BIT(1) ? BIT(5) | BIT(4) : BIT(5); + *(buf + 2) |= data & BIT(2) ? BIT(7) : 0x00; + *(buf + 1) |= BIT(0); + *(buf + 1) |= data & BIT(3) ? BIT(3) | BIT(2) : BIT(3); + *(buf + 1) |= data & BIT(4) ? BIT(6) | BIT(5) : BIT(6); + *(buf + 0) |= data & BIT(5) ? BIT(1) | BIT(0) : BIT(1); + *(buf + 0) |= data & BIT(6) ? BIT(4) | BIT(3) : BIT(4); + *(buf + 0) |= data & BIT(7) ? BIT(7) | BIT(6) : BIT(7); +} + +static esp_err_t led_strip_spi_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + // LED_PIXEL_FORMAT_GRB takes 72bits(9bytes) + uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; + memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]); + __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]); + __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]); + if (spi_strip->bytes_per_pixel > 3) { + __led_strip_spi_bit(0, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]); + } + return ESP_OK; +} + +static esp_err_t led_strip_spi_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + ESP_RETURN_ON_FALSE(spi_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, "wrong LED pixel format, expected 4 bytes per pixel"); + // LED_PIXEL_FORMAT_GRBW takes 96bits(12bytes) + uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; + // SK6812 component order is GRBW + memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]); + __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]); + __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]); + __led_strip_spi_bit(white, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]); + + return ESP_OK; +} + +static esp_err_t led_strip_spi_refresh(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + spi_transaction_t tx_conf; + memset(&tx_conf, 0, sizeof(tx_conf)); + + tx_conf.length = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BITS_PER_COLOR_BYTE; + tx_conf.tx_buffer = spi_strip->pixel_buf; + tx_conf.rx_buffer = NULL; + ESP_RETURN_ON_ERROR(spi_device_transmit(spi_strip->spi_device, &tx_conf), TAG, "transmit pixels by SPI failed"); + + return ESP_OK; +} + +static esp_err_t led_strip_spi_clear(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + //Write zero to turn off all leds + memset(spi_strip->pixel_buf, 0, spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + uint8_t *buf = spi_strip->pixel_buf; + for (int index = 0; index < spi_strip->strip_len * spi_strip->bytes_per_pixel; index++) { + __led_strip_spi_bit(0, buf); + buf += SPI_BYTES_PER_COLOR_BYTE; + } + + return led_strip_spi_refresh(strip); +} + +static esp_err_t led_strip_spi_del(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + + ESP_RETURN_ON_ERROR(spi_bus_remove_device(spi_strip->spi_device), TAG, "delete spi device failed"); + ESP_RETURN_ON_ERROR(spi_bus_free(spi_strip->spi_host), TAG, "free spi bus failed"); + + free(spi_strip); + return ESP_OK; +} + +esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip) +{ + led_strip_spi_obj *spi_strip = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(led_config && spi_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led_pixel_format"); + uint8_t bytes_per_pixel = 3; + if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) { + bytes_per_pixel = 4; + } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) { + bytes_per_pixel = 3; + } else { + assert(false); + } + uint32_t mem_caps = MALLOC_CAP_DEFAULT; + if (spi_config->flags.with_dma) { + // DMA buffer must be placed in internal SRAM + mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; + } + spi_strip = heap_caps_calloc(1, sizeof(led_strip_spi_obj) + led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, mem_caps); + + ESP_GOTO_ON_FALSE(spi_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for spi strip"); + + spi_strip->spi_host = spi_config->spi_bus; + // for backward compatibility, if the user does not set the clk_src, use the default value + spi_clock_source_t clk_src = SPI_CLK_SRC_DEFAULT; + if (spi_config->clk_src) { + clk_src = spi_config->clk_src; + } + + spi_bus_config_t spi_bus_cfg = { + .mosi_io_num = led_config->strip_gpio_num, + //Only use MOSI to generate the signal, set -1 when other pins are not used. + .miso_io_num = -1, + .sclk_io_num = -1, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, + }; + ESP_GOTO_ON_ERROR(spi_bus_initialize(spi_strip->spi_host, &spi_bus_cfg, spi_config->flags.with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED), err, TAG, "create SPI bus failed"); + + if (led_config->flags.invert_out == true) { + esp_rom_gpio_connect_out_signal(led_config->strip_gpio_num, spi_periph_signal[spi_strip->spi_host].spid_out, true, false); + } + + spi_device_interface_config_t spi_dev_cfg = { + .clock_source = clk_src, + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .clock_speed_hz = LED_STRIP_SPI_DEFAULT_RESOLUTION, + .mode = 0, + //set -1 when CS is not used + .spics_io_num = -1, + .queue_size = LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE, + }; + + ESP_GOTO_ON_ERROR(spi_bus_add_device(spi_strip->spi_host, &spi_dev_cfg, &spi_strip->spi_device), err, TAG, "Failed to add spi device"); + + int clock_resolution_khz = 0; + spi_device_get_actual_freq(spi_strip->spi_device, &clock_resolution_khz); + // TODO: ideally we should decide the SPI_BYTES_PER_COLOR_BYTE by the real clock resolution + // But now, let's fixed the resolution, the downside is, we don't support a clock source whose frequency is not multiple of LED_STRIP_SPI_DEFAULT_RESOLUTION + ESP_GOTO_ON_FALSE(clock_resolution_khz == LED_STRIP_SPI_DEFAULT_RESOLUTION / 1000, ESP_ERR_NOT_SUPPORTED, err, + TAG, "unsupported clock resolution:%dKHz", clock_resolution_khz); + + spi_strip->bytes_per_pixel = bytes_per_pixel; + spi_strip->strip_len = led_config->max_leds; + spi_strip->base.set_pixel = led_strip_spi_set_pixel; + spi_strip->base.set_pixel_rgbw = led_strip_spi_set_pixel_rgbw; + spi_strip->base.refresh = led_strip_spi_refresh; + spi_strip->base.clear = led_strip_spi_clear; + spi_strip->base.del = led_strip_spi_del; + + *ret_strip = &spi_strip->base; + return ESP_OK; +err: + if (spi_strip) { + if (spi_strip->spi_device) { + spi_bus_remove_device(spi_strip->spi_device); + } + if (spi_strip->spi_host) { + spi_bus_free(spi_strip->spi_host); + } + free(spi_strip); + } + return ret; +} diff --git a/Source/ring-factory/partitions.csv b/Source/ring-factory/partitions.csv index 4c23950..7a5c6a5 100644 --- a/Source/ring-factory/partitions.csv +++ b/Source/ring-factory/partitions.csv @@ -1,7 +1,7 @@ # ESP-IDF Partition Table # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x4000, -otadata, data, ota, 0xd000, 0x2000, -phy_init, data, phy, 0xf000, 0x1000, -factory, app, factory, 0x10000, 1400K, +nvs, data, nvs, 0xB000, 0x4000, +otadata, data, ota, , 0x2000, +phy_init, data, phy, , 0x1000, +factory, app, factory, 0x20000, 1400K, ota_0, app, ota_0, , 2400K diff --git a/Source/ring-factory/sdkconfig b/Source/ring-factory/sdkconfig index 29427b9..da264fc 100644 --- a/Source/ring-factory/sdkconfig +++ b/Source/ring-factory/sdkconfig @@ -1,14 +1,16 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.1.1 Project Configuration # CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" CONFIG_SOC_DPORT_WORKAROUND="Not determined" -CONFIG_SOC_CAPS_ECO_VER_MAX=3 +CONFIG_SOC_CAPS_ECO_VER_MAX=301 CONFIG_SOC_ADC_SUPPORTED=y CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y CONFIG_SOC_SDMMC_HOST_SUPPORTED=y CONFIG_SOC_BT_SUPPORTED=y CONFIG_SOC_PCNT_SUPPORTED=y @@ -24,6 +26,9 @@ CONFIG_SOC_RTC_MEM_SUPPORTED=y CONFIG_SOC_I2S_SUPPORTED=y CONFIG_SOC_RMT_SUPPORTED=y CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y CONFIG_SOC_SUPPORT_COEXISTENCE=y CONFIG_SOC_AES_SUPPORTED=y CONFIG_SOC_MPI_SUPPORTED=y @@ -31,6 +36,8 @@ CONFIG_SOC_SHA_SUPPORTED=y CONFIG_SOC_FLASH_ENC_SUPPORTED=y CONFIG_SOC_SECURE_BOOT_SUPPORTED=y CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 CONFIG_SOC_XTAL_SUPPORT_26M=y CONFIG_SOC_XTAL_SUPPORT_40M=y @@ -51,36 +58,35 @@ CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 -CONFIG_SOC_RTC_SLOW_CLOCK_SUPPORT_8MD256=y CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y -CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=5 +CONFIG_SOC_IDCACHE_PER_CORE=y CONFIG_SOC_CPU_CORES_NUM=2 CONFIG_SOC_CPU_INTR_NUM=32 CONFIG_SOC_CPU_HAS_FPU=y CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 CONFIG_SOC_CPU_WATCHPOINT_SIZE=64 -CONFIG_SOC_DAC_PERIPH_NUM=2 +CONFIG_SOC_DAC_CHAN_NUM=2 CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y CONFIG_SOC_GPIO_PORT=1 CONFIG_SOC_GPIO_PIN_COUNT=40 CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF -CONFIG_SOC_GPIO_SUPPORT_SLP_SWITCH=y +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA CONFIG_SOC_I2C_NUM=2 CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 CONFIG_SOC_I2C_SUPPORT_SLAVE=y CONFIG_SOC_I2C_SUPPORT_APB=y -CONFIG_SOC_CLK_APLL_SUPPORTED=y -CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 -CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 -CONFIG_SOC_APLL_MIN_HZ=5303031 -CONFIG_SOC_APLL_MAX_HZ=125000000 CONFIG_SOC_I2S_NUM=2 CONFIG_SOC_I2S_HW_VERSION_1=y CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y CONFIG_SOC_I2S_SUPPORTS_PDM=y CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y CONFIG_SOC_I2S_SUPPORTS_ADC=y CONFIG_SOC_I2S_SUPPORTS_DAC=y @@ -95,7 +101,7 @@ CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y CONFIG_SOC_LEDC_CHANNEL_NUM=8 -CONFIG_SOC_LEDC_TIMER_BIT_WIDE_NUM=20 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 CONFIG_SOC_MCPWM_GROUPS=2 CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 @@ -106,6 +112,8 @@ CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 CONFIG_SOC_PCNT_GROUPS=1 @@ -126,11 +134,13 @@ CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y CONFIG_SOC_SDM_GROUPS=1 CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y CONFIG_SOC_SPI_AS_CS_SUPPORTED=y CONFIG_SOC_SPI_PERIPH_NUM=3 CONFIG_SOC_SPI_DMA_CHAN_NUM=2 CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y @@ -145,7 +155,9 @@ CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y CONFIG_SOC_TOUCH_VERSION_1=y CONFIG_SOC_TOUCH_SENSOR_NUM=10 CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y CONFIG_SOC_UART_NUM=3 CONFIG_SOC_UART_SUPPORT_APB_CLK=y @@ -167,19 +179,38 @@ CONFIG_SOC_SECURE_BOOT_V1=y CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 +CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 +CONFIG_SOC_APLL_MIN_HZ=5303031 +CONFIG_SOC_APLL_MAX_HZ=125000000 +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y CONFIG_SOC_SDMMC_USE_IOMUX=y CONFIG_SOC_SDMMC_NUM_SLOTS=2 CONFIG_SOC_WIFI_WAPI_SUPPORT=y CONFIG_SOC_WIFI_CSI_SUPPORT=y CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y CONFIG_SOC_BLE_SUPPORTED=y CONFIG_SOC_BLE_MESH_SUPPORTED=y CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y CONFIG_IDF_CMAKE=y CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET_ARCH="xtensa" @@ -191,7 +222,7 @@ CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 # Build type # CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_APP_BUILD_TYPE_RAM is not set CONFIG_APP_BUILD_GENERATE_BINARIES=y CONFIG_APP_BUILD_BOOTLOADER=y CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y @@ -211,11 +242,11 @@ CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set # CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set # CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set -CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +CONFIG_BOOTLOADER_LOG_LEVEL_WARN=y +# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set -CONFIG_BOOTLOADER_LOG_LEVEL=3 +CONFIG_BOOTLOADER_LOG_LEVEL=2 # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y CONFIG_BOOTLOADER_FACTORY_RESET=y @@ -236,6 +267,7 @@ CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y # CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0x10 # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +CONFIG_BOOTLOADER_RESERVE_RTC_MEM=y CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # end of Bootloader config @@ -260,9 +292,11 @@ CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 CONFIG_ESP_ROM_HAS_CRC_LE=y CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y CONFIG_ESP_ROM_HAS_JPEG_DECODE=y -CONFIG_ESP_ROM_SUPPORT_MULTIPLE_UART=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y # # Serial flasher config @@ -307,7 +341,7 @@ CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_OFFSET=0xA000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table @@ -332,6 +366,7 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set # CONFIG_COMPILER_DUMP_RTL_FILES is not set # end of Compiler options @@ -394,6 +429,7 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set # CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set # CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y # end of TWAI Configuration # @@ -459,6 +495,16 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set # CONFIG_I2S_ENABLE_DEBUG_LOG is not set # end of I2S Configuration + +# +# DAC Configuration +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of DAC Configuration # end of Driver Configurations # @@ -500,6 +546,11 @@ CONFIG_ADC_CALI_LUT_ENABLE=y CONFIG_ADC_DISABLE_DAC_OUTPUT=y # end of ADC and ADC Calibration +# +# Wireless Coexistence +# +# end of Wireless Coexistence + # # Common ESP-related # @@ -564,6 +615,26 @@ CONFIG_HTTPD_PURGE_BUF_LEN=32 # Hardware Settings # +# +# Chip revision +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +# end of Chip revision + # # MAC Config # @@ -571,9 +642,11 @@ CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set # end of MAC Config # @@ -582,7 +655,6 @@ CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set -# CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND is not set CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 # end of Sleep Config @@ -599,23 +671,9 @@ CONFIG_RTC_CLK_CAL_CYCLES=1024 # # Peripheral Control # -# CONFIG_PERIPH_CTRL_FUNC_IN_IRAM is not set +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y # end of Peripheral Control -# -# MMU Config -# -CONFIG_MMU_PAGE_SIZE_64KB=y -CONFIG_MMU_PAGE_MODE="64KB" -CONFIG_MMU_PAGE_SIZE=0x10000 -# end of MMU Config - -CONFIG_ESP32_REV_MIN_0=y -# CONFIG_ESP32_REV_MIN_1 is not set -# CONFIG_ESP32_REV_MIN_2 is not set -# CONFIG_ESP32_REV_MIN_3 is not set -CONFIG_ESP32_REV_MIN=0 - # # Main XTAL Config # @@ -648,10 +706,17 @@ CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 CONFIG_ESP_NETIF_TCPIP_LWIP=y # CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set # CONFIG_ESP_NETIF_L2_TAP is not set # CONFIG_ESP_NETIF_BRIDGE_EN is not set # end of ESP NETIF Adapter +# +# Partition API Configuration +# +# end of Partition API Configuration + # # PHY # @@ -660,6 +725,10 @@ CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP_PHY_MAX_TX_POWER=20 CONFIG_ESP_PHY_REDUCE_TX_POWER=y +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 # end of PHY # @@ -684,7 +753,6 @@ CONFIG_PM_ENABLE=y # ESP Ringbuf # # CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH is not set # end of ESP Ringbuf # @@ -699,6 +767,12 @@ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 # Memory # # CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options # end of Memory # @@ -713,6 +787,7 @@ CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 # # Memory protection @@ -737,7 +812,8 @@ CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y CONFIG_ESP_TASK_WDT_PANIC=y CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y @@ -783,6 +859,11 @@ CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY=0x1 +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y # CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # end of High resolution timer (esp_timer) @@ -790,32 +871,55 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # # Wi-Fi # -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -CONFIG_ESP32_WIFI_NVS_ENABLED=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP32_WIFI_IRAM_OPT=y -CONFIG_ESP32_WIFI_RX_IRAM_OPT=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 is not set +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y # CONFIG_ESP_WIFI_GMAC_SUPPORT is not set CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y # CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set # end of Wi-Fi # @@ -830,18 +934,11 @@ CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y # FAT Filesystem support # CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set # CONFIG_FATFS_SECTOR_512 is not set -# CONFIG_FATFS_SECTOR_1024 is not set -# CONFIG_FATFS_SECTOR_2048 is not set CONFIG_FATFS_SECTOR_4096=y -CONFIG_FATFS_SECTORS_PER_CLUSTER_1=y -# CONFIG_FATFS_SECTORS_PER_CLUSTER_2 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_4 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_8 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_16 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_32 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_64 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_128 is not set # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_720 is not set @@ -864,17 +961,12 @@ CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_936 is not set # CONFIG_FATFS_CODEPAGE_949 is not set # CONFIG_FATFS_CODEPAGE_950 is not set -CONFIG_FATFS_AUTO_TYPE=y -# CONFIG_FATFS_FAT12 is not set -# CONFIG_FATFS_FAT16 is not set CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set CONFIG_FATFS_FS_LOCK=0 CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y # CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 # end of FAT Filesystem support # @@ -900,6 +992,7 @@ CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set CONFIG_FREERTOS_USE_TICKLESS_IDLE=y @@ -911,6 +1004,7 @@ CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP=3 # CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y # CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y # CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y CONFIG_FREERTOS_ISR_STACKSIZE=1536 @@ -922,7 +1016,6 @@ CONFIG_FREERTOS_CORETIMER_0=y CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # end of Port @@ -939,6 +1032,8 @@ CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y # CONFIG_HAL_ASSERTION_SILENT is not set # CONFIG_HAL_ASSERTION_ENABLE is not set CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y # end of Hardware Abstraction Layer (HAL) and Low Level (LL) # @@ -950,9 +1045,14 @@ CONFIG_HEAP_POISONING_DISABLED=y CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_TRACING_STANDALONE is not set # CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set # end of Heap memory debugging +CONFIG_IEEE802154_CCA_THRESHOLD=-60 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 + # # Log output # @@ -978,6 +1078,7 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y CONFIG_LWIP_LOCAL_HOSTNAME="sgu-ring-fact" # CONFIG_LWIP_NETIF_API is not set # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set # CONFIG_LWIP_IRAM_OPTIMIZATION is not set @@ -990,9 +1091,8 @@ CONFIG_LWIP_SO_REUSE_RXTOALL=y # CONFIG_LWIP_SO_RCVBUF is not set # CONFIG_LWIP_NETBUF_RECVINFO is not set CONFIG_LWIP_IP4_FRAG=y -CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_IP4_REASSEMBLY is not set -# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 # CONFIG_LWIP_IP_FORWARD is not set # CONFIG_LWIP_STATS is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y @@ -1004,6 +1104,7 @@ CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set CONFIG_LWIP_DHCP_OPTIONS_LEN=68 CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 # # DHCP server @@ -1014,10 +1115,8 @@ CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 # end of DHCP server # CONFIG_LWIP_AUTOIP is not set -CONFIG_LWIP_IPV6=y -# CONFIG_LWIP_IPV6_AUTOCONFIG is not set -CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 -# CONFIG_LWIP_IPV6_FORWARD is not set +CONFIG_LWIP_IPV4=y +# CONFIG_LWIP_IPV6 is not set # CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set CONFIG_LWIP_NETIF_LOOPBACK=y CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 @@ -1066,8 +1165,6 @@ CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1=y CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x1 # CONFIG_LWIP_PPP_SUPPORT is not set -CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 -CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 # CONFIG_LWIP_SLIP_SUPPORT is not set # @@ -1101,18 +1198,9 @@ CONFIG_LWIP_ESP_LWIP_ASSERT=y # CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y # CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y -# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set -CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y -# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set -# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y -# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set # end of Hooks # CONFIG_LWIP_DEBUG is not set @@ -1138,6 +1226,7 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 # CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set # CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +CONFIG_MBEDTLS_PKCS7_C=y # end of mbedTLS v3.x related # @@ -1277,6 +1366,17 @@ CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y # OpenThread # # CONFIG_OPENTHREAD_ENABLED is not set + +# +# Thread Operational Dataset +# +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset # end of OpenThread # @@ -1300,6 +1400,14 @@ CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # end of PThreads +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + # # SPI Flash driver # @@ -1329,6 +1437,11 @@ CONFIG_SPI_FLASH_BROWNOUT_RESET=y # # Auto-detect flash chips # +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y @@ -1405,6 +1518,11 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set # end of Unity unit testing library +# +# Root Hub configuration +# +# end of Root Hub configuration + # # Virtual file system # @@ -1413,6 +1531,7 @@ CONFIG_VFS_SUPPORT_DIR=y CONFIG_VFS_SUPPORT_SELECT=y CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 # # Host File System I/O (Semihosting) @@ -1435,38 +1554,26 @@ CONFIG_WL_SECTOR_SIZE=4096 CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION=y +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set # end of Wi-Fi Provisioning Manager - -# -# Supplicant -# -CONFIG_WPA_MBEDTLS_CRYPTO=y -CONFIG_WPA_MBEDTLS_TLS_CLIENT=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_SUITE_B_192 is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# CONFIG_WPA_11R_SUPPORT is not set -# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set -# end of Supplicant # end of Component config +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + # Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set # CONFIG_NO_BLOBS is not set # CONFIG_ESP32_NO_BLOBS is not set # CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set # CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set # CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set # CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set -CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +CONFIG_LOG_BOOTLOADER_LEVEL_WARN=y +# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set # CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set # CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set -CONFIG_LOG_BOOTLOADER_LEVEL=3 +CONFIG_LOG_BOOTLOADER_LEVEL=2 # CONFIG_APP_ROLLBACK_ENABLE is not set # CONFIG_FLASH_ENCRYPTION_ENABLED is not set # CONFIG_FLASHMODE_QIO is not set @@ -1546,6 +1653,7 @@ CONFIG_INT_WDT=y CONFIG_INT_WDT_TIMEOUT_MS=300 CONFIG_INT_WDT_CHECK_CPU1=y CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y CONFIG_TASK_WDT_PANIC=y CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y @@ -1575,6 +1683,41 @@ CONFIG_ESP32_BROWNOUT_DET_LVL=0 # CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y diff --git a/Source/ring-fw/dependencies.lock b/Source/ring-fw/dependencies.lock new file mode 100644 index 0000000..add085d --- /dev/null +++ b/Source/ring-fw/dependencies.lock @@ -0,0 +1,15 @@ +dependencies: + espressif/led_strip: + component_hash: c240f82567a37357bef313f76b0df93cb2da025835e525006096ea7e0fd61b4f + source: + service_url: https://api.components.espressif.com/ + type: service + version: 2.4.3 + idf: + component_hash: null + source: + type: idf + version: 5.1.1 +manifest_hash: 1e23ce33a87e2e6bf01e970cf1cbdf4cf98a4898d8855f3af2a1322206852abc +target: esp32 +version: 1.0.0 diff --git a/Source/ring-fw/main/FWConfig.h b/Source/ring-fw/main/FWConfig.h index 545e544..fc911e7 100644 --- a/Source/ring-fw/main/FWConfig.h +++ b/Source/ring-fw/main/FWConfig.h @@ -17,7 +17,6 @@ // WS1228 as sanity led #define FWCONFIG_WS1228B_PIN 18 -#define FWCONFIG_WS1228B_RMT_TX_CHANNEL RMT_CHANNEL_0 #define HWCONFIG_WS1228B_LEDCOUNT (45) #endif \ No newline at end of file diff --git a/Source/ring-fw/main/GPIO.c b/Source/ring-fw/main/GPIO.c index fa25a92..9aff48c 100644 --- a/Source/ring-fw/main/GPIO.c +++ b/Source/ring-fw/main/GPIO.c @@ -7,7 +7,7 @@ #define TAG "GPIO" -static led_strip_t* m_strip = NULL; +static led_strip_handle_t led_strip; void GPIO_Init() { @@ -17,23 +17,18 @@ void GPIO_Init() gpio_set_direction((gpio_num_t)FWCONFIG_SWITCH_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode((gpio_num_t)FWCONFIG_SWITCH_PIN, GPIO_PULLUP_ONLY); - // Initialize LED drivers - rmt_config_t config = RMT_DEFAULT_CONFIG_TX(FWCONFIG_WS1228B_PIN, FWCONFIG_WS1228B_RMT_TX_CHANNEL); - // set counter clock to 40MHz - config.clk_div = 2; - - ESP_ERROR_CHECK(rmt_config(&config)); - ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0)); - - // ----------------------- - // install ws2812 driver - led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(HWCONFIG_WS1228B_LEDCOUNT, (led_strip_dev_t)config.channel); - m_strip = led_strip_new_rmt_ws2812(&strip_config); - if (!m_strip) { - ESP_LOGE(TAG, "install WS2812 driver failed"); - } - // Clear LED strip (turn off all LEDs) - ESP_ERROR_CHECK(m_strip->clear(m_strip, 100)); + + /* LED strip initialization with the GPIO and pixels number*/ + led_strip_config_t strip_config = { + .strip_gpio_num = FWCONFIG_WS1228B_PIN, + .max_leds = HWCONFIG_WS1228B_LEDCOUNT, // sanity LED + at least one LED on board + }; + led_strip_rmt_config_t rmt_config = { + .resolution_hz = 10 * 1000 * 1000, // 10MHz + }; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); } void GPIO_EnableHoldPowerPin(bool bEnabled) @@ -43,15 +38,15 @@ void GPIO_EnableHoldPowerPin(bool bEnabled) void GPIO_SetPixel(uint32_t u32Index, uint8_t u8Red, uint8_t u8Green, uint8_t u8Blue) { - ESP_ERROR_CHECK(m_strip->set_pixel(m_strip, u32Index, u8Red, u8Green, u8Blue)); + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, u32Index, u8Red, u8Green, u8Blue)); } void GPIO_ClearAllPixels() { - ESP_ERROR_CHECK(m_strip->clear(m_strip, 50)); + ESP_ERROR_CHECK(led_strip_clear(led_strip)); } void GPIO_RefreshPixels() { - ESP_ERROR_CHECK(m_strip->refresh(m_strip, 100)); + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); } \ No newline at end of file diff --git a/Source/ring-fw/main/fwconfig.h b/Source/ring-fw/main/fwconfig.h index 545e544..fc911e7 100644 --- a/Source/ring-fw/main/fwconfig.h +++ b/Source/ring-fw/main/fwconfig.h @@ -17,7 +17,6 @@ // WS1228 as sanity led #define FWCONFIG_WS1228B_PIN 18 -#define FWCONFIG_WS1228B_RMT_TX_CHANNEL RMT_CHANNEL_0 #define HWCONFIG_WS1228B_LEDCOUNT (45) #endif \ No newline at end of file diff --git a/Source/ring-fw/main/gpio.c b/Source/ring-fw/main/gpio.c index fa25a92..9aff48c 100644 --- a/Source/ring-fw/main/gpio.c +++ b/Source/ring-fw/main/gpio.c @@ -7,7 +7,7 @@ #define TAG "GPIO" -static led_strip_t* m_strip = NULL; +static led_strip_handle_t led_strip; void GPIO_Init() { @@ -17,23 +17,18 @@ void GPIO_Init() gpio_set_direction((gpio_num_t)FWCONFIG_SWITCH_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode((gpio_num_t)FWCONFIG_SWITCH_PIN, GPIO_PULLUP_ONLY); - // Initialize LED drivers - rmt_config_t config = RMT_DEFAULT_CONFIG_TX(FWCONFIG_WS1228B_PIN, FWCONFIG_WS1228B_RMT_TX_CHANNEL); - // set counter clock to 40MHz - config.clk_div = 2; - - ESP_ERROR_CHECK(rmt_config(&config)); - ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0)); - - // ----------------------- - // install ws2812 driver - led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(HWCONFIG_WS1228B_LEDCOUNT, (led_strip_dev_t)config.channel); - m_strip = led_strip_new_rmt_ws2812(&strip_config); - if (!m_strip) { - ESP_LOGE(TAG, "install WS2812 driver failed"); - } - // Clear LED strip (turn off all LEDs) - ESP_ERROR_CHECK(m_strip->clear(m_strip, 100)); + + /* LED strip initialization with the GPIO and pixels number*/ + led_strip_config_t strip_config = { + .strip_gpio_num = FWCONFIG_WS1228B_PIN, + .max_leds = HWCONFIG_WS1228B_LEDCOUNT, // sanity LED + at least one LED on board + }; + led_strip_rmt_config_t rmt_config = { + .resolution_hz = 10 * 1000 * 1000, // 10MHz + }; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); } void GPIO_EnableHoldPowerPin(bool bEnabled) @@ -43,15 +38,15 @@ void GPIO_EnableHoldPowerPin(bool bEnabled) void GPIO_SetPixel(uint32_t u32Index, uint8_t u8Red, uint8_t u8Green, uint8_t u8Blue) { - ESP_ERROR_CHECK(m_strip->set_pixel(m_strip, u32Index, u8Red, u8Green, u8Blue)); + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, u32Index, u8Red, u8Green, u8Blue)); } void GPIO_ClearAllPixels() { - ESP_ERROR_CHECK(m_strip->clear(m_strip, 50)); + ESP_ERROR_CHECK(led_strip_clear(led_strip)); } void GPIO_RefreshPixels() { - ESP_ERROR_CHECK(m_strip->refresh(m_strip, 100)); + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); } \ No newline at end of file diff --git a/Source/ring-fw/main/idf_component.yml b/Source/ring-fw/main/idf_component.yml new file mode 100644 index 0000000..fbf50c7 --- /dev/null +++ b/Source/ring-fw/main/idf_component.yml @@ -0,0 +1,17 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: "*" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/Source/ring-fw/main/main.c b/Source/ring-fw/main/main.c index 20dd926..5509a4a 100644 --- a/Source/ring-fw/main/main.c +++ b/Source/ring-fw/main/main.c @@ -7,6 +7,7 @@ CONDITIONS OF ANY KIND, either express or implied. */ #include "FWConfig.h" +#include "HelperMacro.h" #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -24,6 +25,7 @@ #include "gpio.h" #include "SGUBRProtocol.h" #include "SGUBRComm.h" +#include "SGUHelper.h" #include "esp_now.h" #include "esp_crc.h" #include "esp_netif.h" @@ -32,7 +34,7 @@ #define SGU_GATTS_TAG "SGU-GATTS" -#define LED_OUTPUT_MAX (220) +#define LED_OUTPUT_MAX (160) #define LED_OUTPUT_IDLE (100) static void InitESPNOW(); @@ -157,46 +159,59 @@ static void LedRefreshTask(void *pvParameters) { switch((SGUBRPROTOCOL_ECHEVRONANIM)m_s32ChevronAnim) { + case SGUBRPROTOCOL_ECHEVRONANIM_Suicide: + { + ESP_LOGI(TAG, "Animation / Suicide"); + // Light up the hidden chevron RED. + GPIO_SetPixel(SGUHELPER_ChevronIndexToLedIndex(5), LED_OUTPUT_MAX, 0, 0); + GPIO_SetPixel(SGUHELPER_ChevronIndexToLedIndex(6), LED_OUTPUT_MAX, 0, 0); + break; + } case SGUBRPROTOCOL_ECHEVRONANIM_FadeIn: { ESP_LOGI(TAG, "Animation / FadeIn"); - for(int brightness = 0; brightness < LED_OUTPUT_MAX; brightness += 10) + + for(float fltBrightness = 0.0f; fltBrightness <= 1.0f; fltBrightness += 0.05f) { - for(int i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + const uint8_t u8Brightness = (uint8_t)(HELPERMACRO_LEDLOGADJ(fltBrightness, 1.0f) * LED_OUTPUT_MAX); + + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) { - if ((i % 5) == 0) - GPIO_SetPixel(i, brightness, brightness, brightness); + if (SGUHELPER_IsLEDIndexChevron(i)) + GPIO_SetPixel(i, u8Brightness, u8Brightness, u8Brightness); else GPIO_SetPixel(i, 0, 0, 0); } GPIO_RefreshPixels(); - vTaskDelay(pdMS_TO_TICKS(50)); + vTaskDelay(pdMS_TO_TICKS(40)); } break; } case SGUBRPROTOCOL_ECHEVRONANIM_FadeOut: { ESP_LOGI(TAG, "Animation / FadeOut"); - for(int brightness = LED_OUTPUT_MAX; brightness >= 0; brightness -= 10) + for(float fltBrightness = 1.0f; fltBrightness >= 0.0f; fltBrightness -= 0.05f) { - for(int i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + const uint8_t u8Brightness = (fltBrightness < 0.05f ? 0 : (uint8_t)(HELPERMACRO_LEDLOGADJ(fltBrightness, 1.0f) * LED_OUTPUT_MAX)); + + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) { - if ((i % 5) == 0) - GPIO_SetPixel(i, brightness, brightness, brightness); + if (SGUHELPER_IsLEDIndexChevron(i)) + GPIO_SetPixel(i, u8Brightness, u8Brightness, u8Brightness); else GPIO_SetPixel(i, 0, 0, 0); } GPIO_RefreshPixels(); - vTaskDelay(pdMS_TO_TICKS(50)); + vTaskDelay(pdMS_TO_TICKS(40)); } break; } case SGUBRPROTOCOL_ECHEVRONANIM_ErrorToWhite: { ESP_LOGI(TAG, "Animation / Error"); - for(int i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) { - if ((i % 5) == 0) + if (SGUHELPER_IsLEDIndexChevron(i)) GPIO_SetPixel(i, LED_OUTPUT_MAX, 0, 0); else GPIO_SetPixel(i, 0, 0, 0); @@ -204,12 +219,13 @@ static void LedRefreshTask(void *pvParameters) GPIO_RefreshPixels(); vTaskDelay(pdMS_TO_TICKS(1500)); - for(int brightness = 0; brightness < LED_OUTPUT_MAX; brightness += 10) + for(float fltBrightness = 0.0f; fltBrightness <= 1.0f; fltBrightness += 0.05f) { - for(int i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + const uint8_t u8Brightness = (uint8_t)(HELPERMACRO_LEDLOGADJ(fltBrightness, 1.0f) * LED_OUTPUT_MAX); + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) { - if ((i % 5) == 0) - GPIO_SetPixel(i, LED_OUTPUT_MAX, brightness, brightness); + if (SGUHELPER_IsLEDIndexChevron(i)) + GPIO_SetPixel(i, LED_OUTPUT_MAX, u8Brightness, u8Brightness); } GPIO_RefreshPixels(); vTaskDelay(pdMS_TO_TICKS(50)); @@ -219,9 +235,9 @@ static void LedRefreshTask(void *pvParameters) case SGUBRPROTOCOL_ECHEVRONANIM_ErrorToOff: { ESP_LOGI(TAG, "Animation / Error"); - for(int i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) { - if ((i % 5) == 0) + if (SGUHELPER_IsLEDIndexChevron(i)) GPIO_SetPixel(i, LED_OUTPUT_MAX, 0, 0); else GPIO_SetPixel(i, 0, 0, 0); @@ -230,12 +246,32 @@ static void LedRefreshTask(void *pvParameters) GPIO_RefreshPixels(); vTaskDelay(pdMS_TO_TICKS(1500)); - for(int brightness = LED_OUTPUT_MAX; brightness >= 0; brightness -= 10) + for(float fltBrightness = 1.0f; fltBrightness >= 0.0f; fltBrightness -= 0.05f) + { + const uint8_t u8Brightness = (fltBrightness < 0.05f ? 0 : (uint8_t)(HELPERMACRO_LEDLOGADJ(fltBrightness, 1.0f) * LED_OUTPUT_MAX)); + + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + { + if (SGUHELPER_IsLEDIndexChevron(i)) + GPIO_SetPixel(i, u8Brightness, 0, 0); + } + GPIO_RefreshPixels(); + vTaskDelay(pdMS_TO_TICKS(50)); + } + break; + } + case SGUBRPROTOCOL_ECHEVRONANIM_AllSymbolsOn: + { + ESP_LOGI(TAG, "Animation / AllSymbolsOn"); + for(float fltBrightness = 0.0f; fltBrightness <= 1.0f; fltBrightness += 0.05f) { - for(int i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) + const uint8_t u8Brightness = (uint8_t)(HELPERMACRO_LEDLOGADJ(fltBrightness, 1.0f) * LED_OUTPUT_MAX); + for(int32_t i = 0; i < HWCONFIG_WS1228B_LEDCOUNT; i++) { - if ((i % 5) == 0) - GPIO_SetPixel(i, brightness, 0, 0); + if (SGUHELPER_IsLEDIndexChevron(i)) + GPIO_SetPixel(i, u8Brightness, u8Brightness, u8Brightness); + else + GPIO_SetPixel(i, 5, 5, 5); } GPIO_RefreshPixels(); vTaskDelay(pdMS_TO_TICKS(50)); @@ -311,7 +347,7 @@ static void SGUBRUpdateLightHandler(const SGUBRPROTOCOL_SUpdateLightArg* psArg) ESP_LOGI(TAG, "BLE Update light received. Lights: %u", /*0*/(uint)psArg->u8LightCount); // Keep chevrons dimly lit - for(int i = 0; i < psArg->u8LightCount; i++) + for(int32_t i = 0; i < psArg->u8LightCount; i++) { uint8_t u8LightIndex = psArg->u8Lights[i]; @@ -405,6 +441,7 @@ void app_main(void) xTaskCreatePinnedToCore(&MainTask, "MainTask", 4000, NULL, 10, NULL, 1); long switchTicks = 0; + bool bLastIsSuicide = false; while(true) { @@ -436,14 +473,21 @@ void app_main(void) // Means cutting to power to itself. if (m_bIsSuicide) { + if (!bLastIsSuicide) + { + m_s32ChevronAnim = SGUBRPROTOCOL_ECHEVRONANIM_Suicide; + ESP_LOGW(TAG, "Suicide animation"); + } + // Release the power pin // Delay for animation before stop GPIO_EnableHoldPowerPin(false); // At this point if there are no external power to maintain it, it should die. - vTaskDelay(pdMS_TO_TICKS(500)); - ESP_LOGW(TAG, "Seems like it we will live"); + vTaskDelay(pdMS_TO_TICKS(250)); + ESP_LOGW(TAG, "Seems like we will live"); } + bLastIsSuicide = m_bIsSuicide; vTaskDelay(pdMS_TO_TICKS(250)); } } diff --git a/Source/ring-fw/managed_components/espressif__led_strip/.component_hash b/Source/ring-fw/managed_components/espressif__led_strip/.component_hash new file mode 100644 index 0000000..d6abe9d --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/.component_hash @@ -0,0 +1 @@ +c240f82567a37357bef313f76b0df93cb2da025835e525006096ea7e0fd61b4f \ No newline at end of file diff --git a/Source/ring-fw/managed_components/espressif__led_strip/CHANGELOG.md b/Source/ring-fw/managed_components/espressif__led_strip/CHANGELOG.md new file mode 100644 index 0000000..494cad2 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/CHANGELOG.md @@ -0,0 +1,32 @@ +## 2.4.0 + +- Support configurable SPI mode to contorl leds + - recommend to enable DMA when using SPI mode + +## 2.3.0 + +- Support configurable RMT channel size by setting `mem_block_symbols` + +## 2.2.0 + +- Support for 4 components RGBW leds (SK6812): + - in led_strip_config_t new fields + led_pixel_format, controlling byte format (LED_PIXEL_FORMAT_GRB, LED_PIXEL_FORMAT_GRBW) + led_model, used to configure bit timing (LED_MODEL_WS2812, LED_MODEL_SK6812) + - new API led_strip_set_pixel_rgbw + - new interface type set_pixel_rgbw + +## 2.1.0 + +- Support DMA feature, which offloads the CPU by a lot when it comes to drive a bunch of LEDs +- Support various RMT clock sources +- Acquire and release the power management lock before and after each refresh +- New driver flag: `invert_out` which can invert the led control signal by hardware + +## 2.0.0 + +- Reimplemented the driver using the new RMT driver (`driver/rmt_tx.h`) + +## 1.0.0 + +- Initial driver version, based on the legacy RMT driver (`driver/rmt.h`) diff --git a/Source/ring-fw/managed_components/espressif__led_strip/CMakeLists.txt b/Source/ring-fw/managed_components/espressif__led_strip/CMakeLists.txt new file mode 100644 index 0000000..bd122c2 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/CMakeLists.txt @@ -0,0 +1,18 @@ +include($ENV{IDF_PATH}/tools/cmake/version.cmake) + +set(srcs "src/led_strip_api.c") + +if(CONFIG_SOC_RMT_SUPPORTED) + list(APPEND srcs "src/led_strip_rmt_dev.c" "src/led_strip_rmt_encoder.c") +endif() + +# the SPI backend driver relies on something that was added in IDF 5.1 +if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "5.1") + if(CONFIG_SOC_GPSPI_SUPPORTED) + list(APPEND srcs "src/led_strip_spi_dev.c") + endif() +endif() + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS "include" "interface" + REQUIRES "driver") diff --git a/Source/ring-fw/managed_components/espressif__led_strip/LICENSE b/Source/ring-fw/managed_components/espressif__led_strip/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Source/ring-fw/managed_components/espressif__led_strip/README.md b/Source/ring-fw/managed_components/espressif__led_strip/README.md new file mode 100644 index 0000000..6f9f8f3 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/README.md @@ -0,0 +1,90 @@ +# LED Strip Driver + +[![Component Registry](https://components.espressif.com/components/espressif/led_strip/badge.svg)](https://components.espressif.com/components/espressif/led_strip) + +This driver is designed for addressable LEDs like [WS2812](http://www.world-semi.com/Certifications/WS2812B.html), where each LED is controlled by a single data line. + +## Backend Controllers + +### The [RMT](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html) Peripheral + +This is the most economical way to drive the LEDs because it only consumes one RMT channel, leaving other channels free to use. However, the memory usage increases dramatically with the number of LEDs. If the RMT hardware can't be assist by DMA, the driver will going into interrupt very frequently, thus result in a high CPU usage. What's worse, if the RMT interrupt is delayed or not serviced in time (e.g. if Wi-Fi interrupt happens on the same CPU core), the RMT transaction will be corrupted and the LEDs will display incorrect colors. If you want to use RMT to drive a large number of LEDs, you'd better to enable the DMA feature if possible [^1]. + +#### Allocate LED Strip Object with RMT Backend + +```c +#define BLINK_GPIO 0 + +led_strip_handle_t led_strip; + +/* LED strip initialization with the GPIO and pixels number*/ +led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = 1, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter) +}; + +led_strip_rmt_config_t rmt_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .resolution_hz = 10 * 1000 * 1000, // 10MHz + .flags.with_dma = false, // whether to enable the DMA feature +}; +ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); +``` + +You can create multiple LED strip objects with different GPIOs and pixel numbers. The backend driver will automatically allocate the RMT channel for you if there is more available. + +### The [SPI](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html) Peripheral + +SPI peripheral can also be used to generate the timing required by the LED strip. However this backend is not as economical as the RMT one, because it will take up the whole **bus**, unlike the RMT just takes one **channel**. You **CANT** connect other devices to the same SPI bus if it's been used by the led_strip, because the led_strip doesn't have the concept of "Chip Select". + +Please note, the SPI backend has a dependency of **ESP-IDF >= 5.1** + +#### Allocate LED Strip Object with SPI Backend + +```c +#define BLINK_GPIO 0 + +led_strip_handle_t led_strip; + +/* LED strip initialization with the GPIO and pixels number*/ +led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = 1, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter) +}; + +led_strip_spi_config_t spi_config = { + .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs + .spi_bus = SPI2_HOST, // SPI bus ID +}; +ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip)); +``` + +The number of LED strip objects can be created depends on how many free SPI buses are free to use in your project. + +## FAQ + +* Which led_strip backend should I choose? + * It depends on your application requirement and target chip's ability. + + ```mermaid + flowchart LR + A{Is RMT supported?} + A --> |No| B[SPI backend] + B --> C{Does the led strip has \n a larger number of LEDs?} + C --> |No| D[Don't have to enable the DMA of the backend] + C --> |Yes| E[Enable the DMA of the backend] + A --> |Yes| F{Does the led strip has \n a larger number of LEDs?} + F --> |Yes| G{Does RMT support DMA?} + G --> |Yes| E + G --> |No| B + F --> |No| H[RMT backend] --> D + ``` + +[^1]: The RMT DMA feature is not available on all ESP chips. Please check the data sheet before using it. diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt new file mode 100644 index 0000000..fc2dfc7 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_strip_rmt_ws2812) diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md new file mode 100644 index 0000000..ad52235 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/README.md @@ -0,0 +1,31 @@ +# LED Strip Example (RMT backend + WS2812) + +This example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component. + +## How to Use Example + +### Hardware Required + +* A development board with Espressif SoC +* A USB cable for Power supply and programming +* WS2812 LED strip + +### Configure the Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. Then assign the proper GPIO in the [source file](main/led_strip_rmt_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number. + +### Build and Flash + +Run `idf.py -p PORT build flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```text +I (299) gpio: GPIO[8]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (309) example: Created LED strip object with RMT backend +I (309) example: Start blinking LED strip +``` diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt new file mode 100644 index 0000000..37b9c14 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_strip_rmt_ws2812_main.c" + INCLUDE_DIRS ".") diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml new file mode 100644 index 0000000..916c366 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml @@ -0,0 +1,5 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: + version: '^2' + override_path: '../../../' diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c new file mode 100644 index 0000000..62293d5 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "led_strip.h" +#include "esp_log.h" +#include "esp_err.h" + +// GPIO assignment +#define LED_STRIP_BLINK_GPIO 2 +// Numbers of the LED in the strip +#define LED_STRIP_LED_NUMBERS 24 +// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution) +#define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000) + +static const char *TAG = "example"; + +led_strip_handle_t configure_led(void) +{ + // LED strip general initialization, according to your led board design + led_strip_config_t strip_config = { + .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal + }; + + // LED strip backend configuration: RMT + led_strip_rmt_config_t rmt_config = { + .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .resolution_hz = LED_STRIP_RMT_RES_HZ, // RMT counter clock frequency + .flags.with_dma = false, // DMA feature is available on ESP target like ESP32-S3 + }; + + // LED Strip object handle + led_strip_handle_t led_strip; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + ESP_LOGI(TAG, "Created LED strip object with RMT backend"); + return led_strip; +} + +void app_main(void) +{ + led_strip_handle_t led_strip = configure_led(); + bool led_on_off = false; + + ESP_LOGI(TAG, "Start blinking LED strip"); + while (1) { + if (led_on_off) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5)); + } + /* Refresh the strip to send data */ + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); + ESP_LOGI(TAG, "LED ON!"); + } else { + /* Set all LED off to clear all pixels */ + ESP_ERROR_CHECK(led_strip_clear(led_strip)); + ESP_LOGI(TAG, "LED OFF!"); + } + + led_on_off = !led_on_off; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt new file mode 100644 index 0000000..7d3af2d --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_strip_spi_ws2812) diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md new file mode 100644 index 0000000..c545c84 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/README.md @@ -0,0 +1,31 @@ +# LED Strip Example (SPI backend + WS2812) + +This example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component. + +## How to Use Example + +### Hardware Required + +* A development board with Espressif SoC +* A USB cable for Power supply and programming +* WS2812 LED strip + +### Configure the Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. Then assign the proper GPIO in the [source file](main/led_strip_spi_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number. + +### Build and Flash + +Run `idf.py -p PORT build flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +```text +I (299) gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (309) example: Created LED strip object with SPI backend +I (309) example: Start blinking LED strip +``` diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt new file mode 100644 index 0000000..5ad7dd5 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_strip_spi_ws2812_main.c" + INCLUDE_DIRS ".") diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml new file mode 100644 index 0000000..050d8d2 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/idf_component.yml @@ -0,0 +1,6 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/led_strip: + version: '^2.4' + override_path: '../../../' + idf: ">=5.1" diff --git a/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c new file mode 100644 index 0000000..69b780c --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/examples/led_strip_spi_ws2812/main/led_strip_spi_ws2812_main.c @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "led_strip.h" +#include "esp_log.h" +#include "esp_err.h" + +// GPIO assignment +#define LED_STRIP_BLINK_GPIO 2 +// Numbers of the LED in the strip +#define LED_STRIP_LED_NUMBERS 24 + +static const char *TAG = "example"; + +led_strip_handle_t configure_led(void) +{ + // LED strip general initialization, according to your led board design + led_strip_config_t strip_config = { + .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line + .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, + .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip + .led_model = LED_MODEL_WS2812, // LED strip model + .flags.invert_out = false, // whether to invert the output signal + }; + + // LED strip backend configuration: SPI + led_strip_spi_config_t spi_config = { + .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption + .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs + .spi_bus = SPI2_HOST, // SPI bus ID + }; + + // LED Strip object handle + led_strip_handle_t led_strip; + ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip)); + ESP_LOGI(TAG, "Created LED strip object with SPI backend"); + return led_strip; +} + +void app_main(void) +{ + led_strip_handle_t led_strip = configure_led(); + bool led_on_off = false; + + ESP_LOGI(TAG, "Start blinking LED strip"); + while (1) { + if (led_on_off) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { + ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5)); + } + /* Refresh the strip to send data */ + ESP_ERROR_CHECK(led_strip_refresh(led_strip)); + ESP_LOGI(TAG, "LED ON!"); + } else { + /* Set all LED off to clear all pixels */ + ESP_ERROR_CHECK(led_strip_clear(led_strip)); + ESP_LOGI(TAG, "LED OFF!"); + } + + led_on_off = !led_on_off; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} diff --git a/Source/ring-fw/managed_components/espressif__led_strip/idf_component.yml b/Source/ring-fw/managed_components/espressif__led_strip/idf_component.yml new file mode 100644 index 0000000..e973e89 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/idf_component.yml @@ -0,0 +1,6 @@ +dependencies: + idf: + version: '>=5.0' +description: Driver for Addressable LED Strip (WS2812, etc) +url: https://github.com/espressif/idf-extra-components/tree/master/led_strip +version: 2.4.3 diff --git a/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip.h b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip.h new file mode 100644 index 0000000..234b637 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip.h @@ -0,0 +1,91 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "led_strip_rmt.h" +#include "led_strip_spi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set RGB for a specific pixel + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * + * @return + * - ESP_OK: Set RGB for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters + * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred + */ +esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); + +/** + * @brief Set RGBW for a specific pixel + * + * @note Only call this function if your led strip does have the white component (e.g. SK6812-RGBW) + * @note Also see `led_strip_set_pixel` if you only want to specify the RGB part of the color and bypass the white component + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * @param white: separate white component + * + * @return + * - ESP_OK: Set RGBW color for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument + * - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred + */ +esp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white); + +/** + * @brief Refresh memory colors to LEDs + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Refresh successfully + * - ESP_FAIL: Refresh failed because some other error occurred + * + * @note: + * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. + */ +esp_err_t led_strip_refresh(led_strip_handle_t strip); + +/** + * @brief Clear LED strip (turn off all LEDs) + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Clear LEDs successfully + * - ESP_FAIL: Clear LEDs failed because some other error occurred + */ +esp_err_t led_strip_clear(led_strip_handle_t strip); + +/** + * @brief Free LED strip resources + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ +esp_err_t led_strip_del(led_strip_handle_t strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_rmt.h b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_rmt.h new file mode 100644 index 0000000..69ff7cd --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_rmt.h @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "driver/rmt_types.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED Strip RMT specific configuration + */ +typedef struct { + rmt_clock_source_t clk_src; /*!< RMT clock source */ + uint32_t resolution_hz; /*!< RMT tick resolution, if set to zero, a default resolution (10MHz) will be applied */ + size_t mem_block_symbols; /*!< How many RMT symbols can one RMT channel hold at one time. Set to 0 will fallback to use the default size. */ + struct { + uint32_t with_dma: 1; /*!< Use DMA to transmit data */ + } flags; +} led_strip_rmt_config_t; + +/** + * @brief Create LED strip based on RMT TX channel + * + * @param led_config LED strip configuration + * @param rmt_config RMT specific configuration + * @param ret_strip Returned LED strip handle + * @return + * - ESP_OK: create LED strip handle successfully + * - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument + * - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory + * - ESP_FAIL: create LED strip handle failed because some other error + */ +esp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_spi.h b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_spi.h new file mode 100644 index 0000000..6b5b1dc --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_spi.h @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "driver/spi_master.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED Strip SPI specific configuration + */ +typedef struct { + spi_clock_source_t clk_src; /*!< SPI clock source */ + spi_host_device_t spi_bus; /*!< SPI bus ID. Which buses are available depends on the specific chip */ + struct { + uint32_t with_dma: 1; /*!< Use DMA to transmit data */ + } flags; +} led_strip_spi_config_t; + +/** + * @brief Create LED strip based on SPI MOSI channel + * @note Although only the MOSI line is used for generating the signal, the whole SPI bus can't be used for other purposes. + * + * @param led_config LED strip configuration + * @param spi_config SPI specific configuration + * @param ret_strip Returned LED strip handle + * @return + * - ESP_OK: create LED strip handle successfully + * - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument + * - ESP_ERR_NOT_SUPPORTED: create LED strip handle failed because of unsupported configuration + * - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory + * - ESP_FAIL: create LED strip handle failed because some other error + */ +esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_types.h b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_types.h new file mode 100644 index 0000000..d5b8052 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/include/led_strip_types.h @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief LED strip pixel format + */ +typedef enum { + LED_PIXEL_FORMAT_GRB, /*!< Pixel format: GRB */ + LED_PIXEL_FORMAT_GRBW, /*!< Pixel format: GRBW */ + LED_PIXEL_FORMAT_INVALID /*!< Invalid pixel format */ +} led_pixel_format_t; + +/** + * @brief LED strip model + * @note Different led model may have different timing parameters, so we need to distinguish them. + */ +typedef enum { + LED_MODEL_WS2812, /*!< LED strip model: WS2812 */ + LED_MODEL_SK6812, /*!< LED strip model: SK6812 */ + LED_MODEL_INVALID /*!< Invalid LED strip model */ +} led_model_t; + +/** + * @brief LED strip handle + */ +typedef struct led_strip_t *led_strip_handle_t; + +/** + * @brief LED Strip Configuration + */ +typedef struct { + int strip_gpio_num; /*!< GPIO number that used by LED strip */ + uint32_t max_leds; /*!< Maximum LEDs in a single strip */ + led_pixel_format_t led_pixel_format; /*!< LED pixel format */ + led_model_t led_model; /*!< LED model */ + + struct { + uint32_t invert_out: 1; /*!< Invert output signal */ + } flags; +} led_strip_config_t; + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-fw/managed_components/espressif__led_strip/interface/led_strip_interface.h b/Source/ring-fw/managed_components/espressif__led_strip/interface/led_strip_interface.h new file mode 100644 index 0000000..3de4c27 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/interface/led_strip_interface.h @@ -0,0 +1,95 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct led_strip_t led_strip_t; /*!< Type of LED strip */ + +/** + * @brief LED strip interface definition + */ +struct led_strip_t { + /** + * @brief Set RGB for a specific pixel + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * + * @return + * - ESP_OK: Set RGB for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters + * - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred + */ + esp_err_t (*set_pixel)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue); + + /** + * @brief Set RGBW for a specific pixel. Similar to `set_pixel` but also set the white component + * + * @param strip: LED strip + * @param index: index of pixel to set + * @param red: red part of color + * @param green: green part of color + * @param blue: blue part of color + * @param white: separate white component + * + * @return + * - ESP_OK: Set RGBW color for a specific pixel successfully + * - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument + * - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred + */ + esp_err_t (*set_pixel_rgbw)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white); + + /** + * @brief Refresh memory colors to LEDs + * + * @param strip: LED strip + * @param timeout_ms: timeout value for refreshing task + * + * @return + * - ESP_OK: Refresh successfully + * - ESP_FAIL: Refresh failed because some other error occurred + * + * @note: + * After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip. + */ + esp_err_t (*refresh)(led_strip_t *strip); + + /** + * @brief Clear LED strip (turn off all LEDs) + * + * @param strip: LED strip + * @param timeout_ms: timeout value for clearing task + * + * @return + * - ESP_OK: Clear LEDs successfully + * - ESP_FAIL: Clear LEDs failed because some other error occurred + */ + esp_err_t (*clear)(led_strip_t *strip); + + /** + * @brief Free LED strip resources + * + * @param strip: LED strip + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ + esp_err_t (*del)(led_strip_t *strip); +}; + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_api.c b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_api.c new file mode 100644 index 0000000..4a6a6c3 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_api.c @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "esp_log.h" +#include "esp_check.h" +#include "led_strip.h" +#include "led_strip_interface.h" + +static const char *TAG = "led_strip"; + +esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->set_pixel(strip, index, red, green, blue); +} + +esp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->set_pixel_rgbw(strip, index, red, green, blue, white); +} + +esp_err_t led_strip_refresh(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->refresh(strip); +} + +esp_err_t led_strip_clear(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->clear(strip); +} + +esp_err_t led_strip_del(led_strip_handle_t strip) +{ + ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return strip->del(strip); +} diff --git a/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c new file mode 100644 index 0000000..1cbf0e4 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_dev.c @@ -0,0 +1,164 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "driver/rmt_tx.h" +#include "led_strip.h" +#include "led_strip_interface.h" +#include "led_strip_rmt_encoder.h" + +#define LED_STRIP_RMT_DEFAULT_RESOLUTION 10000000 // 10MHz resolution +#define LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE 4 +// the memory size of each RMT channel, in words (4 bytes) +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 +#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 64 +#else +#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 48 +#endif + +static const char *TAG = "led_strip_rmt"; + +typedef struct { + led_strip_t base; + rmt_channel_handle_t rmt_chan; + rmt_encoder_handle_t strip_encoder; + uint32_t strip_len; + uint8_t bytes_per_pixel; + uint8_t pixel_buf[]; +} led_strip_rmt_obj; + +static esp_err_t led_strip_rmt_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + uint32_t start = index * rmt_strip->bytes_per_pixel; + // In thr order of GRB, as LED strip like WS2812 sends out pixels in this order + rmt_strip->pixel_buf[start + 0] = green & 0xFF; + rmt_strip->pixel_buf[start + 1] = red & 0xFF; + rmt_strip->pixel_buf[start + 2] = blue & 0xFF; + if (rmt_strip->bytes_per_pixel > 3) { + rmt_strip->pixel_buf[start + 3] = 0; + } + return ESP_OK; +} + +static esp_err_t led_strip_rmt_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + ESP_RETURN_ON_FALSE(rmt_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, "wrong LED pixel format, expected 4 bytes per pixel"); + uint8_t *buf_start = rmt_strip->pixel_buf + index * 4; + // SK6812 component order is GRBW + *buf_start = green & 0xFF; + *++buf_start = red & 0xFF; + *++buf_start = blue & 0xFF; + *++buf_start = white & 0xFF; + return ESP_OK; +} + +static esp_err_t led_strip_rmt_refresh(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + rmt_transmit_config_t tx_conf = { + .loop_count = 0, + }; + + ESP_RETURN_ON_ERROR(rmt_enable(rmt_strip->rmt_chan), TAG, "enable RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_transmit(rmt_strip->rmt_chan, rmt_strip->strip_encoder, rmt_strip->pixel_buf, + rmt_strip->strip_len * rmt_strip->bytes_per_pixel, &tx_conf), TAG, "transmit pixels by RMT failed"); + ESP_RETURN_ON_ERROR(rmt_tx_wait_all_done(rmt_strip->rmt_chan, -1), TAG, "flush RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_disable(rmt_strip->rmt_chan), TAG, "disable RMT channel failed"); + return ESP_OK; +} + +static esp_err_t led_strip_rmt_clear(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + // Write zero to turn off all leds + memset(rmt_strip->pixel_buf, 0, rmt_strip->strip_len * rmt_strip->bytes_per_pixel); + return led_strip_rmt_refresh(strip); +} + +static esp_err_t led_strip_rmt_del(led_strip_t *strip) +{ + led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base); + ESP_RETURN_ON_ERROR(rmt_del_channel(rmt_strip->rmt_chan), TAG, "delete RMT channel failed"); + ESP_RETURN_ON_ERROR(rmt_del_encoder(rmt_strip->strip_encoder), TAG, "delete strip encoder failed"); + free(rmt_strip); + return ESP_OK; +} + +esp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip) +{ + led_strip_rmt_obj *rmt_strip = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(led_config && rmt_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led_pixel_format"); + uint8_t bytes_per_pixel = 3; + if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) { + bytes_per_pixel = 4; + } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) { + bytes_per_pixel = 3; + } else { + assert(false); + } + rmt_strip = calloc(1, sizeof(led_strip_rmt_obj) + led_config->max_leds * bytes_per_pixel); + ESP_GOTO_ON_FALSE(rmt_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for rmt strip"); + uint32_t resolution = rmt_config->resolution_hz ? rmt_config->resolution_hz : LED_STRIP_RMT_DEFAULT_RESOLUTION; + + // for backward compatibility, if the user does not set the clk_src, use the default value + rmt_clock_source_t clk_src = RMT_CLK_SRC_DEFAULT; + if (rmt_config->clk_src) { + clk_src = rmt_config->clk_src; + } + size_t mem_block_symbols = LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS; + // override the default value if the user sets it + if (rmt_config->mem_block_symbols) { + mem_block_symbols = rmt_config->mem_block_symbols; + } + rmt_tx_channel_config_t rmt_chan_config = { + .clk_src = clk_src, + .gpio_num = led_config->strip_gpio_num, + .mem_block_symbols = mem_block_symbols, + .resolution_hz = resolution, + .trans_queue_depth = LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE, + .flags.with_dma = rmt_config->flags.with_dma, + .flags.invert_out = led_config->flags.invert_out, + }; + ESP_GOTO_ON_ERROR(rmt_new_tx_channel(&rmt_chan_config, &rmt_strip->rmt_chan), err, TAG, "create RMT TX channel failed"); + + led_strip_encoder_config_t strip_encoder_conf = { + .resolution = resolution, + .led_model = led_config->led_model + }; + ESP_GOTO_ON_ERROR(rmt_new_led_strip_encoder(&strip_encoder_conf, &rmt_strip->strip_encoder), err, TAG, "create LED strip encoder failed"); + + + rmt_strip->bytes_per_pixel = bytes_per_pixel; + rmt_strip->strip_len = led_config->max_leds; + rmt_strip->base.set_pixel = led_strip_rmt_set_pixel; + rmt_strip->base.set_pixel_rgbw = led_strip_rmt_set_pixel_rgbw; + rmt_strip->base.refresh = led_strip_rmt_refresh; + rmt_strip->base.clear = led_strip_rmt_clear; + rmt_strip->base.del = led_strip_rmt_del; + + *ret_strip = &rmt_strip->base; + return ESP_OK; +err: + if (rmt_strip) { + if (rmt_strip->rmt_chan) { + rmt_del_channel(rmt_strip->rmt_chan); + } + if (rmt_strip->strip_encoder) { + rmt_del_encoder(rmt_strip->strip_encoder); + } + free(rmt_strip); + } + return ret; +} diff --git a/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c new file mode 100644 index 0000000..d352ac0 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.c @@ -0,0 +1,146 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "led_strip_rmt_encoder.h" + +static const char *TAG = "led_rmt_encoder"; + +typedef struct { + rmt_encoder_t base; + rmt_encoder_t *bytes_encoder; + rmt_encoder_t *copy_encoder; + int state; + rmt_symbol_word_t reset_code; +} rmt_led_strip_encoder_t; + +static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder; + rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder; + rmt_encode_state_t session_state = 0; + rmt_encode_state_t state = 0; + size_t encoded_symbols = 0; + switch (led_encoder->state) { + case 0: // send RGB data + encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state); + if (session_state & RMT_ENCODING_COMPLETE) { + led_encoder->state = 1; // switch to next state when current encoding session finished + } + if (session_state & RMT_ENCODING_MEM_FULL) { + state |= RMT_ENCODING_MEM_FULL; + goto out; // yield if there's no free space for encoding artifacts + } + // fall-through + case 1: // send reset code + encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code, + sizeof(led_encoder->reset_code), &session_state); + if (session_state & RMT_ENCODING_COMPLETE) { + led_encoder->state = 0; // back to the initial encoding session + state |= RMT_ENCODING_COMPLETE; + } + if (session_state & RMT_ENCODING_MEM_FULL) { + state |= RMT_ENCODING_MEM_FULL; + goto out; // yield if there's no free space for encoding artifacts + } + } +out: + *ret_state = state; + return encoded_symbols; +} + +static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_del_encoder(led_encoder->bytes_encoder); + rmt_del_encoder(led_encoder->copy_encoder); + free(led_encoder); + return ESP_OK; +} + +static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder) +{ + rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base); + rmt_encoder_reset(led_encoder->bytes_encoder); + rmt_encoder_reset(led_encoder->copy_encoder); + led_encoder->state = 0; + return ESP_OK; +} + +esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder) +{ + esp_err_t ret = ESP_OK; + rmt_led_strip_encoder_t *led_encoder = NULL; + ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(config->led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led model"); + led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t)); + ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder"); + led_encoder->base.encode = rmt_encode_led_strip; + led_encoder->base.del = rmt_del_led_strip_encoder; + led_encoder->base.reset = rmt_led_strip_encoder_reset; + rmt_bytes_encoder_config_t bytes_encoder_config; + if (config->led_model == LED_MODEL_SK6812) { + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.6 * config->resolution / 1000000, // T1H=0.6us + .level1 = 0, + .duration1 = 0.6 * config->resolution / 1000000, // T1L=0.6us + }, + .flags.msb_first = 1 // SK6812 transfer bit order: G7...G0R7...R0B7...B0(W7...W0) + }; + } else if (config->led_model == LED_MODEL_WS2812) { + // different led strip might have its own timing requirements, following parameter is for WS2812 + bytes_encoder_config = (rmt_bytes_encoder_config_t) { + .bit0 = { + .level0 = 1, + .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us + .level1 = 0, + .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us + }, + .bit1 = { + .level0 = 1, + .duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us + .level1 = 0, + .duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us + }, + .flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0 + }; + } else { + assert(false); + } + ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed"); + rmt_copy_encoder_config_t copy_encoder_config = {}; + ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed"); + + uint32_t reset_ticks = config->resolution / 1000000 * 50 / 2; // reset code duration defaults to 50us + led_encoder->reset_code = (rmt_symbol_word_t) { + .level0 = 0, + .duration0 = reset_ticks, + .level1 = 0, + .duration1 = reset_ticks, + }; + *ret_encoder = &led_encoder->base; + return ESP_OK; +err: + if (led_encoder) { + if (led_encoder->bytes_encoder) { + rmt_del_encoder(led_encoder->bytes_encoder); + } + if (led_encoder->copy_encoder) { + rmt_del_encoder(led_encoder->copy_encoder); + } + free(led_encoder); + } + return ret; +} diff --git a/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h new file mode 100644 index 0000000..ba71e60 --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_rmt_encoder.h @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "driver/rmt_encoder.h" +#include "led_strip_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Type of led strip encoder configuration + */ +typedef struct { + uint32_t resolution; /*!< Encoder resolution, in Hz */ + led_model_t led_model; /*!< LED model */ +} led_strip_encoder_config_t; + +/** + * @brief Create RMT encoder for encoding LED strip pixels into RMT symbols + * + * @param[in] config Encoder configuration + * @param[out] ret_encoder Returned encoder handle + * @return + * - ESP_ERR_INVALID_ARG for any invalid arguments + * - ESP_ERR_NO_MEM out of memory when creating led strip encoder + * - ESP_OK if creating encoder successfully + */ +esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder); + +#ifdef __cplusplus +} +#endif diff --git a/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_spi_dev.c b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_spi_dev.c new file mode 100644 index 0000000..12ea8fb --- /dev/null +++ b/Source/ring-fw/managed_components/espressif__led_strip/src/led_strip_spi_dev.c @@ -0,0 +1,209 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "esp_rom_gpio.h" +#include "soc/spi_periph.h" +#include "led_strip.h" +#include "led_strip_interface.h" +#include "hal/spi_hal.h" + +#define LED_STRIP_SPI_DEFAULT_RESOLUTION (2.5 * 1000 * 1000) // 2.5MHz resolution +#define LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE 4 + +#define SPI_BYTES_PER_COLOR_BYTE 3 +#define SPI_BITS_PER_COLOR_BYTE (SPI_BYTES_PER_COLOR_BYTE * 8) + +static const char *TAG = "led_strip_spi"; + +typedef struct { + led_strip_t base; + spi_host_device_t spi_host; + spi_device_handle_t spi_device; + uint32_t strip_len; + uint8_t bytes_per_pixel; + uint8_t pixel_buf[]; +} led_strip_spi_obj; + +// please make sure to zero-initialize the buf before calling this function +static void __led_strip_spi_bit(uint8_t data, uint8_t *buf) +{ + // Each color of 1 bit is represented by 3 bits of SPI, low_level:100 ,high_level:110 + // So a color byte occupies 3 bytes of SPI. + *(buf + 2) |= data & BIT(0) ? BIT(2) | BIT(1) : BIT(2); + *(buf + 2) |= data & BIT(1) ? BIT(5) | BIT(4) : BIT(5); + *(buf + 2) |= data & BIT(2) ? BIT(7) : 0x00; + *(buf + 1) |= BIT(0); + *(buf + 1) |= data & BIT(3) ? BIT(3) | BIT(2) : BIT(3); + *(buf + 1) |= data & BIT(4) ? BIT(6) | BIT(5) : BIT(6); + *(buf + 0) |= data & BIT(5) ? BIT(1) | BIT(0) : BIT(1); + *(buf + 0) |= data & BIT(6) ? BIT(4) | BIT(3) : BIT(4); + *(buf + 0) |= data & BIT(7) ? BIT(7) | BIT(6) : BIT(7); +} + +static esp_err_t led_strip_spi_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + // LED_PIXEL_FORMAT_GRB takes 72bits(9bytes) + uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; + memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]); + __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]); + __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]); + if (spi_strip->bytes_per_pixel > 3) { + __led_strip_spi_bit(0, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]); + } + return ESP_OK; +} + +static esp_err_t led_strip_spi_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs"); + ESP_RETURN_ON_FALSE(spi_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, "wrong LED pixel format, expected 4 bytes per pixel"); + // LED_PIXEL_FORMAT_GRBW takes 96bits(12bytes) + uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; + // SK6812 component order is GRBW + memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]); + __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]); + __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]); + __led_strip_spi_bit(white, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]); + + return ESP_OK; +} + +static esp_err_t led_strip_spi_refresh(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + spi_transaction_t tx_conf; + memset(&tx_conf, 0, sizeof(tx_conf)); + + tx_conf.length = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BITS_PER_COLOR_BYTE; + tx_conf.tx_buffer = spi_strip->pixel_buf; + tx_conf.rx_buffer = NULL; + ESP_RETURN_ON_ERROR(spi_device_transmit(spi_strip->spi_device, &tx_conf), TAG, "transmit pixels by SPI failed"); + + return ESP_OK; +} + +static esp_err_t led_strip_spi_clear(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + //Write zero to turn off all leds + memset(spi_strip->pixel_buf, 0, spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE); + uint8_t *buf = spi_strip->pixel_buf; + for (int index = 0; index < spi_strip->strip_len * spi_strip->bytes_per_pixel; index++) { + __led_strip_spi_bit(0, buf); + buf += SPI_BYTES_PER_COLOR_BYTE; + } + + return led_strip_spi_refresh(strip); +} + +static esp_err_t led_strip_spi_del(led_strip_t *strip) +{ + led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base); + + ESP_RETURN_ON_ERROR(spi_bus_remove_device(spi_strip->spi_device), TAG, "delete spi device failed"); + ESP_RETURN_ON_ERROR(spi_bus_free(spi_strip->spi_host), TAG, "free spi bus failed"); + + free(spi_strip); + return ESP_OK; +} + +esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip) +{ + led_strip_spi_obj *spi_strip = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(led_config && spi_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led_pixel_format"); + uint8_t bytes_per_pixel = 3; + if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) { + bytes_per_pixel = 4; + } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) { + bytes_per_pixel = 3; + } else { + assert(false); + } + uint32_t mem_caps = MALLOC_CAP_DEFAULT; + if (spi_config->flags.with_dma) { + // DMA buffer must be placed in internal SRAM + mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; + } + spi_strip = heap_caps_calloc(1, sizeof(led_strip_spi_obj) + led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, mem_caps); + + ESP_GOTO_ON_FALSE(spi_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for spi strip"); + + spi_strip->spi_host = spi_config->spi_bus; + // for backward compatibility, if the user does not set the clk_src, use the default value + spi_clock_source_t clk_src = SPI_CLK_SRC_DEFAULT; + if (spi_config->clk_src) { + clk_src = spi_config->clk_src; + } + + spi_bus_config_t spi_bus_cfg = { + .mosi_io_num = led_config->strip_gpio_num, + //Only use MOSI to generate the signal, set -1 when other pins are not used. + .miso_io_num = -1, + .sclk_io_num = -1, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, + }; + ESP_GOTO_ON_ERROR(spi_bus_initialize(spi_strip->spi_host, &spi_bus_cfg, spi_config->flags.with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED), err, TAG, "create SPI bus failed"); + + if (led_config->flags.invert_out == true) { + esp_rom_gpio_connect_out_signal(led_config->strip_gpio_num, spi_periph_signal[spi_strip->spi_host].spid_out, true, false); + } + + spi_device_interface_config_t spi_dev_cfg = { + .clock_source = clk_src, + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .clock_speed_hz = LED_STRIP_SPI_DEFAULT_RESOLUTION, + .mode = 0, + //set -1 when CS is not used + .spics_io_num = -1, + .queue_size = LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE, + }; + + ESP_GOTO_ON_ERROR(spi_bus_add_device(spi_strip->spi_host, &spi_dev_cfg, &spi_strip->spi_device), err, TAG, "Failed to add spi device"); + + int clock_resolution_khz = 0; + spi_device_get_actual_freq(spi_strip->spi_device, &clock_resolution_khz); + // TODO: ideally we should decide the SPI_BYTES_PER_COLOR_BYTE by the real clock resolution + // But now, let's fixed the resolution, the downside is, we don't support a clock source whose frequency is not multiple of LED_STRIP_SPI_DEFAULT_RESOLUTION + ESP_GOTO_ON_FALSE(clock_resolution_khz == LED_STRIP_SPI_DEFAULT_RESOLUTION / 1000, ESP_ERR_NOT_SUPPORTED, err, + TAG, "unsupported clock resolution:%dKHz", clock_resolution_khz); + + spi_strip->bytes_per_pixel = bytes_per_pixel; + spi_strip->strip_len = led_config->max_leds; + spi_strip->base.set_pixel = led_strip_spi_set_pixel; + spi_strip->base.set_pixel_rgbw = led_strip_spi_set_pixel_rgbw; + spi_strip->base.refresh = led_strip_spi_refresh; + spi_strip->base.clear = led_strip_spi_clear; + spi_strip->base.del = led_strip_spi_del; + + *ret_strip = &spi_strip->base; + return ESP_OK; +err: + if (spi_strip) { + if (spi_strip->spi_device) { + spi_bus_remove_device(spi_strip->spi_device); + } + if (spi_strip->spi_host) { + spi_bus_free(spi_strip->spi_host); + } + free(spi_strip); + } + return ret; +} diff --git a/Source/ring-fw/sdkconfig b/Source/ring-fw/sdkconfig index 8040a8e..57c82e7 100644 --- a/Source/ring-fw/sdkconfig +++ b/Source/ring-fw/sdkconfig @@ -1,14 +1,16 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.1.1 Project Configuration # CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" CONFIG_SOC_DPORT_WORKAROUND="Not determined" -CONFIG_SOC_CAPS_ECO_VER_MAX=3 +CONFIG_SOC_CAPS_ECO_VER_MAX=301 CONFIG_SOC_ADC_SUPPORTED=y CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y CONFIG_SOC_SDMMC_HOST_SUPPORTED=y CONFIG_SOC_BT_SUPPORTED=y CONFIG_SOC_PCNT_SUPPORTED=y @@ -24,6 +26,9 @@ CONFIG_SOC_RTC_MEM_SUPPORTED=y CONFIG_SOC_I2S_SUPPORTED=y CONFIG_SOC_RMT_SUPPORTED=y CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y CONFIG_SOC_SUPPORT_COEXISTENCE=y CONFIG_SOC_AES_SUPPORTED=y CONFIG_SOC_MPI_SUPPORTED=y @@ -31,6 +36,8 @@ CONFIG_SOC_SHA_SUPPORTED=y CONFIG_SOC_FLASH_ENC_SUPPORTED=y CONFIG_SOC_SECURE_BOOT_SUPPORTED=y CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 CONFIG_SOC_XTAL_SUPPORT_26M=y CONFIG_SOC_XTAL_SUPPORT_40M=y @@ -51,36 +58,35 @@ CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 -CONFIG_SOC_RTC_SLOW_CLOCK_SUPPORT_8MD256=y CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y -CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=5 +CONFIG_SOC_IDCACHE_PER_CORE=y CONFIG_SOC_CPU_CORES_NUM=2 CONFIG_SOC_CPU_INTR_NUM=32 CONFIG_SOC_CPU_HAS_FPU=y CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 CONFIG_SOC_CPU_WATCHPOINT_SIZE=64 -CONFIG_SOC_DAC_PERIPH_NUM=2 +CONFIG_SOC_DAC_CHAN_NUM=2 CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y CONFIG_SOC_GPIO_PORT=1 CONFIG_SOC_GPIO_PIN_COUNT=40 CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF -CONFIG_SOC_GPIO_SUPPORT_SLP_SWITCH=y +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA CONFIG_SOC_I2C_NUM=2 CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 CONFIG_SOC_I2C_SUPPORT_SLAVE=y CONFIG_SOC_I2C_SUPPORT_APB=y -CONFIG_SOC_CLK_APLL_SUPPORTED=y -CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 -CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 -CONFIG_SOC_APLL_MIN_HZ=5303031 -CONFIG_SOC_APLL_MAX_HZ=125000000 CONFIG_SOC_I2S_NUM=2 CONFIG_SOC_I2S_HW_VERSION_1=y CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y CONFIG_SOC_I2S_SUPPORTS_PDM=y CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y CONFIG_SOC_I2S_SUPPORTS_ADC=y CONFIG_SOC_I2S_SUPPORTS_DAC=y @@ -95,7 +101,7 @@ CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y CONFIG_SOC_LEDC_CHANNEL_NUM=8 -CONFIG_SOC_LEDC_TIMER_BIT_WIDE_NUM=20 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 CONFIG_SOC_MCPWM_GROUPS=2 CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 @@ -106,6 +112,8 @@ CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 CONFIG_SOC_PCNT_GROUPS=1 @@ -126,11 +134,13 @@ CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y CONFIG_SOC_SDM_GROUPS=1 CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y CONFIG_SOC_SPI_AS_CS_SUPPORTED=y CONFIG_SOC_SPI_PERIPH_NUM=3 CONFIG_SOC_SPI_DMA_CHAN_NUM=2 CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y @@ -145,7 +155,9 @@ CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y CONFIG_SOC_TOUCH_VERSION_1=y CONFIG_SOC_TOUCH_SENSOR_NUM=10 CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y CONFIG_SOC_UART_NUM=3 CONFIG_SOC_UART_SUPPORT_APB_CLK=y @@ -167,19 +179,38 @@ CONFIG_SOC_SECURE_BOOT_V1=y CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 +CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 +CONFIG_SOC_APLL_MIN_HZ=5303031 +CONFIG_SOC_APLL_MAX_HZ=125000000 +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y CONFIG_SOC_SDMMC_USE_IOMUX=y CONFIG_SOC_SDMMC_NUM_SLOTS=2 CONFIG_SOC_WIFI_WAPI_SUPPORT=y CONFIG_SOC_WIFI_CSI_SUPPORT=y CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y CONFIG_SOC_BLE_SUPPORTED=y CONFIG_SOC_BLE_MESH_SUPPORTED=y CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y CONFIG_IDF_CMAKE=y CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET_ARCH="xtensa" @@ -191,7 +222,7 @@ CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 # Build type # CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_APP_BUILD_TYPE_RAM is not set CONFIG_APP_BUILD_GENERATE_BINARIES=y CONFIG_APP_BUILD_BOOTLOADER=y CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y @@ -210,12 +241,12 @@ CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set # CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +CONFIG_BOOTLOADER_LOG_LEVEL_ERROR=y # CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set -CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set -CONFIG_BOOTLOADER_LOG_LEVEL=3 +CONFIG_BOOTLOADER_LOG_LEVEL=1 # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y # CONFIG_BOOTLOADER_FACTORY_RESET is not set @@ -226,10 +257,11 @@ CONFIG_BOOTLOADER_WDT_ENABLE=y CONFIG_BOOTLOADER_WDT_TIME_MS=9000 # CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y -# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set -# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON=y +CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS=y CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0x10 # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +CONFIG_BOOTLOADER_RESERVE_RTC_MEM=y CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # end of Bootloader config @@ -254,9 +286,11 @@ CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 CONFIG_ESP_ROM_HAS_CRC_LE=y CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y CONFIG_ESP_ROM_HAS_JPEG_DECODE=y -CONFIG_ESP_ROM_SUPPORT_MULTIPLE_UART=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y # # Serial flasher config @@ -326,6 +360,7 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set # CONFIG_COMPILER_DUMP_RTL_FILES is not set # end of Compiler options @@ -388,6 +423,7 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set # CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set # CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y # end of TWAI Configuration # @@ -453,6 +489,16 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set # CONFIG_I2S_ENABLE_DEBUG_LOG is not set # end of I2S Configuration + +# +# DAC Configuration +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of DAC Configuration # end of Driver Configurations # @@ -494,6 +540,11 @@ CONFIG_ADC_CALI_LUT_ENABLE=y CONFIG_ADC_DISABLE_DAC_OUTPUT=y # end of ADC and ADC Calibration +# +# Wireless Coexistence +# +# end of Wireless Coexistence + # # Common ESP-related # @@ -558,6 +609,26 @@ CONFIG_HTTPD_PURGE_BUF_LEN=32 # Hardware Settings # +# +# Chip revision +# +CONFIG_ESP32_REV_MIN_0=y +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +# CONFIG_ESP32_REV_MIN_3 is not set +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=0 +CONFIG_ESP32_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +# end of Chip revision + # # MAC Config # @@ -565,9 +636,11 @@ CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set # end of MAC Config # @@ -576,7 +649,6 @@ CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set -# CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND is not set CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 # end of Sleep Config @@ -593,23 +665,9 @@ CONFIG_RTC_CLK_CAL_CYCLES=1024 # # Peripheral Control # -# CONFIG_PERIPH_CTRL_FUNC_IN_IRAM is not set +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y # end of Peripheral Control -# -# MMU Config -# -CONFIG_MMU_PAGE_SIZE_64KB=y -CONFIG_MMU_PAGE_MODE="64KB" -CONFIG_MMU_PAGE_SIZE=0x10000 -# end of MMU Config - -CONFIG_ESP32_REV_MIN_0=y -# CONFIG_ESP32_REV_MIN_1 is not set -# CONFIG_ESP32_REV_MIN_2 is not set -# CONFIG_ESP32_REV_MIN_3 is not set -CONFIG_ESP32_REV_MIN=0 - # # Main XTAL Config # @@ -642,10 +700,17 @@ CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 CONFIG_ESP_NETIF_TCPIP_LWIP=y # CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set # CONFIG_ESP_NETIF_L2_TAP is not set # CONFIG_ESP_NETIF_BRIDGE_EN is not set # end of ESP NETIF Adapter +# +# Partition API Configuration +# +# end of Partition API Configuration + # # PHY # @@ -654,6 +719,10 @@ CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=10 CONFIG_ESP_PHY_MAX_TX_POWER=10 CONFIG_ESP_PHY_REDUCE_TX_POWER=y +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 # end of PHY # @@ -678,7 +747,6 @@ CONFIG_PM_ENABLE=y # ESP Ringbuf # # CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH is not set # end of ESP Ringbuf # @@ -693,6 +761,12 @@ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 # Memory # # CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options # end of Memory # @@ -707,6 +781,7 @@ CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 # # Memory protection @@ -731,7 +806,8 @@ CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 # CONFIG_ESP_INT_WDT_CHECK_CPU1 is not set -CONFIG_ESP_TASK_WDT=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y CONFIG_ESP_TASK_WDT_PANIC=y CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y @@ -777,6 +853,11 @@ CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY=0x1 +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y # CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # end of High resolution timer (esp_timer) @@ -784,32 +865,55 @@ CONFIG_ESP_TIMER_IMPL_TG0_LAC=y # # Wi-Fi # -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -CONFIG_ESP32_WIFI_NVS_ENABLED=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP32_WIFI_IRAM_OPT=y -CONFIG_ESP32_WIFI_RX_IRAM_OPT=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 is not set +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y # CONFIG_ESP_WIFI_GMAC_SUPPORT is not set CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y # CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set # end of Wi-Fi # @@ -824,18 +928,11 @@ CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y # FAT Filesystem support # CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set # CONFIG_FATFS_SECTOR_512 is not set -# CONFIG_FATFS_SECTOR_1024 is not set -# CONFIG_FATFS_SECTOR_2048 is not set CONFIG_FATFS_SECTOR_4096=y -CONFIG_FATFS_SECTORS_PER_CLUSTER_1=y -# CONFIG_FATFS_SECTORS_PER_CLUSTER_2 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_4 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_8 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_16 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_32 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_64 is not set -# CONFIG_FATFS_SECTORS_PER_CLUSTER_128 is not set # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_720 is not set @@ -858,17 +955,12 @@ CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_936 is not set # CONFIG_FATFS_CODEPAGE_949 is not set # CONFIG_FATFS_CODEPAGE_950 is not set -CONFIG_FATFS_AUTO_TYPE=y -# CONFIG_FATFS_FAT12 is not set -# CONFIG_FATFS_FAT16 is not set CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set CONFIG_FATFS_FS_LOCK=0 CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y # CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 # end of FAT Filesystem support # @@ -894,6 +986,7 @@ CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set CONFIG_FREERTOS_USE_TICKLESS_IDLE=y @@ -904,6 +997,7 @@ CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP=3 # Port # # CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y # CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y CONFIG_FREERTOS_ISR_STACKSIZE=1536 @@ -915,7 +1009,6 @@ CONFIG_FREERTOS_CORETIMER_0=y CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # end of Port @@ -932,6 +1025,8 @@ CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y # CONFIG_HAL_ASSERTION_SILENT is not set # CONFIG_HAL_ASSERTION_ENABLE is not set CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y # end of Hardware Abstraction Layer (HAL) and Low Level (LL) # @@ -943,23 +1038,30 @@ CONFIG_HEAP_POISONING_DISABLED=y CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_TRACING_STANDALONE is not set # CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set # end of Heap memory debugging +CONFIG_IEEE802154_CCA_THRESHOLD=-60 +CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 + # # Log output # # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set -# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +CONFIG_LOG_DEFAULT_LEVEL_ERROR=y # CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set # CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_DEFAULT_LEVEL=1 CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_WARN is not set +# CONFIG_LOG_MAXIMUM_LEVEL_INFO is not set # CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set # CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set -CONFIG_LOG_MAXIMUM_LEVEL=3 +CONFIG_LOG_MAXIMUM_LEVEL=1 CONFIG_LOG_COLORS=y CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set @@ -971,6 +1073,7 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y CONFIG_LWIP_LOCAL_HOSTNAME="sgu-ring-fw" # CONFIG_LWIP_NETIF_API is not set # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set # CONFIG_LWIP_IRAM_OPTIMIZATION is not set @@ -983,9 +1086,8 @@ CONFIG_LWIP_SO_REUSE_RXTOALL=y # CONFIG_LWIP_SO_RCVBUF is not set # CONFIG_LWIP_NETBUF_RECVINFO is not set CONFIG_LWIP_IP4_FRAG=y -CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_IP4_REASSEMBLY is not set -# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 # CONFIG_LWIP_IP_FORWARD is not set # CONFIG_LWIP_STATS is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y @@ -997,6 +1099,7 @@ CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y # CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set CONFIG_LWIP_DHCP_OPTIONS_LEN=68 CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 # # DHCP server @@ -1007,10 +1110,8 @@ CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 # end of DHCP server # CONFIG_LWIP_AUTOIP is not set -CONFIG_LWIP_IPV6=y -# CONFIG_LWIP_IPV6_AUTOCONFIG is not set -CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 -# CONFIG_LWIP_IPV6_FORWARD is not set +CONFIG_LWIP_IPV4=y +# CONFIG_LWIP_IPV6 is not set # CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set CONFIG_LWIP_NETIF_LOOPBACK=y CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 @@ -1059,8 +1160,6 @@ CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1=y CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x1 # CONFIG_LWIP_PPP_SUPPORT is not set -CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 -CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 # CONFIG_LWIP_SLIP_SUPPORT is not set # @@ -1094,18 +1193,9 @@ CONFIG_LWIP_ESP_LWIP_ASSERT=y # CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y # CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y -# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set -CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y -# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set -# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y -# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set # end of Hooks # CONFIG_LWIP_DEBUG is not set @@ -1131,6 +1221,7 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 # CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set # CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +CONFIG_MBEDTLS_PKCS7_C=y # end of mbedTLS v3.x related # @@ -1270,6 +1361,17 @@ CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y # OpenThread # # CONFIG_OPENTHREAD_ENABLED is not set + +# +# Thread Operational Dataset +# +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset # end of OpenThread # @@ -1293,6 +1395,14 @@ CONFIG_PTHREAD_TASK_CORE_DEFAULT=1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # end of PThreads +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + # # SPI Flash driver # @@ -1322,6 +1432,11 @@ CONFIG_SPI_FLASH_BROWNOUT_RESET=y # # Auto-detect flash chips # +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y @@ -1398,6 +1513,11 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set # end of Unity unit testing library +# +# Root Hub configuration +# +# end of Root Hub configuration + # # Virtual file system # @@ -1406,6 +1526,7 @@ CONFIG_VFS_SUPPORT_DIR=y CONFIG_VFS_SUPPORT_SELECT=y CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 # # Host File System I/O (Semihosting) @@ -1428,38 +1549,26 @@ CONFIG_WL_SECTOR_SIZE=4096 CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION=y +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set # end of Wi-Fi Provisioning Manager - -# -# Supplicant -# -CONFIG_WPA_MBEDTLS_CRYPTO=y -CONFIG_WPA_MBEDTLS_TLS_CLIENT=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_SUITE_B_192 is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# CONFIG_WPA_11R_SUPPORT is not set -# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set -# end of Supplicant # end of Component config +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + # Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set # CONFIG_NO_BLOBS is not set # CONFIG_ESP32_NO_BLOBS is not set # CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set # CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set # CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +CONFIG_LOG_BOOTLOADER_LEVEL_ERROR=y # CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set -CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set # CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set # CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set -CONFIG_LOG_BOOTLOADER_LEVEL=3 +CONFIG_LOG_BOOTLOADER_LEVEL=1 # CONFIG_APP_ROLLBACK_ENABLE is not set # CONFIG_FLASH_ENCRYPTION_ENABLED is not set # CONFIG_FLASHMODE_QIO is not set @@ -1539,6 +1648,7 @@ CONFIG_INT_WDT=y CONFIG_INT_WDT_TIMEOUT_MS=300 # CONFIG_INT_WDT_CHECK_CPU1 is not set CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y CONFIG_TASK_WDT_PANIC=y CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y @@ -1568,6 +1678,41 @@ CONFIG_ESP32_BROWNOUT_DET_LVL=0 # CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y diff --git a/Source/test/test-stepper/main/GateStepper.c b/Source/test/test-stepper/main/GateStepper.c index 6faad73..0b8f209 100644 --- a/Source/test/test-stepper/main/GateStepper.c +++ b/Source/test/test-stepper/main/GateStepper.c @@ -1,4 +1,5 @@ #include "GateStepper.h" +#include "HelperMacro.h" #include "esp_timer.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" @@ -7,9 +8,6 @@ #define TAG "GateStepper" -#define MIN(a,b) (((a)<(b))?(a):(b)) -#define MAX(a,b) (((a)>(b))?(a):(b)) - static void tmr_signal_callback(void* arg); #define STEPEND_BIT 0x01 @@ -95,7 +93,7 @@ static IRAM_ATTR void tmr_signal_callback(void* arg) gpio_set_level(HWCONFIG_STEPPER_STEP_PIN, m_bPeriodAlternate); if (m_bPeriodAlternate) { - const int32_t s32 = MIN(abs(m_count) , abs(m_target - m_count)); + const int32_t s32 = HELPERMACRO_MIN(abs(m_count) , abs(m_target - m_count)); if (s32 < 100) m_period = 1500;