@serenityjs/core 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";var Go=Object.create;var Lt=Object.defineProperty;var zo=Object.getOwnPropertyDescriptor;var Lo=Object.getOwnPropertyNames;var Oo=Object.getPrototypeOf,Ho=Object.prototype.hasOwnProperty;var c=(e,t)=>Lt(e,"name",{value:t,configurable:!0});var Ot=(e,t)=>{for(var a in t)Lt(e,a,{get:t[a],enumerable:!0})},_n=(e,t,a,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Lo(t))!Ho.call(e,n)&&n!==a&&Lt(e,n,{get:()=>t[n],enumerable:!(r=zo(t,n))||r.enumerable});return e};var yn=(e,t,a)=>(a=e!=null?Go(Oo(e)):{},_n(t||!e||!e.__esModule?Lt(a,"default",{value:e,enumerable:!0}):a,e)),No=e=>_n(Lt({},"__esModule",{value:!0}),e);var qi={};Ot(qi,{AbilityEnum:()=>Ur,AbilityMap:()=>un,ActionForm:()=>Oi,ActorFlagMap:()=>mn,AdminCommands:()=>Zr,AttributeMap:()=>pn,Block:()=>jt,BlockCardinalDirectionTrait:()=>Nn,BlockContainer:()=>Hr,BlockDirectionTrait:()=>Rn,BlockEnum:()=>Ie,BlockIdentifier:()=>P,BlockInventoryTrait:()=>Wn,BlockOpenBitTrait:()=>Ln,BlockPalette:()=>Nr,BlockPermutation:()=>F,BlockStorage:()=>aa,BlockToolType:()=>_t,BlockTrait:()=>q,BlockTraits:()=>ba,BlockType:()=>B,BlockUpdateSignal:()=>$t,BlockUpperBitTrait:()=>On,BlockUpsideDownBitTrait:()=>zn,BlockWeirdoDirectionTrait:()=>Gn,BooleanEnum:()=>$r,CardinalDirection:()=>E,Chunk:()=>Z,ChunkReadySignal:()=>Ft,Command:()=>jr,CommandArgumentPointer:()=>xa,CommandExecutionState:()=>nt,CommandRegistry:()=>Jr,Commands:()=>Yr,CommonCommands:()=>Qr,ConsoleInterface:()=>nn,Container:()=>et,CreativeItem:()=>Ae,CustomBlockType:()=>Vt,CustomEntityType:()=>Gr,CustomEnum:()=>K,CustomItemType:()=>Yo,DefaultDimensionProperties:()=>It,DefaultItemStackProperties:()=>Rs,DefaultWorldProviderProperties:()=>Na,Device:()=>ca,Dimension:()=>ot,EffectAddSignal:()=>Cr,EffectRemoveSignal:()=>Pr,Entity:()=>W,EntityAirSupplyTrait:()=>Bs,EntityAttributeTrait:()=>pe,EntityAttributeUpdateSignal:()=>ur,EntityCollision:()=>Xs,EntityContainer:()=>mt,EntityDespawnedSignal:()=>lr,EntityDieSignal:()=>Wr,EntityDimensionChangeSignal:()=>qt,EntityEffectsTrait:()=>ut,EntityEnum:()=>St,EntityEquipmentTrait:()=>ct,EntityFlagUpdateSignal:()=>mr,EntityGravityTrait:()=>it,EntityHealthChangedSignal:()=>Ar,EntityHealthTrait:()=>L,EntityHitSignal:()=>Dr,EntityHurtSignal:()=>Mr,EntityIdentifier:()=>b,EntityInteractMethod:()=>yt,EntityInventoryTrait:()=>k,EntityInvisibilityTrait:()=>Xt,EntityItemStackTrait:()=>xt,EntityMetadataUpdateSignal:()=>pr,EntityMovementTrait:()=>_e,EntityNameTagTrait:()=>Kt,EntityPalette:()=>Br,EntityPhysicsTrait:()=>ea,EntitySpawnedSignal:()=>cr,EntityTrait:()=>T,EntityTraits:()=>Ia,EntityType:()=>re,Enum:()=>tt,EventSignal:()=>_,Form:()=>De,GamemodeEnum:()=>qr,Handlers:()=>dn,IntegerEnum:()=>ze,InternalProvider:()=>wi,ItemBundleTrait:()=>Ze,ItemCategory:()=>pa,ItemDrop:()=>_a,ItemEnchantableTrait:()=>qs,ItemEnum:()=>rt,ItemEquippableTrait:()=>$s,ItemGroup:()=>bn,ItemIdentifier:()=>N,ItemPalette:()=>Xr,ItemStack:()=>C,ItemToolTier:()=>Be,ItemToolType:()=>Nt,ItemTrait:()=>Ce,ItemTraits:()=>$a,ItemType:()=>Y,ItemUseMethod:()=>ae,LevelDBProvider:()=>Si,LootPool:()=>Fi,LootTable:()=>$i,MessageForm:()=>Li,MetadataMap:()=>ln,ModalForm:()=>Hi,Network:()=>or,NetworkBound:()=>Ht,NetworkHandler:()=>w,Player:()=>me,PlayerAbilityUpdateSignal:()=>br,PlayerBreakBlockSignal:()=>_r,PlayerChatSignal:()=>fr,PlayerChunkRenderingTrait:()=>qe,PlayerCursorTrait:()=>ve,PlayerDropItemSignal:()=>yr,PlayerEntityRenderingTrait:()=>Js,PlayerExhaustionTrait:()=>Ya,PlayerGamemodeChangeSignal:()=>vr,PlayerHungerTrait:()=>Qs,PlayerInteractWithBlockSignal:()=>Tr,PlayerInteractWithEntitySignal:()=>Er,PlayerJoinSignal:()=>hr,PlayerLeaveSignal:()=>dr,PlayerListTrait:()=>Ys,PlayerOpenedContainerSignal:()=>Ut,PlayerPlaceBlockSignal:()=>gr,PlayerSaturationTrait:()=>Ja,PlayerStartEmotingSignal:()=>kr,PlayerStartUsingItemSignal:()=>wr,PlayerStopEmotingSignal:()=>xr,PlayerStopUsingItemSignal:()=>Sr,PlayerTrait:()=>Pe,PlayerUseItemSignal:()=>Oe,PositionEnum:()=>ge,Serenity:()=>Ri,ServerEvent:()=>Rt,SoftEnum:()=>Zt,StringEnum:()=>Ge,SubChunk:()=>ne,SuperflatGenerator:()=>oa,SuperflatWorker:()=>rn,TagEnum:()=>Vr,TargetEnum:()=>M,TerrainGenerator:()=>sa,TerrainWorker:()=>tn,TickSchedule:()=>Bt,ValidEnum:()=>We,VerticalHalfTrait:()=>Hn,VoidGenerator:()=>Ra,Worker:()=>an,World:()=>Ct,WorldEnum:()=>Qt,WorldEvent:()=>g,WorldInitializeSignal:()=>da,WorldProvider:()=>ra,WorldTickSignal:()=>ir,hash:()=>Lr});module.exports=No(qi);var zt=require("@serenityjs/protocol"),ma=require("@serenityjs/logger"),Ao=require("@serenityjs/raknet"),Wo=yn(require("@serenityjs/emitter"));var ua=require("zlib"),wn=require("@serenityjs/emitter"),Se=require("@serenityjs/raknet"),ha=require("@serenityjs/logger"),D=require("@serenityjs/protocol");var Ht=function(e){return e[e.Server=0]="Server",e[e.Client=1]="Client",e}(Ht||{});var P=function(e){return e.PinkTulip="minecraft:pink_tulip",e.BuddingAmethyst="minecraft:budding_amethyst",e.LightBlueConcretePowder="minecraft:light_blue_concrete_powder",e.Gravel="minecraft:gravel",e.DetectorRail="minecraft:detector_rail",e.CyanTerracotta="minecraft:cyan_terracotta",e.HardPinkStainedGlass="minecraft:hard_pink_stained_glass",e.LightGrayCandle="minecraft:light_gray_candle",e.NetherGoldOre="minecraft:nether_gold_ore",e.PolishedBasalt="minecraft:polished_basalt",e.BlueCandle="minecraft:blue_candle",e.DarkOakWood="minecraft:dark_oak_wood",e.TuffBrickWall="minecraft:tuff_brick_wall",e.AcaciaWallSign="minecraft:acacia_wall_sign",e.BambooPressurePlate="minecraft:bamboo_pressure_plate",e.MelonBlock="minecraft:melon_block",e.RedWool="minecraft:red_wool",e.GoldOre="minecraft:gold_ore",e.BirchStandingSign="minecraft:birch_standing_sign",e.Element93="minecraft:element_93",e.WaxedCutCopperStairs="minecraft:waxed_cut_copper_stairs",e.Cornflower="minecraft:cornflower",e.RedNetherBrick="minecraft:red_nether_brick",e.OxidizedCutCopperStairs="minecraft:oxidized_cut_copper_stairs",e.WarpedDoor="minecraft:warped_door",e.PolishedGraniteStairs="minecraft:polished_granite_stairs",e.RedMushroomBlock="minecraft:red_mushroom_block",e.Element30="minecraft:element_30",e.DeadBubbleCoralWallFan="minecraft:dead_bubble_coral_wall_fan",e.BlueCarpet="minecraft:blue_carpet",e.BambooBlock="minecraft:bamboo_block",e.DeepslateBricks="minecraft:deepslate_bricks",e.WaxedCopper="minecraft:waxed_copper",e.WhiteWool="minecraft:white_wool",e.WoodenDoor="minecraft:wooden_door",e.PistonArmCollision="minecraft:piston_arm_collision",e.RedSandstoneSlab="minecraft:red_sandstone_slab",e.DarkPrismarineStairs="minecraft:dark_prismarine_stairs",e.EndBricks="minecraft:end_bricks",e.SculkShrieker="minecraft:sculk_shrieker",e.BambooMosaicStairs="minecraft:bamboo_mosaic_stairs",e.Vine="minecraft:vine",e.WaxedOxidizedChiseledCopper="minecraft:waxed_oxidized_chiseled_copper",e.WhiteTulip="minecraft:white_tulip",e.Granite="minecraft:granite",e.PolishedTuffSlab="minecraft:polished_tuff_slab",e.BrownMushroom="minecraft:brown_mushroom",e.CutCopperStairs="minecraft:cut_copper_stairs",e.BlueStainedGlassPane="minecraft:blue_stained_glass_pane",e.Element0="minecraft:element_0",e.ExposedCopperDoor="minecraft:exposed_copper_door",e.BlackstoneDoubleSlab="minecraft:blackstone_double_slab",e.SpruceStandingSign="minecraft:spruce_standing_sign",e.Element118="minecraft:element_118",e.FenceGate="minecraft:fence_gate",e.DeepslateTileSlab="minecraft:deepslate_tile_slab",e.PowderSnow="minecraft:powder_snow",e.MagentaCandle="minecraft:magenta_candle",e.DeepslateTileDoubleSlab="minecraft:deepslate_tile_double_slab",e.Calcite="minecraft:calcite",e.GrayTerracotta="minecraft:gray_terracotta",e.CyanCarpet="minecraft:cyan_carpet",e.CyanStainedGlass="minecraft:cyan_stained_glass",e.DarkOakButton="minecraft:dark_oak_button",e.DeepslateCopperOre="minecraft:deepslate_copper_ore",e.StoneBrickStairs="minecraft:stone_brick_stairs",e.WaxedOxidizedCutCopperSlab="minecraft:waxed_oxidized_cut_copper_slab",e.WarpedWallSign="minecraft:warped_wall_sign",e.Ladder="minecraft:ladder",e.ChiseledStoneBricks="minecraft:chiseled_stone_bricks",e.SprucePressurePlate="minecraft:spruce_pressure_plate",e.DiamondOre="minecraft:diamond_ore",e.WaxedOxidizedCutCopper="minecraft:waxed_oxidized_cut_copper",e.DeadHornCoralWallFan="minecraft:dead_horn_coral_wall_fan",e.GrayConcrete="minecraft:gray_concrete",e.Element73="minecraft:element_73",e.CobblestoneSlab="minecraft:cobblestone_slab",e.GreenTerracotta="minecraft:green_terracotta",e.HardPurpleStainedGlassPane="minecraft:hard_purple_stained_glass_pane",e.WaxedCopperTrapdoor="minecraft:waxed_copper_trapdoor",e.NetherBrickStairs="minecraft:nether_brick_stairs",e.HardBlueStainedGlassPane="minecraft:hard_blue_stained_glass_pane",e.YellowShulkerBox="minecraft:yellow_shulker_box",e.ChiseledCopper="minecraft:chiseled_copper",e.GraniteStairs="minecraft:granite_stairs",e.GrayWool="minecraft:gray_wool",e.GreenConcretePowder="minecraft:green_concrete_powder",e.LimeStainedGlass="minecraft:lime_stained_glass",e.OxidizedCopperBulb="minecraft:oxidized_copper_bulb",e.CobbledDeepslateStairs="minecraft:cobbled_deepslate_stairs",e.WaxedExposedCopper="minecraft:waxed_exposed_copper",e.StrippedAcaciaWood="minecraft:stripped_acacia_wood",e.Element16="minecraft:element_16",e.JungleButton="minecraft:jungle_button",e.DeadBubbleCoralFan="minecraft:dead_bubble_coral_fan",e.PoweredRepeater="minecraft:powered_repeater",e.SpruceStairs="minecraft:spruce_stairs",e.Loom="minecraft:loom",e.HardGreenStainedGlassPane="minecraft:hard_green_stained_glass_pane",e.Element104="minecraft:element_104",e.YellowStainedGlass="minecraft:yellow_stained_glass",e.OxidizedDoubleCutCopperSlab="minecraft:oxidized_double_cut_copper_slab",e.JungleDoor="minecraft:jungle_door",e.Diorite="minecraft:diorite",e.DarkoakWallSign="minecraft:darkoak_wall_sign",e.InfoUpdate2="minecraft:info_update2",e.DripstoneBlock="minecraft:dripstone_block",e.GrayCandleCake="minecraft:gray_candle_cake",e.ExposedCopperTrapdoor="minecraft:exposed_copper_trapdoor",e.BlueTerracotta="minecraft:blue_terracotta",e.HangingRoots="minecraft:hanging_roots",e.SmoothSandstone="minecraft:smooth_sandstone",e.PolishedBlackstoneButton="minecraft:polished_blackstone_button",e.StrippedBirchWood="minecraft:stripped_birch_wood",e.RedCandleCake="minecraft:red_candle_cake",e.MossyStoneBricks="minecraft:mossy_stone_bricks",e.HardLightBlueStainedGlassPane="minecraft:hard_light_blue_stained_glass_pane",e.CherryPressurePlate="minecraft:cherry_pressure_plate",e.HardBrownStainedGlass="minecraft:hard_brown_stained_glass",e.CherryHangingSign="minecraft:cherry_hanging_sign",e.YellowWool="minecraft:yellow_wool",e.BlackCandleCake="minecraft:black_candle_cake",e.CrimsonWallSign="minecraft:crimson_wall_sign",e.PolishedBlackstoneBrickStairs="minecraft:polished_blackstone_brick_stairs",e.LightBlock1="minecraft:light_block_1",e.Element46="minecraft:element_46",e.SmoothSandstoneSlab="minecraft:smooth_sandstone_slab",e.GrayCarpet="minecraft:gray_carpet",e.DarkOakDoor="minecraft:dark_oak_door",e.Wheat="minecraft:wheat",e.Grindstone="minecraft:grindstone",e.OakFence="minecraft:oak_fence",e.YellowStainedGlassPane="minecraft:yellow_stained_glass_pane",e.DarkOakSlab="minecraft:dark_oak_slab",e.PolishedGraniteDoubleSlab="minecraft:polished_granite_double_slab",e.HoneycombBlock="minecraft:honeycomb_block",e.EndGateway="minecraft:end_gateway",e.AzureBluet="minecraft:azure_bluet",e.StoneStairs="minecraft:stone_stairs",e.Beacon="minecraft:beacon",e.PolishedBlackstoneBrickWall="minecraft:polished_blackstone_brick_wall",e.SnowLayer="minecraft:snow_layer",e.HardPinkStainedGlassPane="minecraft:hard_pink_stained_glass_pane",e.BrickDoubleSlab="minecraft:brick_double_slab",e.WhiteCarpet="minecraft:white_carpet",e.BlackCandle="minecraft:black_candle",e.Cactus="minecraft:cactus",e.GlowFrame="minecraft:glow_frame",e.MudBrickDoubleSlab="minecraft:mud_brick_double_slab",e.BambooMosaicSlab="minecraft:bamboo_mosaic_slab",e.BambooFence="minecraft:bamboo_fence",e.DarkPrismarineSlab="minecraft:dark_prismarine_slab",e.PrismarineBricksStairs="minecraft:prismarine_bricks_stairs",e.Mycelium="minecraft:mycelium",e.DioriteSlab="minecraft:diorite_slab",e.RedConcrete="minecraft:red_concrete",e.CrimsonHyphae="minecraft:crimson_hyphae",e.BlackTerracotta="minecraft:black_terracotta",e.StrippedDarkOakLog="minecraft:stripped_dark_oak_log",e.HardOrangeStainedGlassPane="minecraft:hard_orange_stained_glass_pane",e.OxidizedCopperGrate="minecraft:oxidized_copper_grate",e.JungleLog="minecraft:jungle_log",e.BubbleCoralFan="minecraft:bubble_coral_fan",e.BambooSlab="minecraft:bamboo_slab",e.LitRedstoneOre="minecraft:lit_redstone_ore",e.NetherWart="minecraft:nether_wart",e.OrangeStainedGlassPane="minecraft:orange_stained_glass_pane",e.StrippedMangroveWood="minecraft:stripped_mangrove_wood",e.CutRedSandstone="minecraft:cut_red_sandstone",e.LimeShulkerBox="minecraft:lime_shulker_box",e.HardBlackStainedGlassPane="minecraft:hard_black_stained_glass_pane",e.SmoothRedSandstone="minecraft:smooth_red_sandstone",e.LilyOfTheValley="minecraft:lily_of_the_valley",e.BlueOrchid="minecraft:blue_orchid",e.LimeGlazedTerracotta="minecraft:lime_glazed_terracotta",e.Trapdoor="minecraft:trapdoor",e.HardGlassPane="minecraft:hard_glass_pane",e.DeadBrainCoralFan="minecraft:dead_brain_coral_fan",e.AcaciaStandingSign="minecraft:acacia_standing_sign",e.UndyedShulkerBox="minecraft:undyed_shulker_box",e.QuartzOre="minecraft:quartz_ore",e.InfoUpdate="minecraft:info_update",e.Seagrass="minecraft:seagrass",e.TubeCoralFan="minecraft:tube_coral_fan",e.Unknown="minecraft:unknown",e.CherryStairs="minecraft:cherry_stairs",e.Barrel="minecraft:barrel",e.BigDripleaf="minecraft:big_dripleaf",e.QuartzSlab="minecraft:quartz_slab",e.FireCoralBlock="minecraft:fire_coral_block",e.WaxedExposedCutCopperSlab="minecraft:waxed_exposed_cut_copper_slab",e.DeadHornCoral="minecraft:dead_horn_coral",e.InfestedMossyStoneBricks="minecraft:infested_mossy_stone_bricks",e.Element68="minecraft:element_68",e.RedstoneLamp="minecraft:redstone_lamp",e.MossyCobblestone="minecraft:mossy_cobblestone",e.Element113="minecraft:element_113",e.BlueStainedGlass="minecraft:blue_stained_glass",e.Cake="minecraft:cake",e.DarkOakDoubleSlab="minecraft:dark_oak_double_slab",e.StrippedCrimsonHyphae="minecraft:stripped_crimson_hyphae",e.DarkOakHangingSign="minecraft:dark_oak_hanging_sign",e.GreenConcrete="minecraft:green_concrete",e.Deepslate="minecraft:deepslate",e.StrippedOakWood="minecraft:stripped_oak_wood",e.PurpurSlab="minecraft:purpur_slab",e.MagentaCarpet="minecraft:magenta_carpet",e.PitcherCrop="minecraft:pitcher_crop",e.BrownWool="minecraft:brown_wool",e.PinkWool="minecraft:pink_wool",e.WarpedStandingSign="minecraft:warped_standing_sign",e.Deadbush="minecraft:deadbush",e.EnderChest="minecraft:ender_chest",e.WaxedExposedChiseledCopper="minecraft:waxed_exposed_chiseled_copper",e.TuffSlab="minecraft:tuff_slab",e.RedstoneWire="minecraft:redstone_wire",e.WarpedPressurePlate="minecraft:warped_pressure_plate",e.GreenCandleCake="minecraft:green_candle_cake",e.DiamondBlock="minecraft:diamond_block",e.ExposedCopperBulb="minecraft:exposed_copper_bulb",e.Element58="minecraft:element_58",e.BambooMosaicDoubleSlab="minecraft:bamboo_mosaic_double_slab",e.DarkPrismarineDoubleSlab="minecraft:dark_prismarine_double_slab",e.CryingObsidian="minecraft:crying_obsidian",e.OakStairs="minecraft:oak_stairs",e.HardGrayStainedGlass="minecraft:hard_gray_stained_glass",e.OakLog="minecraft:oak_log",e.WaxedWeatheredCutCopper="minecraft:waxed_weathered_cut_copper",e.Andesite="minecraft:andesite",e.BrownStainedGlassPane="minecraft:brown_stained_glass_pane",e.SculkVein="minecraft:sculk_vein",e.PinkStainedGlassPane="minecraft:pink_stained_glass_pane",e.ExposedDoubleCutCopperSlab="minecraft:exposed_double_cut_copper_slab",e.CandleCake="minecraft:candle_cake",e.MagentaShulkerBox="minecraft:magenta_shulker_box",e.PurpleTerracotta="minecraft:purple_terracotta",e.SmoothQuartz="minecraft:smooth_quartz",e.PackedIce="minecraft:packed_ice",e.IronBars="minecraft:iron_bars",e.OxidizedCutCopper="minecraft:oxidized_cut_copper",e.PolishedGranite="minecraft:polished_granite",e.Element39="minecraft:element_39",e.LightBlueStainedGlass="minecraft:light_blue_stained_glass",e.Fern="minecraft:fern",e.PackedMud="minecraft:packed_mud",e.LightBlueCandleCake="minecraft:light_blue_candle_cake",e.Element1="minecraft:element_1",e.Poppy="minecraft:poppy",e.MossCarpet="minecraft:moss_carpet",e.CrimsonStairs="minecraft:crimson_stairs",e.GreenStainedGlassPane="minecraft:green_stained_glass_pane",e.WarpedFungus="minecraft:warped_fungus",e.Element102="minecraft:element_102",e.StoneBrickDoubleSlab="minecraft:stone_brick_double_slab",e.CopperOre="minecraft:copper_ore",e.GrayCandle="minecraft:gray_candle",e.PolishedDeepslateSlab="minecraft:polished_deepslate_slab",e.BambooDoor="minecraft:bamboo_door",e.BlackConcretePowder="minecraft:black_concrete_powder",e.MelonStem="minecraft:melon_stem",e.AmethystBlock="minecraft:amethyst_block",e.GoldBlock="minecraft:gold_block",e.StrippedOakLog="minecraft:stripped_oak_log",e.FlowerPot="minecraft:flower_pot",e.ChiseledBookshelf="minecraft:chiseled_bookshelf",e.JungleFence="minecraft:jungle_fence",e.SpruceLog="minecraft:spruce_log",e.PolishedDeepslateStairs="minecraft:polished_deepslate_stairs",e.HardLimeStainedGlass="minecraft:hard_lime_stained_glass",e.ShortGrass="minecraft:short_grass",e.LapisBlock="minecraft:lapis_block",e.WeatheredChiseledCopper="minecraft:weathered_chiseled_copper",e.CoarseDirt="minecraft:coarse_dirt",e.SmallAmethystBud="minecraft:small_amethyst_bud",e.ActivatorRail="minecraft:activator_rail",e.Podzol="minecraft:podzol",e.MangroveButton="minecraft:mangrove_button",e.IronTrapdoor="minecraft:iron_trapdoor",e.Potatoes="minecraft:potatoes",e.LargeAmethystBud="minecraft:large_amethyst_bud",e.MuddyMangroveRoots="minecraft:muddy_mangrove_roots",e.HardLightBlueStainedGlass="minecraft:hard_light_blue_stained_glass",e.TrialSpawner="minecraft:trial_spawner",e.StrippedJungleWood="minecraft:stripped_jungle_wood",e.DeadTubeCoralBlock="minecraft:dead_tube_coral_block",e.Noteblock="minecraft:noteblock",e.Tuff="minecraft:tuff",e.Reserved6="minecraft:reserved6",e.SoulTorch="minecraft:soul_torch",e.QuartzBricks="minecraft:quartz_bricks",e.MangroveLog="minecraft:mangrove_log",e.SandstoneSlab="minecraft:sandstone_slab",e.WhiteShulkerBox="minecraft:white_shulker_box",e.BirchWood="minecraft:birch_wood",e.PolishedBlackstonePressurePlate="minecraft:polished_blackstone_pressure_plate",e.MossyStoneBrickSlab="minecraft:mossy_stone_brick_slab",e.RawGoldBlock="minecraft:raw_gold_block",e.Allium="minecraft:allium",e.CrackedPolishedBlackstoneBricks="minecraft:cracked_polished_blackstone_bricks",e.MobSpawner="minecraft:mob_spawner",e.CopperGrate="minecraft:copper_grate",e.WeatheredDoubleCutCopperSlab="minecraft:weathered_double_cut_copper_slab",e.DeepslateTiles="minecraft:deepslate_tiles",e.BlackWool="minecraft:black_wool",e.Lava="minecraft:lava",e.LightBlock14="minecraft:light_block_14",e.AcaciaFenceGate="minecraft:acacia_fence_gate",e.CyanCandleCake="minecraft:cyan_candle_cake",e.OrangeCandle="minecraft:orange_candle",e.ColoredTorchBp="minecraft:colored_torch_bp",e.Scaffolding="minecraft:scaffolding",e.PoweredComparator="minecraft:powered_comparator",e.LightBlock8="minecraft:light_block_8",e.SpruceSapling="minecraft:spruce_sapling",e.CutSandstoneDoubleSlab="minecraft:cut_sandstone_double_slab",e.BlastFurnace="minecraft:blast_furnace",e.CutSandstoneSlab="minecraft:cut_sandstone_slab",e.SpruceFence="minecraft:spruce_fence",e.HardYellowStainedGlassPane="minecraft:hard_yellow_stained_glass_pane",e.HardGreenStainedGlass="minecraft:hard_green_stained_glass",e.DarkOakSapling="minecraft:dark_oak_sapling",e.SandstoneDoubleSlab="minecraft:sandstone_double_slab",e.PinkPetals="minecraft:pink_petals",e.SoulFire="minecraft:soul_fire",e.PinkCarpet="minecraft:pink_carpet",e.MangroveDoubleSlab="minecraft:mangrove_double_slab",e.BrownCarpet="minecraft:brown_carpet",e.GreenCandle="minecraft:green_candle",e.PurpleStainedGlassPane="minecraft:purple_stained_glass_pane",e.SmoothQuartzDoubleSlab="minecraft:smooth_quartz_double_slab",e.OxidizedCopperTrapdoor="minecraft:oxidized_copper_trapdoor",e.LightGrayStainedGlass="minecraft:light_gray_stained_glass",e.BrainCoral="minecraft:brain_coral",e.Obsidian="minecraft:obsidian",e.Chest="minecraft:chest",e.DeadBubbleCoralBlock="minecraft:dead_bubble_coral_block",e.LightGrayStainedGlassPane="minecraft:light_gray_stained_glass_pane",e.BlackstoneSlab="minecraft:blackstone_slab",e.StrippedSpruceWood="minecraft:stripped_spruce_wood",e.Cauldron="minecraft:cauldron",e.Glowingobsidian="minecraft:glowingobsidian",e.DeepslateBrickWall="minecraft:deepslate_brick_wall",e.DarkoakStandingSign="minecraft:darkoak_standing_sign",e.WaxedExposedCopperGrate="minecraft:waxed_exposed_copper_grate",e.TubeCoralBlock="minecraft:tube_coral_block",e.AcaciaPlanks="minecraft:acacia_planks",e.Element85="minecraft:element_85",e.JungleWallSign="minecraft:jungle_wall_sign",e.EndBrickStairs="minecraft:end_brick_stairs",e.PolishedBlackstoneDoubleSlab="minecraft:polished_blackstone_double_slab",e.OrangeCarpet="minecraft:orange_carpet",e.ExposedCopper="minecraft:exposed_copper",e.PolishedDeepslateDoubleSlab="minecraft:polished_deepslate_double_slab",e.NetherBrickSlab="minecraft:nether_brick_slab",e.HeavyWeightedPressurePlate="minecraft:heavy_weighted_pressure_plate",e.Element89="minecraft:element_89",e.StoneButton="minecraft:stone_button",e.Stone="minecraft:stone",e.RedNetherBrickDoubleSlab="minecraft:red_nether_brick_double_slab",e.PitcherPlant="minecraft:pitcher_plant",e.Element101="minecraft:element_101",e.WaxedCopperBulb="minecraft:waxed_copper_bulb",e.AndesiteStairs="minecraft:andesite_stairs",e.Sponge="minecraft:sponge",e.BoneBlock="minecraft:bone_block",e.NormalStoneStairs="minecraft:normal_stone_stairs",e.WarpedHangingSign="minecraft:warped_hanging_sign",e.GreenStainedGlass="minecraft:green_stained_glass",e.DioriteDoubleSlab="minecraft:diorite_double_slab",e.GrayStainedGlassPane="minecraft:gray_stained_glass_pane",e.EndStoneBrickSlab="minecraft:end_stone_brick_slab",e.Frame="minecraft:frame",e.Smoker="minecraft:smoker",e.HardenedClay="minecraft:hardened_clay",e.BirchHangingSign="minecraft:birch_hanging_sign",e.PolishedTuffWall="minecraft:polished_tuff_wall",e.UnlitRedstoneTorch="minecraft:unlit_redstone_torch",e.StrippedJungleLog="minecraft:stripped_jungle_log",e.LapisOre="minecraft:lapis_ore",e.HardBlueStainedGlass="minecraft:hard_blue_stained_glass",e.PolishedGraniteSlab="minecraft:polished_granite_slab",e.LightBlock9="minecraft:light_block_9",e.OxidizedCutCopperSlab="minecraft:oxidized_cut_copper_slab",e.Beehive="minecraft:beehive",e.LimeStainedGlassPane="minecraft:lime_stained_glass_pane",e.LightBlock7="minecraft:light_block_7",e.CherryDoubleSlab="minecraft:cherry_double_slab",e.LightBlock6="minecraft:light_block_6",e.LightBlock5="minecraft:light_block_5",e.WaxedOxidizedCutCopperStairs="minecraft:waxed_oxidized_cut_copper_stairs",e.LightBlock4="minecraft:light_block_4",e.WarpedRoots="minecraft:warped_roots",e.SmallDripleafBlock="minecraft:small_dripleaf_block",e.GreenWool="minecraft:green_wool",e.LimeCandleCake="minecraft:lime_candle_cake",e.MangroveLeaves="minecraft:mangrove_leaves",e.LightBlock3="minecraft:light_block_3",e.AcaciaLeaves="minecraft:acacia_leaves",e.Barrier="minecraft:barrier",e.RawIronBlock="minecraft:raw_iron_block",e.Dispenser="minecraft:dispenser",e.CrimsonRoots="minecraft:crimson_roots",e.LightBlock2="minecraft:light_block_2",e.LightBlock0="minecraft:light_block_0",e.Stonecutter="minecraft:stonecutter",e.AndesiteDoubleSlab="minecraft:andesite_double_slab",e.UnpoweredRepeater="minecraft:unpowered_repeater",e.OakSapling="minecraft:oak_sapling",e.LightGrayTerracotta="minecraft:light_gray_terracotta",e.PinkStainedGlass="minecraft:pink_stained_glass",e.HardMagentaStainedGlassPane="minecraft:hard_magenta_stained_glass_pane",e.BrownStainedGlass="minecraft:brown_stained_glass",e.FireCoral="minecraft:fire_coral",e.CobbledDeepslate="minecraft:cobbled_deepslate",e.Element99="minecraft:element_99",e.BirchLog="minecraft:birch_log",e.OrangeStainedGlass="minecraft:orange_stained_glass",e.OrangeWool="minecraft:orange_wool",e.PolishedBlackstoneBrickDoubleSlab="minecraft:polished_blackstone_brick_double_slab",e.BubbleCoralBlock="minecraft:bubble_coral_block",e.CrimsonDoubleSlab="minecraft:crimson_double_slab",e.Kelp="minecraft:kelp",e.UnderwaterTorch="minecraft:underwater_torch",e.RespawnAnchor="minecraft:respawn_anchor",e.DeadFireCoralWallFan="minecraft:dead_fire_coral_wall_fan",e.LightGrayConcrete="minecraft:light_gray_concrete",e.BirchPlanks="minecraft:birch_planks",e.SeaPickle="minecraft:sea_pickle",e.RedSandstoneDoubleSlab="minecraft:red_sandstone_double_slab",e.Element74="minecraft:element_74",e.RedSand="minecraft:red_sand",e.HayBlock="minecraft:hay_block",e.SuspiciousGravel="minecraft:suspicious_gravel",e.HeavyCore="minecraft:heavy_core",e.JungleWood="minecraft:jungle_wood",e.RedStainedGlass="minecraft:red_stained_glass",e.PurpleShulkerBox="minecraft:purple_shulker_box",e.PolishedTuffDoubleSlab="minecraft:polished_tuff_double_slab",e.OxidizedCopperDoor="minecraft:oxidized_copper_door",e.WaxedWeatheredCopper="minecraft:waxed_weathered_copper",e.ChiseledQuartzBlock="minecraft:chiseled_quartz_block",e.InfestedCrackedStoneBricks="minecraft:infested_cracked_stone_bricks",e.LightBlueTerracotta="minecraft:light_blue_terracotta",e.DeepslateBrickSlab="minecraft:deepslate_brick_slab",e.FloweringAzalea="minecraft:flowering_azalea",e.InvisibleBedrock="minecraft:invisible_bedrock",e.OakLeaves="minecraft:oak_leaves",e.BrainCoralFan="minecraft:brain_coral_fan",e.BambooStairs="minecraft:bamboo_stairs",e.Torch="minecraft:torch",e.GlowLichen="minecraft:glow_lichen",e.CopperTrapdoor="minecraft:copper_trapdoor",e.RedCandle="minecraft:red_candle",e.MudBrickWall="minecraft:mud_brick_wall",e.HoneyBlock="minecraft:honey_block",e.CherryTrapdoor="minecraft:cherry_trapdoor",e.BrownConcrete="minecraft:brown_concrete",e.LitPumpkin="minecraft:lit_pumpkin",e.PinkConcrete="minecraft:pink_concrete",e.YellowGlazedTerracotta="minecraft:yellow_glazed_terracotta",e.SmoothBasalt="minecraft:smooth_basalt",e.WarpedPlanks="minecraft:warped_planks",e.Piston="minecraft:piston",e.CherryFence="minecraft:cherry_fence",e.MangrovePlanks="minecraft:mangrove_planks",e.HardLightGrayStainedGlassPane="minecraft:hard_light_gray_stained_glass_pane",e.RedTerracotta="minecraft:red_terracotta",e.Water="minecraft:water",e.WeatheredCopperTrapdoor="minecraft:weathered_copper_trapdoor",e.Element77="minecraft:element_77",e.WeatheredCopperGrate="minecraft:weathered_copper_grate",e.SpruceButton="minecraft:spruce_button",e.WallBanner="minecraft:wall_banner",e.DeadFireCoralBlock="minecraft:dead_fire_coral_block",e.MagentaWool="minecraft:magenta_wool",e.WaxedWeatheredCopperGrate="minecraft:waxed_weathered_copper_grate",e.WaxedWeatheredCopperBulb="minecraft:waxed_weathered_copper_bulb",e.VerdantFroglight="minecraft:verdant_froglight",e.MossyCobblestoneSlab="minecraft:mossy_cobblestone_slab",e.MagentaGlazedTerracotta="minecraft:magenta_glazed_terracotta",e.PolishedAndesite="minecraft:polished_andesite",e.PurpleStainedGlass="minecraft:purple_stained_glass",e.QuartzDoubleSlab="minecraft:quartz_double_slab",e.MangroveSlab="minecraft:mangrove_slab",e.WallSign="minecraft:wall_sign",e.InfestedDeepslate="minecraft:infested_deepslate",e.OrangeGlazedTerracotta="minecraft:orange_glazed_terracotta",e.BirchSapling="minecraft:birch_sapling",e.ClientRequestPlaceholderBlock="minecraft:client_request_placeholder_block",e.HardBrownStainedGlassPane="minecraft:hard_brown_stained_glass_pane",e.Torchflower="minecraft:torchflower",e.SporeBlossom="minecraft:spore_blossom",e.Waterlily="minecraft:waterlily",e.EmeraldBlock="minecraft:emerald_block",e.Conduit="minecraft:conduit",e.Anvil="minecraft:anvil",e.SuspiciousSand="minecraft:suspicious_sand",e.AncientDebris="minecraft:ancient_debris",e.DarkOakPlanks="minecraft:dark_oak_planks",e.JungleLeaves="minecraft:jungle_leaves",e.LightningRod="minecraft:lightning_rod",e.NetherBrickFence="minecraft:nether_brick_fence",e.BlackStainedGlassPane="minecraft:black_stained_glass_pane",e.MagentaConcrete="minecraft:magenta_concrete",e.CobblestoneWall="minecraft:cobblestone_wall",e.LightBlueStainedGlassPane="minecraft:light_blue_stained_glass_pane",e.DeepslateBrickDoubleSlab="minecraft:deepslate_brick_double_slab",e.TubeCoralWallFan="minecraft:tube_coral_wall_fan",e.SpruceDoubleSlab="minecraft:spruce_double_slab",e.RedSandstone="minecraft:red_sandstone",e.DarkOakLog="minecraft:dark_oak_log",e.OakPlanks="minecraft:oak_planks",e.RedstoneOre="minecraft:redstone_ore",e.AcaciaHangingSign="minecraft:acacia_hanging_sign",e.LightBlock13="minecraft:light_block_13",e.OchreFroglight="minecraft:ochre_froglight",e.PolishedBlackstoneStairs="minecraft:polished_blackstone_stairs",e.TuffWall="minecraft:tuff_wall",e.MangrovePressurePlate="minecraft:mangrove_pressure_plate",e.Observer="minecraft:observer",e.PinkGlazedTerracotta="minecraft:pink_glazed_terracotta",e.YellowTerracotta="minecraft:yellow_terracotta",e.BrownGlazedTerracotta="minecraft:brown_glazed_terracotta",e.BrownCandleCake="minecraft:brown_candle_cake",e.PinkCandleCake="minecraft:pink_candle_cake",e.QuartzBlock="minecraft:quartz_block",e.RedstoneTorch="minecraft:redstone_torch",e.BirchLeaves="minecraft:birch_leaves",e.SilverGlazedTerracotta="minecraft:silver_glazed_terracotta",e.CyanConcretePowder="minecraft:cyan_concrete_powder",e.OxidizedCopper="minecraft:oxidized_copper",e.BirchPressurePlate="minecraft:birch_pressure_plate",e.Element19="minecraft:element_19",e.SandstoneStairs="minecraft:sandstone_stairs",e.StrippedBambooBlock="minecraft:stripped_bamboo_block",e.CrackedStoneBricks="minecraft:cracked_stone_bricks",e.DeadTubeCoralWallFan="minecraft:dead_tube_coral_wall_fan",e.BirchFenceGate="minecraft:birch_fence_gate",e.SculkCatalyst="minecraft:sculk_catalyst",e.Element115="minecraft:element_115",e.Cobblestone="minecraft:cobblestone",e.HornCoral="minecraft:horn_coral",e.WhiteConcretePowder="minecraft:white_concrete_powder",e.YellowConcrete="minecraft:yellow_concrete",e.OakDoubleSlab="minecraft:oak_double_slab",e.StrippedWarpedStem="minecraft:stripped_warped_stem",e.DaylightDetector="minecraft:daylight_detector",e.SmoothSandstoneStairs="minecraft:smooth_sandstone_stairs",e.JunglePressurePlate="minecraft:jungle_pressure_plate",e.HardWhiteStainedGlass="minecraft:hard_white_stained_glass",e.DoubleCutCopperSlab="minecraft:double_cut_copper_slab",e.BirchButton="minecraft:birch_button",e.CrimsonPlanks="minecraft:crimson_planks",e.Sandstone="minecraft:sandstone",e.BlackstoneWall="minecraft:blackstone_wall",e.LightWeightedPressurePlate="minecraft:light_weighted_pressure_plate",e.PolishedBlackstone="minecraft:polished_blackstone",e.Bamboo="minecraft:bamboo",e.RedNetherBrickSlab="minecraft:red_nether_brick_slab",e.IronOre="minecraft:iron_ore",e.WaxedWeatheredChiseledCopper="minecraft:waxed_weathered_chiseled_copper",e.Element17="minecraft:element_17",e.StickyPistonArmCollision="minecraft:sticky_piston_arm_collision",e.Element51="minecraft:element_51",e.GrayStainedGlass="minecraft:gray_stained_glass",e.ExposedCutCopperSlab="minecraft:exposed_cut_copper_slab",e.Element52="minecraft:element_52",e.WarpedStairs="minecraft:warped_stairs",e.Bedrock="minecraft:bedrock",e.SmithingTable="minecraft:smithing_table",e.LightBlock10="minecraft:light_block_10",e.TuffBrickSlab="minecraft:tuff_brick_slab",e.RoseBush="minecraft:rose_bush",e.GreenCarpet="minecraft:green_carpet",e.PurpleCandleCake="minecraft:purple_candle_cake",e.PrismarineBrickSlab="minecraft:prismarine_brick_slab",e.CyanConcrete="minecraft:cyan_concrete",e.NetheriteBlock="minecraft:netherite_block",e.RedstoneBlock="minecraft:redstone_block",e.PolishedBlackstoneWall="minecraft:polished_blackstone_wall",e.QuartzPillar="minecraft:quartz_pillar",e.WaxedExposedCutCopper="minecraft:waxed_exposed_cut_copper",e.GildedBlackstone="minecraft:gilded_blackstone",e.JungleHangingSign="minecraft:jungle_hanging_sign",e.BlueConcretePowder="minecraft:blue_concrete_powder",e.CherryWood="minecraft:cherry_wood",e.BirchSlab="minecraft:birch_slab",e.EndStone="minecraft:end_stone",e.CrimsonDoor="minecraft:crimson_door",e.JungleSlab="minecraft:jungle_slab",e.WaxedOxidizedCopper="minecraft:waxed_oxidized_copper",e.Glowstone="minecraft:glowstone",e.StonePressurePlate="minecraft:stone_pressure_plate",e.QuartzStairs="minecraft:quartz_stairs",e.WaxedExposedCutCopperStairs="minecraft:waxed_exposed_cut_copper_stairs",e.HardLimeStainedGlassPane="minecraft:hard_lime_stained_glass_pane",e.MudBrickSlab="minecraft:mud_brick_slab",e.CrackedDeepslateTiles="minecraft:cracked_deepslate_tiles",e.Farmland="minecraft:farmland",e.DeadBrainCoralWallFan="minecraft:dead_brain_coral_wall_fan",e.PinkCandle="minecraft:pink_candle",e.NormalStoneDoubleSlab="minecraft:normal_stone_double_slab",e.BrownCandle="minecraft:brown_candle",e.LightBlock12="minecraft:light_block_12",e.Rail="minecraft:rail",e.SoulLantern="minecraft:soul_lantern",e.Carrots="minecraft:carrots",e.AcaciaTrapdoor="minecraft:acacia_trapdoor",e.StoneBricks="minecraft:stone_bricks",e.MossyCobblestoneStairs="minecraft:mossy_cobblestone_stairs",e.HardMagentaStainedGlass="minecraft:hard_magenta_stained_glass",e.PinkTerracotta="minecraft:pink_terracotta",e.WaxedWeatheredCopperDoor="minecraft:waxed_weathered_copper_door",e.DarkPrismarine="minecraft:dark_prismarine",e.InfestedCobblestone="minecraft:infested_cobblestone",e.BrainCoralWallFan="minecraft:brain_coral_wall_fan",e.MangroveWood="minecraft:mangrove_wood",e.CraftingTable="minecraft:crafting_table",e.RedGlazedTerracotta="minecraft:red_glazed_terracotta",e.DarkOakFenceGate="minecraft:dark_oak_fence_gate",e.CherryButton="minecraft:cherry_button",e.CrimsonNylium="minecraft:crimson_nylium",e.WarpedDoubleSlab="minecraft:warped_double_slab",e.StructureVoid="minecraft:structure_void",e.BambooFenceGate="minecraft:bamboo_fence_gate",e.PurpleConcrete="minecraft:purple_concrete",e.WhiteStainedGlassPane="minecraft:white_stained_glass_pane",e.WaxedExposedCopperBulb="minecraft:waxed_exposed_copper_bulb",e.BubbleCoral="minecraft:bubble_coral",e.CoalOre="minecraft:coal_ore",e.PolishedBlackstoneBrickSlab="minecraft:polished_blackstone_brick_slab",e.NormalStoneSlab="minecraft:normal_stone_slab",e.PurpleCandle="minecraft:purple_candle",e.Snow="minecraft:snow",e.CalibratedSculkSensor="minecraft:calibrated_sculk_sensor",e.YellowConcretePowder="minecraft:yellow_concrete_powder",e.OakSlab="minecraft:oak_slab",e.Sand="minecraft:sand",e.MangroveStandingSign="minecraft:mangrove_standing_sign",e.Slime="minecraft:slime",e.Element117="minecraft:element_117",e.JungleStairs="minecraft:jungle_stairs",e.MossyStoneBrickDoubleSlab="minecraft:mossy_stone_brick_double_slab",e.CutRedSandstoneDoubleSlab="minecraft:cut_red_sandstone_double_slab",e.AzaleaLeaves="minecraft:azalea_leaves",e.BambooDoubleSlab="minecraft:bamboo_double_slab",e.ChiseledPolishedBlackstone="minecraft:chiseled_polished_blackstone",e.SmoothStoneSlab="minecraft:smooth_stone_slab",e.InfestedChiseledStoneBricks="minecraft:infested_chiseled_stone_bricks",e.BrownConcretePowder="minecraft:brown_concrete_powder",e.PinkConcretePowder="minecraft:pink_concrete_powder",e.CrackedDeepslateBricks="minecraft:cracked_deepslate_bricks",e.DeadTubeCoral="minecraft:dead_tube_coral",e.AcaciaDoor="minecraft:acacia_door",e.OrangeShulkerBox="minecraft:orange_shulker_box",e.NetherWartBlock="minecraft:nether_wart_block",e.LightBlueGlazedTerracotta="minecraft:light_blue_glazed_terracotta",e.PrismarineSlab="minecraft:prismarine_slab",e.PrismarineDoubleSlab="minecraft:prismarine_double_slab",e.LightBlock11="minecraft:light_block_11",e.CherryDoor="minecraft:cherry_door",e.WeatheredCutCopperStairs="minecraft:weathered_cut_copper_stairs",e.AcaciaLog="minecraft:acacia_log",e.FlowingLava="minecraft:flowing_lava",e.WhiteTerracotta="minecraft:white_terracotta",e.CrimsonTrapdoor="minecraft:crimson_trapdoor",e.BlueShulkerBox="minecraft:blue_shulker_box",e.Basalt="minecraft:basalt",e.WaxedWeatheredCopperTrapdoor="minecraft:waxed_weathered_copper_trapdoor",e.HardCyanStainedGlass="minecraft:hard_cyan_stained_glass",e.PolishedDiorite="minecraft:polished_diorite",e.Element13="minecraft:element_13",e.CyanGlazedTerracotta="minecraft:cyan_glazed_terracotta",e.LitRedstoneLamp="minecraft:lit_redstone_lamp",e.HardPurpleStainedGlass="minecraft:hard_purple_stained_glass",e.YellowCandleCake="minecraft:yellow_candle_cake",e.StickyPiston="minecraft:sticky_piston",e.MediumAmethystBud="minecraft:medium_amethyst_bud",e.BrownShulkerBox="minecraft:brown_shulker_box",e.PinkShulkerBox="minecraft:pink_shulker_box",e.LightBlueCandle="minecraft:light_blue_candle",e.DeepslateTileStairs="minecraft:deepslate_tile_stairs",e.SculkSensor="minecraft:sculk_sensor",e.CopperBulb="minecraft:copper_bulb",e.Element6="minecraft:element_6",e.Element97="minecraft:element_97",e.DioriteStairs="minecraft:diorite_stairs",e.SmoothStoneDoubleSlab="minecraft:smooth_stone_double_slab",e.SpruceLeaves="minecraft:spruce_leaves",e.RedStainedGlassPane="minecraft:red_stained_glass_pane",e.FrogSpawn="minecraft:frog_spawn",e.Element111="minecraft:element_111",e.CrimsonFenceGate="minecraft:crimson_fence_gate",e.RedCarpet="minecraft:red_carpet",e.SmoothSandstoneDoubleSlab="minecraft:smooth_sandstone_double_slab",e.RedShulkerBox="minecraft:red_shulker_box",e.DirtWithRoots="minecraft:dirt_with_roots",e.StrippedCherryLog="minecraft:stripped_cherry_log",e.HornCoralWallFan="minecraft:horn_coral_wall_fan",e.CopperDoor="minecraft:copper_door",e.CrimsonButton="minecraft:crimson_button",e.MagentaConcretePowder="minecraft:magenta_concrete_powder",e.PrismarineStairs="minecraft:prismarine_stairs",e.IronDoor="minecraft:iron_door",e.MangroveTrapdoor="minecraft:mangrove_trapdoor",e.DaylightDetectorInverted="minecraft:daylight_detector_inverted",e.JunglePlanks="minecraft:jungle_planks",e.ChorusFlower="minecraft:chorus_flower",e.TorchflowerCrop="minecraft:torchflower_crop",e.CrackedNetherBricks="minecraft:cracked_nether_bricks",e.Pumpkin="minecraft:pumpkin",e.SmoothStone="minecraft:smooth_stone",e.GraniteSlab="minecraft:granite_slab",e.LimeConcrete="minecraft:lime_concrete",e.WaxedWeatheredCutCopperSlab="minecraft:waxed_weathered_cut_copper_slab",e.RedMushroom="minecraft:red_mushroom",e.HardYellowStainedGlass="minecraft:hard_yellow_stained_glass",e.MagentaTerracotta="minecraft:magenta_terracotta",e.BlackCarpet="minecraft:black_carpet",e.ExposedCutCopperStairs="minecraft:exposed_cut_copper_stairs",e.MangroveStairs="minecraft:mangrove_stairs",e.PolishedDioriteSlab="minecraft:polished_diorite_slab",e.RedSandstoneStairs="minecraft:red_sandstone_stairs",e.LightBlueConcrete="minecraft:light_blue_concrete",e.MangroveFenceGate="minecraft:mangrove_fence_gate",e.BubbleColumn="minecraft:bubble_column",e.Sunflower="minecraft:sunflower",e.Allow="minecraft:allow",e.GrayConcretePowder="minecraft:gray_concrete_powder",e.BambooHangingSign="minecraft:bamboo_hanging_sign",e.WitherRose="minecraft:wither_rose",e.CopperBlock="minecraft:copper_block",e.BirchDoubleSlab="minecraft:birch_double_slab",e.WaxedWeatheredDoubleCutCopperSlab="minecraft:waxed_weathered_double_cut_copper_slab",e.PolishedBlackstoneBricks="minecraft:polished_blackstone_bricks",e.CutCopper="minecraft:cut_copper",e.FrostedIce="minecraft:frosted_ice",e.SpruceDoor="minecraft:spruce_door",e.ChiseledSandstone="minecraft:chiseled_sandstone",e.ChippedAnvil="minecraft:chipped_anvil",e.WarpedTrapdoor="minecraft:warped_trapdoor",e.OrangeConcretePowder="minecraft:orange_concrete_powder",e.FlowingWater="minecraft:flowing_water",e.BrickBlock="minecraft:brick_block",e.HardGlass="minecraft:hard_glass",e.CaveVines="minecraft:cave_vines",e.MagentaStainedGlassPane="minecraft:magenta_stained_glass_pane",e.Element62="minecraft:element_62",e.LightBlueCarpet="minecraft:light_blue_carpet",e.OakHangingSign="minecraft:oak_hanging_sign",e.StrippedDarkOakWood="minecraft:stripped_dark_oak_wood",e.WhiteStainedGlass="minecraft:white_stained_glass",e.OakWood="minecraft:oak_wood",e.WaxedExposedDoubleCutCopperSlab="minecraft:waxed_exposed_double_cut_copper_slab",e.WaxedOxidizedCopperTrapdoor="minecraft:waxed_oxidized_copper_trapdoor",e.Jukebox="minecraft:jukebox",e.StrippedCherryWood="minecraft:stripped_cherry_wood",e.AcaciaPressurePlate="minecraft:acacia_pressure_plate",e.SmoothRedSandstoneSlab="minecraft:smooth_red_sandstone_slab",e.Jigsaw="minecraft:jigsaw",e.BorderBlock="minecraft:border_block",e.Shroomlight="minecraft:shroomlight",e.YellowCandle="minecraft:yellow_candle",e.DarkOakStairs="minecraft:dark_oak_stairs",e.DeepslateTileWall="minecraft:deepslate_tile_wall",e.GlassPane="minecraft:glass_pane",e.ChiseledDeepslate="minecraft:chiseled_deepslate",e.CutCopperSlab="minecraft:cut_copper_slab",e.InfestedStoneBricks="minecraft:infested_stone_bricks",e.BambooTrapdoor="minecraft:bamboo_trapdoor",e.OxidizedChiseledCopper="minecraft:oxidized_chiseled_copper",e.DarkOakTrapdoor="minecraft:dark_oak_trapdoor",e.MangroveWallSign="minecraft:mangrove_wall_sign",e.Beetroot="minecraft:beetroot",e.RawCopperBlock="minecraft:raw_copper_block",e.HornCoralBlock="minecraft:horn_coral_block",e.Skull="minecraft:skull",e.LightGrayCandleCake="minecraft:light_gray_candle_cake",e.Element95="minecraft:element_95",e.WhiteCandle="minecraft:white_candle",e.GoldenRail="minecraft:golden_rail",e.LitFurnace="minecraft:lit_furnace",e.CyanWool="minecraft:cyan_wool",e.PetrifiedOakDoubleSlab="minecraft:petrified_oak_double_slab",e.StructureBlock="minecraft:structure_block",e.TintedGlass="minecraft:tinted_glass",e.DeprecatedAnvil="minecraft:deprecated_anvil",e.GrayShulkerBox="minecraft:gray_shulker_box",e.FireCoralWallFan="minecraft:fire_coral_wall_fan",e.JungleFenceGate="minecraft:jungle_fence_gate",e.ExposedCopperGrate="minecraft:exposed_copper_grate",e.WaxedCopperGrate="minecraft:waxed_copper_grate",e.DeadBrainCoral="minecraft:dead_brain_coral",e.JungleTrapdoor="minecraft:jungle_trapdoor",e.SpruceWallSign="minecraft:spruce_wall_sign",e.CoalBlock="minecraft:coal_block",e.WarpedFenceGate="minecraft:warped_fence_gate",e.Composter="minecraft:composter",e.Element44="minecraft:element_44",e.WaxedDoubleCutCopperSlab="minecraft:waxed_double_cut_copper_slab",e.WaxedExposedCopperDoor="minecraft:waxed_exposed_copper_door",e.BlueGlazedTerracotta="minecraft:blue_glazed_terracotta",e.BlueWool="minecraft:blue_wool",e.Clay="minecraft:clay",e.WeepingVines="minecraft:weeping_vines",e.ChorusPlant="minecraft:chorus_plant",e.MudBrickStairs="minecraft:mud_brick_stairs",e.SmoothRedSandstoneStairs="minecraft:smooth_red_sandstone_stairs",e.Element100="minecraft:element_100",e.Element103="minecraft:element_103",e.Element105="minecraft:element_105",e.CrimsonPressurePlate="minecraft:crimson_pressure_plate",e.Element106="minecraft:element_106",e.Element107="minecraft:element_107",e.HardGrayStainedGlassPane="minecraft:hard_gray_stained_glass_pane",e.Element108="minecraft:element_108",e.Element109="minecraft:element_109",e.LightGrayShulkerBox="minecraft:light_gray_shulker_box",e.Element112="minecraft:element_112",e.Element110="minecraft:element_110",e.Element116="minecraft:element_116",e.Element114="minecraft:element_114",e.WhiteGlazedTerracotta="minecraft:white_glazed_terracotta",e.StrippedWarpedHyphae="minecraft:stripped_warped_hyphae",e.Element50="minecraft:element_50",e.PumpkinStem="minecraft:pumpkin_stem",e.Lever="minecraft:lever",e.MovingBlock="minecraft:moving_block",e.TrappedChest="minecraft:trapped_chest",e.LightGrayConcretePowder="minecraft:light_gray_concrete_powder",e.BrainCoralBlock="minecraft:brain_coral_block",e.StandingSign="minecraft:standing_sign",e.PurpleConcretePowder="minecraft:purple_concrete_powder",e.BambooPlanks="minecraft:bamboo_planks",e.CommandBlock="minecraft:command_block",e.TwistingVines="minecraft:twisting_vines",e.AcaciaDoubleSlab="minecraft:acacia_double_slab",e.PolishedAndesiteDoubleSlab="minecraft:polished_andesite_double_slab",e.Magma="minecraft:magma",e.Dirt="minecraft:dirt",e.Reeds="minecraft:reeds",e.Deny="minecraft:deny",e.BeeNest="minecraft:bee_nest",e.Campfire="minecraft:campfire",e.SoulSoil="minecraft:soul_soil",e.Element8="minecraft:element_8",e.Element28="minecraft:element_28",e.DarkOakPressurePlate="minecraft:dark_oak_pressure_plate",e.SoulSand="minecraft:soul_sand",e.CobbledDeepslateDoubleSlab="minecraft:cobbled_deepslate_double_slab",e.SpruceHangingSign="minecraft:spruce_hanging_sign",e.ReinforcedDeepslate="minecraft:reinforced_deepslate",e.EndRod="minecraft:end_rod",e.FletchingTable="minecraft:fletching_table",e.CherryLeaves="minecraft:cherry_leaves",e.BlackGlazedTerracotta="minecraft:black_glazed_terracotta",e.StrippedAcaciaLog="minecraft:stripped_acacia_log",e.SnifferEgg="minecraft:sniffer_egg",e.WarpedFence="minecraft:warped_fence",e.CaveVinesBodyWithBerries="minecraft:cave_vines_body_with_berries",e.CherryStandingSign="minecraft:cherry_standing_sign",e.MangroveHangingSign="minecraft:mangrove_hanging_sign",e.WaxedExposedCopperTrapdoor="minecraft:waxed_exposed_copper_trapdoor",e.MossyStoneBrickStairs="minecraft:mossy_stone_brick_stairs",e.CrimsonStem="minecraft:crimson_stem",e.ColoredTorchRg="minecraft:colored_torch_rg",e.TuffBrickDoubleSlab="minecraft:tuff_brick_double_slab",e.Vault="minecraft:vault",e.AzaleaLeavesFlowered="minecraft:azalea_leaves_flowered",e.Element18="minecraft:element_18",e.CrimsonSlab="minecraft:crimson_slab",e.WarpedHyphae="minecraft:warped_hyphae",e.OxeyeDaisy="minecraft:oxeye_daisy",e.BambooButton="minecraft:bamboo_button",e.WarpedWartBlock="minecraft:warped_wart_block",e.TuffStairs="minecraft:tuff_stairs",e.YellowCarpet="minecraft:yellow_carpet",e.BlackStainedGlass="minecraft:black_stained_glass",e.WaxedOxidizedCopperDoor="minecraft:waxed_oxidized_copper_door",e.GrassBlock="minecraft:grass_block",e.TripwireHook="minecraft:tripwire_hook",e.HardBlackStainedGlass="minecraft:hard_black_stained_glass",e.StrippedBirchLog="minecraft:stripped_birch_log",e.RedTulip="minecraft:red_tulip",e.CutSandstone="minecraft:cut_sandstone",e.LimeWool="minecraft:lime_wool",e.BlueCandleCake="minecraft:blue_candle_cake",e.LargeFern="minecraft:large_fern",e.SweetBerryBush="minecraft:sweet_berry_bush",e.PolishedBlackstoneSlab="minecraft:polished_blackstone_slab",e.BlackShulkerBox="minecraft:black_shulker_box",e.JungleSapling="minecraft:jungle_sapling",e.BlueConcrete="minecraft:blue_concrete",e.JungleStandingSign="minecraft:jungle_standing_sign",e.Web="minecraft:web",e.WeatheredCutCopperSlab="minecraft:weathered_cut_copper_slab",e.Cocoa="minecraft:cocoa",e.DarkOakLeaves="minecraft:dark_oak_leaves",e.OrangeTerracotta="minecraft:orange_terracotta",e.Fire="minecraft:fire",e.PurpurDoubleSlab="minecraft:purpur_double_slab",e.ExposedChiseledCopper="minecraft:exposed_chiseled_copper",e.InfestedStone="minecraft:infested_stone",e.EndPortalFrame="minecraft:end_portal_frame",e.Prismarine="minecraft:prismarine",e.MagentaCandleCake="minecraft:magenta_candle_cake",e.DeepslateGoldOre="minecraft:deepslate_gold_ore",e.HardOrangeStainedGlass="minecraft:hard_orange_stained_glass",e.Glass="minecraft:glass",e.MossBlock="minecraft:moss_block",e.NetherBrickDoubleSlab="minecraft:nether_brick_double_slab",e.ExposedCutCopper="minecraft:exposed_cut_copper",e.PrismarineBrickDoubleSlab="minecraft:prismarine_brick_double_slab",e.Bookshelf="minecraft:bookshelf",e.WaxedWeatheredCutCopperStairs="minecraft:waxed_weathered_cut_copper_stairs",e.MangroveRoots="minecraft:mangrove_roots",e.AcaciaStairs="minecraft:acacia_stairs",e.PolishedAndesiteStairs="minecraft:polished_andesite_stairs",e.CherrySlab="minecraft:cherry_slab",e.SmoothRedSandstoneDoubleSlab="minecraft:smooth_red_sandstone_double_slab",e.LitBlastFurnace="minecraft:lit_blast_furnace",e.Element11="minecraft:element_11",e.Sculk="minecraft:sculk",e.TuffBrickStairs="minecraft:tuff_brick_stairs",e.ChemistryTable="minecraft:chemistry_table",e.DeadFireCoral="minecraft:dead_fire_coral",e.StoneBrickSlab="minecraft:stone_brick_slab",e.StrippedSpruceLog="minecraft:stripped_spruce_log",e.WaxedOxidizedCopperBulb="minecraft:waxed_oxidized_copper_bulb",e.DeepslateBrickStairs="minecraft:deepslate_brick_stairs",e.WarpedNylium="minecraft:warped_nylium",e.DeepslateEmeraldOre="minecraft:deepslate_emerald_ore",e.StrippedCrimsonStem="minecraft:stripped_crimson_stem",e.AcaciaSapling="minecraft:acacia_sapling",e.StonecutterBlock="minecraft:stonecutter_block",e.AndesiteSlab="minecraft:andesite_slab",e.CyanShulkerBox="minecraft:cyan_shulker_box",e.UnpoweredComparator="minecraft:unpowered_comparator",e.LimeCandle="minecraft:lime_candle",e.Target="minecraft:target",e.WoodenButton="minecraft:wooden_button",e.MangroveDoor="minecraft:mangrove_door",e.EndStoneBrickDoubleSlab="minecraft:end_stone_brick_double_slab",e.WeatheredCopperDoor="minecraft:weathered_copper_door",e.PearlescentFroglight="minecraft:pearlescent_froglight",e.TallGrass="minecraft:tall_grass",e.LightBlock15="minecraft:light_block_15",e.Element64="minecraft:element_64",e.NetherSprouts="minecraft:nether_sprouts",e.Element92="minecraft:element_92",e.CyanStainedGlassPane="minecraft:cyan_stained_glass_pane",e.DeadHornCoralBlock="minecraft:dead_horn_coral_block",e.Element12="minecraft:element_12",e.DeadHornCoralFan="minecraft:dead_horn_coral_fan",e.Furnace="minecraft:furnace",e.WarpedSlab="minecraft:warped_slab",e.Netherrack="minecraft:netherrack",e.WarpedStem="minecraft:warped_stem",e.Chain="minecraft:chain",e.HornCoralFan="minecraft:horn_coral_fan",e.GreenShulkerBox="minecraft:green_shulker_box",e.BrickStairs="minecraft:brick_stairs",e.PurpleCarpet="minecraft:purple_carpet",e.FireCoralFan="minecraft:fire_coral_fan",e.Element69="minecraft:element_69",e.SpruceTrapdoor="minecraft:spruce_trapdoor",e.PurpleGlazedTerracotta="minecraft:purple_glazed_terracotta",e.ChainCommandBlock="minecraft:chain_command_block",e.SpruceFenceGate="minecraft:spruce_fence_gate",e.RedNetherBrickStairs="minecraft:red_nether_brick_stairs",e.GreenGlazedTerracotta="minecraft:green_glazed_terracotta",e.DeepslateRedstoneOre="minecraft:deepslate_redstone_ore",e.DeadBrainCoralBlock="minecraft:dead_brain_coral_block",e.MangroveFence="minecraft:mangrove_fence",e.BirchTrapdoor="minecraft:birch_trapdoor",e.TuffBricks="minecraft:tuff_bricks",e.Mud="minecraft:mud",e.Ice="minecraft:ice",e.Air="minecraft:air",e.Bed="minecraft:bed",e.LightBlueWool="minecraft:light_blue_wool",e.BlackConcrete="minecraft:black_concrete",e.Tnt="minecraft:tnt",e.DeadTubeCoralFan="minecraft:dead_tube_coral_fan",e.PolishedDioriteStairs="minecraft:polished_diorite_stairs",e.Element83="minecraft:element_83",e.OrangeConcrete="minecraft:orange_concrete",e.Netherreactor="minecraft:netherreactor",e.LimeCarpet="minecraft:lime_carpet",e.DeadFireCoralFan="minecraft:dead_fire_coral_fan",e.DecoratedPot="minecraft:decorated_pot",e.GraniteDoubleSlab="minecraft:granite_double_slab",e.EnchantingTable="minecraft:enchanting_table",e.BubbleCoralWallFan="minecraft:bubble_coral_wall_fan",e.OrangeTulip="minecraft:orange_tulip",e.Azalea="minecraft:azalea",e.Bell="minecraft:bell",e.MudBricks="minecraft:mud_bricks",e.BirchWallSign="minecraft:birch_wall_sign",e.BambooWallSign="minecraft:bamboo_wall_sign",e.AcaciaWood="minecraft:acacia_wood",e.Hopper="minecraft:hopper",e.HardRedStainedGlass="minecraft:hard_red_stained_glass",e.PrismarineBricks="minecraft:prismarine_bricks",e.Lectern="minecraft:lectern",e.AcaciaButton="minecraft:acacia_button",e.StandingBanner="minecraft:standing_banner",e.SeaLantern="minecraft:sea_lantern",e.WaxedOxidizedDoubleCutCopperSlab="minecraft:waxed_oxidized_double_cut_copper_slab",e.LightBlueShulkerBox="minecraft:light_blue_shulker_box",e.MangrovePropagule="minecraft:mangrove_propagule",e.PolishedDioriteDoubleSlab="minecraft:polished_diorite_double_slab",e.MossyCobblestoneDoubleSlab="minecraft:mossy_cobblestone_double_slab",e.BirchStairs="minecraft:birch_stairs",e.SpruceSlab="minecraft:spruce_slab",e.BlackstoneStairs="minecraft:blackstone_stairs",e.BlueIce="minecraft:blue_ice",e.HardRedStainedGlassPane="minecraft:hard_red_stained_glass_pane",e.Lantern="minecraft:lantern",e.DarkOakFence="minecraft:dark_oak_fence",e.BirchDoor="minecraft:birch_door",e.DeepslateLapisOre="minecraft:deepslate_lapis_ore",e.CrimsonHangingSign="minecraft:crimson_hanging_sign",e.DeepslateCoalOre="minecraft:deepslate_coal_ore",e.WeatheredCutCopper="minecraft:weathered_cut_copper",e.BambooStandingSign="minecraft:bamboo_standing_sign",e.StrippedMangroveLog="minecraft:stripped_mangrove_log",e.PolishedTuff="minecraft:polished_tuff",e.MagentaStainedGlass="minecraft:magenta_stained_glass",e.WeatheredCopperBulb="minecraft:weathered_copper_bulb",e.HardWhiteStainedGlassPane="minecraft:hard_white_stained_glass_pane",e.HardCyanStainedGlassPane="minecraft:hard_cyan_stained_glass_pane",e.ChiseledNetherBricks="minecraft:chiseled_nether_bricks",e.WarpedButton="minecraft:warped_button",e.RedConcretePowder="minecraft:red_concrete_powder",e.DeadBubbleCoral="minecraft:dead_bubble_coral",e.CherrySapling="minecraft:cherry_sapling",e.CherryLog="minecraft:cherry_log",e.PolishedTuffStairs="minecraft:polished_tuff_stairs",e.DragonEgg="minecraft:dragon_egg",e.NetherBrick="minecraft:nether_brick",e.DeepslateIronOre="minecraft:deepslate_iron_ore",e.Element3="minecraft:element_3",e.Element2="minecraft:element_2",e.Element5="minecraft:element_5",e.Element4="minecraft:element_4",e.Element7="minecraft:element_7",e.Element9="minecraft:element_9",e.Camera="minecraft:camera",e.WaxedCutCopper="minecraft:waxed_cut_copper",e.Element47="minecraft:element_47",e.CobbledDeepslateSlab="minecraft:cobbled_deepslate_slab",e.Lilac="minecraft:lilac",e.CrimsonStandingSign="minecraft:crimson_standing_sign",e.EmeraldOre="minecraft:emerald_ore",e.BrownMushroomBlock="minecraft:brown_mushroom_block",e.PetrifiedOakSlab="minecraft:petrified_oak_slab",e.CarvedPumpkin="minecraft:carved_pumpkin",e.Dropper="minecraft:dropper",e.Candle="minecraft:candle",e.PolishedAndesiteSlab="minecraft:polished_andesite_slab",e.AcaciaSlab="minecraft:acacia_slab",e.CobbledDeepslateWall="minecraft:cobbled_deepslate_wall",e.PointedDripstone="minecraft:pointed_dripstone",e.CutRedSandstoneSlab="minecraft:cut_red_sandstone_slab",e.ChiseledTuffBricks="minecraft:chiseled_tuff_bricks",e.ChemicalHeat="minecraft:chemical_heat",e.TripWire="minecraft:trip_wire",e.CaveVinesHeadWithBerries="minecraft:cave_vines_head_with_berries",e.ChiseledRedSandstone="minecraft:chiseled_red_sandstone",e.BrickSlab="minecraft:brick_slab",e.BrewingStand="minecraft:brewing_stand",e.BambooSapling="minecraft:bamboo_sapling",e.SmoothQuartzSlab="minecraft:smooth_quartz_slab",e.WhiteCandleCake="minecraft:white_candle_cake",e.EndPortal="minecraft:end_portal",e.JungleDoubleSlab="minecraft:jungle_double_slab",e.SpruceWood="minecraft:spruce_wood",e.Blackstone="minecraft:blackstone",e.LitDeepslateRedstoneOre="minecraft:lit_deepslate_redstone_ore",e.Element10="minecraft:element_10",e.Element14="minecraft:element_14",e.Element15="minecraft:element_15",e.Element36="minecraft:element_36",e.Element37="minecraft:element_37",e.Element34="minecraft:element_34",e.Element35="minecraft:element_35",e.Element32="minecraft:element_32",e.Element33="minecraft:element_33",e.Element31="minecraft:element_31",e.Element38="minecraft:element_38",e.Element29="minecraft:element_29",e.Element21="minecraft:element_21",e.Element20="minecraft:element_20",e.Element23="minecraft:element_23",e.Element22="minecraft:element_22",e.Element25="minecraft:element_25",e.Element24="minecraft:element_24",e.Element27="minecraft:element_27",e.Element26="minecraft:element_26",e.Element59="minecraft:element_59",e.Element54="minecraft:element_54",e.Element55="minecraft:element_55",e.Element56="minecraft:element_56",e.Element57="minecraft:element_57",e.Element53="minecraft:element_53",e.Element49="minecraft:element_49",e.Element48="minecraft:element_48",e.Element45="minecraft:element_45",e.Element43="minecraft:element_43",e.Element42="minecraft:element_42",e.Element41="minecraft:element_41",e.Element40="minecraft:element_40",e.Element72="minecraft:element_72",e.Element70="minecraft:element_70",e.Element71="minecraft:element_71",e.Element76="minecraft:element_76",e.Element75="minecraft:element_75",e.Element78="minecraft:element_78",e.Element79="minecraft:element_79",e.Element65="minecraft:element_65",e.Element67="minecraft:element_67",e.PolishedDeepslateWall="minecraft:polished_deepslate_wall",e.Element66="minecraft:element_66",e.Element61="minecraft:element_61",e.Element60="minecraft:element_60",e.Element63="minecraft:element_63",e.Element98="minecraft:element_98",e.Element90="minecraft:element_90",e.Element91="minecraft:element_91",e.Element94="minecraft:element_94",e.Element96="minecraft:element_96",e.Element88="minecraft:element_88",e.Element82="minecraft:element_82",e.Element81="minecraft:element_81",e.Element80="minecraft:element_80",e.Element87="minecraft:element_87",e.Element86="minecraft:element_86",e.Element84="minecraft:element_84",e.LitSmoker="minecraft:lit_smoker",e.SmoothQuartzStairs="minecraft:smooth_quartz_stairs",e.LightGrayCarpet="minecraft:light_gray_carpet",e.PurpurBlock="minecraft:purpur_block",e.CherryWallSign="minecraft:cherry_wall_sign",e.CyanCandle="minecraft:cyan_candle",e.RepeatingCommandBlock="minecraft:repeating_command_block",e.CrimsonFungus="minecraft:crimson_fungus",e.CherryPlanks="minecraft:cherry_planks",e.PolishedDeepslate="minecraft:polished_deepslate",e.TuffDoubleSlab="minecraft:tuff_double_slab",e.PurpurStairs="minecraft:purpur_stairs",e.TubeCoral="minecraft:tube_coral",e.WaxedCopperDoor="minecraft:waxed_copper_door",e.Portal="minecraft:portal",e.Peony="minecraft:peony",e.Crafter="minecraft:crafter",e.SprucePlanks="minecraft:spruce_planks",e.AmethystCluster="minecraft:amethyst_cluster",e.WaxedChiseledCopper="minecraft:waxed_chiseled_copper",e.WaxedCutCopperSlab="minecraft:waxed_cut_copper_slab",e.DriedKelpBlock="minecraft:dried_kelp_block",e.HardLightGrayStainedGlass="minecraft:hard_light_gray_stained_glass",e.CrimsonFence="minecraft:crimson_fence",e.ChiseledTuff="minecraft:chiseled_tuff",e.LimeConcretePowder="minecraft:lime_concrete_powder",e.BirchFence="minecraft:birch_fence",e.TurtleEgg="minecraft:turtle_egg",e.BrownTerracotta="minecraft:brown_terracotta",e.CobblestoneDoubleSlab="minecraft:cobblestone_double_slab",e.DeepslateDiamondOre="minecraft:deepslate_diamond_ore",e.LightGrayWool="minecraft:light_gray_wool",e.SoulCampfire="minecraft:soul_campfire",e.WoodenPressurePlate="minecraft:wooden_pressure_plate",e.WaxedOxidizedCopperGrate="minecraft:waxed_oxidized_copper_grate",e.DamagedAnvil="minecraft:damaged_anvil",e.WhiteConcrete="minecraft:white_concrete",e.AcaciaFence="minecraft:acacia_fence",e.GrassPath="minecraft:grass_path",e.OrangeCandleCake="minecraft:orange_candle_cake",e.WeatheredCopper="minecraft:weathered_copper",e.LimeTerracotta="minecraft:lime_terracotta",e.CherryFenceGate="minecraft:cherry_fence_gate",e.GrayGlazedTerracotta="minecraft:gray_glazed_terracotta",e.Lodestone="minecraft:lodestone",e.BambooMosaic="minecraft:bamboo_mosaic",e.PurpleWool="minecraft:purple_wool",e.IronBlock="minecraft:iron_block",e.CartographyTable="minecraft:cartography_table",e.Dandelion="minecraft:dandelion",e}({});var b=function(e){return e.Balloon="minecraft:balloon",e.FallingBlock="minecraft:falling_block",e.Vindicator="minecraft:vindicator",e.VillagerV2="minecraft:villager_v2",e.IceBomb="minecraft:ice_bomb",e.Cat="minecraft:cat",e.Bee="minecraft:bee",e.WanderingTrader="minecraft:wandering_trader",e.Wolf="minecraft:wolf",e.Rabbit="minecraft:rabbit",e.Sniffer="minecraft:sniffer",e.Tadpole="minecraft:tadpole",e.WindChargeProjectile="minecraft:wind_charge_projectile",e.Sheep="minecraft:sheep",e.Witch="minecraft:witch",e.Zoglin="minecraft:zoglin",e.Skeleton="minecraft:skeleton",e.Cow="minecraft:cow",e.Ravager="minecraft:ravager",e.Mooshroom="minecraft:mooshroom",e.Allay="minecraft:allay",e.IronGolem="minecraft:iron_golem",e.Dolphin="minecraft:dolphin",e.Breeze="minecraft:breeze",e.TraderLlama="minecraft:trader_llama",e.Turtle="minecraft:turtle",e.Tropicalfish="minecraft:tropicalfish",e.PolarBear="minecraft:polar_bear",e.Chicken="minecraft:chicken",e.Panda="minecraft:panda",e.Slime="minecraft:slime",e.Pillager="minecraft:pillager",e.Mule="minecraft:mule",e.ZombieVillager="minecraft:zombie_villager",e.Arrow="minecraft:arrow",e.Llama="minecraft:llama",e.Horse="minecraft:horse",e.Donkey="minecraft:donkey",e.Bogged="minecraft:bogged",e.Camel="minecraft:camel",e.BreezeWindChargeProjectile="minecraft:breeze_wind_charge_projectile",e.ZombieHorse="minecraft:zombie_horse",e.Zombie="minecraft:zombie",e.Villager="minecraft:villager",e.Strider="minecraft:strider",e.OminousItemSpawner="minecraft:ominous_item_spawner",e.Warden="minecraft:warden",e.Agent="minecraft:agent",e.Stray="minecraft:stray",e.Spider="minecraft:spider",e.Player="minecraft:player",e.SmallFireball="minecraft:small_fireball",e.SkeletonHorse="minecraft:skeleton_horse",e.Husk="minecraft:husk",e.Hoglin="minecraft:hoglin",e.EnderCrystal="minecraft:ender_crystal",e.Silverfish="minecraft:silverfish",e.Armadillo="minecraft:armadillo",e.Piglin="minecraft:piglin",e.Guardian="minecraft:guardian",e.Wither="minecraft:wither",e.Vex="minecraft:vex",e.Pig="minecraft:pig",e.Parrot="minecraft:parrot",e.Ocelot="minecraft:ocelot",e.Blaze="minecraft:blaze",e.Goat="minecraft:goat",e.Frog="minecraft:frog",e.Fox="minecraft:fox",e.CaveSpider="minecraft:cave_spider",e.WitherSkeleton="minecraft:wither_skeleton",e.Squid="minecraft:squid",e.Shulker="minecraft:shulker",e.Salmon="minecraft:salmon",e.Creeper="minecraft:creeper",e.Pufferfish="minecraft:pufferfish",e.PiglinBrute="minecraft:piglin_brute",e.Phantom="minecraft:phantom",e.Npc="minecraft:npc",e.MagmaCube="minecraft:magma_cube",e.LlamaSpit="minecraft:llama_spit",e.GlowSquid="minecraft:glow_squid",e.EnderDragon="minecraft:ender_dragon",e.Ghast="minecraft:ghast",e.Cod="minecraft:cod",e.EvocationIllager="minecraft:evocation_illager",e.Endermite="minecraft:endermite",e.Enderman="minecraft:enderman",e.ElderGuardian="minecraft:elder_guardian",e.Drowned="minecraft:drowned",e.Bat="minecraft:bat",e.Axolotl="minecraft:axolotl",e.XpOrb="minecraft:xp_orb",e.ZombieVillagerV2="minecraft:zombie_villager_v2",e.ZombiePigman="minecraft:zombie_pigman",e.SnowGolem="minecraft:snow_golem",e.Fireball="minecraft:fireball",e.ChestBoat="minecraft:chest_boat",e.Boat="minecraft:boat",e.ShulkerBullet="minecraft:shulker_bullet",e.XpBottle="minecraft:xp_bottle",e.Tnt="minecraft:tnt",e.SplashPotion="minecraft:splash_potion",e.LingeringPotion="minecraft:lingering_potion",e.WitherSkullDangerous="minecraft:wither_skull_dangerous",e.WitherSkull="minecraft:wither_skull",e.ThrownTrident="minecraft:thrown_trident",e.Snowball="minecraft:snowball",e.FishingHook="minecraft:fishing_hook",e.EnderPearl="minecraft:ender_pearl",e.Egg="minecraft:egg",e.DragonFireball="minecraft:dragon_fireball",e.ArmorStand="minecraft:armor_stand",e.LightningBolt="minecraft:lightning_bolt",e.TripodCamera="minecraft:tripod_camera",e.TntMinecart="minecraft:tnt_minecart",e.Minecart="minecraft:minecart",e.HopperMinecart="minecraft:hopper_minecart",e.FireworksRocket="minecraft:fireworks_rocket",e.EyeOfEnderSignal="minecraft:eye_of_ender_signal",e.CommandBlockMinecart="minecraft:command_block_minecart",e.ChestMinecart="minecraft:chest_minecart",e.AreaEffectCloud="minecraft:area_effect_cloud",e.Item="minecraft:item",e}({});var N=function(e){return e.OrangeCandle="minecraft:orange_candle",e.ColoredTorchBp="minecraft:colored_torch_bp",e.TropicalFishBucket="minecraft:tropical_fish_bucket",e.LightBlock14="minecraft:light_block_14",e.AcaciaFenceGate="minecraft:acacia_fence_gate",e.CyanDye="minecraft:cyan_dye",e.Scaffolding="minecraft:scaffolding",e.SculkCatalyst="minecraft:sculk_catalyst",e.Honeycomb="minecraft:honeycomb",e.BirchFenceGate="minecraft:birch_fence_gate",e.Shears="minecraft:shears",e.BlueConcrete="minecraft:blue_concrete",e.FieldMasonedBannerPattern="minecraft:field_masoned_banner_pattern",e.WaxedCutCopper="minecraft:waxed_cut_copper",e.CamelSpawnEgg="minecraft:camel_spawn_egg",e.StoneBrickSlab="minecraft:stone_brick_slab",e.GoldIngot="minecraft:gold_ingot",e.SprucePlanks="minecraft:spruce_planks",e.RoseBush="minecraft:rose_bush",e.TuffBrickSlab="minecraft:tuff_brick_slab",e.WoodenPickaxe="minecraft:wooden_pickaxe",e.LightBlock10="minecraft:light_block_10",e.Cookie="minecraft:cookie",e.BlueStainedGlassPane="minecraft:blue_stained_glass_pane",e.CutCopperStairs="minecraft:cut_copper_stairs",e.WhiteWool="minecraft:white_wool",e.WaxedCopper="minecraft:waxed_copper",e.WoodenDoor="minecraft:wooden_door",e.OakSign="minecraft:oak_sign",e.YellowCandle="minecraft:yellow_candle",e.Shroomlight="minecraft:shroomlight",e.MilkBucket="minecraft:milk_bucket",e.RedSandstoneStairs="minecraft:red_sandstone_stairs",e.PolishedDioriteSlab="minecraft:polished_diorite_slab",e.DarkOakPlanks="minecraft:dark_oak_planks",e.JungleLeaves="minecraft:jungle_leaves",e.SuspiciousSand="minecraft:suspicious_sand",e.AncientDebris="minecraft:ancient_debris",e.SpruceTrapdoor="minecraft:spruce_trapdoor",e.PurpleGlazedTerracotta="minecraft:purple_glazed_terracotta",e.MusicDisc11="minecraft:music_disc_11",e.IronBlock="minecraft:iron_block",e.RedNetherBrick="minecraft:red_nether_brick",e.Redstone="minecraft:redstone",e.BoneMeal="minecraft:bone_meal",e.WarpedPressurePlate="minecraft:warped_pressure_plate",e.StraySpawnEgg="minecraft:stray_spawn_egg",e.InfestedChiseledStoneBricks="minecraft:infested_chiseled_stone_bricks",e.PrismarineStairs="minecraft:prismarine_stairs",e.IronDoor="minecraft:iron_door",e.DarkPrismarineStairs="minecraft:dark_prismarine_stairs",e.RedSandstoneSlab="minecraft:red_sandstone_slab",e.SculkShrieker="minecraft:sculk_shrieker",e.BambooMosaicStairs="minecraft:bamboo_mosaic_stairs",e.EndBricks="minecraft:end_bricks",e.WaxedOxidizedCopper="minecraft:waxed_oxidized_copper",e.MangrovePlanks="minecraft:mangrove_planks",e.WaxedWeatheredCopperDoor="minecraft:waxed_weathered_copper_door",e.PinkTerracotta="minecraft:pink_terracotta",e.BlazeRod="minecraft:blaze_rod",e.BrownTerracotta="minecraft:brown_terracotta",e.CarvedPumpkin="minecraft:carved_pumpkin",e.BlazeSpawnEgg="minecraft:blaze_spawn_egg",e.Balloon="minecraft:balloon",e.OakPlanks="minecraft:oak_planks",e.DarkOakLog="minecraft:dark_oak_log",e.RedstoneOre="minecraft:redstone_ore",e.AxolotlBucket="minecraft:axolotl_bucket",e.Hopper="minecraft:hopper",e.PiglinBruteSpawnEgg="minecraft:piglin_brute_spawn_egg",e.SeaPickle="minecraft:sea_pickle",e.Lead="minecraft:lead",e.BirchPlanks="minecraft:birch_planks",e.EndBrickStairs="minecraft:end_brick_stairs",e.TubeCoralBlock="minecraft:tube_coral_block",e.WaxedExposedCopperGrate="minecraft:waxed_exposed_copper_grate",e.AcaciaPlanks="minecraft:acacia_planks",e.WaxedExposedCutCopperSlab="minecraft:waxed_exposed_cut_copper_slab",e.DeadHornCoral="minecraft:dead_horn_coral",e.FireCoralBlock="minecraft:fire_coral_block",e.Barrel="minecraft:barrel",e.QuartzSlab="minecraft:quartz_slab",e.BigDripleaf="minecraft:big_dripleaf",e.CherryStairs="minecraft:cherry_stairs",e.FishingRod="minecraft:fishing_rod",e.NameTag="minecraft:name_tag",e.JungleFence="minecraft:jungle_fence",e.Mycelium="minecraft:mycelium",e.GhastSpawnEgg="minecraft:ghast_spawn_egg",e.DeepslateRedstoneOre="minecraft:deepslate_redstone_ore",e.YellowStainedGlassPane="minecraft:yellow_stained_glass_pane",e.DarkOakSlab="minecraft:dark_oak_slab",e.SmoothQuartzStairs="minecraft:smooth_quartz_stairs",e.FenceGate="minecraft:fence_gate",e.RottenFlesh="minecraft:rotten_flesh",e.LightGrayStainedGlassPane="minecraft:light_gray_stained_glass_pane",e.EyeArmorTrimSmithingTemplate="minecraft:eye_armor_trim_smithing_template",e.BlackstoneSlab="minecraft:blackstone_slab",e.GoldenPickaxe="minecraft:golden_pickaxe",e.Chest="minecraft:chest",e.LightBlueDye="minecraft:light_blue_dye",e.PolishedBlackstoneBrickWall="minecraft:polished_blackstone_brick_wall",e.StoneStairs="minecraft:stone_stairs",e.Beacon="minecraft:beacon",e.Furnace="minecraft:furnace",e.WarpedSlab="minecraft:warped_slab",e.LightGrayStainedGlass="minecraft:light_gray_stained_glass",e.OxidizedCopperTrapdoor="minecraft:oxidized_copper_trapdoor",e.DetectorRail="minecraft:detector_rail",e.Gravel="minecraft:gravel",e.HoglinSpawnEgg="minecraft:hoglin_spawn_egg",e.LightBlueConcretePowder="minecraft:light_blue_concrete_powder",e.JungleWood="minecraft:jungle_wood",e.HeavyCore="minecraft:heavy_core",e.SuspiciousGravel="minecraft:suspicious_gravel",e.Bleach="minecraft:bleach",e.RedStainedGlass="minecraft:red_stained_glass",e.PurpleShulkerBox="minecraft:purple_shulker_box",e.IronTrapdoor="minecraft:iron_trapdoor",e.MangroveButton="minecraft:mangrove_button",e.PurpleConcretePowder="minecraft:purple_concrete_powder",e.BambooPlanks="minecraft:bamboo_planks",e.ChorusFlower="minecraft:chorus_flower",e.JunglePlanks="minecraft:jungle_planks",e.JungleSign="minecraft:jungle_sign",e.WindCharge="minecraft:wind_charge",e.GlisteringMelonSlice="minecraft:glistering_melon_slice",e.Carrot="minecraft:carrot",e.TrialSpawner="minecraft:trial_spawner",e.StrippedJungleWood="minecraft:stripped_jungle_wood",e.IronNugget="minecraft:iron_nugget",e.BoneBlock="minecraft:bone_block",e.WarpedHangingSign="minecraft:warped_hanging_sign",e.NormalStoneStairs="minecraft:normal_stone_stairs",e.LightBlueStainedGlass="minecraft:light_blue_stained_glass",e.Fern="minecraft:fern",e.PackedMud="minecraft:packed_mud",e.PolishedGranite="minecraft:polished_granite",e.IronBars="minecraft:iron_bars",e.OxidizedCutCopper="minecraft:oxidized_cut_copper",e.GlassBottle="minecraft:glass_bottle",e.SmallDripleafBlock="minecraft:small_dripleaf_block",e.WarpedRoots="minecraft:warped_roots",e.MagentaWool="minecraft:magenta_wool",e.HardGreenStainedGlassPane="minecraft:hard_green_stained_glass_pane",e.IronBoots="minecraft:iron_boots",e.YellowStainedGlass="minecraft:yellow_stained_glass",e.RabbitSpawnEgg="minecraft:rabbit_spawn_egg",e.HornCoral="minecraft:horn_coral",e.WhiteConcretePowder="minecraft:white_concrete_powder",e.CherryPlanks="minecraft:cherry_planks",e.GraniteSlab="minecraft:granite_slab",e.SoulSoil="minecraft:soul_soil",e.DarkOakPressurePlate="minecraft:dark_oak_pressure_plate",e.GraniteStairs="minecraft:granite_stairs",e.StrippedWarpedStem="minecraft:stripped_warped_stem",e.FriendPotterySherd="minecraft:friend_pottery_sherd",e.DaylightDetector="minecraft:daylight_detector",e.SmoothSandstoneStairs="minecraft:smooth_sandstone_stairs",e.RepeatingCommandBlock="minecraft:repeating_command_block",e.DrownedSpawnEgg="minecraft:drowned_spawn_egg",e.QuartzBricks="minecraft:quartz_bricks",e.MangroveLog="minecraft:mangrove_log",e.BambooMosaic="minecraft:bamboo_mosaic",e.Trapdoor="minecraft:trapdoor",e.PearlescentFroglight="minecraft:pearlescent_froglight",e.OrangeDye="minecraft:orange_dye",e.BirchButton="minecraft:birch_button",e.CrimsonPlanks="minecraft:crimson_planks",e.Netherrack="minecraft:netherrack",e.WarpedStem="minecraft:warped_stem",e.WarpedPlanks="minecraft:warped_planks",e.PigSpawnEgg="minecraft:pig_spawn_egg",e.FoxSpawnEgg="minecraft:fox_spawn_egg",e.PhantomMembrane="minecraft:phantom_membrane",e.BambooRaft="minecraft:bamboo_raft",e.GlowSquidSpawnEgg="minecraft:glow_squid_spawn_egg",e.EnderDragonSpawnEgg="minecraft:ender_dragon_spawn_egg",e.RedDye="minecraft:red_dye",e.OrangeStainedGlass="minecraft:orange_stained_glass",e.CobblestoneWall="minecraft:cobblestone_wall",e.MagentaConcrete="minecraft:magenta_concrete",e.Crossbow="minecraft:crossbow",e.ExposedCopper="minecraft:exposed_copper",e.RaiserArmorTrimSmithingTemplate="minecraft:raiser_armor_trim_smithing_template",e.OrangeCarpet="minecraft:orange_carpet",e.CherryFence="minecraft:cherry_fence",e.CrimsonTrapdoor="minecraft:crimson_trapdoor",e.BlueShulkerBox="minecraft:blue_shulker_box",e.BirchBoat="minecraft:birch_boat",e.WhiteTerracotta="minecraft:white_terracotta",e.Mud="minecraft:mud",e.BlueDye="minecraft:blue_dye",e.OakLeaves="minecraft:oak_leaves",e.FloweringAzalea="minecraft:flowering_azalea",e.DeepslateBrickSlab="minecraft:deepslate_brick_slab",e.BlackStainedGlassPane="minecraft:black_stained_glass_pane",e.NetherBrickFence="minecraft:nether_brick_fence",e.NetheriteHoe="minecraft:netherite_hoe",e.GoldenCarrot="minecraft:golden_carrot",e.BlackstoneWall="minecraft:blackstone_wall",e.WeatheredCutCopper="minecraft:weathered_cut_copper",e.MusicDiscMellohi="minecraft:music_disc_mellohi",e.DiamondBoots="minecraft:diamond_boots",e.MangroveBoat="minecraft:mangrove_boat",e.TubeCoralFan="minecraft:tube_coral_fan",e.CutRedSandstone="minecraft:cut_red_sandstone",e.PolishedBlackstoneButton="minecraft:polished_blackstone_button",e.StrippedBirchWood="minecraft:stripped_birch_wood",e.SmoothSandstone="minecraft:smooth_sandstone",e.ArcherPotterySherd="minecraft:archer_pottery_sherd",e.RedstoneBlock="minecraft:redstone_block",e.PolishedBlackstoneWall="minecraft:polished_blackstone_wall",e.GoldenApple="minecraft:golden_apple",e.MangroveFence="minecraft:mangrove_fence",e.CookedMutton="minecraft:cooked_mutton",e.PurpleCandle="minecraft:purple_candle",e.NormalStoneSlab="minecraft:normal_stone_slab",e.GoldenAxe="minecraft:golden_axe",e.Mace="minecraft:mace",e.CherryLeaves="minecraft:cherry_leaves",e.PointedDripstone="minecraft:pointed_dripstone",e.CobbledDeepslateWall="minecraft:cobbled_deepslate_wall",e.WoodenShovel="minecraft:wooden_shovel",e.DarkOakTrapdoor="minecraft:dark_oak_trapdoor",e.DeepslateTileWall="minecraft:deepslate_tile_wall",e.Cod="minecraft:cod",e.DarkOakFenceGate="minecraft:dark_oak_fence_gate",e.Lever="minecraft:lever",e.HeartOfTheSea="minecraft:heart_of_the_sea",e.PolishedDeepslateWall="minecraft:polished_deepslate_wall",e.Cake="minecraft:cake",e.BlueStainedGlass="minecraft:blue_stained_glass",e.MossyCobblestone="minecraft:mossy_cobblestone",e.HostArmorTrimSmithingTemplate="minecraft:host_armor_trim_smithing_template",e.BirchTrapdoor="minecraft:birch_trapdoor",e.Cauldron="minecraft:cauldron",e.StrippedSpruceWood="minecraft:stripped_spruce_wood",e.DeepslateBrickWall="minecraft:deepslate_brick_wall",e.GrayStainedGlass="minecraft:gray_stained_glass",e.BambooFenceGate="minecraft:bamboo_fence_gate",e.PurpleConcrete="minecraft:purple_concrete",e.WoodenHoe="minecraft:wooden_hoe",e.EndermiteSpawnEgg="minecraft:endermite_spawn_egg",e.CherryFenceGate="minecraft:cherry_fence_gate",e.BeetrootSoup="minecraft:beetroot_soup",e.HardRedStainedGlassPane="minecraft:hard_red_stained_glass_pane",e.OxidizedCopperGrate="minecraft:oxidized_copper_grate",e.JungleLog="minecraft:jungle_log",e.BlackGlazedTerracotta="minecraft:black_glazed_terracotta",e.RabbitStew="minecraft:rabbit_stew",e.CherryChestBoat="minecraft:cherry_chest_boat",e.CrimsonSlab="minecraft:crimson_slab",e.BreezeRod="minecraft:breeze_rod",e.MudBrickWall="minecraft:mud_brick_wall",e.MusicDiscCreator="minecraft:music_disc_creator",e.PolishedGraniteStairs="minecraft:polished_granite_stairs",e.RedMushroomBlock="minecraft:red_mushroom_block",e.Bowl="minecraft:bowl",e.WarpedDoor="minecraft:warped_door",e.OxidizedCutCopperStairs="minecraft:oxidized_cut_copper_stairs",e.FrogSpawnEgg="minecraft:frog_spawn_egg",e.IronHorseArmor="minecraft:iron_horse_armor",e.Pumpkin="minecraft:pumpkin",e.BirchLog="minecraft:birch_log",e.SnoutArmorTrimSmithingTemplate="minecraft:snout_armor_trim_smithing_template",e.CobbledDeepslate="minecraft:cobbled_deepslate",e.LightBlueCarpet="minecraft:light_blue_carpet",e.WeatheredCopper="minecraft:weathered_copper",e.BambooStairs="minecraft:bamboo_stairs",e.CrackedStoneBricks="minecraft:cracked_stone_bricks",e.WhiteDye="minecraft:white_dye",e.CreeperBannerPattern="minecraft:creeper_banner_pattern",e.PolishedDeepslate="minecraft:polished_deepslate",e.DarkOakDoor="minecraft:dark_oak_door",e.SmoothSandstoneSlab="minecraft:smooth_sandstone_slab",e.GrayCarpet="minecraft:gray_carpet",e.Wheat="minecraft:wheat",e.Grindstone="minecraft:grindstone",e.OakFence="minecraft:oak_fence",e.LightBlueConcrete="minecraft:light_blue_concrete",e.MangroveFenceGate="minecraft:mangrove_fence_gate",e.JungleFenceGate="minecraft:jungle_fence_gate",e.DeepslateEmeraldOre="minecraft:deepslate_emerald_ore",e.StrippedCrimsonStem="minecraft:stripped_crimson_stem",e.SpruceFence="minecraft:spruce_fence",e.LightBlueStainedGlassPane="minecraft:light_blue_stained_glass_pane",e.MagmaCream="minecraft:magma_cream",e.ElderGuardianSpawnEgg="minecraft:elder_guardian_spawn_egg",e.Saddle="minecraft:saddle",e.RawGoldBlock="minecraft:raw_gold_block",e.CarrotOnAStick="minecraft:carrot_on_a_stick",e.PolishedBlackstoneSlab="minecraft:polished_blackstone_slab",e.WhiteStainedGlass="minecraft:white_stained_glass",e.Slime="minecraft:slime",e.TuffWall="minecraft:tuff_wall",e.PolishedBlackstoneStairs="minecraft:polished_blackstone_stairs",e.TurtleEgg="minecraft:turtle_egg",e.BirchFence="minecraft:birch_fence",e.TntMinecart="minecraft:tnt_minecart",e.CopperOre="minecraft:copper_ore",e.WarpedFungus="minecraft:warped_fungus",e.GreenStainedGlassPane="minecraft:green_stained_glass_pane",e.GoldenLeggings="minecraft:golden_leggings",e.GrayStainedGlassPane="minecraft:gray_stained_glass_pane",e.EndStoneBrickSlab="minecraft:end_stone_brick_slab",e.WritableBook="minecraft:writable_book",e.AcaciaFence="minecraft:acacia_fence",e.ArmsUpPotterySherd="minecraft:arms_up_pottery_sherd",e.DarkOakFence="minecraft:dark_oak_fence",e.WaxedWeatheredChiseledCopper="minecraft:waxed_weathered_chiseled_copper",e.IronOre="minecraft:iron_ore",e.RedNetherBrickSlab="minecraft:red_nether_brick_slab",e.BeetrootSeeds="minecraft:beetroot_seeds",e.Noteblock="minecraft:noteblock",e.IceBomb="minecraft:ice_bomb",e.JungleStairs="minecraft:jungle_stairs",e.BirchSapling="minecraft:birch_sapling",e.HardBrownStainedGlassPane="minecraft:hard_brown_stained_glass_pane",e.Torchflower="minecraft:torchflower",e.LightBlock13="minecraft:light_block_13",e.AcaciaHangingSign="minecraft:acacia_hanging_sign",e.PiglinBannerPattern="minecraft:piglin_banner_pattern",e.IronGolemSpawnEgg="minecraft:iron_golem_spawn_egg",e.DarkPrismarineSlab="minecraft:dark_prismarine_slab",e.PrismarineBricksStairs="minecraft:prismarine_bricks_stairs",e.BambooFence="minecraft:bamboo_fence",e.BambooMosaicSlab="minecraft:bamboo_mosaic_slab",e.CrimsonFence="minecraft:crimson_fence",e.RedNetherBrickStairs="minecraft:red_nether_brick_stairs",e.CrimsonDoor="minecraft:crimson_door",e.Deny="minecraft:deny",e.SmoothRedSandstoneStairs="minecraft:smooth_red_sandstone_stairs",e.Composter="minecraft:composter",e.ExposedCutCopperSlab="minecraft:exposed_cut_copper_slab",e.WarpedStairs="minecraft:warped_stairs",e.EchoShard="minecraft:echo_shard",e.SpruceFenceGate="minecraft:spruce_fence_gate",e.WarpedFence="minecraft:warped_fence",e.StrippedJungleLog="minecraft:stripped_jungle_log",e.SentryArmorTrimSmithingTemplate="minecraft:sentry_armor_trim_smithing_template",e.CherrySign="minecraft:cherry_sign",e.EnchantedGoldenApple="minecraft:enchanted_golden_apple",e.MossyCobblestoneStairs="minecraft:mossy_cobblestone_stairs",e.AcaciaDoor="minecraft:acacia_door",e.NetherWartBlock="minecraft:nether_wart_block",e.LightBlueGlazedTerracotta="minecraft:light_blue_glazed_terracotta",e.BlueOrchid="minecraft:blue_orchid",e.LilyOfTheValley="minecraft:lily_of_the_valley",e.SmoothRedSandstone="minecraft:smooth_red_sandstone",e.DeepslateCopperOre="minecraft:deepslate_copper_ore",e.StoneBrickStairs="minecraft:stone_brick_stairs",e.TuffStairs="minecraft:tuff_stairs",e.SugarCane="minecraft:sugar_cane",e.CrimsonFenceGate="minecraft:crimson_fence_gate",e.DiamondChestplate="minecraft:diamond_chestplate",e.NetherGoldOre="minecraft:nether_gold_ore",e.MangroveStairs="minecraft:mangrove_stairs",e.WarpedFenceGate="minecraft:warped_fence_gate",e.Basalt="minecraft:basalt",e.OakStairs="minecraft:oak_stairs",e.JungleDoor="minecraft:jungle_door",e.Diorite="minecraft:diorite",e.CoarseDirt="minecraft:coarse_dirt",e.SpruceStairs="minecraft:spruce_stairs",e.Allow="minecraft:allow",e.GrayConcretePowder="minecraft:gray_concrete_powder",e.BirchStairs="minecraft:birch_stairs",e.DarkOakHangingSign="minecraft:dark_oak_hanging_sign",e.GreenConcrete="minecraft:green_concrete",e.StrippedCrimsonHyphae="minecraft:stripped_crimson_hyphae",e.PolishedAndesiteStairs="minecraft:polished_andesite_stairs",e.AcaciaStairs="minecraft:acacia_stairs",e.IronAxe="minecraft:iron_axe",e.BirchLeaves="minecraft:birch_leaves",e.SilverGlazedTerracotta="minecraft:silver_glazed_terracotta",e.VerdantFroglight="minecraft:verdant_froglight",e.WaxedWeatheredCopperGrate="minecraft:waxed_weathered_copper_grate",e.WaxedWeatheredCopperBulb="minecraft:waxed_weathered_copper_bulb",e.MossyCobblestoneSlab="minecraft:mossy_cobblestone_slab",e.MagentaGlazedTerracotta="minecraft:magenta_glazed_terracotta",e.DarkOakStairs="minecraft:dark_oak_stairs",e.PinkDye="minecraft:pink_dye",e.BrownDye="minecraft:brown_dye",e.BlackDye="minecraft:black_dye",e.CrimsonNylium="minecraft:crimson_nylium",e.SquidSpawnEgg="minecraft:squid_spawn_egg",e.WaxedExposedCopperTrapdoor="minecraft:waxed_exposed_copper_trapdoor",e.BambooChestRaft="minecraft:bamboo_chest_raft",e.MossyStoneBrickStairs="minecraft:mossy_stone_brick_stairs",e.CookedSalmon="minecraft:cooked_salmon",e.CowSpawnEgg="minecraft:cow_spawn_egg",e.AmethystBlock="minecraft:amethyst_block",e.Target="minecraft:target",e.ScrapePotterySherd="minecraft:scrape_pottery_sherd",e.Emerald="minecraft:emerald",e.CobbledDeepslateSlab="minecraft:cobbled_deepslate_slab",e.MushroomStew="minecraft:mushroom_stew",e.GrassBlock="minecraft:grass_block",e.LimeGlazedTerracotta="minecraft:lime_glazed_terracotta",e.DiamondSword="minecraft:diamond_sword",e.PandaSpawnEgg="minecraft:panda_spawn_egg",e.AcaciaSign="minecraft:acacia_sign",e.SandstoneStairs="minecraft:sandstone_stairs",e.DioriteStairs="minecraft:diorite_stairs",e.Arrow="minecraft:arrow",e.PolishedDioriteStairs="minecraft:polished_diorite_stairs",e.Sponge="minecraft:sponge",e.AndesiteStairs="minecraft:andesite_stairs",e.BlackStainedGlass="minecraft:black_stained_glass",e.LightGrayDye="minecraft:light_gray_dye",e.LightBlueShulkerBox="minecraft:light_blue_shulker_box",e.Diamond="minecraft:diamond",e.SeaLantern="minecraft:sea_lantern",e.MossyStoneBrickSlab="minecraft:mossy_stone_brick_slab",e.DeadHornCoralFan="minecraft:dead_horn_coral_fan",e.DeadHornCoralBlock="minecraft:dead_horn_coral_block",e.Lectern="minecraft:lectern",e.PrismarineBricks="minecraft:prismarine_bricks",e.GreenStainedGlass="minecraft:green_stained_glass",e.CocoaBeans="minecraft:cocoa_beans",e.MusicDiscWait="minecraft:music_disc_wait",e.HeartbreakPotterySherd="minecraft:heartbreak_pottery_sherd",e.JungleHangingSign="minecraft:jungle_hanging_sign",e.BlueConcretePowder="minecraft:blue_concrete_powder",e.NetheriteIngot="minecraft:netherite_ingot",e.GildedBlackstone="minecraft:gilded_blackstone",e.PoppedChorusFruit="minecraft:popped_chorus_fruit",e.BrickStairs="minecraft:brick_stairs",e.WaxedCutCopperStairs="minecraft:waxed_cut_copper_stairs",e.Cornflower="minecraft:cornflower",e.SalmonBucket="minecraft:salmon_bucket",e.CyanStainedGlass="minecraft:cyan_stained_glass",e.CyanCarpet="minecraft:cyan_carpet",e.Netherbrick="minecraft:netherbrick",e.CobblestoneSlab="minecraft:cobblestone_slab",e.HardPurpleStainedGlassPane="minecraft:hard_purple_stained_glass_pane",e.GreenTerracotta="minecraft:green_terracotta",e.WaxedCopperTrapdoor="minecraft:waxed_copper_trapdoor",e.NetherBrickStairs="minecraft:nether_brick_stairs",e.GreenGlazedTerracotta="minecraft:green_glazed_terracotta",e.HangingRoots="minecraft:hanging_roots",e.BlueTerracotta="minecraft:blue_terracotta",e.ExposedCopperTrapdoor="minecraft:exposed_copper_trapdoor",e.BirchDoor="minecraft:birch_door",e.BirchPressurePlate="minecraft:birch_pressure_plate",e.ZombieVillagerSpawnEgg="minecraft:zombie_villager_spawn_egg",e.SpireArmorTrimSmithingTemplate="minecraft:spire_armor_trim_smithing_template",e.ExposedCutCopper="minecraft:exposed_cut_copper",e.MusicDiscRelic="minecraft:music_disc_relic",e.WaxedExposedCutCopperStairs="minecraft:waxed_exposed_cut_copper_stairs",e.SpruceSign="minecraft:spruce_sign",e.QuartzStairs="minecraft:quartz_stairs",e.PurpurStairs="minecraft:purpur_stairs",e.CopperIngot="minecraft:copper_ingot",e.BrownConcretePowder="minecraft:brown_concrete_powder",e.FlowArmorTrimSmithingTemplate="minecraft:flow_armor_trim_smithing_template",e.CrackedDeepslateBricks="minecraft:cracked_deepslate_bricks",e.PinkConcretePowder="minecraft:pink_concrete_powder",e.LightGrayWool="minecraft:light_gray_wool",e.RedWool="minecraft:red_wool",e.MelonBlock="minecraft:melon_block",e.BambooPressurePlate="minecraft:bamboo_pressure_plate",e.Dropper="minecraft:dropper",e.WardArmorTrimSmithingTemplate="minecraft:ward_armor_trim_smithing_template",e.ExposedCopperGrate="minecraft:exposed_copper_grate",e.Cobblestone="minecraft:cobblestone",e.DarkOakSign="minecraft:dark_oak_sign",e.MossCarpet="minecraft:moss_carpet",e.CrimsonStairs="minecraft:crimson_stairs",e.Calcite="minecraft:calcite",e.StriderSpawnEgg="minecraft:strider_spawn_egg",e.GrayTerracotta="minecraft:gray_terracotta",e.LapisLazuli="minecraft:lapis_lazuli",e.BlackstoneStairs="minecraft:blackstone_stairs",e.Book="minecraft:book",e.DeadBubbleCoralFan="minecraft:dead_bubble_coral_fan",e.PolishedBlackstoneBrickStairs="minecraft:polished_blackstone_brick_stairs",e.AcaciaWood="minecraft:acacia_wood",e.OchreFroglight="minecraft:ochre_froglight",e.Brush="minecraft:brush",e.ExposedCutCopperStairs="minecraft:exposed_cut_copper_stairs",e.EnderPearl="minecraft:ender_pearl",e.ChiseledNetherBricks="minecraft:chiseled_nether_bricks",e.HardLimeStainedGlass="minecraft:hard_lime_stained_glass",e.PolishedDeepslateStairs="minecraft:polished_deepslate_stairs",e.BirchHangingSign="minecraft:birch_hanging_sign",e.PurpleDye="minecraft:purple_dye",e.PolishedTuffWall="minecraft:polished_tuff_wall",e.WeatheredCutCopperStairs="minecraft:weathered_cut_copper_stairs",e.MusicDisc5="minecraft:music_disc_5",e.BambooTrapdoor="minecraft:bamboo_trapdoor",e.CopperDoor="minecraft:copper_door",e.NetheritePickaxe="minecraft:netherite_pickaxe",e.ExposedCopperBulb="minecraft:exposed_copper_bulb",e.DiamondBlock="minecraft:diamond_block",e.PitcherPod="minecraft:pitcher_pod",e.IronHoe="minecraft:iron_hoe",e.WaxedCopperBulb="minecraft:waxed_copper_bulb",e.SculkVein="minecraft:sculk_vein",e.BrownStainedGlassPane="minecraft:brown_stained_glass_pane",e.Andesite="minecraft:andesite",e.PinkStainedGlassPane="minecraft:pink_stained_glass_pane",e.CodSpawnEgg="minecraft:cod_spawn_egg",e.NetheriteBlock="minecraft:netherite_block",e.Coal="minecraft:coal",e.WaxedWeatheredCutCopperStairs="minecraft:waxed_weathered_cut_copper_stairs",e.LightBlock5="minecraft:light_block_5",e.WaxedOxidizedCutCopperStairs="minecraft:waxed_oxidized_cut_copper_stairs",e.InkSac="minecraft:ink_sac",e.NetheriteScrap="minecraft:netherite_scrap",e.TuffBrickStairs="minecraft:tuff_brick_stairs",e.LightGrayTerracotta="minecraft:light_gray_terracotta",e.BurnPotterySherd="minecraft:burn_pottery_sherd",e.RavagerSpawnEgg="minecraft:ravager_spawn_egg",e.Bone="minecraft:bone",e.CobbledDeepslateStairs="minecraft:cobbled_deepslate_stairs",e.ShulkerSpawnEgg="minecraft:shulker_spawn_egg",e.DeepslateTileStairs="minecraft:deepslate_tile_stairs",e.YellowTerracotta="minecraft:yellow_terracotta",e.BrownGlazedTerracotta="minecraft:brown_glazed_terracotta",e.SlimeSpawnEgg="minecraft:slime_spawn_egg",e.PillagerSpawnEgg="minecraft:pillager_spawn_egg",e.Observer="minecraft:observer",e.PinkGlazedTerracotta="minecraft:pink_glazed_terracotta",e.Compass="minecraft:compass",e.HardLightGrayStainedGlass="minecraft:hard_light_gray_stained_glass",e.DeepslateBrickStairs="minecraft:deepslate_brick_stairs",e.WaxedOxidizedCopperBulb="minecraft:waxed_oxidized_copper_bulb",e.EnchantedBook="minecraft:enchanted_book",e.CutSandstone="minecraft:cut_sandstone",e.RedTulip="minecraft:red_tulip",e.MudBrickStairs="minecraft:mud_brick_stairs",e.HardMagentaStainedGlass="minecraft:hard_magenta_stained_glass",e.FlintAndSteel="minecraft:flint_and_steel",e.OminousBottle="minecraft:ominous_bottle",e.CopperBulb="minecraft:copper_bulb",e.CreeperSpawnEgg="minecraft:creeper_spawn_egg",e.SalmonSpawnEgg="minecraft:salmon_spawn_egg",e.SpruceDoor="minecraft:spruce_door",e.ChiseledSandstone="minecraft:chiseled_sandstone",e.FrostedIce="minecraft:frosted_ice",e.CutCopperSlab="minecraft:cut_copper_slab",e.QuartzOre="minecraft:quartz_ore",e.CalibratedSculkSensor="minecraft:calibrated_sculk_sensor",e.Snow="minecraft:snow",e.MangroveDoor="minecraft:mangrove_door",e.BrownWool="minecraft:brown_wool",e.PinkWool="minecraft:pink_wool",e.GoldBlock="minecraft:gold_block",e.StrippedOakLog="minecraft:stripped_oak_log",e.BlueIce="minecraft:blue_ice",e.CherryDoor="minecraft:cherry_door",e.JungleTrapdoor="minecraft:jungle_trapdoor",e.SkullBannerPattern="minecraft:skull_banner_pattern",e.BlackConcretePowder="minecraft:black_concrete_powder",e.BambooDoor="minecraft:bamboo_door",e.Vine="minecraft:vine",e.WaxedOxidizedChiseledCopper="minecraft:waxed_oxidized_chiseled_copper",e.PolarBearSpawnEgg="minecraft:polar_bear_spawn_egg",e.Farmland="minecraft:farmland",e.AcaciaSapling="minecraft:acacia_sapling",e.HardBlueStainedGlassPane="minecraft:hard_blue_stained_glass_pane",e.YellowShulkerBox="minecraft:yellow_shulker_box",e.ChiseledCopper="minecraft:chiseled_copper",e.WaxedWeatheredCopper="minecraft:waxed_weathered_copper",e.OxidizedCopperDoor="minecraft:oxidized_copper_door",e.ChiseledQuartzBlock="minecraft:chiseled_quartz_block",e.DeepslateBricks="minecraft:deepslate_bricks",e.BambooBlock="minecraft:bamboo_block",e.NetheriteUpgradeSmithingTemplate="minecraft:netherite_upgrade_smithing_template",e.NetheriteHelmet="minecraft:netherite_helmet",e.GusterPotterySherd="minecraft:guster_pottery_sherd",e.Lantern="minecraft:lantern",e.NetheriteSword="minecraft:netherite_sword",e.ChainCommandBlock="minecraft:chain_command_block",e.AcaciaTrapdoor="minecraft:acacia_trapdoor",e.BakedPotato="minecraft:baked_potato",e.MangroveTrapdoor="minecraft:mangrove_trapdoor",e.CherryTrapdoor="minecraft:cherry_trapdoor",e.GlowstoneDust="minecraft:glowstone_dust",e.Blackstone="minecraft:blackstone",e.WarpedWartBlock="minecraft:warped_wart_block",e.LlamaSpawnEgg="minecraft:llama_spawn_egg",e.WarpedTrapdoor="minecraft:warped_trapdoor",e.EndRod="minecraft:end_rod",e.FletchingTable="minecraft:fletching_table",e.CoastArmorTrimSmithingTemplate="minecraft:coast_armor_trim_smithing_template",e.ChemicalHeat="minecraft:chemical_heat",e.StrippedDarkOakLog="minecraft:stripped_dark_oak_log",e.RedConcrete="minecraft:red_concrete",e.CrimsonHyphae="minecraft:crimson_hyphae",e.BlackTerracotta="minecraft:black_terracotta",e.DriedKelpBlock="minecraft:dried_kelp_block",e.ChippedAnvil="minecraft:chipped_anvil",e.ExplorerPotterySherd="minecraft:explorer_pottery_sherd",e.Porkchop="minecraft:porkchop",e.FlowerPot="minecraft:flower_pot",e.UnderwaterTorch="minecraft:underwater_torch",e.RespawnAnchor="minecraft:respawn_anchor",e.NetheriteBoots="minecraft:netherite_boots",e.MangroveLeaves="minecraft:mangrove_leaves",e.RawCopperBlock="minecraft:raw_copper_block",e.Beetroot="minecraft:beetroot",e.WardenSpawnEgg="minecraft:warden_spawn_egg",e.HardCyanStainedGlass="minecraft:hard_cyan_stained_glass",e.WaxedWeatheredCopperTrapdoor="minecraft:waxed_weathered_copper_trapdoor",e.PolishedDiorite="minecraft:polished_diorite",e.CyanGlazedTerracotta="minecraft:cyan_glazed_terracotta",e.PinkShulkerBox="minecraft:pink_shulker_box",e.PackedIce="minecraft:packed_ice",e.SmoothQuartz="minecraft:smooth_quartz",e.PurpleTerracotta="minecraft:purple_terracotta",e.Bed="minecraft:bed",e.WaxedExposedCopper="minecraft:waxed_exposed_copper",e.StrippedAcaciaWood="minecraft:stripped_acacia_wood",e.WaxedOxidizedCopperGrate="minecraft:waxed_oxidized_copper_grate",e.ChainmailHelmet="minecraft:chainmail_helmet",e.OxidizedChiseledCopper="minecraft:oxidized_chiseled_copper",e.HardMagentaStainedGlassPane="minecraft:hard_magenta_stained_glass_pane",e.PinkStainedGlass="minecraft:pink_stained_glass",e.MusicDiscStal="minecraft:music_disc_stal",e.BrownStainedGlass="minecraft:brown_stained_glass",e.CoalBlock="minecraft:coal_block",e.Vault="minecraft:vault",e.AzaleaLeavesFlowered="minecraft:azalea_leaves_flowered",e.StructureVoid="minecraft:structure_void",e.ChainmailChestplate="minecraft:chainmail_chestplate",e.RecoveryCompass="minecraft:recovery_compass",e.MudBricks="minecraft:mud_bricks",e.Peony="minecraft:peony",e.CrackedPolishedBlackstoneBricks="minecraft:cracked_polished_blackstone_bricks",e.Allium="minecraft:allium",e.AcaciaChestBoat="minecraft:acacia_chest_boat",e.OakWood="minecraft:oak_wood",e.WaxedOxidizedCopperTrapdoor="minecraft:waxed_oxidized_copper_trapdoor",e.SkeletonHorseSpawnEgg="minecraft:skeleton_horse_spawn_egg",e.LightBlueWool="minecraft:light_blue_wool",e.ClayBall="minecraft:clay_ball",e.BlackConcrete="minecraft:black_concrete",e.ShortGrass="minecraft:short_grass",e.LapisBlock="minecraft:lapis_block",e.BreezeSpawnEgg="minecraft:breeze_spawn_egg",e.LimeConcrete="minecraft:lime_concrete",e.WaxedWeatheredCutCopperSlab="minecraft:waxed_weathered_cut_copper_slab",e.SmoothQuartzSlab="minecraft:smooth_quartz_slab",e.TorchflowerSeeds="minecraft:torchflower_seeds",e.HayBlock="minecraft:hay_block",e.PolishedBlackstoneBrickSlab="minecraft:polished_blackstone_brick_slab",e.StrippedBambooBlock="minecraft:stripped_bamboo_block",e.ChiseledStoneBricks="minecraft:chiseled_stone_bricks",e.Ladder="minecraft:ladder",e.IronChestplate="minecraft:iron_chestplate",e.DiamondHelmet="minecraft:diamond_helmet",e.WaxedOxidizedCutCopperSlab="minecraft:waxed_oxidized_cut_copper_slab",e.PrismarineCrystals="minecraft:prismarine_crystals",e.Banner="minecraft:banner",e.PumpkinSeeds="minecraft:pumpkin_seeds",e.WhiteConcrete="minecraft:white_concrete",e.HardGrayStainedGlass="minecraft:hard_gray_stained_glass",e.SlimeBall="minecraft:slime_ball",e.TubeCoral="minecraft:tube_coral",e.Stick="minecraft:stick",e.Egg="minecraft:egg",e.NetherSprouts="minecraft:nether_sprouts",e.WeatheredCopperDoor="minecraft:weathered_copper_door",e.MusicDiscBlocks="minecraft:music_disc_blocks",e.BrickBlock="minecraft:brick_block",e.RedstoneLamp="minecraft:redstone_lamp",e.CherrySlab="minecraft:cherry_slab",e.CutCopper="minecraft:cut_copper",e.Bamboo="minecraft:bamboo",e.CyanConcrete="minecraft:cyan_concrete",e.PrismarineBrickSlab="minecraft:prismarine_brick_slab",e.Smoker="minecraft:smoker",e.Frame="minecraft:frame",e.BrewerPotterySherd="minecraft:brewer_pottery_sherd",e.RedSand="minecraft:red_sand",e.PinkCarpet="minecraft:pink_carpet",e.GreenDye="minecraft:green_dye",e.GusterBannerPattern="minecraft:guster_banner_pattern",e.BrownCarpet="minecraft:brown_carpet",e.LightGrayConcrete="minecraft:light_gray_concrete",e.WeatheredCopperGrate="minecraft:weathered_copper_grate",e.WeatheredCopperTrapdoor="minecraft:weathered_copper_trapdoor",e.ChorusPlant="minecraft:chorus_plant",e.PurpleWool="minecraft:purple_wool",e.WaxedOxidizedCutCopper="minecraft:waxed_oxidized_cut_copper",e.GrayConcrete="minecraft:gray_concrete",e.WaxedOxidizedCopperDoor="minecraft:waxed_oxidized_copper_door",e.FermentedSpiderEye="minecraft:fermented_spider_eye",e.SpiderEye="minecraft:spider_eye",e.MagentaConcretePowder="minecraft:magenta_concrete_powder",e.LimeStainedGlassPane="minecraft:lime_stained_glass_pane",e.OrangeConcrete="minecraft:orange_concrete",e.TraderLlamaSpawnEgg="minecraft:trader_llama_spawn_egg",e.GhastTear="minecraft:ghast_tear",e.PinkConcrete="minecraft:pink_concrete",e.LitPumpkin="minecraft:lit_pumpkin",e.BrownConcrete="minecraft:brown_concrete",e.Compound="minecraft:compound",e.MudBrickSlab="minecraft:mud_brick_slab",e.Tuff="minecraft:tuff",e.ExposedCopperDoor="minecraft:exposed_copper_door",e.GrayGlazedTerracotta="minecraft:gray_glazed_terracotta",e.SnortPotterySherd="minecraft:snort_pottery_sherd",e.StoneButton="minecraft:stone_button",e.SpruceSapling="minecraft:spruce_sapling",e.LightBlock8="minecraft:light_block_8",e.WaxedCutCopperSlab="minecraft:waxed_cut_copper_slab",e.Feather="minecraft:feather",e.Clay="minecraft:clay",e.WolfSpawnEgg="minecraft:wolf_spawn_egg",e.CyanStainedGlassPane="minecraft:cyan_stained_glass_pane",e.VillagerSpawnEgg="minecraft:villager_spawn_egg",e.LimeDye="minecraft:lime_dye",e.CrimsonFungus="minecraft:crimson_fungus",e.Trident="minecraft:trident",e.HardenedClay="minecraft:hardened_clay",e.GoatHorn="minecraft:goat_horn",e.Crafter="minecraft:crafter",e.SheepSpawnEgg="minecraft:sheep_spawn_egg",e.MusicDiscPigstep="minecraft:music_disc_pigstep",e.Azalea="minecraft:azalea",e.FireCharge="minecraft:fire_charge",e.AcaciaBoat="minecraft:acacia_boat",e.CyanWool="minecraft:cyan_wool",e.DeepslateDiamondOre="minecraft:deepslate_diamond_ore",e.WhiteCandle="minecraft:white_candle",e.Clock="minecraft:clock",e.RedCarpet="minecraft:red_carpet",e.LightGrayCarpet="minecraft:light_gray_carpet",e.PurpurBlock="minecraft:purpur_block",e.DriedKelp="minecraft:dried_kelp",e.CookedBeef="minecraft:cooked_beef",e.CherryHangingSign="minecraft:cherry_hanging_sign",e.PolishedBlackstone="minecraft:polished_blackstone",e.CrimsonPressurePlate="minecraft:crimson_pressure_plate",e.Charcoal="minecraft:charcoal",e.LightGrayShulkerBox="minecraft:light_gray_shulker_box",e.HorseSpawnEgg="minecraft:horse_spawn_egg",e.NautilusShell="minecraft:nautilus_shell",e.Bow="minecraft:bow",e.String="minecraft:string",e.FrogSpawn="minecraft:frog_spawn",e.RedStainedGlassPane="minecraft:red_stained_glass_pane",e.RedCandle="minecraft:red_candle",e.GlowLichen="minecraft:glow_lichen",e.CopperTrapdoor="minecraft:copper_trapdoor",e.LeatherHelmet="minecraft:leather_helmet",e.WitherRose="minecraft:wither_rose",e.DarkOakChestBoat="minecraft:dark_oak_chest_boat",e.CopperBlock="minecraft:copper_block",e.SplashPotion="minecraft:splash_potion",e.Cactus="minecraft:cactus",e.TurtleScute="minecraft:turtle_scute",e.GlowFrame="minecraft:glow_frame",e.AcaciaSlab="minecraft:acacia_slab",e.PolishedAndesiteSlab="minecraft:polished_andesite_slab",e.Glass="minecraft:glass",e.MossBlock="minecraft:moss_block",e.GoldOre="minecraft:gold_ore",e.SkeletonSpawnEgg="minecraft:skeleton_spawn_egg",e.CutSandstoneSlab="minecraft:cut_sandstone_slab",e.EndCrystal="minecraft:end_crystal",e.PurpleCarpet="minecraft:purple_carpet",e.FireCoralFan="minecraft:fire_coral_fan",e.GreenConcretePowder="minecraft:green_concrete_powder",e.LimeStainedGlass="minecraft:lime_stained_glass",e.PolishedAndesite="minecraft:polished_andesite",e.PurpleStainedGlass="minecraft:purple_stained_glass",e.OakBoat="minecraft:oak_boat",e.MagentaStainedGlass="minecraft:magenta_stained_glass",e.WeatheredCopperBulb="minecraft:weathered_copper_bulb",e.LightWeightedPressurePlate="minecraft:light_weighted_pressure_plate",e.RapidFertilizer="minecraft:rapid_fertilizer",e.HoneyBlock="minecraft:honey_block",e.StructureBlock="minecraft:structure_block",e.TintedGlass="minecraft:tinted_glass",e.BuddingAmethyst="minecraft:budding_amethyst",e.PinkTulip="minecraft:pink_tulip",e.OakHangingSign="minecraft:oak_hanging_sign",e.SpruceSlab="minecraft:spruce_slab",e.GlassPane="minecraft:glass_pane",e.ShelterPotterySherd="minecraft:shelter_pottery_sherd",e.InfestedDeepslate="minecraft:infested_deepslate",e.Podzol="minecraft:podzol",e.ActivatorRail="minecraft:activator_rail",e.WhiteStainedGlassPane="minecraft:white_stained_glass_pane",e.LightBlock12="minecraft:light_block_12",e.BrownCandle="minecraft:brown_candle",e.PolishedDeepslateSlab="minecraft:polished_deepslate_slab",e.Deepslate="minecraft:deepslate",e.StrippedOakWood="minecraft:stripped_oak_wood",e.OxidizedCopper="minecraft:oxidized_copper",e.IronShovel="minecraft:iron_shovel",e.StoneBricks="minecraft:stone_bricks",e.NetherWart="minecraft:nether_wart",e.OrangeStainedGlassPane="minecraft:orange_stained_glass_pane",e.GoatSpawnEgg="minecraft:goat_spawn_egg",e.StrippedMangroveWood="minecraft:stripped_mangrove_wood",e.Campfire="minecraft:campfire",e.OrangeConcretePowder="minecraft:orange_concrete_powder",e.FlowPotterySherd="minecraft:flow_pottery_sherd",e.GreenCandle="minecraft:green_candle",e.PurpleStainedGlassPane="minecraft:purple_stained_glass_pane",e.Jigsaw="minecraft:jigsaw",e.AcaciaPressurePlate="minecraft:acacia_pressure_plate",e.SmoothRedSandstoneSlab="minecraft:smooth_red_sandstone_slab",e.ChiseledPolishedBlackstone="minecraft:chiseled_polished_blackstone",e.SmoothStoneSlab="minecraft:smooth_stone_slab",e.AzaleaLeaves="minecraft:azalea_leaves",e.MagentaStainedGlassPane="minecraft:magenta_stained_glass_pane",e.WoodenAxe="minecraft:wooden_axe",e.CyanCandle="minecraft:cyan_candle",e.PrizePotterySherd="minecraft:prize_pottery_sherd",e.WhiteCarpet="minecraft:white_carpet",e.OakChestBoat="minecraft:oak_chest_boat",e.BirchWood="minecraft:birch_wood",e.GlowInkSac="minecraft:glow_ink_sac",e.HardCyanStainedGlassPane="minecraft:hard_cyan_stained_glass_pane",e.EmeraldOre="minecraft:emerald_ore",e.SmoothStone="minecraft:smooth_stone",e.HardLightBlueStainedGlass="minecraft:hard_light_blue_stained_glass",e.YellowConcretePowder="minecraft:yellow_concrete_powder",e.OakSlab="minecraft:oak_slab",e.GoldenHorseArmor="minecraft:golden_horse_armor",e.CherryWood="minecraft:cherry_wood",e.BirchSlab="minecraft:birch_slab",e.JungleSlab="minecraft:jungle_slab",e.MagentaDye="minecraft:magenta_dye",e.MangroveSlab="minecraft:mangrove_slab",e.WaterBucket="minecraft:water_bucket",e.HardBlueStainedGlass="minecraft:hard_blue_stained_glass",e.PolishedGraniteSlab="minecraft:polished_granite_slab",e.LapisOre="minecraft:lapis_ore",e.LightBlock9="minecraft:light_block_9",e.Beehive="minecraft:beehive",e.OxidizedCutCopperSlab="minecraft:oxidized_cut_copper_slab",e.SculkSensor="minecraft:sculk_sensor",e.BambooSlab="minecraft:bamboo_slab",e.PoisonousPotato="minecraft:poisonous_potato",e.PrismarineSlab="minecraft:prismarine_slab",e.SandstoneSlab="minecraft:sandstone_slab",e.WolfArmor="minecraft:wolf_armor",e.HardOrangeStainedGlass="minecraft:hard_orange_stained_glass",e.LimeConcretePowder="minecraft:lime_concrete_powder",e.GreenCarpet="minecraft:green_carpet",e.SpruceButton="minecraft:spruce_button",e.CherryPressurePlate="minecraft:cherry_pressure_plate",e.CutRedSandstoneSlab="minecraft:cut_red_sandstone_slab",e.DioriteSlab="minecraft:diorite_slab",e.Medicine="minecraft:medicine",e.AndesiteSlab="minecraft:andesite_slab",e.HornCoralFan="minecraft:horn_coral_fan",e.BrickSlab="minecraft:brick_slab",e.NetherBrickSlab="minecraft:nether_brick_slab",e.DripstoneBlock="minecraft:dripstone_block",e.Gunpowder="minecraft:gunpowder",e.PurpurSlab="minecraft:purpur_slab",e.MagentaCarpet="minecraft:magenta_carpet",e.GlowBerries="minecraft:glow_berries",e.Bread="minecraft:bread",e.WeatheredCutCopperSlab="minecraft:weathered_cut_copper_slab",e.StoneSword="minecraft:stone_sword",e.Leather="minecraft:leather",e.MangroveRoots="minecraft:mangrove_roots",e.CommandBlockMinecart="minecraft:command_block_minecart",e.WaxedExposedCutCopper="minecraft:waxed_exposed_cut_copper",e.SpruceLeaves="minecraft:spruce_leaves",e.StrippedCherryLog="minecraft:stripped_cherry_log",e.DeepslateTileSlab="minecraft:deepslate_tile_slab",e.PolishedTuffStairs="minecraft:polished_tuff_stairs",e.GoldNugget="minecraft:gold_nugget",e.CrackedNetherBricks="minecraft:cracked_nether_bricks",e.BatSpawnEgg="minecraft:bat_spawn_egg",e.DonkeySpawnEgg="minecraft:donkey_spawn_egg",e.RabbitHide="minecraft:rabbit_hide",e.RibArmorTrimSmithingTemplate="minecraft:rib_armor_trim_smithing_template",e.InfestedCobblestone="minecraft:infested_cobblestone",e.DarkPrismarine="minecraft:dark_prismarine",e.HardLightBlueStainedGlassPane="minecraft:hard_light_blue_stained_glass_pane",e.MossyStoneBricks="minecraft:mossy_stone_bricks",e.PolishedBlackstoneBricks="minecraft:polished_blackstone_bricks",e.TropicalFishSpawnEgg="minecraft:tropical_fish_spawn_egg",e.MobSpawner="minecraft:mob_spawner",e.CopperGrate="minecraft:copper_grate",e.DeepslateTiles="minecraft:deepslate_tiles",e.CrackedDeepslateTiles="minecraft:cracked_deepslate_tiles",e.OrangeGlazedTerracotta="minecraft:orange_glazed_terracotta",e.ChiseledDeepslate="minecraft:chiseled_deepslate",e.EmeraldBlock="minecraft:emerald_block",e.VexSpawnEgg="minecraft:vex_spawn_egg",e.Obsidian="minecraft:obsidian",e.Kelp="minecraft:kelp",e.MelonSlice="minecraft:melon_slice",e.ChiseledRedSandstone="minecraft:chiseled_red_sandstone",e.DeadBubbleCoral="minecraft:dead_bubble_coral",e.DarkOakWood="minecraft:dark_oak_wood",e.TuffBrickWall="minecraft:tuff_brick_wall",e.QuartzPillar="minecraft:quartz_pillar",e.PolishedTuffSlab="minecraft:polished_tuff_slab",e.WaxedCopperDoor="minecraft:waxed_copper_door",e.WaxedCopperGrate="minecraft:waxed_copper_grate",e.DeadBrainCoral="minecraft:dead_brain_coral",e.SmoothBasalt="minecraft:smooth_basalt",e.YellowGlazedTerracotta="minecraft:yellow_glazed_terracotta",e.JunglePressurePlate="minecraft:jungle_pressure_plate",e.CatSpawnEgg="minecraft:cat_spawn_egg",e.HowlPotterySherd="minecraft:howl_pottery_sherd",e.WaxedExposedCopperDoor="minecraft:waxed_exposed_copper_door",e.LightBlueTerracotta="minecraft:light_blue_terracotta",e.WaxedWeatheredCutCopper="minecraft:waxed_weathered_cut_copper",e.OakLog="minecraft:oak_log",e.DolphinSpawnEgg="minecraft:dolphin_spawn_egg",e.InfestedStone="minecraft:infested_stone",e.ExposedChiseledCopper="minecraft:exposed_chiseled_copper",e.WeatheredChiseledCopper="minecraft:weathered_chiseled_copper",e.CherrySapling="minecraft:cherry_sapling",e.WaxedChiseledCopper="minecraft:waxed_chiseled_copper",e.CookedRabbit="minecraft:cooked_rabbit",e.Flint="minecraft:flint",e.TrialKey="minecraft:trial_key",e.WaxedExposedChiseledCopper="minecraft:waxed_exposed_chiseled_copper",e.EnderChest="minecraft:ender_chest",e.DeepslateCoalOre="minecraft:deepslate_coal_ore",e.OxidizedCopperBulb="minecraft:oxidized_copper_bulb",e.DragonEgg="minecraft:dragon_egg",e.WaxedExposedCopperBulb="minecraft:waxed_exposed_copper_bulb",e.PinkPetals="minecraft:pink_petals",e.BeeSpawnEgg="minecraft:bee_spawn_egg",e.BrainCoral="minecraft:brain_coral",e.Dispenser="minecraft:dispenser",e.RawIronBlock="minecraft:raw_iron_block",e.CrimsonRoots="minecraft:crimson_roots",e.SpruceWood="minecraft:spruce_wood",e.TadpoleSpawnEgg="minecraft:tadpole_spawn_egg",e.TurtleSpawnEgg="minecraft:turtle_spawn_egg",e.HoneycombBlock="minecraft:honeycomb_block",e.JungleSapling="minecraft:jungle_sapling",e.EnderEye="minecraft:ender_eye",e.NetherBrick="minecraft:nether_brick",e.CherryButton="minecraft:cherry_button",e.Lodestone="minecraft:lodestone",e.GrayWool="minecraft:gray_wool",e.StoneShovel="minecraft:stone_shovel",e.BlackWool="minecraft:black_wool",e.StrippedBirchLog="minecraft:stripped_birch_log",e.Potato="minecraft:potato",e.OrangeWool="minecraft:orange_wool",e.YellowWool="minecraft:yellow_wool",e.LimeWool="minecraft:lime_wool",e.SkullPotterySherd="minecraft:skull_pottery_sherd",e.GreenWool="minecraft:green_wool",e.MagentaTerracotta="minecraft:magenta_terracotta",e.BlackCarpet="minecraft:black_carpet",e.BlueWool="minecraft:blue_wool",e.HardGlassPane="minecraft:hard_glass_pane",e.GrayDye="minecraft:gray_dye",e.Jukebox="minecraft:jukebox",e.Shield="minecraft:shield",e.HardBlackStainedGlass="minecraft:hard_black_stained_glass",e.YellowCarpet="minecraft:yellow_carpet",e.LimeCarpet="minecraft:lime_carpet",e.GoldenSword="minecraft:golden_sword",e.Sunflower="minecraft:sunflower",e.MusicDiscFar="minecraft:music_disc_far",e.BlueCarpet="minecraft:blue_carpet",e.LightGrayConcretePowder="minecraft:light_gray_concrete_powder",e.RedConcretePowder="minecraft:red_concrete_powder",e.DarkOakLeaves="minecraft:dark_oak_leaves",e.BrainCoralFan="minecraft:brain_coral_fan",e.Elytra="minecraft:elytra",e.CyanConcretePowder="minecraft:cyan_concrete_powder",e.YellowConcrete="minecraft:yellow_concrete",e.NetheriteChestplate="minecraft:netherite_chestplate",e.DeadTubeCoralBlock="minecraft:dead_tube_coral_block",e.HardLightGrayStainedGlassPane="minecraft:hard_light_gray_stained_glass_pane",e.RedTerracotta="minecraft:red_terracotta",e.OrangeTerracotta="minecraft:orange_terracotta",e.LimeTerracotta="minecraft:lime_terracotta",e.TwistingVines="minecraft:twisting_vines",e.CommandBlock="minecraft:command_block",e.CyanTerracotta="minecraft:cyan_terracotta",e.StoneAxe="minecraft:stone_axe",e.Dandelion="minecraft:dandelion",e.WarpedNylium="minecraft:warped_nylium",e.HornCoralBlock="minecraft:horn_coral_block",e.WhiteGlazedTerracotta="minecraft:white_glazed_terracotta",e.RedGlazedTerracotta="minecraft:red_glazed_terracotta",e.BlueGlazedTerracotta="minecraft:blue_glazed_terracotta",e.BoggedSpawnEgg="minecraft:bogged_spawn_egg",e.Brick="minecraft:brick",e.LargeAmethystBud="minecraft:large_amethyst_bud",e.CartographyTable="minecraft:cartography_table",e.WayfinderArmorTrimSmithingTemplate="minecraft:wayfinder_armor_trim_smithing_template",e.BlueCandle="minecraft:blue_candle",e.PolishedBasalt="minecraft:polished_basalt",e.GrassPath="minecraft:grass_path",e.ColoredTorchRg="minecraft:colored_torch_rg",e.CrimsonStem="minecraft:crimson_stem",e.StrippedSpruceLog="minecraft:stripped_spruce_log",e.OrangeTulip="minecraft:orange_tulip",e.DiamondOre="minecraft:diamond_ore",e.CaveSpiderSpawnEgg="minecraft:cave_spider_spawn_egg",e.BubbleCoral="minecraft:bubble_coral",e.CoalOre="minecraft:coal_ore",e.EmptyMap="minecraft:empty_map",e.JungleBoat="minecraft:jungle_boat",e.Poppy="minecraft:poppy",e.ShulkerShell="minecraft:shulker_shell",e.DeepslateIronOre="minecraft:deepslate_iron_ore",e.DeepslateGoldOre="minecraft:deepslate_gold_ore",e.DeepslateLapisOre="minecraft:deepslate_lapis_ore",e.Granite="minecraft:granite",e.PetrifiedOakSlab="minecraft:petrified_oak_slab",e.NetheriteLeggings="minecraft:netherite_leggings",e.StrippedAcaciaLog="minecraft:stripped_acacia_log",e.LightBlock1="minecraft:light_block_1",e.SpruceLog="minecraft:spruce_log",e.ChestMinecart="minecraft:chest_minecart",e.AcaciaLog="minecraft:acacia_log",e.WarpedHyphae="minecraft:warped_hyphae",e.OxeyeDaisy="minecraft:oxeye_daisy",e.PitcherPlant="minecraft:pitcher_plant",e.MangroveSign="minecraft:mangrove_sign",e.MagmaCubeSpawnEgg="minecraft:magma_cube_spawn_egg",e.MangroveWood="minecraft:mangrove_wood",e.ZombiePigmanSpawnEgg="minecraft:zombie_pigman_spawn_egg",e.PolishedTuff="minecraft:polished_tuff",e.StrippedMangroveLog="minecraft:stripped_mangrove_log",e.CherryLog="minecraft:cherry_log",e.DeadFireCoralFan="minecraft:dead_fire_coral_fan",e.IronLeggings="minecraft:iron_leggings",e.Pufferfish="minecraft:pufferfish",e.AmethystShard="minecraft:amethyst_shard",e.StrippedDarkOakWood="minecraft:stripped_dark_oak_wood",e.StrippedCherryWood="minecraft:stripped_cherry_wood",e.StrippedWarpedHyphae="minecraft:stripped_warped_hyphae",e.Barrier="minecraft:barrier",e.AcaciaLeaves="minecraft:acacia_leaves",e.MangrovePropagule="minecraft:mangrove_propagule",e.StickyPiston="minecraft:sticky_piston",e.OakSapling="minecraft:oak_sapling",e.WhiteTulip="minecraft:white_tulip",e.DarkOakSapling="minecraft:dark_oak_sapling",e.SuspiciousStew="minecraft:suspicious_stew",e.BeeNest="minecraft:bee_nest",e.TadpoleBucket="minecraft:tadpole_bucket",e.WheatSeeds="minecraft:wheat_seeds",e.MelonSeeds="minecraft:melon_seeds",e.SoulSand="minecraft:soul_sand",e.Sugar="minecraft:sugar",e.SpruceChestBoat="minecraft:spruce_chest_boat",e.CherryBoat="minecraft:cherry_boat",e.MangroveChestBoat="minecraft:mangrove_chest_boat",e.CookedCod="minecraft:cooked_cod",e.SmallAmethystBud="minecraft:small_amethyst_bud",e.Apple="minecraft:apple",e.SweetBerries="minecraft:sweet_berries",e.LargeFern="minecraft:large_fern",e.TallGrass="minecraft:tall_grass",e.PufferfishSpawnEgg="minecraft:pufferfish_spawn_egg",e.LeatherLeggings="minecraft:leather_leggings",e.BubbleCoralFan="minecraft:bubble_coral_fan",e.FireCoral="minecraft:fire_coral",e.DeadFireCoral="minecraft:dead_fire_coral",e.CryingObsidian="minecraft:crying_obsidian",e.Lilac="minecraft:lilac",e.DeadTubeCoral="minecraft:dead_tube_coral",e.DeadBrainCoralFan="minecraft:dead_brain_coral_fan",e.DeadTubeCoralFan="minecraft:dead_tube_coral_fan",e.LingeringPotion="minecraft:lingering_potion",e.AzureBluet="minecraft:azure_bluet",e.YellowDye="minecraft:yellow_dye",e.WanderingTraderSpawnEgg="minecraft:wandering_trader_spawn_egg",e.DeadBrainCoralBlock="minecraft:dead_brain_coral_block",e.WeepingVines="minecraft:weeping_vines",e.Waterlily="minecraft:waterlily",e.LightBlueCandle="minecraft:light_blue_candle",e.Seagrass="minecraft:seagrass",e.DiamondPickaxe="minecraft:diamond_pickaxe",e.Deadbush="minecraft:deadbush",e.JungleButton="minecraft:jungle_button",e.Ice="minecraft:ice",e.CyanShulkerBox="minecraft:cyan_shulker_box",e.HardPinkStainedGlassPane="minecraft:hard_pink_stained_glass_pane",e.SnowLayer="minecraft:snow_layer",e.LightBlock0="minecraft:light_block_0",e.DarkOakBoat="minecraft:dark_oak_boat",e.DirtWithRoots="minecraft:dirt_with_roots",e.MuddyMangroveRoots="minecraft:muddy_mangrove_roots",e.TropicalFish="minecraft:tropical_fish",e.SporeBlossom="minecraft:spore_blossom",e.HardYellowStainedGlass="minecraft:hard_yellow_stained_glass",e.AmethystCluster="minecraft:amethyst_cluster",e.MediumAmethystBud="minecraft:medium_amethyst_bud",e.WoodenPressurePlate="minecraft:wooden_pressure_plate",e.HuskSpawnEgg="minecraft:husk_spawn_egg",e.IronSword="minecraft:iron_sword",e.TuffSlab="minecraft:tuff_slab",e.ChiseledTuff="minecraft:chiseled_tuff",e.JungleChestBoat="minecraft:jungle_chest_boat",e.TuffBricks="minecraft:tuff_bricks",e.ChiseledTuffBricks="minecraft:chiseled_tuff_bricks",e.Chicken="minecraft:chicken",e.StoneHoe="minecraft:stone_hoe",e.Beef="minecraft:beef",e.ArmadilloScute="minecraft:armadillo_scute",e.ChainmailBoots="minecraft:chainmail_boots",e.Mutton="minecraft:mutton",e.Rabbit="minecraft:rabbit",e.DiamondHorseArmor="minecraft:diamond_horse_armor",e.Salmon="minecraft:salmon",e.BoltArmorTrimSmithingTemplate="minecraft:bolt_armor_trim_smithing_template",e.BrownMushroom="minecraft:brown_mushroom",e.RedMushroom="minecraft:red_mushroom",e.BrownMushroomBlock="minecraft:brown_mushroom_block",e.Web="minecraft:web",e.EndPortalFrame="minecraft:end_portal_frame",e.ArmorStand="minecraft:armor_stand",e.InfestedStoneBricks="minecraft:infested_stone_bricks",e.InfestedMossyStoneBricks="minecraft:infested_mossy_stone_bricks",e.InfestedCrackedStoneBricks="minecraft:infested_cracked_stone_bricks",e.SnifferEgg="minecraft:sniffer_egg",e.ChainmailLeggings="minecraft:chainmail_leggings",e.ChickenSpawnEgg="minecraft:chicken_spawn_egg",e.OcelotSpawnEgg="minecraft:ocelot_spawn_egg",e.ReinforcedDeepslate="minecraft:reinforced_deepslate",e.MooshroomSpawnEgg="minecraft:mooshroom_spawn_egg",e.ParrotSpawnEgg="minecraft:parrot_spawn_egg",e.MuleSpawnEgg="minecraft:mule_spawn_egg",e.HardOrangeStainedGlassPane="minecraft:hard_orange_stained_glass_pane",e.ZombieHorseSpawnEgg="minecraft:zombie_horse_spawn_egg",e.EndermanSpawnEgg="minecraft:enderman_spawn_egg",e.SilverfishSpawnEgg="minecraft:silverfish_spawn_egg",e.WitherSkeletonSpawnEgg="minecraft:wither_skeleton_spawn_egg",e.CookedPorkchop="minecraft:cooked_porkchop",e.MusicDiscOtherside="minecraft:music_disc_otherside",e.LeatherBoots="minecraft:leather_boots",e.SpiderSpawnEgg="minecraft:spider_spawn_egg",e.Sculk="minecraft:sculk",e.ZombieSpawnEgg="minecraft:zombie_spawn_egg",e.MusicDiscPrecipice="minecraft:music_disc_precipice",e.WitchSpawnEgg="minecraft:witch_spawn_egg",e.GuardianSpawnEgg="minecraft:guardian_spawn_egg",e.DamagedAnvil="minecraft:damaged_anvil",e.PiglinSpawnEgg="minecraft:piglin_spawn_egg",e.ZoglinSpawnEgg="minecraft:zoglin_spawn_egg",e.Loom="minecraft:loom",e.AxolotlSpawnEgg="minecraft:axolotl_spawn_egg",e.AllaySpawnEgg="minecraft:allay_spawn_egg",e.NetheriteAxe="minecraft:netherite_axe",e.VindicatorSpawnEgg="minecraft:vindicator_spawn_egg",e.EvokerSpawnEgg="minecraft:evoker_spawn_egg",e.PhantomSpawnEgg="minecraft:phantom_spawn_egg",e.SnowGolemSpawnEgg="minecraft:snow_golem_spawn_egg",e.SnifferSpawnEgg="minecraft:sniffer_spawn_egg",e.ArmadilloSpawnEgg="minecraft:armadillo_spawn_egg",e.MusicDisc13="minecraft:music_disc_13",e.Bedrock="minecraft:bedrock",e.Dirt="minecraft:dirt",e.Magma="minecraft:magma",e.EndStone="minecraft:end_stone",e.ChorusFruit="minecraft:chorus_fruit",e.BrainCoralBlock="minecraft:brain_coral_block",e.BubbleCoralBlock="minecraft:bubble_coral_block",e.DeadBubbleCoralBlock="minecraft:dead_bubble_coral_block",e.DeadFireCoralBlock="minecraft:dead_fire_coral_block",e.IronHelmet="minecraft:iron_helmet",e.GoldenHelmet="minecraft:golden_helmet",e.LeatherChestplate="minecraft:leather_chestplate",e.GoldenChestplate="minecraft:golden_chestplate",e.MangroveHangingSign="minecraft:mangrove_hanging_sign",e.DiamondLeggings="minecraft:diamond_leggings",e.WoodenButton="minecraft:wooden_button",e.GoldenBoots="minecraft:golden_boots",e.WoodenSword="minecraft:wooden_sword",e.DiamondAxe="minecraft:diamond_axe",e.StonePickaxe="minecraft:stone_pickaxe",e.IronPickaxe="minecraft:iron_pickaxe",e.BambooSign="minecraft:bamboo_sign",e.PinkCandle="minecraft:pink_candle",e.GoldenShovel="minecraft:golden_shovel",e.DiamondShovel="minecraft:diamond_shovel",e.NetheriteShovel="minecraft:netherite_shovel",e.GoldenHoe="minecraft:golden_hoe",e.DiamondHoe="minecraft:diamond_hoe",e.BrownShulkerBox="minecraft:brown_shulker_box",e.CookedChicken="minecraft:cooked_chicken",e.PumpkinPie="minecraft:pumpkin_pie",e.WarpedFungusOnAStick="minecraft:warped_fungus_on_a_stick",e.Snowball="minecraft:snowball",e.LeatherHorseArmor="minecraft:leather_horse_armor",e.TurtleHelmet="minecraft:turtle_helmet",e.TotemOfUndying="minecraft:totem_of_undying",e.ExperienceBottle="minecraft:experience_bottle",e.Potion="minecraft:potion",e.MusicDiscCat="minecraft:music_disc_cat",e.Spyglass="minecraft:spyglass",e.Torch="minecraft:torch",e.SoulTorch="minecraft:soul_torch",e.Rail="minecraft:rail",e.SoulLantern="minecraft:soul_lantern",e.Candle="minecraft:candle",e.MagentaCandle="minecraft:magenta_candle",e.LimeCandle="minecraft:lime_candle",e.GrayCandle="minecraft:gray_candle",e.HardPinkStainedGlass="minecraft:hard_pink_stained_glass",e.LightGrayCandle="minecraft:light_gray_candle",e.PowderSnowBucket="minecraft:powder_snow_bucket",e.BlackCandle="minecraft:black_candle",e.SheafPotterySherd="minecraft:sheaf_pottery_sherd",e.CraftingTable="minecraft:crafting_table",e.SmithingTable="minecraft:smithing_table",e.MusicDiscStrad="minecraft:music_disc_strad",e.SoulCampfire="minecraft:soul_campfire",e.BlastFurnace="minecraft:blast_furnace",e.ChemistryTable="minecraft:chemistry_table",e.BrewingStand="minecraft:brewing_stand",e.EnchantingTable="minecraft:enchanting_table",e.Bookshelf="minecraft:bookshelf",e.ChiseledBookshelf="minecraft:chiseled_bookshelf",e.TrappedChest="minecraft:trapped_chest",e.RabbitFoot="minecraft:rabbit_foot",e.UndyedShulkerBox="minecraft:undyed_shulker_box",e.WhiteShulkerBox="minecraft:white_shulker_box",e.GrayShulkerBox="minecraft:gray_shulker_box",e.BlackShulkerBox="minecraft:black_shulker_box",e.RedShulkerBox="minecraft:red_shulker_box",e.OrangeShulkerBox="minecraft:orange_shulker_box",e.HardBlackStainedGlassPane="minecraft:hard_black_stained_glass_pane",e.LimeShulkerBox="minecraft:lime_shulker_box",e.GreenShulkerBox="minecraft:green_shulker_box",e.Quartz="minecraft:quartz",e.MagentaShulkerBox="minecraft:magenta_shulker_box",e.MusicDiscChirp="minecraft:music_disc_chirp",e.MusicDiscMall="minecraft:music_disc_mall",e.MusicDiscWard="minecraft:music_disc_ward",e.LightningRod="minecraft:lightning_rod",e.MusicDiscCreatorMusicBox="minecraft:music_disc_creator_music_box",e.DangerPotterySherd="minecraft:danger_pottery_sherd",e.DiscFragment5="minecraft:disc_fragment_5",e.Glowstone="minecraft:glowstone",e.BirchSign="minecraft:birch_sign",e.CrimsonSign="minecraft:crimson_sign",e.WarpedSign="minecraft:warped_sign",e.FireworkStar="minecraft:firework_star",e.SpruceHangingSign="minecraft:spruce_hanging_sign",e.BambooHangingSign="minecraft:bamboo_hanging_sign",e.CrimsonHangingSign="minecraft:crimson_hanging_sign",e.HardGrayStainedGlassPane="minecraft:hard_gray_stained_glass_pane",e.Painting="minecraft:painting",e.HoneyBottle="minecraft:honey_bottle",e.LavaBucket="minecraft:lava_bucket",e.CodBucket="minecraft:cod_bucket",e.WitherSpawnEgg="minecraft:wither_spawn_egg",e.PufferfishBucket="minecraft:pufferfish_bucket",e.Skull="minecraft:skull",e.HeartPotterySherd="minecraft:heart_pottery_sherd",e.Bell="minecraft:bell",e.Anvil="minecraft:anvil",e.Conduit="minecraft:conduit",e.StonecutterBlock="minecraft:stonecutter_block",e.RawIron="minecraft:raw_iron",e.RawGold="minecraft:raw_gold",e.HardGlass="minecraft:hard_glass",e.RawCopper="minecraft:raw_copper",e.IronIngot="minecraft:iron_ingot",e.PrismarineShard="minecraft:prismarine_shard",e.BlazePowder="minecraft:blaze_powder",e.DragonBreath="minecraft:dragon_breath",e.HardGreenStainedGlass="minecraft:hard_green_stained_glass",e.NetherStar="minecraft:nether_star",e.Paper="minecraft:paper",e.LightBlock4="minecraft:light_block_4",e.Tnt="minecraft:tnt",e.HardWhiteStainedGlass="minecraft:hard_white_stained_glass",e.HardPurpleStainedGlass="minecraft:hard_purple_stained_glass",e.HardBrownStainedGlass="minecraft:hard_brown_stained_glass",e.HardRedStainedGlass="minecraft:hard_red_stained_glass",e.HardWhiteStainedGlassPane="minecraft:hard_white_stained_glass_pane",e.HardYellowStainedGlassPane="minecraft:hard_yellow_stained_glass_pane",e.HardLimeStainedGlassPane="minecraft:hard_lime_stained_glass_pane",e.GlowStick="minecraft:glow_stick",e.BambooButton="minecraft:bamboo_button",e.Sparkler="minecraft:sparkler",e.SpruceBoat="minecraft:spruce_boat",e.LodestoneCompass="minecraft:lodestone_compass",e.Air="minecraft:air",e.FireworkRocket="minecraft:firework_rocket",e.BirchChestBoat="minecraft:birch_chest_boat",e.GoldenRail="minecraft:golden_rail",e.Minecart="minecraft:minecart",e.HopperMinecart="minecraft:hopper_minecart",e.RedstoneTorch="minecraft:redstone_torch",e.AcaciaButton="minecraft:acacia_button",e.DarkOakButton="minecraft:dark_oak_button",e.CrimsonButton="minecraft:crimson_button",e.WarpedButton="minecraft:warped_button",e.TripwireHook="minecraft:tripwire_hook",e.SprucePressurePlate="minecraft:spruce_pressure_plate",e.MangrovePressurePlate="minecraft:mangrove_pressure_plate",e.StonePressurePlate="minecraft:stone_pressure_plate",e.HeavyWeightedPressurePlate="minecraft:heavy_weighted_pressure_plate",e.PolishedBlackstonePressurePlate="minecraft:polished_blackstone_pressure_plate",e.Repeater="minecraft:repeater",e.Comparator="minecraft:comparator",e.Piston="minecraft:piston",e.FlowerBannerPattern="minecraft:flower_banner_pattern",e.MojangBannerPattern="minecraft:mojang_banner_pattern",e.BordureIndentedBannerPattern="minecraft:bordure_indented_banner_pattern",e.GlobeBannerPattern="minecraft:globe_banner_pattern",e.WildArmorTrimSmithingTemplate="minecraft:wild_armor_trim_smithing_template",e.FlowBannerPattern="minecraft:flow_banner_pattern",e.AnglerPotterySherd="minecraft:angler_pottery_sherd",e.BladePotterySherd="minecraft:blade_pottery_sherd",e.MinerPotterySherd="minecraft:miner_pottery_sherd",e.MournerPotterySherd="minecraft:mourner_pottery_sherd",e.PlentyPotterySherd="minecraft:plenty_pottery_sherd",e.VexArmorTrimSmithingTemplate="minecraft:vex_armor_trim_smithing_template",e.DuneArmorTrimSmithingTemplate="minecraft:dune_armor_trim_smithing_template",e.ShaperArmorTrimSmithingTemplate="minecraft:shaper_armor_trim_smithing_template",e.SilenceArmorTrimSmithingTemplate="minecraft:silence_armor_trim_smithing_template",e.TideArmorTrimSmithingTemplate="minecraft:tide_armor_trim_smithing_template",e.Chain="minecraft:chain",e.DecoratedPot="minecraft:decorated_pot",e.OminousTrialKey="minecraft:ominous_trial_key",e.LightBlock15="minecraft:light_block_15",e.FilledMap="minecraft:filled_map",e.BorderBlock="minecraft:border_block",e.LightBlock2="minecraft:light_block_2",e.LightBlock3="minecraft:light_block_3",e.LightBlock6="minecraft:light_block_6",e.LightBlock7="minecraft:light_block_7",e.LightBlock11="minecraft:light_block_11",e.Stone="minecraft:stone",e.Sand="minecraft:sand",e.RedSandstone="minecraft:red_sandstone",e.Sandstone="minecraft:sandstone",e.QuartzBlock="minecraft:quartz_block",e.Prismarine="minecraft:prismarine",e.Bucket="minecraft:bucket",e.Bundle="minecraft:bundle",e.BlueBundle="minecraft:blue_bundle",e.BlackBundle="minecraft:black_bundle",e.BrownBundle="minecraft:brown_bundle",e.CyanBundle="minecraft:cyan_bundle",e.GrayBundle="minecraft:gray_bundle",e.GreenBundle="minecraft:green_bundle",e.LightBlueBundle="minecraft:light_blue_bundle",e.LightGrayBundle="minecraft:light_gray_bundle",e.LimeBundle="minecraft:lime_bundle",e.MagentaBundle="minecraft:magenta_bundle",e.OrangeBundle="minecraft:orange_bundle",e.PinkBundle="minecraft:pink_bundle",e.PurpleBundle="minecraft:purple_bundle",e.RedBundle="minecraft:red_bundle",e.WhiteBundle="minecraft:white_bundle",e.YellowBundle="minecraft:yellow_bundle",e}({});var pa=function(e){return e.Construction="construction",e.Equipment="equipment",e.Items="items",e.Nature="nature",e.None="none",e}(pa||{});var bn=function(e){return e.Anvil="itemGroup.name.anvil",e.Arrow="itemGroup.name.arrow",e.Axe="itemGroup.name.axe",e.Banner="itemGroup.name.banner",e.BannerPattern="itemGroup.name.banner_pattern",e.Bed="itemGroup.name.bed",e.Boat="itemGroup.name.boat",e.Boots="itemGroup.name.boots",e.Buttons="itemGroup.name.buttons",e.Candles="itemGroup.name.candles",e.Chalkboard="itemGroup.name.chalkboard",e.Chest="itemGroup.name.chest",e.Chestboat="itemGroup.name.chestboat",e.Chestplate="itemGroup.name.chestplate",e.Concrete="itemGroup.name.concrete",e.ConcretePowder="itemGroup.name.concretePowder",e.CookedFood="itemGroup.name.cookedFood",e.Copper="itemGroup.name.copper",e.Coral="itemGroup.name.coral",e.CoralDecorations="itemGroup.name.coral_decorations",e.Crop="itemGroup.name.crop",e.Door="itemGroup.name.door",e.Dye="itemGroup.name.dye",e.EnchantedBook="itemGroup.name.enchantedBook",e.Fence="itemGroup.name.fence",e.FenceGate="itemGroup.name.fenceGate",e.Firework="itemGroup.name.firework",e.FireworkStars="itemGroup.name.fireworkStars",e.Flower="itemGroup.name.flower",e.Glass="itemGroup.name.glass",e.GlassPane="itemGroup.name.glassPane",e.GlazedTerracotta="itemGroup.name.glazedTerracotta",e.GoatHorn="itemGroup.name.goatHorn",e.Grass="itemGroup.name.grass",e.HangingSign="itemGroup.name.hanging_sign",e.Helmet="itemGroup.name.helmet",e.Hoe="itemGroup.name.hoe",e.HorseArmor="itemGroup.name.horseArmor",e.Leaves="itemGroup.name.leaves",e.Leggings="itemGroup.name.leggings",e.LingeringPotion="itemGroup.name.lingeringPotion",e.Log="itemGroup.name.log",e.Minecart="itemGroup.name.minecart",e.MiscFood="itemGroup.name.miscFood",e.MobEgg="itemGroup.name.mobEgg",e.MonsterStoneEgg="itemGroup.name.monsterStoneEgg",e.Mushroom="itemGroup.name.mushroom",e.NetherWartBlock="itemGroup.name.netherWartBlock",e.Ore="itemGroup.name.ore",e.Permission="itemGroup.name.permission",e.Pickaxe="itemGroup.name.pickaxe",e.Planks="itemGroup.name.planks",e.Potion="itemGroup.name.potion",e.PotterySherds="itemGroup.name.potterySherds",e.PressurePlate="itemGroup.name.pressurePlate",e.Rail="itemGroup.name.rail",e.RawFood="itemGroup.name.rawFood",e.Record="itemGroup.name.record",e.Sandstone="itemGroup.name.sandstone",e.Sapling="itemGroup.name.sapling",e.Sculk="itemGroup.name.sculk",e.Seed="itemGroup.name.seed",e.Shovel="itemGroup.name.shovel",e.ShulkerBox="itemGroup.name.shulkerBox",e.Sign="itemGroup.name.sign",e.Skull="itemGroup.name.skull",e.Slab="itemGroup.name.slab",e.SmithingTemplates="itemGroup.name.smithing_templates",e.SplashPotion="itemGroup.name.splashPotion",e.StainedClay="itemGroup.name.stainedClay",e.Stairs="itemGroup.name.stairs",e.Stone="itemGroup.name.stone",e.StoneBrick="itemGroup.name.stoneBrick",e.Sword="itemGroup.name.sword",e.Trapdoor="itemGroup.name.trapdoor",e.Walls="itemGroup.name.walls",e.Wood="itemGroup.name.wood",e.Wool="itemGroup.name.wool",e.WoolCarpet="itemGroup.name.woolCarpet",e}(bn||{});var Be=function(e){return e[e.None=0]="None",e[e.Wooden=1]="Wooden",e[e.Stone=2]="Stone",e[e.Iron=3]="Iron",e[e.Gold=4]="Gold",e[e.Diamond=5]="Diamond",e[e.Netherite=6]="Netherite",e}(Be||{});var Nt=function(e){return e[e.None=0]="None",e[e.Axe=1]="Axe",e[e.Hoe=2]="Hoe",e[e.Shovel=3]="Shovel",e[e.Sword=4]="Sword",e[e.Pickaxe=5]="Pickaxe",e}(Nt||{});var _t=function(e){return e[e.None=0]="None",e[e.Sword=1]="Sword",e[e.Shovel=2]="Shovel",e[e.Pickaxe=3]="Pickaxe",e[e.Axe=4]="Axe",e[e.Hoe=5]="Hoe",e[e.Shears=6]="Shears",e}(_t||{});var ae=function(e){return e[e.Click=0]="Click",e[e.Break=1]="Break",e[e.Place=2]="Place",e[e.Use=3]="Use",e}(ae||{});var sr=require("@serenityjs/protocol"),yt=function(e){return e[e.Interact=sr.ItemUseOnEntityInventoryTransactionType.Interact]="Interact",e[e.Attack=sr.ItemUseOnEntityInventoryTransactionType.Attack]="Attack",e}(yt||{});var E=function(e){return e[e.North=3]="North",e[e.East=0]="East",e[e.South=2]="South",e[e.West=1]="West",e}(E||{});var g=function(e){return e[e.WorldInitialize=0]="WorldInitialize",e[e.WorldTick=1]="WorldTick",e[e.ChunkReady=2]="ChunkReady",e[e.HealthChanged=3]="HealthChanged",e[e.EntitySpawned=4]="EntitySpawned",e[e.EntityDespawned=5]="EntityDespawned",e[e.EntityDie=6]="EntityDie",e[e.EntityFlagUpdate=7]="EntityFlagUpdate",e[e.EntityDimensionChange=8]="EntityDimensionChange",e[e.EntityMetadataUpdate=9]="EntityMetadataUpdate",e[e.EntityAttributeUpdate=10]="EntityAttributeUpdate",e[e.EntityHit=11]="EntityHit",e[e.EntityHurt=12]="EntityHurt",e[e.EffectAdd=13]="EffectAdd",e[e.EffectRemove=14]="EffectRemove",e[e.PlayerJoin=15]="PlayerJoin",e[e.PlayerLeave=16]="PlayerLeave",e[e.PlayerChat=17]="PlayerChat",e[e.PlayerPlaceBlock=18]="PlayerPlaceBlock",e[e.PlayerBreakBlock=19]="PlayerBreakBlock",e[e.PlayerDropItem=20]="PlayerDropItem",e[e.PlayerGamemodeChange=21]="PlayerGamemodeChange",e[e.PlayerAbilityUpdate=22]="PlayerAbilityUpdate",e[e.PlayerStartUsingItem=23]="PlayerStartUsingItem",e[e.PlayerStopUsingItem=24]="PlayerStopUsingItem",e[e.PlayerUseItem=25]="PlayerUseItem",e[e.PlayerStartEmoting=26]="PlayerStartEmoting",e[e.PlayerStopEmoting=27]="PlayerStopEmoting",e[e.PlayerInteractWithBlock=28]="PlayerInteractWithBlock",e[e.PlayerInteractWithEntity=29]="PlayerInteractWithEntity",e[e.PlayerOpenedContainer=30]="PlayerOpenedContainer",e[e.BlockUpdate=31]="BlockUpdate",e}(g||{});var Rt=function(e){return e[e.Start=1e3]="Start",e[e.Stop=1001]="Stop",e}(Rt||{});var Ro={compression:!1,encryption:!1},or=class extends wn.Emitter{static{c(this,"Network")}serenity;raknet;properties;logger=new ha.Logger("Network",ha.LoggerColors.Blue);connections=new Map;handlers=new Set;constructor(t,a){super(),this.serenity=t,this.properties=t.properties,this.raknet=new Se.Server(this.properties.address,this.properties.port,1e3,400),this.raknet.on("encapsulated",this.onEncapsulated.bind(this)),this.raknet.on("connect",this.onConnect.bind(this)),this.raknet.on("disconnect",this.onDisconnect.bind(this));for(let r of a||[])this.registerHandler(r)}registerHandler(t){this.handlers.add(t)}unregisterHandler(t){this.handlers.delete(t)}onConnect(t){if(this.connections.has(t))return t.disconnect();let a={...Ro};this.connections.set(t,a),this.logger.debug(`Connection established with ${t.rinfo.address}:${t.rinfo.port}`)}onDisconnect(t){if(!this.connections.has(t))return;let a=new D.DisconnectPacket;a.reason=D.DisconnectReason.Disconnected,a.hideDisconnectScreen=!0;let r=Buffer.from([254,D.CompressionMethod.None,...D.Framer.frame(a.serialize())]);this.onEncapsulated(t,r),this.connections.delete(t),this.serenity.players.delete(t),this.logger.debug(`Connection disconnected with ${t.rinfo.address}:${t.rinfo.port}`)}onEncapsulated(t,...a){let r=this.connections.get(t);if(!r)throw new Error("Received data from a connection that is not a registered connection.");for(let n of a){if(n[0]!==254)throw new Error("Invalid packet header");let s=(r.encryption,n.subarray(1)),o=s[0],i=D.CompressionMethod[o]?s.readUint8():D.CompressionMethod.NotPresent;i!==D.CompressionMethod.NotPresent&&(s=s.subarray(1));let l=i===D.CompressionMethod.None||i===D.CompressionMethod.NotPresent?s:i===D.CompressionMethod.Zlib?this.inflateZlib(s):i===D.CompressionMethod.Snappy?this.inflateSnappy(s):s,m=D.Framer.unframe(l);if(m.length>this.properties.packetsPerFrame)return this.logger.warn(`Received too many packets from "${t.rinfo.address}:${t.rinfo.port}", disconnecting the session.`),t.disconnect();for(let u of m){let p=(0,D.getPacketId)(u),h=D.Packets[p];if(!h){this.logger.debug(`No packet serializer/deserializer found for packet id ${p}.`);continue}try{let d=new h(u).deserialize(),S={bound:Ht.Server,connection:t,packet:d},x=this.emit(p,S),H=this.emit("all",S);if(!x||!H){this.logger.debug(`Packet received with id ${p} was cancelled by an external listener.`);continue}let de=Array.from(this.handlers).filter(Me=>Me.packet===p);if(de.length===0){this.logger.debug(`No handlers found for packet ${D.Packet[p]}, with id ${p}`);continue}for(let Me of de)if(Me.packet===p)try{new Me(this.serenity).handle(d,t)}catch(gn){this.logger.error(`Failed to handle packet with id ${p}`,gn)}}catch(d){this.logger.error(`Failed to deserialize packet with id ${p}`,d)}}}}inflateZlib(t){return(0,ua.inflateRawSync)(t)}inflateSnappy(t){throw new Error("Not implemented")}send(t,a=Se.Priority.Normal,...r){let n=this.connections.get(t);if(!n)throw new Error("Attempted to send packets to a connection that is not a registered connection.");let s=[];for(let p of r){let h={bound:Ht.Client,connection:t,packet:p},d=this.emit(p.getId(),h),S=this.emit("all",h);if(!d||!S){this.logger.debug(`Packet sent with id ${p.getId()} was cancelled by an external listener.`);continue}try{s.push(p.serialize())}catch(x){this.logger.error(`Failed to serialize packet with id ${p.getId()}`,x)}}let o=D.Framer.frame(...s),i=o.byteLength>this.properties.compressionThreshold&&n.compression?Buffer.concat([Buffer.from([this.properties.compressionMethod]),this.deflateZlib(o)]):n.compression?Buffer.concat([Buffer.from([D.CompressionMethod.None]),o]):o,l=(n.encryption,i),m=Buffer.concat([Buffer.from([254]),l]),u=new Se.Frame;return u.reliability=Se.Reliability.Reliable,u.orderChannel=0,u.payload=m,t.sendFrame(u,a)}sendNormal(t,...a){this.send(t,Se.Priority.Normal,...a)}sendImmediate(t,...a){this.send(t,Se.Priority.Immediate,...a)}deflateZlib(t){return(0,ua.deflateRawSync)(t)}setCompression(t,a){let r=this.connections.get(t);r&&(r.compression=a)}setEncryption(t,a){let r=this.connections.get(t);r&&(r.encryption=a)}disconnectConnection(t,a,r){let n=new D.DisconnectPacket;n.message=new D.DisconnectMessage(a,""),n.reason=r,n.hideDisconnectScreen=!1,this.sendImmediate(t,n)}};var w=class{static{c(this,"NetworkHandler")}static packet;serenity;network;constructor(t){this.serenity=t,this.network=t.network}handle(t,a){throw new Error("NetworkHandler.handle() is not implemented!")}};var Sn=require("@serenityjs/protocol");var kn=class extends w{static{c(this,"AnimateHandler")}static packet=Sn.Packet.Animate;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();r.dimension.broadcastExcept(r,t)}};var xn=require("@serenityjs/protocol");var Cn=class extends w{static{c(this,"ContainerCloseHandler")}static packet=xn.Packet.ContainerClose;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();r.openedContainer&&r.openedContainer.close(r)}};var Pn=require("@serenityjs/protocol");var _=class{static{c(this,"EventSignal")}static identifier;identifier=this.constructor.identifier;world;constructor(t){this.world=t}emit(){let t=this.world.emit(this.identifier,this),a=this.world.serenity.emit(this.identifier,this);return t&&a}};var da=class extends _{static{c(this,"WorldInitializeSignal")}static identifier=g.WorldInitialize};var ir=class extends _{static{c(this,"WorldTickSignal")}static identifier=g.WorldTick;currentTick;deltaTick;world;constructor(t,a,r){super(r),this.currentTick=t,this.deltaTick=a,this.world=r}};var Ft=class extends _{static{c(this,"ChunkReadySignal")}static identifier=g.ChunkReady;chunk;dimension;constructor(t,a){super(t.world),this.dimension=t,this.chunk=a}};var cr=class extends _{static{c(this,"EntitySpawnedSignal")}static identifier=g.EntitySpawned;entity;dimension;constructor(t,a){super(t.dimension.world),this.entity=t,this.dimension=a}};var lr=class extends _{static{c(this,"EntityDespawnedSignal")}static identifier=g.EntityDespawned;entity;dimension;constructor(t,a){super(t.dimension.world),this.entity=t,this.dimension=a}};var mr=class extends _{static{c(this,"EntityFlagUpdateSignal")}identifier=g.EntityFlagUpdate;entity;flag;value;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.flag=a,this.value=r}};var pr=class extends _{static{c(this,"EntityMetadataUpdateSignal")}identifier=g.EntityMetadataUpdate;entity;key;dataItem;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.key=a,this.dataItem=r}};var ur=class extends _{static{c(this,"EntityAttributeUpdateSignal")}static identifier=g.EntityAttributeUpdate;entity;attribute;value;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.attribute=a,this.value=r}};var hr=class extends _{static{c(this,"PlayerJoinSignal")}static identifier=g.PlayerJoin;player;constructor(t){super(t.dimension.world),this.player=t}};var dr=class extends _{static{c(this,"PlayerLeaveSignal")}static identifier=g.PlayerLeave;player;reason;message;constructor(t,a,r){super(t.dimension.world),this.player=t,this.reason=a,this.message=r}};var fr=class extends _{static{c(this,"PlayerChatSignal")}static identifier=g.PlayerChat;player;message;constructor(t,a){super(t.dimension.world),this.player=t,this.message=a}};var $t=class extends _{static{c(this,"BlockUpdateSignal")}static identifier=g.BlockUpdate;block;dimension;constructor(t){super(t.dimension.world),this.block=t,this.dimension=t.dimension}};var gr=class extends $t{static{c(this,"PlayerPlaceBlockSignal")}static identifier=g.PlayerPlaceBlock;face;faceLocation;permutationBeingPlaced;player;constructor(t,a,r,n,s){super(t),this.player=a,this.permutationBeingPlaced=r,this.face=n,this.faceLocation=s}};var _r=class extends $t{static{c(this,"PlayerBreakBlockSignal")}static identifier=g.PlayerBreakBlock;player;itemStack;constructor(t,a,r){super(t),this.player=a,this.itemStack=r}};var yr=class extends _{static{c(this,"PlayerDropItemSignal")}static identifier=g.PlayerDropItem;player;itemStack;amount;constructor(t,a,r){super(t.dimension.world),this.player=t,this.itemStack=a,this.amount=r}};var br=class extends _{static{c(this,"PlayerAbilityUpdateSignal")}static identifier=g.PlayerAbilityUpdate;player;ability;value;constructor(t,a,r){super(t.getWorld()),this.player=t,this.ability=a,this.value=r}};var wr=class extends _{static{c(this,"PlayerStartUsingItemSignal")}static identifier=g.PlayerStartUsingItem;player;itemStack;useMethod;constructor(t,a,r){super(t.dimension.world),this.player=t,this.itemStack=a,this.useMethod=r}};var Sr=class extends _{static{c(this,"PlayerStopUsingItemSignal")}static identifier=g.PlayerStopUsingItem;player;itemStack;constructor(t,a){super(t.dimension.world),this.player=t,this.itemStack=a}};var Oe=class extends _{static{c(this,"PlayerUseItemSignal")}static identifier=g.PlayerUseItem;player;itemStack;useMethod;constructor(t,a,r){super(t.dimension.world),this.player=t,this.itemStack=a,this.useMethod=r}};var kr=class extends _{static{c(this,"PlayerStartEmotingSignal")}identifier=g.PlayerStartEmoting;player;emote;tickLength;constructor(t,a,r){super(t.getWorld()),this.player=t,this.emote=a,this.tickLength=r}};var xr=class extends _{static{c(this,"PlayerStopEmotingSignal")}identifier=g.PlayerStopEmoting;player;emote;constructor(t,a){super(t.getWorld()),this.player=t,this.emote=a}};var Cr=class extends _{static{c(this,"EffectAddSignal")}static identifier=g.EffectAdd;entity;effect;constructor(t,a){super(t.getWorld()),this.entity=t,this.effect=a}};var Pr=class extends _{static{c(this,"EffectRemoveSignal")}static identifier=g.EffectRemove;entity;effect;constructor(t,a){super(t.getWorld()),this.entity=t,this.effect=a}};var vr=class extends _{static{c(this,"PlayerGamemodeChangeSignal")}static identifier=g.PlayerGamemodeChange;player;fromGamemode;toGamemode;constructor(t,a,r){super(t.getWorld()),this.player=t,this.fromGamemode=a,this.toGamemode=r}};var qt=class extends _{static{c(this,"EntityDimensionChangeSignal")}static identifier=g.EntityDimensionChange;entity;fromDimension;toDimension;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.fromDimension=a,this.toDimension=r}};var Tr=class extends _{static{c(this,"PlayerInteractWithBlockSignal")}static identifier=g.PlayerInteractWithBlock;source;block;beforeItemStack;itemStack;constructor(t,a,r,n){super(t.getWorld()),this.source=t,this.block=a,this.beforeItemStack=r,this.itemStack=n}};var Er=class extends _{static{c(this,"PlayerInteractWithEntitySignal")}static identifier=g.PlayerInteractWithEntity;source;target;itemStack;beforeItemStack;constructor(t,a,r,n){super(t.getWorld()),this.source=t,this.target=a,this.beforeItemStack=r,this.itemStack=n}};var Ut=class extends _{static{c(this,"PlayerOpenedContainerSignal")}identifier=g.PlayerOpenedContainer;player;container;constructor(t,a){super(t.getWorld()),this.player=t,this.container=a}};var Dr=class extends _{static{c(this,"EntityHitSignal")}static identifier=g.EntityHit;hitEntity;damagingEntity;constructor(t,a){super(t.getWorld()),this.damagingEntity=t,this.hitEntity=a}};var Mr=class extends _{static{c(this,"EntityHurtSignal")}static identifier=g.EntityHurt;hurtEntity;damagingEntity;damage;cause;constructor(t,a,r,n){super(t.getWorld()),this.hurtEntity=t,this.damagingEntity=n,this.damage=a,this.cause=r}};var Ar=class extends _{static{c(this,"EntityHealthChangedSignal")}static identifier=g.HealthChanged;entity;fromHealth;toHealth;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.fromHealth=a,this.toHealth=r}};var Wr=class extends _{static{c(this,"EntityDieSignal")}static identifier=g.EntityDie;entity;damagingEntity;damageCause;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.damagingEntity=a,this.damageCause=r}};var vn=class extends w{static{c(this,"DisconnectHandler")}static packet=Pn.Packet.Disconnect;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();new dr(r,t.reason,t.message.message??"").emit(),r.despawn();let n=r.dimension;n.world.provider.writePlayer(r.getDataEntry(),n),n.world.logger.info(`\xA78[\xA79${r.username}\xA78] Event:\xA7r Player left the server.`)}};var R=require("@serenityjs/protocol");var En=require("@serenityjs/data");var Tn=require("@serenityjs/nbt");var re=class fa{static{c(this,"EntityType")}static types=new Map;static network=0;identifier;network=++fa.network;components;constructor(t,a){this.identifier=t,this.components=a??[]}register(t){if(this.components.includes(t.identifier))throw new Error(`Component ${t.identifier} is already registered to entity type ${this.identifier}`);this.components.push(t.identifier)}unregister(t){if(this.components.includes(t.identifier))this.components.splice(this.components.indexOf(t.identifier),1);else throw new Error(`Component ${t.identifier} is not registered to entity type ${this.identifier}`)}static get(t){return fa.types.get(t)}static getAll(){return[...fa.types.values()]}static toNbt(t){let a=new Tn.CompoundTag;return a.createStringTag("bid",""),a.createByteTag("hasspawnegg",1),a.createStringTag("id",t.identifier),a.createIntTag("rid",t.network),a.createByteTag("summonable",1),a}};for(let e of En.ENTITY_TYPES){let t=new re(e.identifier,e.components);re.types.set(e.identifier,t)}var Gr=class extends re{static{c(this,"CustomEntityType")}constructor(t){super(t)}};var O=require("@serenityjs/protocol");var Rr=require("@serenityjs/binarystream"),Ne=require("@serenityjs/data"),ka=require("@serenityjs/protocol");var He=require("@serenityjs/data");var Fo={loggable:!1,air:!1,liquid:!1,solid:!1,hardness:0,friction:0,color:"",components:[],tags:[],drops:[],permutations:[]},B=class zr{static{c(this,"BlockType")}static types=new Map;identifier;custom;loggable;air;liquid;solid;hardness;friction;color;components=[];tags=[];drops=[];permutations=[];constructor(t,a){this.identifier=t,this.custom=!1;let r={...Fo,...a};this.loggable=r.loggable,this.air=r.air,this.liquid=r.liquid,this.solid=r.solid,this.hardness=r.hardness,this.friction=r.friction,this.color=r.color,this.components=[...r.components,...this.components],this.tags=[...r.tags,...this.tags],this.drops=[...r.drops,...this.drops],this.permutations=[...r.permutations,...this.permutations]}getPermutation(t){for(let a of this.permutations)if(!t||a.matches(t))return a;return this.permutations[0]}static get(t){let a=zr.types.get(t);return a||this.get(P.Air)}static getAll(){return[...zr.types.values()]}};var ke=require("@serenityjs/nbt");var Dn=require("@serenityjs/binarystream"),fe=require("@serenityjs/nbt");var $o=2166136261;function Lr(e,t){let a=Object.keys(t),r=Object.values(t),n=new fe.CompoundTag("",{});n.addTag(new fe.StringTag("name",e));let s=new fe.CompoundTag("states",{});for(let[l,m]of a.entries()){let u=r[l];switch(typeof u){case"number":{s.addTag(new fe.IntTag(m,u));break}case"string":{s.addTag(new fe.StringTag(m,u));break}case"boolean":{s.addTag(new fe.ByteTag(m,u?1:0));break}}}n.addTag(s);let o=new Dn.BinaryStream;fe.CompoundTag.write(o,n);let i=$o;for(let l of o.getBuffer())i^=l&255,i+=(i<<1)+(i<<4)+(i<<7)+(i<<8)+(i<<24),i=i|0;return i}c(Lr,"hash");var F=class ga{static{c(this,"BlockPermutation")}static permutations=new Map;network;index;state;type;constructor(t,a,r){this.network=t,this.state=a,this.type=r,this.index=r.permutations.length}matches(t){for(let a in t)if(this.state[a]!==t[a])return!1;return!0}static resolve(t,a){let r=B.types.get(t);if(!r)return this.resolve(P.Air);let n=r.permutations.find(s=>{for(let o in a){let i=s.state[o],m=(i===!0||i===!1)&&(a[o]===0||a[o]===1)?a[o]===1:a[o];if(i!==m)return!1}return!0});return n||r.permutations[0]}static create(t,a){let r=Lr(t.identifier,a??{}),n=new ga(r,a??{},t);return ga.permutations.set(n.network,n),t.permutations.push(n),n}static toNbt(t){let a=new ke.CompoundTag("",{}),r=new ke.StringTag("name",t.type.identifier),n=new ke.CompoundTag("states",{}),s=Object.keys(t.state),o=Object.values(t.state);for(let[i,l]of s.entries()){let m=o[i];switch(typeof m){case"number":{n.addTag(new ke.IntTag(l,m));break}case"string":{n.addTag(new ke.StringTag(l,m));break}case"boolean":{n.addTag(new ke.ByteTag(l,m?1:0));break}}}return a.addTag(r),a.addTag(n),a}static fromNbt(t){let a=t.getTag("name"),n=t.getTag("states").valueOf();return ga.resolve(a.value,n)}};var _a=class{static{c(this,"ItemDrop")}type;min;max;probability;constructor(t,a,r,n){this.type=t,this.min=a,this.max=r,this.probability=n}roll(){return Math.random()>this.probability?0:Math.floor(Math.random()*(this.max-this.min+1))+this.min}};for(let e of He.BLOCK_TYPES){if(B.types.has(e.identifier))throw new Error(`Block type ${e.identifier} is already registered`);let t=He.BLOCK_DROPS.find(n=>n.identifier===e.identifier),a=He.BLOCK_METADATA.find(n=>n.identifier===e.identifier)??{hardness:0,friction:0,mapColor:""},r=new B(e.identifier,{loggable:e.loggable,air:e.air,liquid:e.liquid,solid:e.solid,hardness:a.hardness,friction:a.friction,color:a.mapColor,components:e.components,tags:e.tags});if(t)for(let n of t?.drops??[]){let{identifier:s,min:o,max:i,chance:l}=n,m=new _a(s,o,i,l);r.drops.push(m)}else r.drops.push(new _a(e.identifier,1,1,1));B.types.set(e.identifier,r)}for(let e of He.BLOCK_PERMUTATIONS){let t=B.types.get(e.identifier);if(!t)throw new Error(`Block type ${e.identifier} does not exist`);let a=new F(e.hash,e.state,t);t.permutations.push(a),F.permutations.set(e.hash,a)}var Mn=require("@serenityjs/nbt"),An=require("@serenityjs/protocol");var Vt=class Or extends B{static{c(this,"CustomBlockType")}static networkId=1e4;custom=!0;networkId=++Or.networkId;constructor(t,a){super(t,a)}static toNbt(t){let a=new Mn.CompoundTag;return a.createCompoundTag("vanilla_block_data").createIntTag("block_id",t.networkId),a.createCompoundTag("menu_category").createStringTag("category",pa.Nature),a.createIntTag("molangVersion",0),a}static toBlockProperty(t){return new An.BlockProperty(t.identifier,Or.toNbt(t))}};var ya={};Ot(ya,{BlockCardinalDirectionTrait:()=>Nn,BlockDirectionTrait:()=>Rn,BlockInventoryTrait:()=>Wn,BlockOpenBitTrait:()=>Ln,BlockTrait:()=>q,BlockUpperBitTrait:()=>On,BlockUpsideDownBitTrait:()=>zn,BlockWeirdoDirectionTrait:()=>Gn,VerticalHalfTrait:()=>Hn});var bt=class{static{c(this,"Trait")}static identifier;static types;identifier=this.constructor.identifier;constructor(){return this}clone(...t){throw new Error(`${this.identifier}.clone() is not implemented`)}};var q=class extends bt{static{c(this,"BlockTrait")}static types=[];block;constructor(t){super(),this.block=t,t.addTrait(this)}};var z=require("@serenityjs/protocol");var Wn=class extends q{static{c(this,"BlockInventoryTrait")}static identifier="inventory";static types=[P.Chest];opened=!1;container;containerType;containerId;inventorySize;constructor(t){switch(super(t),t.getType().identifier){default:{this.containerType=z.ContainerType.Container,this.containerId=z.ContainerId.None,this.inventorySize=27;break}}if(this.container=new Hr(t,this.containerType,this.containerId,this.inventorySize),t.components.has("inventory")){let a=t.components.get("inventory");for(let[r,n]of a.items){let s=new C(n.identifier,{amount:n.amount,auxillary:n.auxillary,world:t.dimension.world,entry:n});this.container.setItem(r,s)}}}onInteract(t){t.isSneaking||!t.abilities.get(z.AbilityIndex.OpenContainers)||this.container.show(t)}onBreak(){for(let t of this.container.storage){if(!t)continue;let{x:a,y:r,z:n}=this.block.position;this.block.dimension.spawnItem(t,new z.Vector3f(a+.5,r+.5,n+.5)).setMotion(new z.Vector3f(0,.1,0))}}onContainerUpdate(t){if(t!==this.container)return;let a={size:this.inventorySize,items:[]};for(let r=0;r<this.inventorySize;r++){let n=this.container.getItem(r);if(n===null)continue;let s=n.getDataEntry();a.items.push([r,s])}this.block.components.set("inventory",a)}onTick(){if(this.container.occupants.size>0&&!this.opened){this.opened=!0;let t=new z.BlockEventPacket;t.position=this.block.position,t.type=z.BlockEventType.ChangeState,t.data=1;let a=new z.LevelSoundEventPacket;switch(a.position=z.BlockPosition.toVector3f(this.block.position),a.data=this.block.permutation.network,a.actorIdentifier="",a.isBabyMob=!1,a.isGlobal=!1,this.block.getType().identifier){default:{a.event=-1;break}case P.Chest:case P.TrappedChest:{a.event=z.LevelSoundEvent.ChestOpen;break}}this.block.dimension.broadcast(t,a)}if(this.container.occupants.size===0&&this.opened){this.opened=!1;let t=new z.BlockEventPacket;t.position=this.block.position,t.type=z.BlockEventType.ChangeState,t.data=0;let a=new z.LevelSoundEventPacket;switch(a.position=z.BlockPosition.toVector3f(this.block.position),a.data=this.block.permutation.network,a.actorIdentifier="",a.isBabyMob=!1,a.isGlobal=!1,this.block.getType().identifier){default:{a.event=-1;break}case P.Chest:case P.TrappedChest:{a.event=z.LevelSoundEvent.ChestClosed;break}}this.block.dimension.broadcast(t,a)}}};var Gn=class extends q{static{c(this,"BlockWeirdoDirectionTrait")}static identifier="weirdo_direction";onPlace(t){let a=t.getCardinalDirection();this.setDirection(a)}setDirection(t){let a=this.block.getType(),n={...this.block.permutation.state,weirdo_direction:t},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var zn=class extends q{static{c(this,"BlockUpsideDownBitTrait")}static identifier="upside_down_bit";onPlace(t,a){if(a.y===1)return this.setUpsideDown(!1);if(a.y===0)return this.setUpsideDown(!0);let r=a.y>.5;return this.setUpsideDown(r)}setUpsideDown(t){let a=this.block.getType(),n={...this.block.permutation.state,upside_down_bit:t},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var oe=require("@serenityjs/protocol");var Ln=class extends q{static{c(this,"BlockOpenBitTrait")}static identifier="open_bit";onInteract(t){if(!t.abilities.get(oe.AbilityIndex.DoorsAndSwitches))return!1;let r=this.block.permutation.state.open_bit;return this.setBit(!r),t.isSneaking}setBit(t,a=!1){let r=this.block.getType(),n=this.block.permutation.state;if(typeof n.upper_block_bit=="boolean"){let i=n.upper_block_bit,l=i?this.block:this.block.above(),m=i?this.block.below():this.block,p={...l.permutation.state,open_bit:t},h=r.getPermutation(p);h&&l.setPermutation(h);let S={...m.permutation.state,open_bit:t},x=r.getPermutation(S);x&&m.setPermutation(x)}else{let i={...n,open_bit:t},l=r.getPermutation(i);l&&this.block.setPermutation(l)}if(a)return;let s=this.block.getType().identifier,o=new oe.LevelSoundEventPacket;o.data=this.block.permutation.network,o.event=t?oe.LevelSoundEvent.DoorOpen:oe.LevelSoundEvent.DoorClose,o.position=oe.BlockPosition.toVector3f(this.block.position),o.actorIdentifier="",o.isBabyMob=!1,o.isGlobal=!0,s.includes("trapdoor")&&(o.event=t?oe.LevelSoundEvent.TrapdoorOpen:oe.LevelSoundEvent.TrapdoorClose),s.includes("fence_gate")&&(o.event=t?oe.LevelSoundEvent.FenceGateOpen:oe.LevelSoundEvent.FenceGateClose),this.block.dimension.broadcast(o)}};var On=class extends q{static{c(this,"BlockUpperBitTrait")}static identifier="upper_block_bit";onPlace(){let t=this.block.above(),r={...this.block.permutation.state,upper_block_bit:!0},n=this.block.getType().getPermutation(r);t.setPermutation(n)}};var Hn=class extends q{static{c(this,"VerticalHalfTrait")}static identifier="minecraft:vertical_half";onPlace(t,a){a.y>.5&&a.y<.99&&this.setVerticalHalf(!0)}onInteract(t){let a=t.getHeldItem();return!a||!a.type.block||a.type.block!==this.block.getType()}setVerticalHalf(t){let a=this.block.getType(),n={...this.block.permutation.state,"minecraft:vertical_half":t?"top":"bottom"},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var Nn=class extends q{static{c(this,"BlockCardinalDirectionTrait")}static identifier="minecraft:cardinal_direction";onPlace(t){switch(t.getCardinalDirection()){case E.North:this.setDirection(E.South);break;case E.South:this.setDirection(E.North);break;case E.East:this.setDirection(E.West);break;case E.West:this.setDirection(E.East);break}}setDirection(t){let a=this.block.getType(),n={...this.block.permutation.state,"minecraft:cardinal_direction":E[t].toLowerCase()},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var Rn=class extends q{static{c(this,"BlockDirectionTrait")}static identifier="direction";onPlace(t){switch(t.getCardinalDirection()){case E.North:this.setDirection(E.South);break;case E.South:this.setDirection(E.North);break;case E.East:this.setDirection(E.West);break;case E.West:this.setDirection(E.East);break}}setDirection(t){let a=this.block.getType(),n={...this.block.permutation.state,direction:t},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var Nr=class{static{c(this,"BlockPalette")}types=B.types;permutations=F.permutations;traits=new Map;registry=new Map;constructor(){for(let t of ba)this.registerTrait(t)}getAllTypes(){return[...this.types.values()]}getAllCustomTypes(){return this.getAllTypes().filter(t=>t instanceof Vt)}getAllPermutations(){return[...this.permutations.values()]}resolveType(t){return this.types.get(t)}resolvePermutation(t,a){let r=this.resolveType(t);if(!r)return this.resolvePermutation(P.Air);let n=r.permutations.find(s=>{for(let o in a){let i=s.state[o],m=(i===!0||i===!1)&&(a[o]===0||a[o]===1)?a[o]===1:a[o];if(i!==m)return!1}return!0});return n||r.permutations[0]}registerType(t){if(this.types.has(t.identifier))return!1;this.types.set(t.identifier,t),Ie.options.push(t.identifier);for(let a of t.permutations)this.registerPermutation(a);return!0}registerPermutation(t){return this.permutations.has(t.network)?!1:(this.permutations.set(t.network,t),!0)}getRegistry(t){return this.registry.get(t)||[]}registerTrait(t){if(this.traits.has(t.identifier))return!1;this.traits.set(t.identifier,t);for(let a of t.types){this.registry.has(a)||this.registry.set(a,[]);let r=this.registry.get(a);r&&(r.push(t),this.registry.set(a,r))}return!0}removeTrait(t){if(!this.traits.has(t))return!1;let a=this.traits.get(t);if(!a)return!1;for(let r of a.types){let n=this.registry.get(r);n&&this.registry.set(r,n.filter(s=>s.identifier!==t))}return this.traits.delete(t),!0}getAllTraits(){return[...this.traits.values()]}getTrait(t){return this.traits.get(t)??null}};var A=require("@serenityjs/protocol");var Fn=require("@serenityjs/nbt"),$n=require("@serenityjs/protocol");var qn=class extends Map{static{c(this,"NbtMap")}block;constructor(t){super(),this.block=t}add(t){return super.set(t.name,t),this.update(),this}set(t,a){return super.set(t,a),this.update(),this}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new $n.BlockActorDataPacket;t.position=this.block.position,t.nbt=new Fn.CompoundTag;for(let[a,r]of this)t.nbt.setTag(a,r);this.block.dimension.broadcast(t)}};var jt=class{static{c(this,"Block")}serenity;dimension;position;components=new Map;traits=new Map;nbt=new qn(this);permutation;constructor(t,a,r,n){this.serenity=t.world.serenity,this.dimension=t,this.position=a,this.permutation=r,n?.entry&&this.loadDataEntry(this.dimension.world,n.entry)}isAir(){return this.permutation.type.air}isLiquid(){return this.permutation.type.liquid}isSolid(){return this.permutation.type.solid}getChunk(){let t=this.position.x>>4,a=this.position.z>>4;return this.dimension.getChunk(t,a)}getPermutation(){return this.permutation}setPermutation(t,a){this.permutation.type!==t.type&&(this.traits.clear(),this.components.clear()),t.type.air&&this.dimension.blocks.delete(A.BlockPosition.hash(this.position)),this.getChunk().setPermutation(this.position,t),a&&this.loadDataEntry(this.getWorld(),a);let n=this.getWorld().blockPalette.getRegistry(t.type.identifier);for(let o of t.type.components){let i=this.getWorld().blockPalette.getTrait(o);i&&n.push(i)}for(let o of Object.keys(t.state))for(let i of this.getWorld().blockPalette.getAllTraits())i.identifier===o&&n.push(i);for(let o of n)this.addTrait(o);let s=new A.UpdateBlockPacket;if(s.networkBlockId=t.network,s.position=this.position,s.flags=A.UpdateBlockFlagsType.Network,s.layer=A.UpdateBlockLayerType.Normal,this.dimension.broadcast(s),this.permutation=t,(this.components.size>0||this.traits.size>0)&&!this.isAir()){let o=A.BlockPosition.hash(this.position);this.dimension.blocks.set(o,this)}}setType(t){this.setPermutation(t.getPermutation())}getType(){return this.permutation.type}getWorld(){return this.dimension.world}hasComponent(t){return this.components.has(t)}getComponent(t){return this.components.get(t)}removeComponent(t){this.components.delete(t)}addComponent(t,a){this.components.set(t,a)}setComponent(t,a){this.components.set(t,a)}hasTrait(t){return this.traits.has(typeof t=="string"?t:t.identifier)}getTrait(t){return this.traits.get(typeof t=="string"?t:t.identifier)}removeTrait(t){this.traits.get(typeof t=="string"?t:t.identifier)?.onRemove?.(),this.traits.delete(typeof t=="string"?t:t.identifier)}addTrait(t){if(this.traits.has(t.identifier))return this.traits.get(t.identifier);this.getWorld().blockPalette.traits.has(t.identifier)||this.getWorld().logger.warn(`Trait "\xA7c${t.identifier}\xA7r" was added to block "\xA7d${this.getType().identifier}\xA7r:\xA7d${JSON.stringify(this.position)}\xA7r" in dimension "\xA7a${this.dimension.identifier}\xA7r" but does not exist in the palette. This may result in a deserilization error.`);try{if(t instanceof q)return this.traits.set(t.identifier,t),t.onAdd?.(),t;{let a=new t(this);return this.traits.set(a.identifier,a),a.onAdd?.(),a}}catch(a){return this.serenity.logger.error(`Failed to add trait "${t.identifier}" to block "${this.getType().identifier}:${JSON.stringify(this.position)}" in dimension "${this.dimension.identifier}"`,a),null}}getToolType(){return _t.None}isToolCompatible(t){return this.getType().hardness<0?!1:(this.getToolType()===_t.None,!0)}getBreakTime(t){let r=this.getType().hardness;return!t&&this.getToolType()===_t.None||t&&this.isToolCompatible(t)?r*=1.5:r*=5,Math.ceil(r*20)}getItemStack(t){let r=this.getWorld().itemPalette.resolveType(this.getType());return new C(r,t)}above(t){return this.dimension.getBlock({...this.position,y:this.position.y+(t??1)})}below(t){return this.dimension.getBlock({...this.position,y:this.position.y-(t??1)})}north(t){return this.dimension.getBlock({...this.position,z:this.position.z-(t??1)})}south(t){return this.dimension.getBlock({...this.position,z:this.position.z+(t??1)})}east(t){return this.dimension.getBlock({...this.position,x:this.position.x+(t??1)})}west(t){return this.dimension.getBlock({...this.position,x:this.position.x-(t??1)})}face(t){switch(t){case A.BlockFace.Top:return this.above();case A.BlockFace.Bottom:return this.below();case A.BlockFace.North:return this.north();case A.BlockFace.South:return this.south();case A.BlockFace.East:return this.east();case A.BlockFace.West:return this.west()}}interact(t){if(!new Tr(t,this,t.getHeldItem(),null).emit())return!1;for(let r of this.traits.values())if(r.onInteract?.(t)===!1)return!1;return!0}destroy(t){let a=!1;for(let n of this.traits.values()){let s=n.onBreak?.(t);s!==void 0&&(a=!s)}if(a)return!1;if(t){if(t.gamemode===A.Gamemode.Survival){let{x:s,y:o,z:i}=this.position;for(let l of this.getType().drops){if(l.type===P.Air)continue;let m=l.roll();if(m<=0)continue;let u=new C(l.type,{amount:m,world:this.dimension.world}),p=this.dimension.spawnItem(u,new A.Vector3f(s+.5,o+.5,i+.5)),h=new A.Vector3f(Math.random()*.1-.05,p.velocity.y,Math.random()*.1-.05);p.addMotion(h)}}let n=new A.LevelEventPacket;n.event=A.LevelEvent.ParticlesDestroyBlock,n.position=A.BlockPosition.toVector3f(this.position),n.data=this.permutation.network,this.dimension.broadcast(n)}let r=F.resolve(P.Air);return this.setPermutation(r),!0}getDataEntry(){let{x:t,y:a,z:r}=this.position;return{identifier:this.getType().identifier,permutation:this.permutation.network,position:[t,a,r],traits:[...this.traits.keys()],components:[...this.components.entries()]}}loadDataEntry(t,a,r=!0){r&&(this.traits.clear(),this.components.clear());for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.blockPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for block "${this.getType().identifier}:${this.position.x},${this.position.y},${this.position.z}" as it does not exist in the palette`);continue}this.addTrait(s)}}};var wa=require("@serenityjs/protocol");var I=require("@serenityjs/protocol");var et=class{static{c(this,"Container")}type;identifier;size;storage;occupants=new Set;emptySlotsCount;constructor(t,a,r){this.type=t,this.identifier=a,this.size=r,this.storage=Array.from({length:r},()=>null),this.emptySlotsCount=r}calculateEmptySlotCount(){return this.storage.filter(t=>t===null).length}getItem(t){return this.storage[t]??null}setItem(t,a){this.storage[t]=a,a.amount===0&&this.clearSlot(t),a.container=this,this.emptySlotsCount=this.calculateEmptySlotCount(),this.update()}addItem(t){let a=this.storage.findIndex(n=>!n||n.amount>=t.maxAmount?!1:t.equals(n)),r=t.amount>=t.maxAmount;if(a>-1&&!r&&t.stackable){let n=this.storage[a],s=Math.min(t.maxAmount-n.amount,t.amount);n.increment(s),t.decrement(s)}else{let n=this.storage.indexOf(null);if(n===-1)return;if(t.amount>t.maxAmount){let s=new C(t.type,{...t,amount:t.maxAmount});return this.setItem(n,s),t.decrement(t.maxAmount),this.addItem(t)}this.setItem(n,t)}}removeItem(t,a){let r=this.getItem(t);if(!r)return null;let n=Math.min(a,r.amount);return r.decrement(n),r.amount===0&&(this.storage[t]=null),this.emptySlotsCount=this.calculateEmptySlotCount(),r}takeItem(t,a){let r=this.getItem(t);if(r===null)return null;let n=Math.min(a,r.amount);r.decrement(n),r.amount===0&&this.clearSlot(t),this.emptySlotsCount=this.calculateEmptySlotCount();let s=new C(r.type,{...r,amount:n});for(let[o,i]of r.components)s.components.set(o,i);for(let o of r.traits.values())o.clone(s);this.update();for(let o of r.nbt.values())s.nbt.add(o);return s}swapItems(t,a,r){let n=r??this,s=this.getItem(t),o=n.getItem(a);this.clearSlot(t),n.clearSlot(a),s&&n.setItem(a,s),o&&this.setItem(t,o)}clearSlot(t){if(this.storage[t]=null,this.emptySlotsCount=this.calculateEmptySlotCount(),this.occupants.size===0)return;let a=new I.InventorySlotPacket;a.containerId=this.identifier,a.slot=t,a.item=new I.NetworkItemStackDescriptor(0),a.fullContainerName=new I.FullContainerName(0,0),a.storageItem=new I.NetworkItemStackDescriptor(0);for(let r of this.occupants)r.send(a)}clear(){for(let t=0;t<this.size;t++)this.clearSlot(t)}update(t){let a=new I.InventoryContentPacket;if(a.containerId=this.identifier,a.fullContainerName=new I.FullContainerName(0,0),a.storageItem=new I.NetworkItemStackDescriptor(0),a.items=this.storage.map(r=>r?C.toNetworkStack(r):new I.NetworkItemStackDescriptor(0)),t)t.send(a);else for(let r of this.occupants)r.send(a)}show(t){t.openedContainer&&t.openedContainer.close(t),this.occupants.add(t),t.openedContainer=this;for(let a of this.storage)if(a)for(let r of a.traits.values())r.onContainerOpen?.(t)}close(t){if(!this.occupants.has(t))throw new Error("Player is not viewing the container.");let a=new I.ContainerClosePacket;a.identifier=this.identifier,a.type=I.ContainerType.None,a.serverInitiated=!1,t.send(a),t.openedContainer=null,this.occupants.delete(t);for(let r of this.storage)if(r)for(let n of r.traits.values())n.onContainerClose?.(t)}};var Hr=class extends et{static{c(this,"BlockContainer")}block;constructor(t,a,r,n){super(a,r,n),this.block=t}setItem(t,a){super.setItem(t,a),a.world||(a.world=this.block.getWorld()),a.initialize()}update(t){super.update(t);for(let a of this.block.traits.values())try{a.onContainerUpdate?.(this)}catch(r){let{x:n,y:s,z:o}=this.block.position;this.block.getWorld().logger.error(`Failed to trigger onContainerUpdate trait event for block "${this.block.getType().identifier}:${n},${s},${o}" in dimension "${this.block.dimension.identifier}"`,r),this.block.traits.delete(a.identifier)}}show(t){if(!new Ut(t,this).emit())return;super.show(t);let r=new wa.ContainerOpenPacket;r.identifier=this.identifier,r.type=this.type,r.position=this.block.position,r.uniqueId=this.type===wa.ContainerType.Container?-1n:t.uniqueId,t.send(r),this.update()}};var ba=Array();for(let e in ya){let t=ya[e];ba.push(t)}var qo={stackable:!0,maxAmount:64,tool:Nt.None,tier:Be.None,tags:[],block:null},Y=class Jt{static{c(this,"ItemType")}static types=new Map;identifier;network;stackable;maxAmount;tool;tier;tags;block;constructor(t,a,r){this.identifier=t,this.network=a;let n={...qo,...r};this.stackable=n.stackable,this.maxAmount=n.maxAmount,this.tool=n.tool,this.tier=n.tier,this.tags=n.tags,this.block=n.block}isTool(){return this.tool!==Nt.None&&this.tier!==Be.None}static get(t){return Jt.types.get(t)}static getByNetwork(t){return[...Jt.types.values()].find(a=>a.network===t)??null}static getAll(){return[...Jt.types.values()]}static resolve(t){return[...Jt.types.values()].find(a=>a.block===t)??null}static toItemData(t){return{name:t.identifier,networkId:t.network,componentBased:!1}}static toNetworkInstance(t,a=1){return{network:t.network,metadata:0,networkBlockId:t.block?.getPermutation().network??0,stackSize:a,extras:{canDestroy:[],canPlaceOn:[],nbt:null}}}};var Un=require("@serenityjs/nbt");var Ae=class Sa{static{c(this,"CreativeItem")}static items=new Map;type;metadata;nbt;constructor(t,a,r){this.type=t,this.metadata=a,this.nbt=r??new Un.CompoundTag("",{})}static register(t,a){let r=Sa.items.size;Sa.items.set(r,new Sa(t,a))}};var Uo=new Rr.BinaryStream(Ne.ITEMDATA),Vo=ka.ItemData.read(Uo);for(let e of Vo){let t=Ne.ITEM_TYPES.find(i=>i.identifier===e.name),a=Ne.TOOL_TYPES.find(i=>i.types.includes(e.name)),r=a?.types.indexOf(e.name),n=r===void 0?Be.None:r+1,s=B.types.get(e.name)??null,o=new Y(e.name,e.networkId,{stackable:t?.stackable,maxAmount:t?.maxAmount,tool:a?.network,tier:n,tags:t?.tags,block:s});Y.types.set(o.identifier,o)}var jo=new Rr.BinaryStream(Ne.CREATIVE_CONTENT),Jo=ka.CreativeItems.read(jo);for(let[e,t]of Jo.entries()){let a=[...Y.types.values()].find(s=>s.network===t.network);if(!a)continue;let r=t.metadata??0,n=t.extras?.nbt;t.metadata=r,Ae.items.set(e,new Ae(a,r,n))}var Yo=class Vn extends Y{static{c(this,"CustomItemType")}static networkId=2e4;custom=!0;constructor(t,a){super(t,++Vn.networkId,a),Ae.register(this,0)}};var tt=class jn{static{c(this,"Enum")}static enums=new Map;static identifier;static type;static symbol;static default=new jn;optional=!0;result;constructor(...t){}validate(t=!1){if(t)throw new Error("Expected value after previous argument.");return!1}static extract(t){throw new Error("Enum.extract() has not been implemented.")}};var We=class extends tt{static{c(this,"ValidEnum")}static type=16};var Ge=class Yt extends We{static{c(this,"StringEnum")}static identifier="string";static symbol=this.type<<16|56;static options=[];static strict=!0;result;constructor(t){super(),this.result=t}validate(t){if(this.result===null){if(t)throw new TypeError('Expected type "string" after previous argument.');return!1}return!0}static extract(t){let a=t.peek();return a?(a=t.next(),+a>=0||+a<=0?new Yt(null):a==="true"||a==="false"?new Yt(null):new Yt(a)):new Yt(null)}};var ze=class wt extends We{static{c(this,"IntegerEnum")}static identifier="integer";static symbol=this.type<<16|1;result;constructor(t){super(),this.result=t}validate(t){if(this.result===null){if(t)throw new TypeError('Expected type "integer" after previous argument.');return!1}return!0}static extract(t){let a=t.peek();return a?(a=t.next(),a==="true"?new wt(1):a==="false"?new wt(0):+a>=0||+a<=0?new wt(+a):new wt(null)):new wt(null)}};var M=class le extends We{static{c(this,"TargetEnum")}static identifier="target";static symbol=this.type<<16|10;result;constructor(t){super(),this.result=t}validate(t=!1){if(t&&!this.result)throw new Error("No targets matched the selector.");return!!this.result}static extract(t){let a=t.next();if(!a)return new le(null);if(+a>=0||+a<=0)return new le(null);if(a==="true"||a==="false")return new le(null);let r=t.state.origin instanceof W?t.state.origin.dimension:t.state.origin;if(!a.startsWith("@")&&!r.getPlayers().some(n=>n.username===a))return new le(null);if(a.startsWith("@")){let n=a.slice(1)[0],s=a.slice(2);if(s.length>0&&(!s.startsWith("[")||!s.endsWith("]")))throw new Error("Invalid query.");let o=s.length>0?s.slice(1,-1).split(",").flatMap(i=>{let[l,m]=i.split("=");return{key:l,value:m}}):[];switch(n){case"a":{let i=r.getPlayers().filter(l=>{if(o.length===0)return!0;for(let{key:m,value:u}of o)switch(m){case"name":{let p=u,h=p.startsWith("!");if(h&&(p=p.slice(1)),h?l.username===p:l.username!==p)return!1;break}case"tag":{let p=u,h=p.startsWith("!");if(h&&(p=p.slice(1)),h?l.hasTag(p):!l.hasTag(p))return!1;break}default:throw new TypeError(`Invalid query key "${m}"`)}return!0});return new le(i)}case"e":{let i=r.getEntities().filter(l=>{if(o.length===0)return!0;for(let{key:m,value:u}of o)switch(m){case"name":{if(l.hasTrait(Kt)){let p=u,h=p.startsWith("!");h&&(p=p.slice(1));let d=l.getTrait(Kt);if(h?d.getNameTag()===p:d.getNameTag()!==p)return!1}else return!1;break}case"type":{let p=u,h=p.startsWith("!");h&&(p=p.slice(1));let d=p.includes(":")?u:`minecraft:${u}`;if(h?l.type.identifier===d:l.type.identifier!==d)return;break}case"tag":{let p=u,h=p.startsWith("!");if(h&&(p=p.slice(1)),h?l.hasTag(p):!l.hasTag(p))return!1;break}default:throw new TypeError(`Invalid query key "${m}"`)}return!0});return new le(i)}case"p":{if(t.state.origin instanceof me)return new le([t.state.origin]);throw new TypeError("Nearest player is not available in this context.")}case"r":{let i=r.getPlayers().filter(m=>{if(o.length===0)return!0;for(let{key:u,value:p}of o)switch(u){case"name":{let h=p,d=h.startsWith("!");if(d&&(h=h.slice(1)),d?m.username===h:m.username!==h)return!1;break}case"tag":{let h=p,d=h.startsWith("!");if(d&&(h=h.slice(1)),d?m.hasTag(h):!m.hasTag(h))return!1;break}default:throw new TypeError(`Invalid query key "${u}"`)}return!0}),l=i[Math.floor(Math.random()*i.length)];return new le([l])}case"s":{if(t.state.origin instanceof W)return new le([t.state.origin]);throw new TypeError("Source player is not available in this context.")}}}else{let n=r.getPlayers().filter(s=>s.username===a);if(n.length===0)throw new Error(`Player "${a}" was not found in the current dimension.`);return new le(n)}return new le(null)}};var Fr=require("@serenityjs/protocol");var ge=class Le extends We{static name="position";static symbol=this.type<<16|64;result;constructor(t){super(),this.result=t}validate(t){if(!this.result&&t)throw new Error("Uxpected input to be formatted as a position.");return!!this.result}static extract(t){let a=t.next();if(!a)return new Le(null);if(Number.isNaN(+a)&&!a.startsWith("~"))return new Le(null);let r=t.next();if(!r)return new Le(null);if(Number.isNaN(+r)&&!r.startsWith("~"))return new Le(null);let n=t.next();if(!n)return new Le(null);if(Number.isNaN(+n)&&!n.startsWith("~"))return new Le(null);let s=a.startsWith("~")?+a.slice(1):0,o=r.startsWith("~")?+r.slice(1):0,i=n.startsWith("~")?+n.slice(1):0;if(t.state.origin instanceof W){let l=t.state.origin,{x:m,y:u,z:p}=l.position,h=a==="~"?m:a.startsWith("~")?m+s:+a,d=r==="~"?u:r.startsWith("~")?u+o:+r,S=n==="~"?p:n.startsWith("~")?p+i:+n,x=new Fr.Vector3f(h,d,S);return new Le(x)}else{let l=a==="~"?0:a.startsWith("~")?s:+a,m=r==="~"?0:r.startsWith("~")?o:+r,u=n==="~"?0:n.startsWith("~")?i:+n,p=new Fr.Vector3f(l,m,u);return new Le(p)}}};var Zt=class extends tt{static{c(this,"SoftEnum")}static type=1040};var K=class extends Zt{static{c(this,"CustomEnum")}static identifier;static symbol=this.type<<16|56;static options=[];static strict=!0;result;options;constructor(t,a){super(),this.result=t,this.options=a}validate(t=!1){if(t&&this.result===null)throw new TypeError(`Expected one of "${this.options.join(", ")}" after previous argument.`);if(this.result===null)return!1;if(!this.options.includes(this.result)&&t)throw new TypeError(`Expected one of "${this.options.join(", ")}" after previous argument.`);return this.options.includes(this.result)}static extract(t){let a=t.peek();return a?(a=t.next(),+a>=0||+a<=0?new this(null,this.options):a==="true"||a==="false"?new this(null,this.options):new this(a,this.options)):new this(null,this.options)}};var $r=class at extends K{static{c(this,"BooleanEnum")}static identifier="boolean";static options=["true","false"];static strict=!0;result;constructor(t){super(t?.toString()??"false",at.options),this.result=t}validate(t){if(this.result===!0||this.result===!1)return!0;if(t)throw new TypeError(`Expected one of: ${at.options.join(", ")}`);return!1}static extract(t){let a=t.peek();return a?(a=t.next(),a==="true"?new at(!0):a==="false"?new at(!1):new at(null)):new at(null)}};var qr=class extends K{static{c(this,"GamemodeEnum")}static identifier="gamemode";static options=["s","c","a","sp","survival","creative","adventure","spectator"]};var Jn=require("@serenityjs/protocol");var Ko=Object.values(Jn.AbilityIndex).filter(e=>typeof e=="string"),Ur=class extends K{static name="ability";static options=Ko};var Zo=B.getAll().map(e=>e.identifier.startsWith("minecraft:")?e.identifier.slice(10):e.identifier),Ie=class extends K{static{c(this,"BlockEnum")}static identifier="blocks";static options=Zo};var Qo=re.getAll().map(e=>e.identifier.startsWith("minecraft:")?e.identifier.slice(10):e.identifier),St=class extends K{static{c(this,"EntityEnum")}static identifier="entities";static options=Qo};var Xo=Y.getAll().map(e=>e.identifier.startsWith("minecraft:")?e.identifier.slice(10):e.identifier),rt=class extends K{static{c(this,"ItemEnum")}static identifier="items";static options=Xo};var Vr=class extends K{static{c(this,"TagEnum")}static identifier="tag_operation";static options=["add","remove","list"]};var Qt=class extends K{static{c(this,"WorldEnum")}static identifier="worlds";static options=[]};var jr=class{static{c(this,"Command")}name;description;registry;callback;constructor(t,a,r,n){this.name=t,this.description=a,this.registry=r,this.callback=n}};var Kn=require("@serenityjs/protocol");var Yn=require("@serenityjs/protocol");var Jr=class{static{c(this,"CommandRegistry")}overloads=new Map;debug=!1;permissionLevel=Yn.CommandPermissionLevel.Normal;overload(t,a){return a?this.overloads.set(t,a):this.overloads.set(t,()=>{}),this}};var Yr=class{static{c(this,"Commands")}commands=new Map;getAll(){return[...this.commands.values()]}get(t){return t.startsWith("/")&&(t=t.slice(1)),t=t.split(" ")[0],this.commands.get(t)}register(t,a,r,n){let s=new Jr,o=n??r;(n?r:()=>{})(s);let l=new jr(t,a,s,o);return this.commands.set(t,l),l}unregister(t){this.commands.delete(t)}serialize(){let t=new Kn.AvailableCommandsPacket;return t.dynamicEnums=[],t.commands=this.getAll().map(a=>({name:a.name,description:a.description,permissionLevel:a.registry.permissionLevel,subcommands:[],flags:a.registry.debug?1:0,alias:-1,overloads:[...a.registry.overloads.keys()].map(r=>({chaining:!1,parameters:Object.entries(r).map(([s,o])=>{let i=Array.isArray(o)?o[0]:o,l=i.type===Zt.type&&i.options.length>0?68157440|t.dynamicEnums.push({name:i.name,values:i.options})-1:i.symbol,m=Array.isArray(o)?o[1]:!1;return s=m?s+"?":s,{symbol:l,name:s,optional:m,options:0}})}))})),t.chainedSubcommandValues=[],t.subcommands=[],t.enumConstraints=[],t.enumValues=[],t.enums=[],t.postFixes=[],t}};var xa=class{static{c(this,"CommandArgumentPointer")}arguments;state;offset=0;constructor(t,a){this.state=t,this.arguments=a}peek(){return this.arguments[this.offset]||null}next(){return this.arguments[this.offset++]||null}},nt=class{static{c(this,"CommandExecutionState")}split;command;origin;constructor(t,a,r){this.split=this.parse(a);let n=this.split.shift();this.command=t.find(s=>s.name===n),this.origin=r}execute(){if(!this.command)throw new TypeError("Unknown command executed. Please make sure the command exists, and that you have permission to use it.");let t={origin:this.origin};for(let[a,r]of this.command.registry.overloads){let n={origin:this.origin},s=new xa(this,this.split);for(let o in a){let i=a[o];if(i)if(Array.isArray(i)){let[l,m]=i;if(!m&&s.offset>=s.arguments.length)throw new TypeError(`Argument ${o} is required.`);let u=l.extract(s);u&&(u.optional=m),n[o]=u??l.default}else{let l=i.extract(s);l&&(l.optional=!1),n[o]=l??i.default}}if(Object.assign(t,n),!(s.offset<s.arguments.length)&&Object.keys(n).length===Object.keys(a).length+1){for(let[o,i]of Object.entries(n)){if(!(i instanceof tt))continue;let l=i.result;i.optional&&l==null||i.validate(!0)}return r(n)??{}}}return this.command.callback(t)??{}}parse(t){let a=/"([^"]+)"|(\S+)/g,r=[],n=null;for(;n=a.exec(t);)r.push(n[1]||n[2]);return r}};var st=require("@serenityjs/protocol");var Bo=c(e=>{e.commands.register("gamemode","Sets a player's gamemode",t=>{t.permissionLevel=st.CommandPermissionLevel.Operator,t.overload({gamemode:qr,target:[M,!0]},a=>{let r=a.target.validate()?a.target.result:[a.origin instanceof me?a.origin:null];if(!r||r.length===0)throw new Error("No targets matched the selector.");let n=a.gamemode.result,s=[];for(let o of r)if(!(!o||!(o instanceof me))){switch(n){case"s":case"survival":{o.gamemode=st.Gamemode.Survival;break}case"c":case"creative":{o.gamemode=st.Gamemode.Creative;break}case"a":case"adventure":{o.gamemode=st.Gamemode.Adventure;break}case"sp":case"spectator":{o.gamemode=st.Gamemode.Spectator;break}default:throw new TypeError("Invalid gamemode specified!")}s.push(`\xA7aSuccessfully updated \xA72${o.username}'s\xA7a gamemode!\xA7r`)}return{message:s.join(`
2
+ `)}})},()=>{})},"register"),Zn=Bo;var Ca=require("@serenityjs/protocol");var Io=c(e=>{e.commands.register("ability","Update an ability for a specified player.",t=>{t.permissionLevel=Ca.CommandPermissionLevel.Operator,t.overload({target:M,ability:Ur,enabled:$r},a=>{let r=a.target.result,n=a.ability.result,s=Ca.AbilityIndex[n],o=a.enabled.result,i=[];for(let l of r){if(!l.isPlayer()){i.push(`\xA77Entity \xA7c${l.uniqueId}\xA77 is not a player.`);continue}l.abilities.set(s,o),i.push(`\xA77Updated ability \xA7a${n}\xA77 to \xA7c${o}\xA77 for \xA7c${l.uniqueId}\xA77`)}return{message:i.join(`
3
+ `)}})},()=>{})},"register"),Qn=Io;var Xn=require("@serenityjs/protocol");var ei=c(e=>{e.commands.register("clear","Clears items from player inventory.",t=>{t.permissionLevel=Xn.CommandPermissionLevel.Operator,t.overload({target:M,item:[rt,!0],metadata:[ze,!0],amount:[ze,!0]},a=>{let r=a.target.result,n=a.item?.result,s=n?`${n.includes(":")?"":"minecraft:"}${n}`:void 0,o=a.metadata?.result??0,i=a.amount?.result,l=0;if(r.length===0)return{message:"No targets matched selector"};for(let m of r){if(!m.hasTrait(k))continue;let{container:u}=m.getTrait(k);if(!n){u.clear();continue}for(let[p,h]of Object.entries(u.storage)){if(!h||h.type.identifier!==s&&h.auxillary!==o)continue;let d=h.amount,S=d-(i??1);if(S<0?(u.clearSlot(Number.parseInt(p)),l+=d):(h.setAmount(Math.max(S,0)),l+=Math.min(i??1,d)),l>=(i??1))break}}return{message:`Cleared the inventory of ${r.length} entities`}})},()=>{})},"register"),Bn=ei;var In=require("@serenityjs/protocol");var ti=c(e=>{e.commands.register("fill","Fill a region with a specific block",t=>{t.permissionLevel=In.CommandPermissionLevel.Operator,t.overload({from:ge,to:ge,block:Ie},a=>{let r=a.block.result,n=r.includes(":")?r:`minecraft:${r}`,s=a.from.result?.floor(),o=a.to.result?.floor(),i=a.origin instanceof W?a.origin.dimension:a.origin,l=e.blockPalette.resolveType(n);i.fill(s,o,l.getPermutation())})},()=>{})},"register"),es=ti;var ts=require("@serenityjs/protocol");var ai=c(e=>{e.commands.register("give","Gives an item to a player",t=>{t.permissionLevel=ts.CommandPermissionLevel.Operator,t.overload({target:M,item:rt,amount:[ze,!0],metadata:[ze,!0]},a=>{let r=a.target.result,n=a.item.result,s=n.includes(":")?n:`minecraft:${n}`,o=a.amount?.result??1,i=a.metadata?.result??0;for(let l of r){if(!l.isPlayer())continue;let m=new C(s,{amount:o,auxillary:i,world:l.getWorld()}),{container:u}=l.getTrait(k);u.addItem(m)}return{message:`Successfully gave x${o} ${s} to ${r.length} players.`}})},()=>{})},"register"),as=ai;var Pa=require("@serenityjs/protocol");var ri=c(e=>{e.commands.register("kick","Kicks a player from the server",t=>{t.permissionLevel=Pa.CommandPermissionLevel.Operator,t.overload({target:M,reason:[Ge,!0]},a=>{let r=a.target.result,n=a.reason?.result??"Kicked by an operator.";if(r.length===0)throw new Error("No targets matched the selector.");for(let s of r)s instanceof me&&s.disconnect(n,Pa.DisconnectReason.Kicked)})},()=>{})},"register"),rs=ri;var ns=require("@serenityjs/protocol");var ni=c(e=>{e.commands.register("setblock","Sets a block at the specified location",t=>{t.permissionLevel=ns.CommandPermissionLevel.Operator,t.overload({position:ge,block:Ie},a=>{let r=a.block.result,n=r.includes(":")?r:`minecraft:${r}`,s=a.position.result?.floor(),i=(a.origin instanceof W?a.origin.dimension:a.origin).getBlock(s),l=e.blockPalette.resolveType(n);return i.setType(l),{message:`\xA7aSuccessfully set block at \xA72${s.x}\xA7a, \xA72${s.y}\xA7a, \xA72${s.z}\xA7a to \xA72${l.identifier}\xA7a.\xA7r`}})},()=>{})},"register"),ss=ni;var os=require("@serenityjs/protocol");var si=c(e=>{e.commands.register("tag","Interact with the tags of a specified entity.",t=>{t.permissionLevel=os.CommandPermissionLevel.Operator,t.overload({target:M,operation:Vr,tag:[Ge,!0]},a=>{let r=a.target.result,n=a.operation.result,s=[];for(let o of r)switch(n){case"add":{let i=a.tag.result;o.addTag(i)?s.push(`\xA77Added tag \xA7a${i}\xA77 to \xA7c${o.uniqueId}\xA77`):s.push(`\xA77Tag \xA7a${i}\xA77 already exists on \xA7c${o.uniqueId}\xA77`);break}case"remove":{let i=a.tag.result;o.removeTag(i)?s.push(`\xA77Removed tag \xA7a${i}\xA77 from \xA7c${o.uniqueId}\xA77`):s.push(`\xA77Tag \xA7a${i}\xA77 does not exist on \xA7c${o.uniqueId}\xA77`);break}case"list":{let i=o.getTags();i.length===0?s.push(`\xA7c${o.uniqueId}\xA77 has no tags.`):s.push(`\xA7c${o.uniqueId}\xA77 has the following tags: \xA7a${i.join("\xA77, \xA7a")}`);break}}return{message:s.join(`
4
+ `)}})},()=>{})},"register"),is=si;var ws=require("@serenityjs/protocol");var Ha=require("@serenityjs/logger"),Je=require("@serenityjs/protocol"),fs=yn(require("@serenityjs/emitter"));var La={};Ot(La,{BlindnessEffect:()=>pi,DarknessEffect:()=>ui,Effect:()=>v,FatalPoisonEffect:()=>gi,InstantDamageEffect:()=>li,InstantHealthEffect:()=>mi,InvisibilityEffect:()=>yi,NauseasEffect:()=>hi,NightVisionEffect:()=>ci,PoisonEffect:()=>ii,RegenerationEffect:()=>oi,SlownessEffect:()=>_i,SpeedEffect:()=>di,WaterBreathingEffect:()=>bi,WitherEffect:()=>fi});var cs=require("@serenityjs/protocol");var v=class{static{c(this,"Effect")}static type;static instant=!1;color=new cs.Color(255,255,255,255);duration;amplifier;showParticles;constructor(t,a,r){this.duration=Object.getPrototypeOf(this).instant?0:t,this.amplifier=a??0,this.showParticles=r??!0}toString(){return JSON.stringify({effectType:Object.getPrototypeOf(this).type,duration:this.duration,amplifier:this.amplifier,showParticles:this.showParticles})}isExpired(){return this.duration<=0}};var va=require("@serenityjs/protocol");var oi=class extends v{static{c(this,"RegenerationEffect")}static type=va.EffectType.Regeneration;color=new va.Color(255,205,92,171);onTick(t){let a=t.getTrait(L);if(!a)return;let r=Math.max(50/2**(this.amplifier-1),1*2**(this.amplifier-5));Number(t.getWorld().currentTick)%r==0&&a.set(a.currentValue+1)}};var Re=require("@serenityjs/protocol");var ii=class extends v{static{c(this,"PoisonEffect")}static type=Re.EffectType.Poison;static instant=!1;color=new Re.Color(255,78,147,49);onTick(t){let a=Math.floor(Math.max(25*Math.pow(.5,this.amplifier-1),12));if(a=Math.min(a,10),Number(t.dimension.world.currentTick)%a!=0||t.isPlayer()&&t.gamemode==Re.Gamemode.Creative)return;let r=t.getTrait(L);r.currentValue<=1||r.applyDamage(1,void 0,Re.ActorDamageCause.Magic)}};var Ta=require("@serenityjs/protocol");var ci=class extends v{static{c(this,"NightVisionEffect")}static type=Ta.EffectType.NightVision;color=new Ta.Color(255,31,31,161)};var kt=require("@serenityjs/protocol");var li=class extends v{static{c(this,"InstantDamageEffect")}static type=kt.EffectType.InstantDamage;static instant=!0;onAdd(t){if(t.isPlayer()&&t.gamemode==kt.Gamemode.Creative)return;let a=t.getTrait(L);a&&a.applyDamage(3*2**this.amplifier,void 0,kt.ActorDamageCause.Magic)}};var ls=require("@serenityjs/protocol");var mi=class extends v{static{c(this,"InstantHealthEffect")}static type=ls.EffectType.InstantHealth;static instant=!0;onAdd(t){let a=t.getTrait(L),r=a.currentValue;r>=a.effectiveMax||a.set(Math.min(a.effectiveMax,r+2*2**this.amplifier))}};var Ea=require("@serenityjs/protocol");var pi=class extends v{static{c(this,"BlindnessEffect")}static type=Ea.EffectType.Blindness;color=new Ea.Color(255,31,31,35)};var Da=require("@serenityjs/protocol");var ui=class extends v{static{c(this,"DarknessEffect")}static type=Da.EffectType.Darkness;color=new Da.Color(255,41,39,33)};var Ma=require("@serenityjs/protocol");var hi=class extends v{static{c(this,"NauseasEffect")}static type=Ma.EffectType.Nausea;color=new Ma.Color(255,85,29,74)};var Aa=require("@serenityjs/protocol");var di=class extends v{static{c(this,"SpeedEffect")}static type=Aa.EffectType.Speed;color=new Aa.Color(255,124,175,198);onAdd(t){let a=t.getTrait(_e);a.set(a.currentValue*(1+.2*this.amplifier))}onRemove(t){let a=t.getTrait(_e);a.set(a.defaultValue)}};var Fe=require("@serenityjs/protocol");var fi=class extends v{static{c(this,"WitherEffect")}static type=Fe.EffectType.Wither;color=new Fe.Color(255,53,42,39);onTick(t){let a=Math.max(40/Math.pow(2,this.amplifier-1),10);if(Number(t.dimension.world.currentTick)%a!=0||t.isPlayer()&&t.gamemode==Fe.Gamemode.Creative)return;t.getTrait(L).applyDamage(1,void 0,Fe.ActorDamageCause.Magic)}};var $e=require("@serenityjs/protocol");var gi=class extends v{static{c(this,"FatalPoisonEffect")}static type=$e.EffectType.FatalPoison;color=new $e.Color(255,78,147,49);onTick(t){let a=Math.floor(Math.max(25*Math.pow(.5,this.amplifier-1),12));if(a=Math.min(a,10),Number(t.dimension.world.currentTick)%a!=0||t.isPlayer()&&t.gamemode==$e.Gamemode.Creative)return;t.getTrait(L).applyDamage(1,void 0,$e.ActorDamageCause.Magic)}};var Wa=require("@serenityjs/protocol");var _i=class extends v{static{c(this,"SlownessEffect")}static type=Wa.EffectType.Slowness;color=new Wa.Color(255,90,108,129);onAdd(t){let a=t.getTrait(_e);a.set(a.currentValue*(1-.15*this.amplifier))}onRemove(t){let a=t.getTrait(_e);a.set(a.defaultValue)}};var Ga=require("@serenityjs/protocol");var yi=class extends v{static{c(this,"InvisibilityEffect")}static type=Ga.EffectType.Invisibility;color=new Ga.Color(255,127,131,146);onAdd(t){t.getTrait(Xt)?.setInvisibility(!0)}onRemove(t){t.getTrait(Xt)?.setInvisibility(!1)}};var za=require("@serenityjs/protocol");var bi=class extends v{static{c(this,"WaterBreathingEffect")}static type=za.EffectType.WaterBreathing;color=new za.Color(255,152,218,192)};var ms=class{static{c(this,"EffectPallete")}effects=new Map;constructor(){for(let t of Kr)this.registerEffect(t)}registerEffect(t){this.effects.set(t.type,t)}getEffect(t){return this.effects.get(t)}getAllEffects(){return[...this.effects.values()]}removeEffect(t){this.effects.delete(t)}};var Kr=[];for(let e in La){let t=La[e];Kr.push(t)}var ye=require("@serenityjs/protocol");var Bt=class{static{c(this,"TickSchedule")}scheduledTick;completeTick;callbacks=new Set;constructor(t,a){this.scheduledTick=BigInt(t);let n=(a instanceof ot?a.world:a).currentTick;this.completeTick=n+this.scheduledTick}execute(){for(let t of this.callbacks)t()}on(t){this.callbacks.add(t)}cancel(){this.callbacks.clear()}};var It={identifier:"overworld",type:ye.DimensionType.Overworld,generator:"void",viewDistance:20,simulationDistance:10,spawnPosition:[0,32767,0]},ot=class{static{c(this,"Dimension")}serenity;properties=It;identifier;type;world;generator;entities=new Map;blocks=new Map;get viewDistance(){return this.properties.viewDistance}set viewDistance(t){this.properties.viewDistance=t}get simulationDistance(){return this.properties.simulationDistance}set simulationDistance(t){this.properties.simulationDistance=t}get spawnPosition(){let t=ye.Vector3f.fromArray(this.properties.spawnPosition);if(t.y>=32767){let a=this.getTopmostBlock(t);a?t.y=a.position.y+3:t.y=0,this.spawnPosition=t}return t}set spawnPosition(t){this.properties.spawnPosition=[t.x,t.y,t.z]}constructor(t,a){this.serenity=t.serenity,this.world=t,this.properties={...It,...a};let r=this.serenity.getGenerator(this.properties.generator);if(!r)throw new Error(`Failed to find generator "${this.properties.generator}" for dimension "${this.properties.identifier}"`);this.generator=new r(this,{seed:t.properties.seed}),this.identifier=this.properties.identifier,this.type=this.properties.type}indexOf(){return[...this.world.dimensions.values()].indexOf(this)}onTick(t){if(this.getPlayers().length===0)return;let a=this.getPlayers().map(r=>r.position);for(let r of this.entities.values())if(a.some(s=>s.distance(r.position)<=this.simulationDistance<<4)){for(let s of r.traits.values())try{s.onTick?.(t)}catch(o){this.world.logger.error(`Failed to tick entity trait "${s.identifier}" for entity "${r.type.identifier}:${r.uniqueId}" in dimension "${this.identifier}"`,o),r.traits.delete(s.identifier)}if(r.hasTrait(k)){let{container:s}=r.getTrait(k);for(let o of s.storage)if(o)for(let i of o.traits.values())try{i.onTick?.(t)}catch(l){this.world.logger.error(`Failed to tick item trait "${i.identifier}" for item "${o.type.identifier}" in dimension "${this.identifier}"`,l),o.traits.delete(i.identifier)}}}for(let r of this.blocks.values())if(a.some(s=>s.distance(r.position)<=this.simulationDistance))for(let s of r.traits.values())try{s.onTick?.(t)}catch(o){this.world.logger.error(`Failed to tick block trait "${s.identifier}" for block "${r.position.x}, ${r.position.y}, ${r.position.z}" in dimension "${this.identifier}"`,o),r.traits.delete(s.identifier)}}getWorld(){return this.world}getChunk(t,a){return this.world.provider.readChunk(t,a,this)}setChunk(t){for(let a of this.getPlayers()){let r=a.getTrait(qe);r.chunks.has(t.hash)&&r.send(t)}return this.world.provider.writeChunk(t,this)}getBlock(t){let a=ye.BlockPosition.from(t),r=ye.BlockPosition.hash(a),n=this.blocks.get(r);if(n)return n;{let s=a.x>>4,o=a.z>>4,l=this.getChunk(s,o).getPermutation(a),m=new jt(this,a,l),u=this.world.blockPalette.getRegistry(l.type.identifier);for(let p of l.type.components){let h=this.world.blockPalette.getTrait(p);h&&u.push(h)}for(let p of Object.keys(l.state))for(let h of this.world.blockPalette.getAllTraits())h.identifier===p&&u.push(h);for(let p of u)m.addTrait(p);return(m.components.size>0||m.traits.size>0)&&this.blocks.set(r,m),m}}getTopmostBlock(t){let r=this.getChunk(t.x>>4,t.z>>4).getTopmostLevel(t);return this.getBlock({...t,y:r})}getPermutation(t){let a=t,r=a.x>>4,n=a.z>>4;return this.getChunk(r,n).getPermutation({x:r,y:a.y,z:n})}sendMessage(t){let a=new ye.TextPacket;a.type=ye.TextPacketType.Raw,a.needsTranslation=!1,a.source=null,a.message=t,a.parameters=null,a.xuid="",a.platformChatId="",a.filtered=t,this.broadcast(a)}getPlayers(){return[...this.entities.values()].filter(t=>t.isPlayer())}getEntity(t,a=!1){return a?[...this.entities.values()].find(r=>r.runtimeId===t)||null:this.entities.get(t)??null}getEntities(){return[...this.entities.values()]}fill(t,a,r){let n=Math.min(t.x,a.x),s=Math.min(t.y,a.y),o=Math.min(t.z,a.z),i=Math.max(t.x,a.x),l=Math.max(t.y,a.y),m=Math.max(t.z,a.z),u=new Set;for(let p=n;p<=i;p++)for(let h=s;h<=l;h++)for(let d=o;d<=m;d++){let S=this.getChunk(p>>4,d>>4);S.setPermutation({x:p,y:h,z:d},r),u.add(S),S.dirty=!0}for(let p of u)this.setChunk(p)}spawnEntity(t,a){let r=new W(this,t);return r.addTrait(it),r.addTrait(ea),r.addTrait(_e),r.position.x=a.x,r.position.y=a.y,r.position.z=a.z,r.spawn()}spawnItem(t,a){let r=new W(this,b.Item);t.world||(t.world=this.world),r.position.x=a.x,r.position.y=a.y,r.position.z=a.z;let n=new xt(r);return n.itemStack=t,r.addTrait(it),r.addTrait(ea),r.addTrait(_e),r.spawn(),r}executeCommand(t){return t.startsWith("/")&&(t=t.slice(1)),new nt(this.world.commands.getAll(),t,this).execute()}schedule(t){let a=new Bt(t,this);return this.world.schedules.add(a),a}broadcast(...t){for(let a of this.getPlayers())a.send(...t)}broadcastImmediate(...t){for(let a of this.getPlayers())a.sendImmediate(...t)}broadcastExcept(t,...a){for(let r of this.entities.values())r.isPlayer()&&r!==t&&r.send(...a)}};var je=require("@serenityjs/protocol");var Ve=require("@serenityjs/protocol");var Oa=require("@serenityjs/protocol");var Ue=class ps{static{c(this,"ScoreboardIdentity")}static IDENTIFIER=0n;identifier=ps.IDENTIFIER++;type;displayName;entity=null;constructor(t,a){t instanceof W?(t.isPlayer()?(this.type=Oa.ScoreboardIdentityType.Player,this.displayName=t.username):(this.type=Oa.ScoreboardIdentityType.Entity,this.displayName=t.type.identifier),this.identifier=a||t.runtimeId,this.entity=t):(this.type=Oa.ScoreboardIdentityType.FakePlayer,this.displayName=t)}};var us=class{static{c(this,"ScoreboardObjective")}world;scoreboard;participants=new Map;objectiveName;displayName;constructor(t,a,r){this.world=t,this.scoreboard=t.scoreboard,this.objectiveName=a,this.displayName=r??a}hasParticipant(t){for(let[a]of this.participants)if(t instanceof Ue&&a===t||t instanceof W&&a.entity===t||typeof t=="string"&&a.displayName===t)return!0;return!1}getParticipant(t){for(let[a]of this.participants)if(t instanceof Ue&&a===t||t instanceof W&&a.entity===t||typeof t=="string"&&a.displayName===t)return a;return null}getParticipants(){return[...this.participants.keys()]}addParticipant(t,a=0){if(this.hasParticipant(t))throw new Error("Participant is already in the objective.");let r=t instanceof Ue?t:t instanceof W?t.scoreboardIdentity:new Ue(t);return this.participants.set(r,a),r}removeParticipant(t){let a=this.getParticipant(t);if(!a)return!1;this.participants.delete(a);let r=new Ve.SetScorePacket;return r.type=Ve.ScoreboardActionType.Remove,r.entries=[{scoreboardId:a.identifier,objectiveName:this.objectiveName,score:0,identityType:a.type,actorUniqueId:null,customName:null}],this.world.broadcast(r),!0}setScore(t,a){let r=this.getParticipant(t)??this.addParticipant(t);this.participants.set(r,a);let n=new Ve.SetScorePacket;n.type=Ve.ScoreboardActionType.Change,n.entries=[{scoreboardId:r.identifier,objectiveName:this.objectiveName,score:a,identityType:r.type,actorUniqueId:r.entity?.uniqueId??null,customName:r.displayName}],this.world.broadcast(n)}addScore(t,a){let r=this.getParticipant(t)??this.addParticipant(t),s=(this.participants.get(r)??0)+a;return this.setScore(r,s),s}getScore(t){let a=this.getParticipant(t);return a?this.participants.get(a):null}clearScores(){let t=new Ve.SetScorePacket;t.type=Ve.ScoreboardActionType.Remove,t.entries=[...this.participants.keys()].map(a=>({scoreboardId:a.identifier,objectiveName:this.objectiveName,score:0,identityType:a.type,actorUniqueId:null,customName:null})),this.world.broadcast(t),this.participants.clear()}};var hs=class{static{c(this,"Scoreboard")}world;objectives=new Set;slots=new Map;constructor(t){this.world=t}getObjective(t){for(let a of this.objectives)if(a.objectiveName===t)return a}addObjective(t,a){if(this.getObjective(t))throw new Error(`Objective with name '${t}' already exists`);let r=new us(this.world,t,a);return this.objectives.add(r),r}removeObjective(t){if(typeof t=="string"){let a=this.getObjective(t);if(!a)throw new Error("Objective does not exist");this.objectives.delete(a)}else this.objectives.delete(t)}getObjectiveAtDisplaySlot(t){return this.slots.get(t)}setObjectiveAtDisplaySlot(t,a){let{objective:r,sortOrder:n,player:s}=a,o=new je.SetDisplayObjectivePacket;o.displaySlot=t,o.objectiveName=r.objectiveName,o.displayName=r.displayName,o.criteriaName="dummy",o.sortOrder=n;let i=new je.SetScorePacket;return i.type=je.ScoreboardActionType.Change,i.entries=[...r.participants].map(([l,m])=>({scoreboardId:l.identifier,objectiveName:r.objectiveName,score:m,identityType:l.type,actorUniqueId:l.entity?.uniqueId??null,customName:l.displayName})),s?s.send(o,i):this.world.broadcast(o,i),this.slots.set(t,r),r}clearObjectiveAtDisplaySlot(t,a){let r=this.slots.get(t);if(!r)return;let n=new je.RemoveObjectivePacket;return n.objectiveName=r.objectiveName,a?.player?a.player.send(n):(this.world.broadcast(n),this.slots.delete(t)),r}};var ds={identifier:"default",seed:Math.floor(Math.random()*2**32),saveInterval:5,dimensions:[{identifier:"overworld",type:Je.DimensionType.Overworld,generator:"superflat",viewDistance:20,simulationDistance:10,spawnPosition:[0,32767,0]}]},Ct=class extends fs.default{static{c(this,"World")}serenity;properties=ds;identifier;provider;dimensions=new Map;logger;entityPalette=new Br;effectPalette=new ms;blockPalette=new Nr;itemPalette=new Xr;commands=new Yr;schedules=new Set;scoreboard=new hs(this);currentTick=0n;dayTime=0;constructor(t,a,r){super(),this.serenity=t,this.provider=a,this.properties={...ds,...r},this.identifier=this.properties.identifier,this.logger=new Ha.Logger(this.identifier,Ha.LoggerColors.GreenBright);for(let n of[...Zr,...Qr])n(this);for(let n of this.properties.dimensions)this.createDimension(n)}onTick(t){if(!(this.getPlayers().length===0||!new ir(this.currentTick,BigInt(t),this).emit())){++this.currentTick,this.dayTime=(this.dayTime+1)%24e3;for(let r of this.dimensions.values())try{r.onTick(t)}catch(n){this.logger.error(`Failed to tick dimension ${r.identifier}`,n)}if(this.currentTick%500n===0n){let r=new Je.SetTimePacket;r.time=this.dayTime,this.broadcast(r)}if(this.schedules.size>0){for(let r of this.schedules)if(this.currentTick>=r.completeTick){try{r.execute()}catch(n){this.logger.error(`Failed to execute schedule for dimension at tick ${r.completeTick}`,n)}this.schedules.delete(r)}}this.currentTick%(BigInt(this.properties.saveInterval)*1200n)===0n&&this.provider.onSave()}}createDimension(t){let a={...It,...t};if(this.dimensions.has(a.identifier))return this.logger.error(`Failed to create dimension with identifier ${a.identifier} as it already exists`),!1;let r=new ot(this,a);return this.dimensions.set(r.identifier,r),this.logger.debug(`Created dimension: ${r.identifier}`),r}sendMessage(t){let a=new Je.TextPacket;a.type=Je.TextPacketType.Raw,a.needsTranslation=!1,a.source=null,a.message=t,a.parameters=null,a.xuid="",a.platformChatId="",a.filtered=t,this.broadcast(a)}getDimension(t){return t===void 0?this.dimensions.values().next().value:this.dimensions.get(t)}getDimensions(){return[...this.dimensions.values()]}getPlayers(){return[...this.dimensions.values()].flatMap(t=>t.getPlayers())}getEntities(){return[...this.dimensions.values()].flatMap(t=>t.getEntities())}schedule(t){let a=new Bt(t,this);return this.schedules.add(a),a}broadcast(...t){for(let a of this.getPlayers())a.send(...t)}broadcastImmediate(...t){for(let a of this.getPlayers())a.sendImmediate(...t)}broadcastExcept(t,...a){for(let r of this.getPlayers())r!==t&&r.send(...a)}};var ta=require("@serenityjs/binarystream"),Ir=require("@serenityjs/nbt");var aa=class Pt{static{c(this,"BlockStorage")}static MAX_X=16;static MAX_Y=16;static MAX_Z=16;static MAX_SIZE=16*16*16;palette;blocks;air;constructor(t,a){let r=F.resolve(P.Air);this.air=r.network,this.palette=t??[this.air],this.blocks=a??Array.from({length:Pt.MAX_SIZE},()=>0)}isEmpty(){return this.palette.length===1&&this.palette[0]===this.air}getState(t,a,r){let n=Pt.getIndex(t,a,r),s=this.blocks[n]??0;return this.palette[s]??this.air}setState(t,a,r,n){let s=this.palette.indexOf(n);s===-1&&(s=this.palette.push(n)-1),this.blocks[Pt.getIndex(t,a,r)]=s}static getIndex(t,a,r){return(t&15)<<8|(r&15)<<4|a&15}static serialize(t,a,r=!1){let n=Math.ceil(Math.log2(t.palette.length));switch(n){case 0:{n=1;break}case 1:case 2:case 3:case 4:case 5:case 6:break;case 7:case 8:{n=8;break}default:{n=16;break}}a.writeByte(n<<1|1);let s=Math.floor(32/n),o=Math.ceil(4096/s);for(let i=0;i<o;i++){let l=0;for(let m=0;m<s;m++){let u=i*s+m;if(u>=4096)break;let p=t.blocks[u]??0,h=m*n;l|=p<<h}a.writeInt32(l,ta.Endianness.Little)}r?a.writeInt32(t.palette.length,ta.Endianness.Little):a.writeZigZag(t.palette.length);for(let i of t.palette)if(r){let l=F.permutations.get(i);if(!l)throw new Error(`Unknown permutation state: ${i}`);let m=F.toNbt(l);Ir.CompoundTag.write(a,m)}else a.writeZigZag(i)}static deserialize(t,a=!1){let r=t.readByte(),n=r>>1,s=(r&1)!==0,o=Math.floor(32/n),i=Math.ceil(4096/o),l=Array.from({length:i});for(let d=0;d<i;d++)l[d]=t.readInt32(ta.Endianness.Little);let m=a?t.readInt32(ta.Endianness.Little):t.readZigZag(),u=Array.from({length:m});for(let d=0;d<m;d++)if(a){let S=Ir.CompoundTag.read(t),x=F.fromNbt(S);if(!x)throw new Error(`Unknown permutation state: ${S.valueOf(!0)}`);u[d]=x.network}else u[d]=t.readZigZag();let p=Array.from({length:4096}),h=0;for(let d of l)for(let S=0;S<o&&h<4096;S++,h++){let x=d>>S*n&(1<<n)-1,H=h>>8&15,de=h&15,Me=h>>4&15;p[Pt.getIndex(H,de,Me)]=x}return new Pt(u,p)}};var gs=require("@serenityjs/binarystream");var ne=class e{static{c(this,"SubChunk")}version;layers;index=null;constructor(t,a){this.version=t??9,this.layers=a??[]}isEmpty(){for(let t of this.layers)if(!t.isEmpty())return!1;return!0}getLayer(t){if(!this.layers[t])for(let a=0;a<=t;a++)this.layers[a]||(this.layers[a]=new aa);return this.layers[t]}getState(t,a,r,n){return this.getLayer(n).getState(t,a,r)}setState(t,a,r,n,s){this.getLayer(s??0).setState(t,a,r,n)}static serialize(t,a,r=!1){if(a.writeUint8(t.version),a.writeUint8(t.layers.length),t.version===9){if(t.index===null)throw new Error("SubChunk index is null for format version 9");a.writeInt8(t.index)}for(let n of t.layers)aa.serialize(n,a,r)}static deserialize(t,a=!1){let r=t.readUint8(),n=t.readUint8(),s=null;r===9&&(s=t.readInt8());let o=[];for(let l=0;l<n;l++)o.push(aa.deserialize(t,a));let i=new e(r,o);return i.index=s,i}static from(t,a=!1){let r=new gs.BinaryStream(t);return e.deserialize(r,a)}};var vt=require("@serenityjs/protocol"),en=require("@serenityjs/binarystream");var Z=class e{static{c(this,"Chunk")}static MAX_SUB_CHUNKS=24;type;x;z;hash;subchunks;cache=null;dirty=!1;ready=!0;constructor(t,a,r,n){this.x=t,this.z=a,this.type=r,this.hash=vt.ChunkCoords.hash({x:t,z:a}),this.subchunks=n??Array.from({length:e.MAX_SUB_CHUNKS})}getPermutation(t){let{x:a,y:r,z:n}=t,s=this.type===vt.DimensionType.Overworld?r+64:r,i=this.getSubChunk(s>>4).getState(a&15,s&15,n&15,0);return F.permutations.get(i)}setPermutation(t,a,r=!0){let{x:n,y:s,z:o}=t,i=this.type===vt.DimensionType.Overworld?s+64:s,l=this.getSubChunk(i>>4),m=a.network;l.setState(n&15,i&15,o&15,m,0),r&&(this.dirty=!0),this.cache=null}getTopmostLevel(t){for(let a=t.y;a>=-64;a--){let r=this.getPermutation({...t,y:a});if(r.type.identifier!==P.Air&&r.type.solid)return a}return-64}getBottommostLevel(t){for(let a=0;a<=t.y;a++)if(this.getPermutation({...t,y:a}).type.identifier!==P.Air)return a;return 0}getSubChunk(t){if(t<0)return this.getSubChunk(0);if(t>=e.MAX_SUB_CHUNKS)return this.getSubChunk(e.MAX_SUB_CHUNKS-1);if(!this.subchunks[t])for(let a=0;a<=t;a++){if(this.subchunks[a])continue;let r=new ne;r.index=this.type===vt.DimensionType.Overworld?a-4:a,this.subchunks[a]=r}return this.subchunks[t]}getSubChunkSendCount(){let t=0;for(let a=e.MAX_SUB_CHUNKS-1;a>=0;a--){let r=this.subchunks[a];if(!r||r.isEmpty())t++;else break}return e.MAX_SUB_CHUNKS-t}isEmpty(){for(let t of this.subchunks)if(!t||!t.isEmpty())return!1;return!0}static serialize(t,a=!1){if(t.cache)return t.cache;let r=new en.BinaryStream;for(let n=0;n<t.getSubChunkSendCount();n++){let s=t.subchunks[n];if(s)ne.serialize(s,r,a);else{let o=new ne;o.index=n,ne.serialize(o,r,a)}}for(let n=0;n<24;n++)r.writeByte(0),r.writeVarInt(2);return r.writeByte(0),t.cache=r.getBuffer(),t.cache}static deserialize(t,a,r,n,s=!1){let o=new en.BinaryStream(n),i=Array.from({length:e.MAX_SUB_CHUNKS},()=>new ne);for(let m=0;m<e.MAX_SUB_CHUNKS;++m){let u=o.binary[o.offset];if(u!==8&&u!==9)break;i[m]=ne.deserialize(o,s)}for(let m=0;m<24;m++)o.readByte(),o.readVarInt();return o.readByte(),new e(a,r,t,i)}};var Na={path:"./worlds"},ra=class{static{c(this,"WorldProvider")}static identifier;identifier=this.constructor.identifier;world;constructor(...t){return this}onStartup(){}onShutdown(){}onSave(){}readChunk(t,a,r){throw new Error(`${this.identifier}.readChunk() is not implemented!`)}writeChunk(t,a){throw new Error(`${this.identifier}.writeChunk() is not implemented!`)}readAvailableEntities(t){throw new Error(`${this.identifier}.getAvailableEntities() is not implemented!`)}writeAvailableEntities(t,a){throw new Error(`${this.identifier}.writeAvailableEntities() is not implemented!`)}readEntity(t,a){throw new Error(`${this.identifier}.readEntity() is not implemented!`)}writeEntity(t,a){throw new Error(`${this.identifier}.writeEntity() is not implemented!`)}readPlayer(t,a){throw new Error(`${this.identifier}.readPlayer() is not implemented!`)}writePlayer(t,a){throw new Error(`${this.identifier}.writePlayer() is not implemented!`)}readAvailableBlocks(t){throw new Error(`${this.identifier}.readAvailableBlocks() is not implemented!`)}writeAvailableBlocks(t,a){throw new Error(`${this.identifier}.writeAvailableBlocks() is not implemented!`)}readBlock(t,a){throw new Error(`${this.identifier}.readBlock() is not implemented!`)}writeBlock(t,a){throw new Error(`${this.identifier}.writeBlock() is not implemented!`)}readProperty(t){throw new Error(`${this.identifier}.readProperty() is not implemented!`)}writeProperty(t,a){throw new Error(`${this.identifier}.writeProperty() is not implemented!`)}static initialize(t,a){throw new Error(`${this.identifier}.initialize() is not implemented!`)}static create(t,a,r){throw new Error(`${this.identifier}.create() is not implemented!`)}};var na=require("@serenityjs/protocol");var wi=class extends ra{static{c(this,"InternalProvider")}static identifier="internal";chunks=new Map;entities=new Map;players=new Map;properties=new Map;readChunk(t,a,r){this.chunks.has(r)||this.chunks.set(r,new Map);let n=this.chunks.get(r);return n.has(na.ChunkCoords.hash({x:t,z:a}))||n.set(na.ChunkCoords.hash({x:t,z:a}),r.generator.apply(t,a)),n.get(na.ChunkCoords.hash({x:t,z:a}))}writeChunk(t,a){this.chunks.has(a)||this.chunks.set(a,new Map),this.chunks.get(a).set(na.ChunkCoords.hash({x:t.x,z:t.z}),t)}getAvailableEntities(t){return this.entities.has(t)||this.entities.set(t,new Map),[...this.entities.get(t)].map(([r])=>r)}readEntity(t,a){this.entities.has(a)||this.entities.set(a,new Map);let r=this.entities.get(a);if(!r.has(t))throw new Error(`Entity with unique id ${t} not found!`);return r.get(t)}writeEntity(t,a){this.entities.has(a)||this.entities.set(a,new Map),this.entities.get(a).set(t.uniqueId,t)}readPlayer(t,a){this.players.has(a)||this.players.set(a,new Map);let r=this.players.get(a);return r.has(t)?r.get(t):null}writePlayer(t,a){this.players.has(a)||this.players.set(a,new Map),this.players.get(a).set(t.uuid,t)}readProperty(t){for(let[a,r]of this.properties)if(a.equals(t))return r;throw new Error(`Property with key ${t.toString("hex")} not found!`)}writeProperty(t,a){this.properties.set(t,a)}static initialize(){}static create(t,a,r){let n=new this,s=new Ct(t,n,r);return n.world=s,s}};var Q=require("fs"),be=require("path"),G=require("@serenityjs/binarystream"),_s=require("@serenityjs/leveldb"),Ye=require("@serenityjs/protocol");var Si=class ie extends ra{static{c(this,"LevelDBProvider")}static identifier="leveldb";path;db;chunks=new Map;constructor(t){super(),this.path=t,this.db=_s.Leveldb.open((0,be.resolve)(t,"db"))}onShutdown(){for(let t of this.world.dimensions.values())t.generator.worker?.terminate();this.onSave(),this.db.close()}onStartup(){for(let t of this.world.dimensions.values()){let a=this.readAvailableEntities(t),r=this.readAvailableBlocks(t);if(!(a.length===0&&r.length===0)){for(let n of a){let s=this.readEntity(n,t);new W(t,s.identifier,{uniqueId:n,entry:s}).spawn()}for(let n of r){let s=this.readBlock(n,t),o=t.world.blockPalette.getAllPermutations().find(l=>l.network===s.permutation);if(!o)continue;let i=new jt(t,new Ye.BlockPosition(...s.position),o,{entry:s});t.blocks.set(Ye.BlockPosition.hash(i.position),i)}}}}onSave(){let t=[...this.world.dimensions.values()].map(r=>r.properties),a=this.world.properties;a.dimensions=t,(0,Q.writeFileSync)((0,be.resolve)(this.path,"properties.json"),JSON.stringify(a,null,2));for(let[r,n]of this.chunks){for(let m of n.values())m.dirty&&this.writeChunk(m,r);let s=[...r.entities.values()],o=[];for(let m of s)m.isPlayer()?this.writePlayer(m.getDataEntry(),r):(this.writeEntity(m.getDataEntry(),r),o.push(m.uniqueId));this.writeAvailableEntities(r,o);let i=[...r.blocks.values()],l=[];for(let m of i)this.writeBlock(m.getDataEntry(),r),l.push(Ye.BlockPosition.hash(m.position));this.writeAvailableBlocks(r,l),this.world.logger.info(`Saved \xA7c${n.size}\xA7r chunks, \xA7c${s.length}\xA7r entities, and \xA7c${i.length}\xA7r blocks for dimension \xA7a${r.identifier}\xA7r.`)}}readChunk(t,a,r){this.chunks.has(r)||this.chunks.set(r,new Map);let n=this.chunks.get(r),s=Ye.ChunkCoords.hash({x:t,z:a});if(n.has(s))return n.get(s);if(this.hasChunk(t,a,r)){let o=new Array;for(let l=-4;l<16;l++)o.push(this.readSubChunk(t,l,a,r));let i=new Z(t,a,r.type,o);return n.set(s,i),i}else{let o=r.generator.apply(t,a);return n.set(s,o),o.ready&&new Ft(r,o).emit(),o}}writeChunk(t,a){if(!(t.isEmpty()||!t.dirty)){this.writeChunkVersion(t.x,t.z,a,40);for(let r=-4;r<16;r++){let n=t.getSubChunk(r+4);!n||n.isEmpty()||this.writeSubChunk(n,t.x,r,t.z,a)}t.dirty=!1}}writeChunkVersion(t,a,r,n){let s=ie.buildChunkVersionKey(t,a,r.indexOf());this.db.put(s,Buffer.from([n]))}hasChunk(t,a,r){try{let n=ie.buildChunkVersionKey(t,a,r.indexOf());return!!this.db.get(n)}catch{return!1}}readSubChunk(t,a,r,n){try{let s=ie.buildSubChunkKey(t,a,r,n.indexOf()),o=ne.from(this.db.get(s),!0);return o.index=a,o}catch{let s=new ne;return s.index=a,s}}writeSubChunk(t,a,r,n,s){let o=ie.buildSubChunkKey(a,r,n,s.indexOf());t.index=r;let i=new G.BinaryStream;ne.serialize(t,i,!0),this.db.put(o,i.getBuffer())}readAvailableEntities(t){let a=new Array;try{let r=ie.buildActorListKey(t),n=new G.BinaryStream(this.db.get(r));do a.push(n.readInt64(G.Endianness.Little));while(!n.cursorAtEnd());return a}catch{return a}}writeAvailableEntities(t,a){let r=ie.buildActorListKey(t),n=new G.BinaryStream;for(let s of a)n.writeInt64(s,G.Endianness.Little);this.db.put(r,n.getBuffer())}readEntity(t,a){if(!this.readAvailableEntities(a).includes(t))throw new Error(`Entity with unique id ${t} not found!`);let n=ie.buildActorDataKey(t),s=this.db.get(n);return JSON.parse(s.toString(),(i,l)=>typeof l=="string"&&l.endsWith("BigInt_t")?BigInt(l.slice(0,-8)):l==="Infinity_t"?1/0:l==="-Infinity_t"?-1/0:l==="NaN_t"?Number.NaN:l)}writeEntity(t,a){let r=this.readAvailableEntities(a);r.includes(t.uniqueId)||r.push(t.uniqueId);let n=JSON.stringify(t,(i,l)=>typeof l=="bigint"?l.toString()+"BigInt_t":l===1/0?"Infinity_t":l===-1/0?"-Infinity_t":Number.isNaN(l)?"NaN_t":l),s=Buffer.from(n),o=ie.buildActorDataKey(t.uniqueId);this.db.put(o,s)}readPlayer(t,a){try{let r=`player_server_${t}_${a.identifier}`,n=this.db.get(Buffer.from(r));return JSON.parse(n.toString(),(o,i)=>typeof i=="string"&&i.endsWith("BigInt_t")?BigInt(i.slice(0,-8)):i==="Infinity_t"?1/0:i==="-Infinity_t"?-1/0:i==="NaN_t"?Number.NaN:i)}catch{return null}}writePlayer(t,a){let r=JSON.stringify(t,(o,i)=>typeof i=="bigint"?i.toString()+"BigInt_t":i===1/0?"Infinity_t":i===-1/0?"-Infinity_t":Number.isNaN(i)?"NaN_t":i),n=Buffer.from(r),s=`player_server_${t.uuid}_${a.identifier}`;this.db.put(Buffer.from(s),n)}readAvailableBlocks(t){let a=new Array;try{let r=ie.buildBlockDataListKey(t),n=new G.BinaryStream(this.db.get(r));do{let s=n.readZigZong();a.push(s)}while(!n.cursorAtEnd());return a}catch{return a}}writeAvailableBlocks(t,a){let r=ie.buildBlockDataListKey(t),n=new G.BinaryStream;for(let s of a)n.writeZigZong(s);this.db.put(r,n.getBuffer())}readBlock(t,a){let r=Ye.BlockPosition.unhash(t),n=ie.buildBlockDataKey(r,a.indexOf()),s=this.db.get(n);return JSON.parse(s.toString())}writeBlock(t,a){let r=new Ye.BlockPosition(...t.position),n=JSON.stringify(t),s=Buffer.from(n),o=ie.buildBlockDataKey(r,a.indexOf());this.db.put(o,s)}readProperty(t){return this.db.get(t)}writeProperty(t,a){return this.db.put(t,a)}static initialize(t,a){let r=(0,be.resolve)(a.path);(0,Q.existsSync)(r)||(0,Q.mkdirSync)(r);let n=(0,Q.readdirSync)(r,{withFileTypes:!0}).filter(s=>s.isDirectory());if(n.length===0)return void t.registerWorld(this.create(t,a,{identifier:"default"}));for(let s of n){let o=(0,be.resolve)(r,s.name),i={identifier:s.name};(0,Q.existsSync)((0,be.resolve)(o,"properties.json"))&&(i=JSON.parse((0,Q.readFileSync)((0,be.resolve)(o,"properties.json"),"utf-8")));let l=new Ct(t,new this(o),i);l.provider.world=l,new da(l).emit(),(0,Q.writeFileSync)((0,be.resolve)(o,"properties.json"),JSON.stringify(l.properties,null,2));for(let m of l.dimensions.values()){let u=m.properties.spawnPosition[0]>>4,p=m.properties.spawnPosition[2]>>4,h=m.viewDistance,d=(h*2+1)**2;l.logger.info(`Preparing \xA7c${d}\xA7r chunks for dimension \xA7a${m.identifier}\xA7r.`);for(let S=-h;S<=h;S++)for(let x=-h;x<=h;x++){let H=l.provider.readChunk(u+S,p+x,m);H.ready&&(H.cache=Z.serialize(H),H.dirty=!1)}l.logger.success(`Successfully pregenerated \xA7c${d}\xA7r chunks for for dimension \xA7a${m.identifier}\xA7r.`)}t.registerWorld(l)}}static create(t,a,r){let n=(0,be.resolve)(a.path);if((0,Q.existsSync)(n)||(0,Q.mkdirSync)(n),!r?.identifier)throw new Error("A world identifier is required to create a new world.");let s=(0,be.resolve)(n,r.identifier);if((0,Q.existsSync)(s))throw new Error(`World with identifier ${r.identifier} already exists in the directory.`);(0,Q.mkdirSync)(s);let o=new Ct(t,new this(s),r);o.provider.world=o,new da(o).emit(),(0,Q.writeFileSync)((0,be.resolve)(s,"properties.json"),JSON.stringify(o.properties,null,2));for(let i of o.dimensions.values()){let l=i.properties.spawnPosition[0]>>4,m=i.properties.spawnPosition[2]>>4,u=i.viewDistance,p=(u*2+1)**2;o.logger.info(`Preparing \xA7c${p}\xA7r chunks for dimension \xA7a${i.identifier}\xA7r.`);for(let h=-u;h<=u;h++)for(let d=-u;d<=u;d++){let S=o.provider.readChunk(l+h,m+d,i);S.ready&&(S.cache=Z.serialize(S),S.dirty=!1)}o.logger.success(`Successfully pregenerated \xA7c${p}\xA7r chunks for for dimension \xA7a${i.identifier}\xA7r.`)}return o}static buildSubChunkKey(t,a,r,n){let s=new G.BinaryStream;return s.writeInt32(t,G.Endianness.Little),s.writeInt32(r,G.Endianness.Little),n!==0&&s.writeInt32(n,G.Endianness.Little),s.writeByte(47),s.writeByte(a),s.getBuffer()}static buildChunkVersionKey(t,a,r){let n=new G.BinaryStream;return n.writeInt32(t,G.Endianness.Little),n.writeInt32(a,G.Endianness.Little),r!==0&&n.writeInt32(r,G.Endianness.Little),n.writeByte(44),n.getBuffer()}static buildActorListKey(t){let a=new G.BinaryStream;return a.writeInt32(1684629360),t.indexOf()!==0&&a.writeInt32(t.indexOf(),G.Endianness.Little),a.getBuffer()}static buildActorDataKey(t){let a=new G.BinaryStream;return a.writeBuffer(Buffer.from("actorprefix","ascii")),a.writeInt64(t,G.Endianness.Little),a.getBuffer()}static buildBlockDataListKey(t){let a=new G.BinaryStream;return a.writeInt32(422726034283),t.indexOf()!==0&&a.writeInt32(t.indexOf(),G.Endianness.Little),a.getBuffer()}static buildBlockDataKey(t,a){let r=new G.BinaryStream;return r.writeZigZag(t.x),r.writeZigZag(t.y),r.writeZigZag(t.z),a!==0&&r.writeInt32(a,G.Endianness.Little),r.writeByte(45),r.getBuffer()}};var ys={seed:Math.floor(Math.random()*2147483647)},sa=class{static{c(this,"TerrainGenerator")}static identifier;static _worker=null;identifier=this.constructor.identifier;dimension;world;properties=ys;queue=new Map;worker;constructor(t,a){this.dimension=t,this.world=t.world,this.properties={...ys,...a},this.identifier=this.constructor.identifier,this.worker=this.constructor._worker?.initialize(this.properties)??null,this.worker?.on("message",r=>{r.identifier===this.identifier&&this.process(r)})}apply(t,a){throw new Error(`${this.identifier}.apply() is not implemented!`)}handoff(t){if(!this.worker)throw new Error("Worker is not available.");this.queue.set(t.hash,t);let{x:a,z:r}=t,n=this.dimension.type;this.worker.postMessage({cx:a,cz:r,type:n})}process(t){let a=this.queue.get(t.hash);if(a){for(let r of t.subchunks){if(!r)continue;let n=a.getSubChunk(t.subchunks.indexOf(r));for(let s of r.layers){let o=n.getLayer(r.layers.indexOf(s));for(let[i,l]of s.blocks.entries())o.blocks[i]=l;for(let[i,l]of s.palette.entries())o.palette[i]=l}}a.ready=!0,new Ft(this.dimension,a).emit(),this.queue.delete(t.hash)}}};var bs=require("worker_threads");var tn=class{static{c(this,"TerrainWorker")}static path=__filename;properties;generator;constructor(t,a){if(bs.isMainThread)throw new Error("Worker can only be initialized in a worker thread");this.properties=a,this.generator=t}apply(t,a,r){throw new Error(`${this.generator.identifier}.apply() is not implemented!`)}static initialize(t){throw new Error(`${this.name}.initialize() is not implemented!`)}};var xe=require("worker_threads");function an(e){return function(t){if(e._worker=t,t.initialize=a=>{if(!xe.isMainThread)throw new Error("Worker can only be initialized in a worker thread");return new xe.Worker(t.path,{workerData:a})},!xe.isMainThread){let a=new t(e,xe.workerData);xe.parentPort?.on("message",r=>{let n=a.apply(r.cx,r.cz,r.type);xe.parentPort?.postMessage({identifier:e.identifier,...n})})}}}c(an,"Worker");var Ra=class extends sa{static{c(this,"VoidGenerator")}static identifier="void";apply(t,a){let r=new Z(t,a,this.dimension.type);return t===0&&a===0&&r.setPermutation({x:0,y:0,z:0},F.resolve(P.Bedrock)),r}};var oa=class extends sa{static{c(this,"SuperflatGenerator")}static identifier="superflat";apply(t,a){let r=new Z(t,a,this.dimension.type);return r.ready=!1,this.handoff(r),r}};function ki(e,t,a,r){var n=arguments.length,s=n<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,a):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(e,t,a,r);else for(var i=e.length-1;i>=0;i--)(o=e[i])&&(s=(n<3?o(s):n>3?o(t,a,s):o(t,a))||s);return n>3&&s&&Object.defineProperty(t,a,s),s}c(ki,"_ts_decorate");var rn=class extends tn{static{c(this,"SuperflatWorker")}static path=__filename;bedrock=F.resolve(P.Bedrock);dirt=F.resolve(P.Dirt);grass=F.resolve(P.GrassBlock);apply(t,a,r){let n=new Z(t,a,r);for(let s=0;s<16;s++)for(let o=0;o<16;o++)for(let i=-64;i<-60;i++){let l={x:s,y:i,z:o};i===-64?n.setPermutation(l,this.bedrock,!1):i===-63||i===-62?n.setPermutation(l,this.dirt,!1):n.setPermutation(l,this.grass,!1)}return n}};rn=ki([an(oa)],rn);var xi=c(e=>{e.commands.register("tp","Teleports an entity to a specified location",t=>{t.permissionLevel=ws.CommandPermissionLevel.Operator,t.overload({position:ge},a=>{let r=a.origin;if(r instanceof ot)return{message:"This command can only be executed by entities"};let n=a.position.result;r.teleport(n)}),t.overload({target:M,destination:M},a=>{let r=a.target.result,n=a.destination.result;if(n.length>1)throw new Error("Destination must be a single entity");let s=n[0].position;for(let o of r)o.teleport(s)}),t.overload({target:M,position:ge},a=>{let r=a.target.result,n=a.position.result;for(let s of r)s.teleport(n)})},()=>{})},"register"),Ss=xi;var ks=require("@serenityjs/protocol");var Ci=c(e=>{e.commands.register("transfer","Transfer a player to a different server",t=>{t.permissionLevel=ks.CommandPermissionLevel.Operator,t.overload({target:M,address:Ge,port:ze},a=>{let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[],s=a.address.result,o=a.port.result;for(let i of r){if(!i.isPlayer()){n.push(`\xA7cEntity \xA74${i.uniqueId}\xA7c is not a player.\xA7r`);continue}i.transfer(s,o),n.push(`\xA7aTransferred \xA72${i.username}\xA7a to \xA72${s}:${o}\xA7a.\xA7r`)}return{message:n.join(`
5
+ `)}})},()=>{})},"register"),xs=Ci;var ia=require("@serenityjs/protocol");var Pi=c(e=>{e.commands.register("summon","Summons an entity at a specified location",t=>{t.permissionLevel=ia.CommandPermissionLevel.Operator,t.overload({entity:St},a=>{if(!(a.origin instanceof W))throw new Error("You can't use this command in this context, try adding a position argument.");let r=a.entity.result.includes(":")?a.entity.result:`minecraft:${a.entity.result}`,{x:n,y:s,z:o}=a.origin.position.floor();return a.origin.dimension.spawnEntity(r,new ia.Vector3f(n,s,o)),{message:`Successfully summoned entity at ${n}, ${s}, ${o}!`}}),t.overload({entity:St,position:ge},a=>{let r=a.entity.result.includes(":")?a.entity.result:`minecraft:${a.entity.result}`,{x:n,y:s,z:o}=a.position.result;(a.origin instanceof W?a.origin.dimension:a.origin).spawnEntity(r,new ia.Vector3f(n,s,o))})},()=>{})},"register"),Cs=Pi;var Ke=require("@serenityjs/protocol");var vi=new Set([Ke.Gamemode.Creative,Ke.Gamemode.CreativeSpectator,Ke.Gamemode.Spectator]),Ti=c(e=>{e.commands.register("kill","Kills entities (players, mobs, etc.).",t=>{t.permissionLevel=Ke.CommandPermissionLevel.Operator,t.overload({target:M},a=>{a.target.validate(!0);let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[];for(let s of r){if(s instanceof me&&vi.has(s.gamemode)){n.push(`\xA7cPlayer \xA74${s.username}\xA7c is in a gamemode that cannot be killed.\xA7r`);continue}s.kill(void 0,Ke.ActorDamageCause.None),n.push(`\xA7aKilled \xA72${s.isPlayer()?s.username:s.uniqueId}\xA7a.`)}return{message:n.join(`
6
+ `)}})},()=>{})},"register"),Ps=Ti;var vs=require("@serenityjs/protocol");var Ei=c(e=>{e.commands.register("stop","Stops the server",t=>{t.permissionLevel=vs.CommandPermissionLevel.Operator},()=>{e.serenity.stop()})},"register"),Ts=Ei;var Es=require("@serenityjs/protocol");var Di=c(e=>{e.commands.register("world","Change the current world of an entity",t=>{t.permissionLevel=Es.CommandPermissionLevel.Operator,t.overload({target:M,world:Qt,dimension:[Ge,!0]},a=>{let r=a.origin.getWorld().serenity,n=a.target.result;if(n.length===0)throw new Error("No targets matched the selector.");let s=r.getWorld(a.world.result);if(!s)throw new Error("World does not exist.");let o=a.dimension.result?s.getDimension(a.dimension.result):s.getDimension();if(!o)throw new Error("Dimension does not exist in specified world.");let i=[];for(let l of n)l.teleport(l.position,o),i.push(`\xA7aSuccessfully changed the world of \xA72${l.isPlayer()?l.username:l.uniqueId}\xA7a to \xA72${s.properties.identifier}\xA7a in dimension \xA72${o.properties.identifier}\xA7a.\xA7r`);return{message:i.join(`
7
+ `)}})},()=>{})},"register"),Ds=Di;var Ms=require("@serenityjs/protocol");var Mi=c(e=>{e.commands.register("op","Set the operator status of a player",t=>{t.permissionLevel=Ms.CommandPermissionLevel.Operator,t.overload({target:M},a=>{let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[];for(let s of r){if(!s.isPlayer()){n.push(`\xA7cEntity \xA74${s.uniqueId}\xA7c is not a player.\xA7r`);continue}if(s.isOp()){n.push(`\xA7cPlayer \xA74${s.username}\xA7c is already a server operator or has a higher permission level.\xA7r`);continue}s.op(),n.push(`\xA7aSuccessfully made \xA72${s.username}\xA7a a server operator.\xA7r`)}return{message:n.join(`
8
+ `)}})},()=>{})},"register"),As=Mi;var Ws=require("@serenityjs/protocol");var Ai=c(e=>{e.commands.register("deop","Remove the operator status of a player",t=>{t.permissionLevel=Ws.CommandPermissionLevel.Operator,t.overload({target:M},a=>{let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[];for(let s of r){if(!s.isPlayer()){n.push(`\xA7cEntity \xA74${s.uniqueId}\xA7c is not a player.\xA7r`);continue}if(!s.isOp()){n.push(`\xA7cPlayer \xA74${s.username}\xA7c is not a server operator.\xA7r`);continue}s.deop(),n.push(`\xA7aSuccessfully removed \xA72${s.username}\xA7a as a server operator.\xA7r`)}return{message:n.join(`
9
+ `)}})},()=>{})},"register"),Gs=Ai;var zs=require("@serenityjs/protocol");var Wi=c(e=>{e.commands.register("save","Save the current world's data to disk",t=>{t.permissionLevel=zs.CommandPermissionLevel.Operator},()=>(e.provider.onSave(),{message:"World has been saved, check console for additional details."}))},"register"),Ls=Wi;var Zr=[Zn,Qn,Bn,es,as,rs,ss,is,Ss,xs,Cs,Ps,Ts,Ds,As,Gs,Ls];var Fa=require("@serenityjs/protocol");var Gi=c(e=>{e.commands.register("about","Get information about the server",()=>({message:`\xA77This server is running \xA7uSerenityJS\xA77 for Minecraft Bedrock Edition. \xA78(v${Fa.MINECRAFT_VERSION}, proto-v${Fa.PROTOCOL_VERSION})\xA7r`}))},"register"),Os=Gi;var Qr=[Os];var Hs=require("readline"),Tt=require("process");var nn=class{static{c(this,"ConsoleInterface")}serenity;interface=(0,Hs.createInterface)({input:Tt.stdin,output:Tt.stdout,terminal:!0});constructor(t){this.serenity=t,Tt.stdin.setRawMode(!0),Tt.stdin.resume(),this.interface.on("line",this.onLine.bind(this)),this.interface.setPrompt("> ")}onLine(t){let a=t.startsWith("/")?t.slice(1):t,{command:r,flags:n}=this.parseFlags(a),s=n.find(([i])=>i==="dim"),o=n.find(([i])=>i==="world");if(o&&!s){let i=this.serenity.worlds.get(o[1]);if(!i){this.serenity.logger.error("The specified world does not exist");return}let l=i.getDimension();try{let m=l.executeCommand(r);if(!m.message)return;i.logger.info(`\xA7a${m.message}\xA7r`)}catch(m){let u=m;i.logger.error(u.message)}}else if(s&&!o){this.serenity.logger.error("You must specify a world flag when specifying a dimension flag");return}else if(s&&o){let i=this.serenity.worlds.get(o[1]);if(!i){this.serenity.logger.error("The specified world does not exist");return}let l=i.getDimension(s[1]);if(!l){this.serenity.logger.error("The specified dimension does not exist");return}try{let m=l.executeCommand(r);if(!m.message)return;i.logger.success(`${m.message}\xA7r`)}catch(m){let u=m;i.logger.error(u.message)}}else{let i=this.serenity.getWorld(),l=i.getDimension();try{let m=l.executeCommand(r);if(!m.message)return;i.logger.info(`\xA7a${m.message}\xA7r`)}catch(m){let u=m;i.logger.error(u.message)}}}parseFlags(t){let a=t.split("--").slice(1).map(n=>{let[s,o]=n.split("=");if(o?.endsWith(" ")){let i=o.indexOf(" ");o=o.slice(0,i)}return[s,o]});return{command:t.split("--")?.[0]?.trim()??t,flags:a}}};var Xr=class{static{c(this,"ItemPalette")}types=Y.types;creativeContent=Ae.items;traits=new Map;registry=new Map;constructor(){for(let t of $a)this.registerTrait(t)}getAllTypes(){return[...this.types.values()]}getType(t){return this.types.get(t)}resolveType(t){return[...this.types.values()].find(a=>a.block===t)??null}registerType(t){return this.types.has(t.identifier)?!1:(this.types.set(t.identifier,t),rt.options.push(t.identifier),!0)}getRegistry(t){return this.registry.get(t)??[]}getCreativeContent(){return[...this.creativeContent.values()]}getCreativeContentByIndex(t){return this.creativeContent.get(t)??null}registerCreativeContent(t,a=0){let r=this.creativeContent.size;this.creativeContent.set(r,new Ae(t,a))}unregisterCreativeContent(t){this.creativeContent.delete(t)}clearCreativeContent(){this.creativeContent.clear()}registerTrait(t){if(this.traits.has(t.identifier))return!1;this.traits.set(t.identifier,t);for(let a of t.types){this.registry.has(a)||this.registry.set(a,[]);let r=this.registry.get(a);r&&(r.push(t),this.registry.set(a,r))}return!0}getAllTraits(){return[...this.traits.values()]}getTrait(t){return this.traits.get(t)??null}};var Va={};Ot(Va,{ItemBundleTrait:()=>Ze,ItemEnchantableTrait:()=>qs,ItemEquippableTrait:()=>$s,ItemTrait:()=>Ce});var Ce=class extends bt{static{c(this,"ItemTrait")}static types=[];item;constructor(t){super(),this.item=t,t.addTrait(this)}equals(t){return this.identifier===t.identifier}clone(t){let a=new this.constructor(t,this.identifier);for(let[r,n]of Object.entries(this))r!=="item"&&(a[r]=n);return a}};var Ua=require("@serenityjs/nbt"),ce=require("@serenityjs/protocol");var qa=require("@serenityjs/nbt"),sn=require("@serenityjs/binarystream");var Ns=class extends Map{static{c(this,"ItemStackNbtMap")}itemStack;constructor(t){super(),this.itemStack=t}get(t){return super.get(t)}add(t){let a=super.set(t.name,t);return this.update(),a}set(t,a){let r=super.set(t,a);return this.update(),r}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}toCompound(){let t=new qa.CompoundTag("");for(let[a,r]of this)t.addTag(r);return t}fromCompound(t){for(let a of t.getTags())this.set(a.name,a)}serialize(){let t=this.toCompound(),a=new sn.BinaryStream;return qa.CompoundTag.write(a,t),a.getBuffer()}deserialize(t){let a=new sn.BinaryStream(t),r=qa.CompoundTag.read(a);this.fromCompound(r)}update(){if(!this.itemStack.container)return;let t=this.itemStack.container.storage.indexOf(this.itemStack);this.itemStack.amount<=0?this.itemStack.container.clearSlot(t):this.itemStack.container.setItem(t,this.itemStack)}};var Rs={amount:1,auxillary:0},C=class Fs{static{c(this,"ItemStack")}type;components=new Map;traits=new Map;nbt=new Ns(this);stackable;maxAmount;world;container=null;amount;auxillary;constructor(t,a){this.type=t instanceof Y?t:Y.get(t);let r={...Rs,...a};this.amount=r.amount,this.auxillary=r.auxillary,this.stackable=this.type.stackable,this.maxAmount=this.type.maxAmount,r.world&&(this.world=r.world,r.entry&&this.loadDataEntry(r.world,r.entry),this.initialize())}initialize(){let t=this.world.itemPalette.getRegistry(this.type.identifier);for(let a of t)this.hasTrait(a)||this.addTrait(a)}update(){if(!this.container)return;let t=this.container.storage.indexOf(this);this.amount<=0?this.container.clearSlot(t):this.container.setItem(t,this)}setAmount(t){this.amount=t,this.update()}decrement(t){this.setAmount(this.amount-(t??1))}increment(t){this.setAmount(this.amount+(t??1))}use(t,a){let r=!1;for(let n of this.traits.values()){a.canceled=r;try{let s=n.onUse?.(t,a);if(s===void 0)continue;r=!s}catch(s){t.getWorld().serenity.logger.error(`Failed to trigger onUse trait event for item "${this.type.identifier}" in dimension "${t.dimension.identifier}"`,s),this.traits.delete(n.identifier)}}return!r}hasTrait(t){return this.traits.has(typeof t=="string"?t:t.identifier)}getTrait(t){return this.traits.get(typeof t=="string"?t:t.identifier)}removeTrait(t){this.traits.get(typeof t=="string"?t:t.identifier)?.onRemove?.(),this.traits.delete(typeof t=="string"?t:t.identifier)}addTrait(t){if(this.traits.has(t.identifier))return this.getTrait(t.identifier);this.world&&!this.world.itemPalette.traits.has(t.identifier)&&this.world.logger.warn(`Trait "\xA7c${t.identifier}\xA7r" was added to itemstack "\xA7d${this.type.identifier}\xA7r" but does not exist in the palette. This may result in a deserilization error.`);try{if(t instanceof Ce)return this.traits.set(t.identifier,t),t.onAdd?.(),t;{let a=new t(this);return this.traits.set(a.identifier,a),a.onAdd?.(),a}}catch(a){return this.world.logger.error(`Failed to add trait "${t.identifier}" to itemstack "${this.type.identifier}"`,a),null}}equals(t){if(this.type.identifier!==t.type.identifier||this.auxillary!==t.auxillary||this.components.size!==t.components.size||this.traits.size!==t.traits.size||this.nbt.size!==t.nbt.size)return!1;let a=JSON.stringify([...this.components.entries()]),r=JSON.stringify([...t.components.entries()]);if(a!==r)return!1;for(let[n,s]of this.traits){let o=t.traits.get(n);if(!o||!s.equals(o))return!1}for(let[n,s]of this.nbt){let o=t.nbt.get(n);if(!o)return!1;let i=s.valueOf(!0),l=o.valueOf(!0);if(i!==l)return!1}return!0}getDataEntry(){return{identifier:this.type.identifier,amount:this.amount,auxillary:this.auxillary,components:[...this.components.entries()],traits:[...this.traits.keys()],nbt:this.nbt.serialize().toString("base64")}}loadDataEntry(t,a,r=!0){if(a.identifier!==this.type.identifier)throw new Error("Failed to load itemstack entry as the type identifier does not match!");r&&(this.components.clear(),this.traits.clear()),this.amount=a.amount,this.auxillary=a.auxillary;for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.itemPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for itemstack "${this.type.identifier}" as it does not exist in the palette`);continue}this.addTrait(s)}this.nbt.deserialize(Buffer.from(a.nbt,"base64"))}static toNetworkInstance(t){let a=t.type.block?.permutations[t.auxillary];return{network:t.type.network,stackSize:t.amount,metadata:t.auxillary,networkBlockId:a?.network??0,extras:{nbt:t.nbt.toCompound(),canDestroy:[],canPlaceOn:[]}}}static toNetworkStack(t){return{...Fs.toNetworkInstance(t),stackNetId:null}}static fromNetworkInstance(t){let a=Y.getByNetwork(t.network);return a?new this(a.identifier,{amount:t.stackSize??1,auxillary:t.metadata??0}):null}};var Ze=class extends Ce{static{c(this,"ItemBundleTrait")}static identifier="dynamic_container";static types=[N.Bundle,N.BlueBundle,N.BlackBundle,N.BrownBundle,N.CyanBundle,N.GrayBundle,N.GreenBundle,N.LightBlueBundle,N.LightGrayBundle,N.LimeBundle,N.MagentaBundle,N.OrangeBundle,N.PinkBundle,N.PurpleBundle,N.RedBundle,N.WhiteBundle,N.YellowBundle];container;constructor(t){if(super(t),t.components.has("dynamic_container")){let a=t.components.get("dynamic_container"),r=new Ua.IntTag("bundle_id",a);t.nbt.set("bundle_id",r)}else{let a=Math.abs(Date.now()>>4)+Math.floor(Math.random()*32);t.components.set("dynamic_container",a);let r=new Ua.IntTag("bundle_id",a);t.nbt.set("bundle_id",r)}this.container=new et(ce.ContainerType.None,ce.ContainerId.Registry,64)}get dynamicId(){return this.item.components.get("dynamic_container")??0}set dynamicId(t){this.item.components.set("dynamic_container",t);let a=new Ua.IntTag("bundle_id",t);this.item.nbt.set("bundle_id",a)}onContainerOpen(t){this.container.occupants.add(t)}onContainerClose(t){this.container.occupants.delete(t)}onTick(){let t=this.item.world.currentTick;if(this.container.occupants.size===0||t%5n!==0n)return;let a=new ce.InventoryContentPacket;a.containerId=ce.ContainerId.Registry,a.storageItem=C.toNetworkStack(this.item),a.fullContainerName=new ce.FullContainerName(ce.ContainerName.Dynamic,this.dynamicId),a.items=[];let r=Array.from(this.container.storage);for(let n=0;n<this.container.size;n++){let s=r[n];s?a.items.push(C.toNetworkStack(s)):a.items.push(new ce.NetworkItemStackDescriptor(0))}for(let n of this.container.occupants)n.send(a)}};var Et=require("@serenityjs/protocol");var $s=class extends Ce{static{c(this,"ItemEquippableTrait")}static identifier="equippable";slot=Et.EquipmentSlot.Chest;static types=[N.DiamondChestplate];onUse(t,a){if(a.method!=ae.Click||this.slot==null)return!1;let r=t.getTrait(ct);if(!r)return!1;let n=t.getTrait(k),s=new Et.LevelSoundEventPacket;return s.event=Et.LevelSoundEvent.EquipGeneric,s.position=t.position,s.actorIdentifier=t.type.identifier,s.data=-1,s.isBabyMob=!1,s.isGlobal=!1,t.send(s),n.container.swapItems(n.selectedSlot,this.slot,r.container),!0}};var Dt=require("@serenityjs/nbt");var qs=class extends Ce{static{c(this,"ItemEnchantableTrait")}static identifier="enchantable";getEnchantments(){let t=this.item.nbt.get("ench"),a=new Map;if(t)for(let{value:r}of t.value)a.set(r.id.value,r.lvl.value);return a}getEnchantment(t){return this.getEnchantments().get(t)??null}hasEnchantment(t){return this.getEnchantment(t)!==null}addEnchantment(t,a){let r=this.item.nbt.get("ench");if(r){let n=new Dt.CompoundTag;n.createShortTag("id",t),n.createShortTag("lvl",a),r.push(n)}this.item.nbt.set("ench",r)}getNbt(){return this.item.nbt.get("ench")}onAdd(){if(!this.item.nbt.has("ench")){let t=new Dt.ListTag("ench",[],Dt.Tag.Compound);this.item.nbt.add(t)}}onRemove(){this.item.nbt.delete("ench")}};var $a=Array();for(let e in Va){let t=Va[e];$a.push(t)}var Qa={};Ot(Qa,{EntityAirSupplyTrait:()=>Bs,EntityAttributeTrait:()=>pe,EntityCollision:()=>Xs,EntityEffectsTrait:()=>ut,EntityEquipmentTrait:()=>ct,EntityGravityTrait:()=>it,EntityHealthTrait:()=>L,EntityInventoryTrait:()=>k,EntityInvisibilityTrait:()=>Xt,EntityItemStackTrait:()=>xt,EntityMovementTrait:()=>_e,EntityNameTagTrait:()=>Kt,EntityPhysicsTrait:()=>ea,EntityTrait:()=>T,PlayerChunkRenderingTrait:()=>qe,PlayerCursorTrait:()=>ve,PlayerEntityRenderingTrait:()=>Js,PlayerExhaustionTrait:()=>Ya,PlayerHungerTrait:()=>Qs,PlayerListTrait:()=>Ys,PlayerSaturationTrait:()=>Ja,PlayerTrait:()=>Pe});var T=class extends bt{static{c(this,"EntityTrait")}static types=[];entity;constructor(t){super(),this.entity=t,t.addTrait(this)}clone(t){let a=new this.constructor(t,this.identifier);for(let[r,n]of Object.entries(this))r!=="entity"&&(a[r]=n);return a}};var Us=require("@serenityjs/protocol");var pe=class extends T{static{c(this,"EntityAttributeTrait")}attribute;effectiveMin=0;effectiveMax=0;defaultValue=0;get currentValue(){return this.get()?.current??this.defaultValue}set currentValue(t){this.set(t)}get(){return this.entity.attributes.get(this.attribute)}increase(t){this.set(this.currentValue+t)}decrease(t){this.set(this.currentValue-t)}set(t){let a={attribute:this.attribute,current:t,effectiveMin:this.effectiveMin,effectiveMax:this.effectiveMax,defaultValue:this.defaultValue},r=new Us.Attribute(this.effectiveMin,this.effectiveMax,t,-1/0,1/0,this.defaultValue,this.attribute,[]);this.entity.components.set(this.identifier,a),this.entity.attributes.set(this.attribute,r)}onSpawn(){if(this.entity.components.has(this.identifier)){let t=this.entity.components.get(this.identifier);this.set(t.current)}else this.set(this.defaultValue)}};var lt=require("@serenityjs/protocol");var _e=class extends pe{static{c(this,"EntityMovementTrait")}static identifier="movement";static types=[b.Player];attribute=lt.AttributeName.Movement;effectiveMin=0;effectiveMax=3402823466e29;defaultValue=.1;onTick(){if(!this.entity.isMoving)return;let t=new lt.MoveActorDeltaPacket;t.runtimeId=this.entity.runtimeId,t.flags=lt.MoveDeltaFlags.All,t.x=this.entity.position.x,t.y=this.entity.position.y,t.z=this.entity.position.z,t.yaw=this.entity.rotation.yaw,t.headYaw=this.entity.rotation.headYaw,t.pitch=this.entity.rotation.pitch,!this.entity.isPlayer()&&!this.entity.isItem()&&(t.y-=.25),this.entity.onGround&&(t.flags|=lt.MoveDeltaFlags.OnGround),this.entity.isPlayer()?this.entity.dimension.broadcastExcept(this.entity,t):this.entity.dimension.broadcast(t)}};var ee=require("@serenityjs/protocol");var L=class extends pe{static{c(this,"EntityHealthTrait")}static identifier="health";static types=[b.Player];attribute=ee.AttributeName.Health;effectiveMin=0;effectiveMax=20;defaultValue=20;applyDamage(t,a,r){if(!new Mr(this.entity,t,r,a).emit())return;this.currentValue-=t;let s=new ee.ActorEventPacket;s.actorRuntimeId=this.entity.runtimeId,s.eventId=ee.ActorEventIds.HURT_ANIMATION,s.eventData=r??ee.ActorDamageCause.None,this.entity.dimension.broadcast(s),this.currentValue<=0&&this.entity.kill(a,r)}set(t){new Ar(this.entity,this.currentValue,t).emit()&&super.set(t)}onInteract(t,a){if(a!==yt.Attack||!t.abilities.get(ee.AbilityIndex.AttackPlayers)&&this.entity.isPlayer()||!t.abilities.get(ee.AbilityIndex.AttackMobs)&&!this.entity.isPlayer()||this.entity.isPlayer()&&this.entity.gamemode===ee.Gamemode.Creative)return;let{headYaw:r,pitch:n}=t.rotation,s=r*Math.PI/180,o=n*Math.PI/180,i=-Math.sin(s)*Math.cos(o)/3.75,l=.2,m=Math.cos(s)*Math.cos(o)/3.75;this.entity.setMotion(new ee.Vector3f(i,l,m)),this.applyDamage(1,t,ee.ActorDamageCause.EntityAttack)}};var Pe=class extends T{static{c(this,"PlayerTrait")}player=this.entity};var se=require("@serenityjs/protocol");var qe=class extends Pe{static{c(this,"PlayerChunkRenderingTrait")}static identifier="chunk_rendering";static types=[b.Player];chunks=new Set;viewDistance=this.player.dimension.viewDistance;send(...t){let a=t.length,r=Math.ceil(a/8);for(let n=0;n<r;n++){let s=n*8,o=Math.min(s+8,a),l=t.slice(s,o).map(m=>{this.chunks.add(m.hash);let u=new se.LevelChunkPacket;return u.x=m.x,u.z=m.z,u.dimension=m.type,u.subChunkCount=m.getSubChunkSendCount(),u.cacheEnabled=!1,u.data=Z.serialize(m),u});this.player.send(...l)}}sent(t){return this.chunks.has(t)}distance(t){let{x:a,z:r}=se.ChunkCoords.unhash(t),n=this.player.position.x>>4,s=this.player.position.z>>4;return Math.hypot(a-n,r-s)}next(t){let a=this.player.position.x>>4,r=this.player.position.z>>4,n=t??this.viewDistance,s=[];for(let o=-n;o<=n;o++)for(let i=-n;i<=n;i++){let l=se.ChunkCoords.hash({x:a+o,z:r+i});if(this.chunks.has(l))continue;Math.hypot(o,i)<=n+.5&&s.push(l)}return s}clear(t){let a=t?[t]:[...this.chunks].map(n=>se.ChunkCoords.unhash(n)),r=new Z(0,0,this.player.dimension.type);for(let n of a){let s=new se.LevelChunkPacket;s.x=n.x,s.z=n.z,s.dimension=this.player.dimension.type,s.subChunkCount=r.getSubChunkSendCount(),s.cacheEnabled=!1,s.data=Z.serialize(r),this.player.send(s),this.chunks.delete(se.ChunkCoords.hash(n))}}onTick(){if(!this.player.isAlive)return;let a=[...this.next(),...this.chunks].filter(r=>!this.chunks.has(r)).map(r=>se.ChunkCoords.unhash(r));if(a.length>0){let r=a.map(n=>{if(this.chunks.has(se.ChunkCoords.hash(n)))return null;let s=this.player.dimension.getChunk(n.x,n.z);return s.ready?s:null}).filter(n=>n!==null);this.send(...r)}else{for(let n of this.chunks)if(this.distance(n)>this.viewDistance+.5){let{x:o,z:i}=se.ChunkCoords.unhash(n);this.clear({x:o,z:i})}let r=new se.NetworkChunkPublisherUpdatePacket;r.radius=this.viewDistance<<4,r.coordinate=this.player.position.floor(),r.savedChunks=[...this.chunks].map(n=>se.ChunkCoords.unhash(n)),this.player.send(r)}}onDespawn(){this.clear()}};var j=require("@serenityjs/protocol");var Qe=require("@serenityjs/protocol");var Vs=require("@serenityjs/protocol");var mt=class extends et{static{c(this,"EntityContainer")}entity;constructor(t,a,r,n){super(a,r,n),this.entity=t}setItem(t,a){super.setItem(t,a),a.world||(a.world=this.entity.getWorld()),a.initialize(),this.entity.isPlayer()&&this.update(this.entity)}clearSlot(t){super.clearSlot(t),this.entity.isPlayer()&&this.update(this.entity)}update(t){super.update(t);for(let a of this.entity.traits.values())try{a.onContainerUpdate?.(this)}catch(r){this.entity.getWorld().logger.error(`Failed to trigger onContainerUpdate trait event for entity "${this.entity.type.identifier}:${this.entity.uniqueId}" in dimension "${this.entity.dimension.identifier}"`,r),this.entity.traits.delete(a.identifier)}}show(t){if(!new Ut(t,this).emit())return;super.show(t);let r=new Vs.ContainerOpenPacket;r.identifier=this.identifier,r.type=this.type,r.position=this.entity.position,r.uniqueId=this.entity.uniqueId,t.send(r),this.update()}};var k=class extends T{static{c(this,"EntityInventoryTrait")}static identifier="inventory";static types=[b.Player];container;containerType=Qe.ContainerType.Inventory;containerId=Qe.ContainerId.Inventory;inventorySize=36;selectedSlot=0;constructor(t){super(t),this.container=new mt(t,this.containerType,this.containerId,this.inventorySize)}getHeldItem(){return this.container.getItem(this.selectedSlot)}setHeldItem(t){if(!this.entity.isPlayer())return;let a=new Qe.MobEquipmentPacket,r=this.getHeldItem(),n=r?C.toNetworkStack(r):new Qe.NetworkItemStackDescriptor(0);a.runtimeEntityId=this.entity.runtimeId,a.containerId=this.containerId,a.selectedSlot=t,a.slot=t,a.item=n,this.selectedSlot=t,this.entity.send(a)}onSpawn(){if(this.entity.components.has("inventory")){let t=this.entity.components.get("inventory");for(let a of t.items){let r=a[0],n=a[1],s=new C(n.identifier,{amount:n.amount,auxillary:n.auxillary,world:this.entity.getWorld(),entry:n});this.container.setItem(r,s)}}this.entity.isPlayer()&&this.container.update(this.entity)}onDespawn(){let t={size:this.inventorySize,items:[]};for(let a=0;a<this.inventorySize;a++){let r=this.container.getItem(a);if(r===null)continue;let n=r.getDataEntry();t.items.push([a,n])}this.entity.components.set("inventory",t)}};var ue=require("@serenityjs/protocol");var xt=class js extends T{static{c(this,"EntityItemStackTrait")}static identifier="itemstack";birthTick;itemStack;lifeSpan=6e3;pickupTick=null;target=null;merging=!1;constructor(t){if(super(t),t.type.identifier!==b.Item)throw new Error("Entity must be an item");let a=t.components.get("itemstack");a?this.itemStack=new C(a.identifier,{entry:a}):this.itemStack=new C(N.Air),this.birthTick=t.dimension.world.currentTick}getLifeSpan(){return this.lifeSpan}setLifeSpan(t){this.lifeSpan=t}pickup(t){this.entity.teleport(t.position),this.target=t,this.pickupTick=this.entity.dimension.world.currentTick}increment(t){this.itemStack.increment(t);let a=new ue.ActorEventPacket;a.eventId=ue.ActorEventIds.ITEM_ENTITY_MERGE,a.eventData=this.itemStack.amount,a.actorRuntimeId=this.entity.runtimeId,this.entity.dimension.broadcast(a)}decrement(t){this.itemStack.decrement(t);let a=new ue.ActorEventPacket;a.eventId=ue.ActorEventIds.ITEM_ENTITY_MERGE,a.eventData=this.itemStack.amount,a.actorRuntimeId=this.entity.runtimeId,this.entity.dimension.broadcast(a)}onTick(){this.entity.components.set("itemstack",this.itemStack.getDataEntry());let t=this.entity.dimension.world.currentTick;if(this.entity.onGround&&this.entity.dimension.world.currentTick%25n===0n&&this.pickupTick===null){let n=this.entity.dimension.getEntities().filter(s=>s.isItem());for(let[s,o]of n.entries()){if(this.merging&&s!==n.length-1||(this.merging&&s===n.length-1&&(this.merging=!1),o===this.entity))continue;let i=o.position.subtract(this.entity.position);if(Math.abs(i.x)<=.9&&Math.abs(i.y)<=.9&&Math.abs(i.z)<=.9){let l=o.getTrait(js),m=l.itemStack;if(m.amount>=m.maxAmount||!m.equals(this.itemStack))continue;this.increment(m.amount),l.entity.despawn(),this.merging=!0}}}if(this.target&&this.pickupTick&&t-this.pickupTick>=5n){let n=new ue.TakeItemActorPacket;n.itemRuntimeId=this.entity.runtimeId,n.targetRuntimeId=this.target.runtimeId;let s=new ue.LevelSoundEventPacket;s.event=ue.LevelSoundEvent.Pop,s.position=this.target.position,s.actorIdentifier=this.entity.type.identifier,s.data=-1,s.isBabyMob=!1,s.isGlobal=!1,this.target.send(s),this.target.dimension.broadcast(n),this.target.getTrait(k).container.addItem(this.itemStack),this.entity.despawn()}else if(this.target)return;if(t-this.birthTick<=10n||t%5n!==0n)return;let a=this.entity.dimension.getPlayers(),r=this.entity.position;for(let n of a){if(!n.isAlive)continue;let o=n.position.subtract(r);Math.abs(o.x)<=1&&Math.abs(o.y-1)<=1&&Math.abs(o.z)<=1&&(this.target=n,this.pickupTick=t)}t-this.birthTick>=BigInt(this.lifeSpan)&&this.entity.despawn()}};var Js=class extends Pe{static{c(this,"PlayerEntityRenderingTrait")}static identifier="entity_rendering";static types=[b.Player];entities=new Set;onTick(){if(!this.player.isAlive)return;let t=this.player.getTrait(qe);if(!t)return;let a=t.viewDistance<<4,r=this.player.dimension.entities;for(let[n,s]of r){if(this.entities.has(n)||s===this.player||!s.isAlive||this.distance(s.position,this.player.position)>a)continue;if(this.entities.add(n),s.isPlayer()){let i=new j.AddPlayerPacket,m=s.getTrait(k).getHeldItem();i.uuid=s.uuid,i.username=s.username,i.runtimeId=s.runtimeId,i.platformChatId="",i.position=s.position,i.velocity=s.velocity,i.pitch=s.rotation.pitch,i.yaw=s.rotation.yaw,i.headYaw=s.rotation.headYaw,i.heldItem=m===null?new j.NetworkItemStackDescriptor(0):C.toNetworkStack(m),i.gamemode=0,i.data=[...s.metadata.values()],i.properties=new j.PropertySyncData([],[]),i.uniqueEntityId=s.uniqueId,i.premissionLevel=s.permission,i.commandPermission=s.permission===2?1:0,i.abilities=[{type:j.AbilityLayerType.Base,abilities:[...s.abilities.entries()].map(([u,p])=>new j.AbilitySet(u,p)),walkSpeed:.1,flySpeed:.05}],i.links=[],i.deviceId="",i.deviceOS=0,this.player.send(i);continue}if(s.isItem()){let i=s.getTrait(xt),l=new j.AddItemActorPacket;l.uniqueId=s.uniqueId,l.runtimeId=s.runtimeId,l.item=C.toNetworkStack(i.itemStack),l.position=s.position,l.velocity=s.velocity,l.data=[...s.metadata.values()],l.fromFishing=!1,this.player.send(l);continue}let o=new j.AddEntityPacket;o.uniqueEntityId=s.uniqueId,o.runtimeId=s.runtimeId,o.identifier=s.type.identifier,o.position=s.position,o.velocity=s.velocity,o.pitch=s.rotation.pitch,o.yaw=s.rotation.yaw,o.headYaw=s.rotation.headYaw,o.bodyYaw=s.rotation.yaw,o.attributes=[],o.data=[...s.metadata.values()],o.properties=new j.PropertySyncData([],[]),o.links=[],this.player.send(o)}for(let n of this.entities)if(this.player.dimension.entities.has(n)){let s=this.player.dimension.entities.get(n);if(!s||this.distance(s.position,this.player.position)<=a)continue;let o=new j.RemoveEntityPacket;o.uniqueEntityId=n,this.player.send(o),this.entities.delete(n)}else{let s=new j.RemoveEntityPacket;s.uniqueEntityId=n,this.player.send(s),this.entities.delete(n)}}onDespawn(){this.clear()}clear(){for(let t of this.entities){let a=new j.RemoveEntityPacket;a.uniqueEntityId=t,this.player.send(a)}this.entities.clear()}distance(t,a){return Math.sqrt(Math.pow(t.x-a.x,2)+Math.pow(t.y-a.y,2)+Math.pow(t.z-a.z,2))}};var we=require("@serenityjs/protocol");var Ys=class extends Pe{static{c(this,"PlayerListTrait")}static identifier="player_list";static types=[b.Player];players=new Set;clear(){let t=new we.PlayerListPacket;t.action=we.PlayerListAction.Remove,t.records=[...this.players].map(a=>new we.PlayerListRecord(a)),this.players.clear(),this.player.send(t)}onTick(){if(!this.player.isAlive||this.player.dimension.world.currentTick%20n!==0n)return;let a=this.player.dimension.world.getPlayers(),r=a.filter(i=>!this.players.has(i.uuid)&&i.isAlive),n=new we.PlayerListPacket;n.action=we.PlayerListAction.Add,n.records=r.map(i=>({uniqueId:i.uniqueId,uuid:i.uuid,xuid:i.xuid,username:i.username,skin:i.skin,platformBuild:0,platformChatIdentifier:"",isHost:!1,isVisitor:!1,isTeacher:!1}));let s=[...this.players].filter(i=>!a.some(l=>l.uuid===i)),o=new we.PlayerListPacket;o.action=we.PlayerListAction.Remove,o.records=s.map(i=>new we.PlayerListRecord(i)),n.records.length>0&&this.player.send(n),o.records.length>0&&this.player.send(o);for(let i of r)this.players.add(i.uuid),i.metadata.update(),i.abilities.update(),i.abilities.update();for(let i of s)this.players.delete(i)}onDespawn(){this.clear()}};var ja=require("@serenityjs/protocol");var ve=class extends Pe{static{c(this,"PlayerCursorTrait")}static identifier="cursor";static types=[b.Player];container;containerType=ja.ContainerType.Inventory;containerId=ja.ContainerId.Ui;inventorySize=1;selectedSlot=0;constructor(t){super(t),this.container=new mt(t,this.containerType,this.containerId,this.inventorySize)}};var Ks=require("@serenityjs/protocol");var Ja=class extends pe{static{c(this,"PlayerSaturationTrait")}static identifier="saturation";static types=[b.Player];attribute=Ks.AttributeName.PlayerSaturation;effectiveMax=20;defaultValue=20;effectiveMin=0};var pt=require("@serenityjs/protocol");var Zs=require("@serenityjs/protocol");var Ya=class extends pe{static{c(this,"PlayerExhaustionTrait")}static identifier="exhaustion";static types=[b.Player];attribute=Zs.AttributeName.PlayerExhaustion;effectiveMax=5;defaultValue=0;effectiveMin=0};var Qs=class on extends pe{static{c(this,"PlayerHungerTrait")}static identifier="hunger";static types=[b.Player];starveableGamemodes=[pt.Gamemode.Adventure,pt.Gamemode.Survival];effectiveMax=20;effectiveMin=0;defaultValue=20;attribute=pt.AttributeName.PlayerHunger;exhaustionTrait;saturationTrait;timer=0;constructor(t){super(t),t.isPlayer()||t.removeTrait(on)}onTick(){if(!this.entity.isAlive||!this.entity.isPlayer()||!this.starveableGamemodes.includes(this.entity.gamemode))return;let t=this.entity.getTrait(L);this.timer++,this.timer>=80&&(this.timer=0),this.timer==0&&(this.currentValue>=18&&t.currentValue<t.effectiveMax?(t.set(t.currentValue+1),this.exhaust(6)):this.currentValue<=0&&t.applyDamage(1,void 0,pt.ActorDamageCause.Starve))}onSpawn(){this.exhaustionTrait=this.entity.getTrait(Ya),this.saturationTrait=this.entity.getTrait(Ja),(!this.exhaustionTrait||!this.saturationTrait)&&this.entity.removeTrait(on)}exhaust(t){if(!(!this.saturationTrait||!this.exhaustionTrait))for(this.exhaustionTrait.increase(t);this.exhaustionTrait.currentValue>=4;){if(this.exhaustionTrait.decrease(4),this.saturationTrait.currentValue>0){this.saturationTrait.set(Math.max(0,this.saturationTrait.currentValue-1));continue}this.currentValue>0&&this.currentValue--}}isHungry(){return this.currentValue<this.effectiveMax}};var cn=require("@serenityjs/protocol");var it=class extends T{static{c(this,"EntityGravityTrait")}static identifier="gravity";static types=[b.Player];onSpawn(){this.entity.flags.has(cn.ActorFlag.HasGravity)||this.entity.flags.set(cn.ActorFlag.HasGravity,!0)}};var U=require("@serenityjs/protocol");var Xs=class extends T{static{c(this,"EntityCollision")}static identifier="collision";static types=[b.Player];height=1.7;width=.6;onSpawn(){this.entity.flags.has(U.ActorFlag.HasCollision)||this.entity.flags.set(U.ActorFlag.HasCollision,!0),this.entity.metadata.has(U.ActorDataId.Reserved054)||this.setHeight(this.height),this.entity.metadata.has(U.ActorDataId.Reserved053)||this.setWidth(this.width)}onGamemodeChange(){this.entity.isPlayer()&&(this.entity.gamemode===U.Gamemode.Spectator?this.entity.flags.set(U.ActorFlag.HasCollision,!1):this.entity.flags.set(U.ActorFlag.HasCollision,!0))}setHeight(t){let a=new U.DataItem(U.ActorDataId.Reserved054,U.ActorDataType.Float,t);this.entity.metadata.set(U.ActorDataId.Reserved054,a),this.height=t}setWidth(t){let a=new U.DataItem(U.ActorDataId.Reserved053,U.ActorDataType.Float,t);this.entity.metadata.set(U.ActorDataId.Reserved053,a),this.width=t}};var J=require("@serenityjs/protocol");var Bs=class extends T{static{c(this,"EntityAirSupplyTrait")}static identifier="air_supply";static types=[b.Player];onTick(){if(!this.entity.isAlive||!this.entity.flags.get(J.ActorFlag.Breathing))return;let t=this.getAirSupplyTicks();if(!this.canBreathe()){if(this.setAirSupplyTicks(t-1),t>-20||(this.setAirSupplyTicks(0),!this.entity.hasTrait(L)))return;this.entity.getTrait(L).applyDamage(.5,void 0,this.entity.isSwimming?J.ActorDamageCause.Drowning:J.ActorDamageCause.Suffocation)}t>=300||this.setAirSupplyTicks(t+5)}canBreathe(){let t=this.entity.dimension.getBlock(this.entity.position.floor());return!t.isLiquid()&&!t.isSolid()||this.entity.hasEffect(J.EffectType.WaterBreathing)}onSpawn(){this.entity.flags.has(J.ActorFlag.Breathing)||this.entity.flags.set(J.ActorFlag.Breathing,!0),this.entity.metadata.has(J.ActorDataId.AirSupply)||this.setAirSupplyTicks(300)}getAirSupplyTicks(){let t=this.entity.metadata.get(J.ActorDataId.AirSupply);return t?t.value:0}setAirSupplyTicks(t){let a=new J.DataItem(J.ActorDataId.AirSupply,J.ActorDataType.Short,t);this.entity.metadata.set(J.ActorDataId.AirSupply,a)}};var X=require("@serenityjs/protocol");var Kt=class extends T{static{c(this,"EntityNameTagTrait")}static identifier="nametag";static types=[b.Player];onSpawn(){if(!this.entity.metadata.has(X.ActorDataId.Name)){let t=this.entity.isPlayer()?this.entity.username:"";this.setNameTag(t)}this.entity.metadata.has(X.ActorDataId.NametagAlwaysShow)||(this.entity.isPlayer()?this.setVisibility(!0):this.setVisibility(!1))}setNameTag(t){let a=new X.DataItem(X.ActorDataId.Name,X.ActorDataType.String,t);this.entity.metadata.set(X.ActorDataId.Name,a)}getNameTag(){let t=this.entity.metadata.get(X.ActorDataId.Name);return t?t.value:""}getVisibility(){let t=this.entity.metadata.get(X.ActorDataId.NametagAlwaysShow);return t?t.value===1:!1}setVisibility(t){let a=new X.DataItem(X.ActorDataId.NametagAlwaysShow,X.ActorDataType.Byte,t?1:0);this.entity.metadata.set(X.ActorDataId.NametagAlwaysShow,a),this.entity.flags.set(X.ActorFlag.AlwaysShowName,t)}};var ea=class extends T{static{c(this,"EntityPhysicsTrait")}static identifier="physics";gravity=.05;onTick(){if(this.entity.isAlive===!1)return;let t=this.entity.hasTrait(it),a=this.entity.dimension,r=this.entity.velocity,n=this.entity.position,s=.15,o=.15;if(r.isZero()?this.entity.isMoving=!1:this.entity.isMoving=!0,r.y!==0){let i=r.y<0?-1:1,l=Math.floor(n.x-s),m=Math.floor(n.y+r.y+o*i),u=Math.floor(n.z-s);if(a.getBlock({x:l,y:m,z:u}).isSolid()||Math.abs(r.y)<.01)this.entity.velocity.y=0;else{let h=a.getBlock({x:l,y:m-1,z:u});this.entity.velocity.y*=t?1-this.gravity:h.getType().friction,this.entity.position.y+=r.y}}if(r.z!==0){let i=r.z<0?-1:1,l=Math.floor(n.x+s),m=Math.floor(n.y+o),u=Math.floor(n.z+r.z+s*i);if(a.getBlock({x:l,y:m,z:u}).isSolid())this.entity.velocity.z=0,this.entity.velocity.z+=.16*-i;else if(Math.abs(r.z)<.01)this.entity.velocity.z=0;else{let d=a.getBlock({x:Math.floor(n.x),y:Math.floor(n.y+o),z:Math.floor(n.z)}).getType().friction;this.entity.velocity.z*=d,this.entity.position.z+=r.z}}if(r.x!==0){let i=r.x<0?-1:1,l=Math.floor(n.x+r.x+s*i),m=Math.floor(n.y+o),u=Math.floor(n.z+s);if(a.getBlock({x:l,y:m,z:u}).isSolid())this.entity.velocity.x=0,this.entity.velocity.x+=.16*-i;else if(Math.abs(r.x)<.01)this.entity.velocity.x=0;else{let d=a.getBlock({x:Math.floor(n.x),y:Math.floor(n.y+o),z:Math.floor(n.z)}).getType().friction;this.entity.velocity.x*=d,this.entity.position.x+=r.x}}if(t){let i=a.getBlock({x:Math.floor(n.x),y:Math.round(n.y+o-1),z:Math.floor(n.z)});i.isSolid()?(this.entity.velocity.y=0,this.entity.velocity.z!==0&&(this.entity.velocity.z*=i.getType().friction),this.entity.velocity.x!==0&&(this.entity.velocity.x*=i.getType().friction),this.entity.onGround=!0):(this.entity.velocity.y-=this.gravity,this.entity.onGround=!1)}}};var he=require("@serenityjs/protocol");var ut=class extends T{static{c(this,"EntityEffectsTrait")}static type=[b.Player];static identifier="effects";effects=new Map;onTick(){for(let[a,r]of this.effects){if(r.onTick?.(this.entity),!r.isExpired()){r.duration-=2;continue}this.remove(a)}let t=this.effects.size>1?8n:2n;if(this.entity.getWorld().currentTick%t==0n){let a=this.getParticleEffect();if(!a)return;let r=new he.LevelEventPacket;r.event=he.LevelEvent.ParticleLegacyEvent|34,r.data=a.color.toInt(),r.position=this.entity.position.subtract(new he.Vector3f(0,1,0)),this.entity.dimension.broadcast(r)}}remove(t){if(!this.effects.has(t)||(new Pr(this.entity,t).emit(),this.effects.get(t)?.onRemove?.(this.entity),this.effects.delete(t),!this.entity.isPlayer()))return;let r=new he.MobEffectPacket;r.runtimeId=this.entity.runtimeId,r.eventId=he.MobEffectEvents.EffectRemove,r.effectId=t,r.particles=!1,r.amplifier=0,r.duration=0,r.inputTick=this.entity.getWorld().currentTick,this.entity.send(r)}has(t){return this.effects.has(t)}add(t,a,r){let n=r?.showParticles??!0,s=r?.amplifier??0,o=this.entity.getWorld().effectPalette.getEffect(t),i=this.effects.get(t);if(!i&&o?i=new o(a,s,n):i&&(i.duration=i.duration+a,i.amplifier=Math.max(i.amplifier,s??0),i.showParticles=n??!0),!i||!new Cr(this.entity,i).emit()||(i.onAdd?.(this.entity),this.effects.set(t,i),!this.entity.isPlayer()))return;let m=new he.MobEffectPacket;m.runtimeId=this.entity.runtimeId,m.eventId=he.MobEffectEvents.EffectAdd,m.effectId=t,m.particles=i.showParticles,m.amplifier=i.amplifier,m.duration=i.duration,m.inputTick=this.entity.getWorld().currentTick,this.entity.send(m)}getParticleEffect(){let t=[...this.effects.values()].filter(a=>a.showParticles);return t[Math.floor(Math.random()*t.length)]}onSpawn(){let t=this.entity.components.get("entity_effects")??[];for(let a of t){let{effectType:r,duration:n,amplifier:s,showParticles:o}=a,i=this.entity.getWorld().effectPalette.getEffect(r);if(!i)return;this.effects.set(r,new i(n,s,o))}}onDespawn(){this.entity.components.set("entity_effects",[...this.effects.values()].map(t=>t.toString()))}};var Ka=require("@serenityjs/protocol");var Xt=class extends T{static{c(this,"EntityInvisibilityTrait")}static identifier="visibility";static types=[b.Player];onSpawn(){this.entity.flags.has(Ka.ActorFlag.Invisible)||this.entity.flags.set(Ka.ActorFlag.Invisible,!1)}setInvisibility(t){this.entity.flags.set(Ka.ActorFlag.Invisible,t)}};var Za=require("@serenityjs/protocol");var ct=class extends T{static{c(this,"EntityEquipmentTrait")}static identifier="equipment";static types=[b.Player];container;constructor(t){super(t),this.container=new mt(t,Za.ContainerType.Armor,Za.ContainerId.Armor,4)}setEquipment(t,a){this.container.setItem(t,a)}getEquipment(t){return this.container.getItem(t)}onSpawn(){if(!this.entity.components.has("equipment"))return;let t=this.entity.components.get("equipment");for(let a in t){let r=t[a],n=new C(r.identifier,{amount:r.amount,auxillary:r.auxillary,world:this.entity.getWorld(),entry:r});this.setEquipment(Number.parseInt(a),n)}}onDespawn(){let t={};for(let a of this.container.storage)a&&(t[this.container.storage.indexOf(a)]=a.getDataEntry());this.entity.components.set("equipment",t),console.dir(this.entity.components.get("equipment"),{depth:1/0,colors:!0})}};var Xa=require("@serenityjs/protocol");var ln=class extends Map{static{c(this,"MetadataMap")}entity;constructor(t){super(),this.entity=t}set(t,a){let r=new pr(this.entity,t,a);if(!r.emit())return this;let n=super.set(t,r.dataItem);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new Xa.SetActorDataPacket;t.runtimeEntityId=this.entity.runtimeId,t.inputTick=this.entity.isPlayer()?this.entity.inputTick:this.entity.dimension.world.currentTick,t.data=[...this.entity.metadata.values()],t.properties=new Xa.PropertySyncData([],[]);for(let[a,r]of this.entity.flags)t.setFlag(a,r);this.entity.dimension.broadcast(t)}};var Ba=require("@serenityjs/protocol");var mn=class extends Map{static{c(this,"ActorFlagMap")}entity;constructor(t){super(),this.entity=t}set(t,a){let r=new mr(this.entity,t,a);if(!r.emit())return this;let n=super.set(t,r.value);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new Ba.SetActorDataPacket;t.runtimeEntityId=this.entity.runtimeId,t.inputTick=this.entity.isPlayer()?this.entity.inputTick:this.entity.dimension.world.currentTick,t.data=[...this.entity.metadata.values()],t.properties=new Ba.PropertySyncData([],[]);for(let[a,r]of this.entity.flags)t.setFlag(a,r);this.entity.dimension.broadcast(t)}};var Is=require("@serenityjs/protocol");var pn=class extends Map{static{c(this,"AttributeMap")}entity;constructor(t){super(),this.entity=t}set(t,a){let r=new ur(this.entity,t,a);if(!r.emit())return this;let n=super.set(t,r.value);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new Is.UpdateAttributesPacket;t.runtimeActorId=this.entity.runtimeId,t.inputTick=this.entity.isPlayer()?this.entity.inputTick:this.entity.dimension.world.currentTick,t.attributes=[...this.entity.attributes.values()],this.entity.dimension.broadcast(t)}};var Xe=require("@serenityjs/protocol");var un=class extends Map{static{c(this,"AbilityMap")}player;constructor(t){super(),this.player=t}set(t,a){let r=new br(this.player,t,a);if(!r.emit())return this;let n=super.set(t,r.value);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}superSet(t,a){return super.set(t,a)}update(){let t=new Xe.UpdateAbilitiesPacket;if(t.permissionLevel=this.player.permission,t.commandPermissionLevel=this.player.permission===2?1:0,t.entityUniqueId=this.player.uniqueId,t.abilities=[{type:Xe.AbilityLayerType.Base,abilities:[...this.player.abilities.entries()].map(([r,n])=>new Xe.AbilitySet(r,n)),walkSpeed:.1,flySpeed:.05}],this.player.dimension.broadcast(t),!this.player.isAlive)return;let a=new Xe.SetPlayerGameTypePacket;a.gamemode=this.player.gamemode,this.player.send(a)}};var W=class hn{static{c(this,"Entity")}static runtimeId=0n;serenity;type;runtimeId=++hn.runtimeId;uniqueId;position=new O.Vector3f(0,0,0);velocity=new O.Vector3f(0,0,0);rotation=new O.Rotation(0,0,0);traits=new Map;components=new Map;metadata=new ln(this);flags=new mn(this);attributes=new pn(this);tags=new Set;scoreboardIdentity;dimension;isAlive=!1;isMoving=!1;onGround=!1;constructor(t,a,r){this.serenity=t.world.serenity,this.dimension=t,a instanceof re?this.type=a:this.type=t.world.entityPalette.getType(a),this.uniqueId=r?.uniqueId?r.uniqueId:hn.createUniqueId(this.type.network,this.runtimeId),this.position.set(t.spawnPosition),this.scoreboardIdentity=new Ue(this),this.isPlayer()||(r?.entry&&this.loadDataEntry(this.dimension.world,r.entry),this.initialize())}initialize(){let t=this.dimension.world.entityPalette.getRegistryFor(this.type.identifier);for(let a of this.type.components){let r=a;a.includes(":")&&(r=a.split(":")[1]);let n=this.dimension.world.entityPalette.getTrait(r);n&&t.push(n)}for(let a of t)this.hasTrait(a)||this.addTrait(a)}isPlayer(){return this.type.identifier===b.Player}isItem(){return this.type.identifier===b.Item}get isSneaking(){return this.flags.get(O.ActorFlag.Sneaking)??!1}get isSprinting(){return this.flags.get(O.ActorFlag.Sprinting)??!1}get isSwimming(){return this.flags.get(O.ActorFlag.Swimming)??!1}addEffect(t,a,r){(this.getTrait(ut)??this.addTrait(ut)).add(t,a*40,r)}removeEffect(t){let a=this.getTrait(ut);!a||!a.has(t)||a.remove(t)}hasEffect(t){return this.getTrait(ut)?.has(t)??!1}hasTrait(t){return this.traits.has(typeof t=="string"?t:t.identifier)}getViewDirection(){let t=this.rotation.pitch*(Math.PI/180),a=-this.rotation.headYaw*(Math.PI/180);return new O.Vector3f(Math.sin(a)*Math.cos(t),-Math.sin(t),Math.cos(a)*Math.cos(t))}getTrait(t){return this.traits.get(typeof t=="string"?t:t.identifier)}removeTrait(t){this.traits.get(typeof t=="string"?t:t.identifier)?.onRemove?.(),this.traits.delete(typeof t=="string"?t:t.identifier)}addTrait(t){if(this.traits.has(t.identifier))return this.getTrait(t.identifier);this.getWorld().entityPalette.traits.has(t.identifier)||this.getWorld().logger.warn(`Trait "\xA7c${t.identifier}\xA7r" was added to entity "\xA7d${this.type.identifier}\xA7r:\xA7d${this.uniqueId}\xA7r" in dimension "\xA7a${this.dimension.identifier}\xA7r" but does not exist in the palette. This may result in a deserilization error.`);try{if(t instanceof T)return this.traits.set(t.identifier,t),t.onAdd?.(),t;{let a=new t(this);return this.traits.set(t.identifier,a),a.onAdd?.(),a}}catch(a){return this.serenity.logger.error(`Failed to add trait "${t.identifier}" to entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,a),null}}getWorld(){return this.dimension.world}getChunk(){let t=this.position.x>>4,a=this.position.z>>4;return this.dimension.getChunk(t,a)}getHeldItem(){return this.hasTrait(k)?this.getTrait(k).getHeldItem():null}getCardinalDirection(){let t=(Math.floor(this.rotation.yaw)+360)%360;return t>=315||t<45?E.South:t>=45&&t<135?E.West:t>=135&&t<225?E.North:t>=225&&t<315?E.East:E.South}spawn(){if(!new cr(this,this.dimension).emit())return this;this.dimension.entities.set(this.uniqueId,this),this.isAlive=!0;for(let a of this.traits.values())try{a.onSpawn?.()}catch(r){this.serenity.logger.error(`Failed to trigger onSpawn trait event for entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,r),this.traits.delete(a.identifier)}return this.metadata.update(),this.attributes.update(),this}despawn(){if(!new lr(this,this.dimension).emit())return this;this.isAlive=!1,this.dimension.entities.delete(this.uniqueId);for(let a of this.traits.values())try{a.onDespawn?.()}catch(r){this.serenity.logger.error(`Failed to trigger onDespawn trait event for entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,r),this.traits.delete(a.identifier)}return this}kill(t,a){if(new Wr(this,t,a).emit(),this.isAlive=!1,this.hasTrait(k)){let{container:r,inventorySize:n}=this.getTrait(k);for(let s=0;s<n;s++){let o=r.getItem(s);o&&(this.dimension.spawnItem(o,this.position),r.clearSlot(s))}}if(this.hasTrait(L)){let r=this.getTrait(L);r.currentValue=r.effectiveMin}this.dimension.schedule(50).on(()=>{if(!this.isPlayer())this.despawn();else for(let r of this.traits.values())r.onDespawn?.()})}interact(t,a){if(a===yt.Interact){if(!new Er(t,this,t.getHeldItem(),null).emit())return}else if(!new Dr(t,this).emit())return;for(let r of this.traits.values())try{r.onInteract?.(t,a)}catch(n){this.serenity.logger.error(`Failed to trigger onInteract trait event for entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,n),this.traits.delete(r.identifier)}}getContainer(t,a){if(a){if(!this.hasTrait(k))return null;let{container:r}=this.getTrait(k);for(let n of r.storage)if(n&&n.hasTrait(Ze)){let s=n.getTrait(Ze);if(s.dynamicId===a)return s.container}}switch(t){default:return null;case O.ContainerName.Armor:{if(!this.hasTrait(ct))throw new Error("The player does not have an equipment trait.");return this.getTrait(ct).container}case O.ContainerName.Hotbar:case O.ContainerName.Inventory:case O.ContainerName.HotbarAndInventory:{if(!this.hasTrait(k))throw new Error("The entity does not have an inventory trait.");return this.getTrait(k).container}}}setMotion(t){this.velocity.x=t?.x??this.velocity.x,this.velocity.y=t?.y??this.velocity.y,this.velocity.z=t?.z??this.velocity.z,this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.position.z+=this.velocity.z,this.onGround=!1;let a=new O.SetActorMotionPacket;a.runtimeId=this.runtimeId,a.motion=this.velocity,a.inputTick=this.isPlayer()?this.inputTick:this.dimension.world.currentTick,this.dimension.broadcast(a)}addMotion(t){this.velocity.x+=t.x,this.velocity.y+=t.y,this.velocity.z+=t.z,this.setMotion()}clearMotion(){this.velocity.x=0,this.velocity.y=0,this.velocity.z=0,this.setMotion()}applyImpulse(t){this.velocity.x+=t.x,this.velocity.y+=t.y,this.velocity.z+=t.z,this.setMotion()}teleport(t,a){if(this.position.x=t.x,this.position.y=t.y,this.position.z=t.z,a){if(!new qt(this,this.dimension,a).emit())return;this.despawn(),this.dimension=a,this.spawn()}else{let r=new O.MoveActorDeltaPacket;r.runtimeId=this.runtimeId,r.flags=O.MoveDeltaFlags.All,r.x=this.position.x,r.y=this.position.y,r.z=this.position.z,r.yaw=this.rotation.yaw,r.headYaw=this.rotation.headYaw,r.pitch=this.rotation.pitch,this.onGround&&(r.flags|=O.MoveDeltaFlags.OnGround),this.dimension.broadcast(r)}}getSelectedSlot(){if(!this.hasTrait(k))throw new Error("The entity does not have an inventory trait.");return this.getTrait(k).selectedSlot}dropItem(t,a,r){if(!this.hasTrait(k))return!1;let n=r.takeItem(t,a);if(!n)return!1;let{x:s,y:o,z:i}=this.position,{headYaw:l,pitch:m}=this.rotation,u=l*Math.PI/180,p=m*Math.PI/180,h=new O.Vector3f(-Math.sin(u)*Math.cos(p)/3/.5,-Math.sin(p)/2*.75,Math.cos(u)*Math.cos(p)/3/.5);return this.dimension.spawnItem(n,new O.Vector3f(s,o-.25,i)).addMotion(h),!0}hasTag(t){return this.tags.has(t)}getTags(){return[...this.tags]}addTag(t){return this.tags.has(t)?!1:(this.tags.add(t),!0)}removeTag(t){return this.tags.has(t)?(this.tags.delete(t),!0):!1}executeCommand(t){return t.startsWith("/")&&(t=t.slice(1)),new nt(this.getWorld().commands.getAll(),t,this).execute()}getDataEntry(){return{uniqueId:this.uniqueId,identifier:this.type.identifier,position:this.position,rotation:this.rotation,components:[...this.components.entries()],traits:[...this.traits.keys()],metadata:[...this.metadata.entries()],flags:[...this.flags.entries()],attributes:[...this.attributes.entries()],scoreboardIdentity:this.scoreboardIdentity.identifier}}loadDataEntry(t,a,r=!0){if(a.uniqueId!==this.uniqueId)throw new Error("Failed to load entity entry as the unique id does not match the entity's unique id!");if(a.identifier!==this.type.identifier)throw new Error("Failed to load entity entry as the identifier does not match the entity's identifier!");this.position.set(a.position),this.rotation.set(a.rotation),this.scoreboardIdentity=new Ue(this,a.scoreboardIdentity),r&&(this.components.clear(),this.traits.clear());for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.entityPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for entity "${this.type.identifier}:${this.uniqueId}" as it does not exist in the palette`);continue}this.addTrait(s)}for(let[n,s]of a.metadata)this.metadata.has(n)||this.metadata.set(n,s);for(let[n,s]of a.flags)this.flags.has(n)||this.flags.set(n,s);for(let[n,s]of a.attributes)this.attributes.has(n)||this.attributes.set(n,s)}static createUniqueId(t,a){let r=BigInt(Math.abs(Date.now()>>4)&511);return BigInt(t<<19)|r<<10n|a}};var y=require("@serenityjs/protocol");var Te=require("@serenityjs/protocol");var ca=class eo{static{c(this,"Device")}identifier;model;os;maxViewDistance;memoryTier;inputMode=Te.InputMode.Unknown;interactionMode=Te.InteractionMode.Classic;playMode=Te.PlayMode.Normal;constructor(t,a,r,n,s){this.identifier=t,this.model=a,this.os=r,this.maxViewDistance=n,this.memoryTier=s}static empty(){return new eo("","",Te.DeviceOS.Undefined,0,Te.MemoryTier.Undetermined)}};var zi={username:"SerenityJS",xuid:"0000000000000000",uuid:"00000000-0000-0000-0000-000000000000",uniqueId:0n,device:ca.empty(),skin:y.SerializedSkin.empty()},me=class extends W{static{c(this,"Player")}connection;username;xuid;uuid;traits=new Map;abilities=new un(this);device;skin;inputTick=0n;permission;openedContainer=null;blockTarget=null;itemTarget=null;entityTarget=null;get gamemode(){return this.components.has("gamemode")||this.components.set("gamemode",y.Gamemode.Survival),this.components.get("gamemode")}set gamemode(t){if(!new vr(this,this.gamemode,t).emit())return;this.components.set("gamemode",t);for(let n of this.traits.values())n.onGamemodeChange?.(t);switch(t){case y.Gamemode.Survival:case y.Gamemode.Adventure:{this.abilities.set(y.AbilityIndex.MayFly,!1);break}case y.Gamemode.Creative:case y.Gamemode.Spectator:{this.abilities.set(y.AbilityIndex.MayFly,!0);break}}let r=new y.SetPlayerGameTypePacket;r.gamemode=t,this.send(r)}constructor(t,a,r){super(t,b.Player,r),this.connection=a;let n={...zi,...r};this.username=n.username,this.xuid=n.xuid,this.uuid=n.uuid,this.device=n.device,this.skin=n.skin,this.permission=this.serenity.permissions.get(this.uuid),r?.entry&&this.loadDataEntry(t.world,r.entry),this.initialize()}initialize(){let t=this.dimension.world.entityPalette.getRegistryFor(this.type.identifier);for(let a of t)this.hasTrait(a)||this.addTrait(a);for(let[a,r]of Object.entries(y.DefaultAbilityValues))this.abilities.has(+a)||this.abilities.set(+a,r)}send(...t){this.serenity.network.sendNormal(this.connection,...t)}sendImmediate(...t){this.serenity.network.sendImmediate(this.connection,...t)}isOp(){return this.permission===y.PermissionLevel.Operator}op(){this.permission=y.PermissionLevel.Operator,this.serenity.permissions.set(this.uuid,y.PermissionLevel.Operator),this.abilities.set(y.AbilityIndex.OperatorCommands,!0),this.abilities.set(y.AbilityIndex.Teleport,!0)}deop(){this.permission=y.PermissionLevel.Member,this.serenity.permissions.set(this.uuid,y.PermissionLevel.Member),this.abilities.set(y.AbilityIndex.OperatorCommands,!1),this.abilities.set(y.AbilityIndex.Teleport,!1)}disconnect(t,a,r){let n=new y.DisconnectPacket;n.message=new y.DisconnectMessage(t,t),n.reason=a??y.DisconnectReason.Kicked,n.hideDisconnectScreen=r??!1,this.sendImmediate(n),this.despawn()}sendMessage(t){let a=new y.TextPacket;a.type=y.TextPacketType.Raw,a.needsTranslation=!1,a.source=null,a.message=t,a.parameters=null,a.xuid="",a.platformChatId="",a.filtered="",this.send(a)}getContainer(t,a){let r=super.getContainer(t,a);if(r===null&&t===y.ContainerName.Dynamic){if(!this.hasTrait(ve))throw new Error("The player does not have a cursor trait.");let{container:n}=this.getTrait(ve);for(let s of n.storage)if(s&&s.hasTrait(Ze)){let o=s.getTrait(Ze);if(o.dynamicId===a)return o.container}}if(r!==null)return r;switch(t){default:return this.openedContainer;case y.ContainerName.Cursor:{if(!this.hasTrait(ve))throw new Error("The player does not have a cursor trait.");return this.getTrait(ve).container}}}spawn(){super.spawn(),this.abilities.update();let t=new y.CreativeContentPacket;t.items=this.getWorld().itemPalette.getCreativeContent().map(r=>({network:r.type.network,metadata:r.metadata,stackSize:1,networkBlockId:r.type.block?.permutations[r.metadata]?.network??0,extras:{canDestroy:[],canPlaceOn:[],nbt:r.nbt}}));let a=this.getWorld().commands.serialize();return a.commands=a.commands.filter(r=>r.permissionLevel<=this.permission),this.send(t,a),this}transfer(t,a,r=!1){let n=new y.TransferPacket;n.address=t,n.port=a,n.reloadWorld=r,this.send(n)}teleport(t,a){if(this.position.x=t.x,this.position.y=t.y,this.position.z=t.z,a){if(!new qt(this,this.dimension,a).emit())return;if(this.despawn(),a.world!==this.dimension.world){this.getWorld().provider.writePlayer(this.getDataEntry(),this.dimension);let n=a.world.provider.readPlayer(this.uuid,a);n?this.loadDataEntry(a.world,n,!0):(this.components.clear(),this.traits.clear(),this.abilities.clear(),this.metadata.clear(),this.flags.clear()),this.initialize()}if(this.dimension.type!==a.type){let n=new y.ChangeDimensionPacket;n.dimension=a.type,n.position=t,n.respawn=!0,n.hasLoadingScreen=!1,this.sendImmediate(n)}return this.dimension=a,this.spawn(),this.teleport(t)}else{let r=new y.MovePlayerPacket;r.runtimeId=this.runtimeId,r.position=t,r.pitch=this.rotation.pitch,r.yaw=this.rotation.yaw,r.headYaw=this.rotation.headYaw,r.mode=y.MoveMode.Teleport,r.onGround=this.onGround,r.riddenRuntimeId=0n,r.cause=new y.TeleportCause(4,0),r.inputTick=this.inputTick,this.send(r)}}getDataEntry(){return{username:this.username,xuid:this.xuid,uuid:this.uuid,uniqueId:this.uniqueId,identifier:this.type.identifier,position:this.position,rotation:this.rotation,components:[...this.components.entries()],traits:[...this.traits.keys()],metadata:[...this.metadata.entries()],flags:[...this.flags.entries()],attributes:[...this.attributes.entries()],abilities:[...this.abilities.entries()],scoreboardIdentity:this.scoreboardIdentity.identifier}}loadDataEntry(t,a,r=!0){if(a.username!==this.username)throw new Error("Failed to load player entry as the username does not match the player's username!");if(a.uuid!==this.uuid)throw new Error("Failed to load player entry as the uuid does not match the player's uuid!");if(a.xuid!==this.xuid)throw new Error("Failed to load player entry as the xuid does not match the player's xuid!");if(a.uniqueId!==this.uniqueId)throw new Error("Failed to load player entry as the unique id does not match the player's unique id!");if(a.identifier!==this.type.identifier)throw new Error("Failed to load player entry as the identifier does not match the player's identifier!");this.position.set(a.position),this.rotation.set(a.rotation),r&&(this.components.clear(),this.traits.clear(),this.abilities.clear());for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.entityPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for player "${this.username}:${this.uniqueId}" as it does not exist in the palette`);continue}this.addTrait(s)}for(let[n,s]of a.metadata)this.metadata.has(n)||this.metadata.set(n,s);for(let[n,s]of a.flags)this.flags.has(n)||this.flags.set(n,s);for(let[n,s]of a.attributes)this.attributes.has(n)||this.attributes.set(n,s);for(let[n,s]of a.abilities)this.abilities.has(n)||this.abilities.set(n,s)}};var Br=class{static{c(this,"EntityPalette")}types=re.types;traits=new Map;registry=new Map;constructor(){for(let t of Ia)this.registerTrait(t)}getAllTypes(){return[...this.types.values()]}getAllCustomTypes(){return this.getAllTypes().filter(t=>t instanceof Gr)}getType(t){return this.types.get(t)}getTypeByUnique(t){let a=Number(t>>19n);for(let r of this.types.values())if(r.network===a)return r;return null}registerType(t){return this.types.has(t.identifier)?!1:(this.types.set(t.identifier,t),St.options.push(t.identifier),!0)}getRegistryFor(t){return this.registry.get(t)||[]}registerTrait(t){if(this.traits.has(t.identifier))return!1;this.traits.set(t.identifier,t);for(let a of t.types??[]){this.registry.has(a)||this.registry.set(a,[]);let r=this.registry.get(a);r&&(r.push(t),this.registry.set(a,r))}return!0}removeTrait(t){if(!this.traits.has(t))return!1;let a=this.traits.get(t);if(!a)return!1;for(let r of a.types??[]){let n=this.registry.get(r);n&&this.registry.set(r,n.filter(s=>s!==a))}return this.traits.delete(t),!0}getAllTraits(){return[...this.traits.values()]}getTrait(t){return this.traits.get(t)||null}};var Ia=Array();for(let e in Qa){let t=Qa[e];Ia.push(t)}var to=class extends w{static{c(this,"InventoryTransactionHandler")}static packet=R.Packet.InventoryTransaction;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();if(t.transaction)switch(t.transaction.type){case R.ComplexInventoryTransaction.NormalTransaction:return this.handleNormalTransaction(r,t.transaction.actions);case R.ComplexInventoryTransaction.ItemUseTransaction:{let n=t.transaction.itemUse;if(!n)throw new Error("ItemUse object missing from ItemUseTransaction");return this.handleItemUseTransaction(r,n)}case R.ComplexInventoryTransaction.ItemUseOnEntityTransaction:{let n=t.transaction.itemUseOnEntity;if(!n)throw new Error("ItemUseOnEntity object missing from ItemUseOnEntityTransaction");return this.handleItemUseOnEntityTransaction(r,n)}case R.ComplexInventoryTransaction.ItemReleaseTransaction:return console.log("TODO: Implement item release transaction")}}handleNormalTransaction(t,a){for(let r of a)switch(r.source.type){default:{this.serenity.logger.debug(`InventoryTransactionHandler: Unimplemented inventory source type: ${R.InventorySourceType[r.source.type]}`);break}case R.InventorySourceType.ContainerInventory:break;case R.InventorySourceType.WorldInteraction:{let n=r.newItem.stackSize??1,s=t.getTrait(k),o=s.container.getItem(r.slot);if(!new yr(t,o,n).emit()){o.update();break}t.dropItem(s.selectedSlot,n,s.container);break}}}handleItemUseTransaction(t,a){let r=t.dimension;switch(a.type){case R.ItemUseInventoryTransactionType.Place:{let n=r.getBlock(a.blockPosition);if(!a.initialTransaction)return void n.interact(t);if(n.isAir()||!n.interact(t)||t.openedContainer||!t.itemTarget)return;let s=t.itemTarget;if(s.type.network!==a.item.network)return;let o=s.type.block;if(!o||o.identifier===P.Air)return;let i=n.face(a.face),l=i.getPermutation();if(!i.isAir())return;let m=o.permutations[s.auxillary]??o.getPermutation(),u=new gr(i,t,m,a.face,a.clickPosition).emit();if(s.components.has("block_data")){let H=s.components.get("block_data");i.loadDataEntry(i.getWorld(),H),i.setPermutation(m,H)}else i.setPermutation(m);let p=!1;for(let H of i.traits.values()){let de=a.clickPosition,Me=H.onPlace?.(t,de);Me!==void 0&&(p=!Me)}let h=ae.Place,d=i,S=s.use(t,{method:h,targetBlock:d})&&new Oe(t,s,h).emit(),x=new R.LevelSoundEventPacket;if(x.event=R.LevelSoundEvent.Place,x.position=R.BlockPosition.toVector3f(i.position),x.data=i.permutation.network,x.actorIdentifier="",x.isBabyMob=!1,x.isGlobal=!1,p||!u)return i.setPermutation(l);if(i.dimension.broadcast(x),S){if(t.gamemode===R.Gamemode.Survival)return s.decrement()}else return s.increment();break}case R.ItemUseInventoryTransactionType.Use:{if(t.itemTarget){let n=t.itemTarget;if(n.type.network!==a.item.network)return;let s=ae.Use;n.use(t,{method:s}),new Oe(t,n,s).emit()}else{let n=t.getHeldItem();if(n.type.network!==a.item.network)return;let s=ae.Click;n.use(t,{method:s}),new Oe(t,n,s).emit()}break}case R.ItemUseInventoryTransactionType.Destroy:console.log("TODO: Implement destroy item use transaction")}}handleItemUseOnEntityTransaction(t,a){let n=t.dimension.getEntity(a.actorRuntimeId,!0);if(!n)return;let s=a.type;if(n.interact(t,s),t.getHeldItem()){let o=t.getHeldItem(),i=a.type===0?ae.Place:ae.Use;o.use(t,{method:i,targetEntity:n}),new Oe(t,o,i).emit()}}};var ht=require("@serenityjs/protocol");var ao=class extends w{static{c(this,"ItemStackRequestHandler")}static packet=ht.Packet.ItemStackRequest;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();for(let n of t.requests)for(let s of n.actions){if(s.takeOrPlace){let o=s.takeOrPlace,i=o.source.container,l=o.destination.container,m=o.source.slot,u=o.destination.slot,p=o.amount??1;if(i.identifier===ht.ContainerName.CreativeOutput)break;let h=r.getContainer(i.identifier,i.dynamicIdentifier);if(!h)throw new Error(`Invalid source type: ${ht.ContainerName[i.identifier]}`);let d=r.getContainer(l.identifier,l.dynamicIdentifier);if(!d)throw new Error(`Invalid destination type: ${ht.ContainerName[l.identifier]}`);let S=h.getItem(m);if(!S)throw new Error("Invalid source item.");let x=d.getItem(u);if(p<=S.amount){let H=h.takeItem(m,p);if(!H)throw new Error("Invalid item.");if(x)x.increment(H.amount);else{d.setItem(u,H);let de=r.getTrait(ve);if(!de)throw new Error("Invalid cursor.");de.container.getItem(0)===null&&de.container.clearSlot(0)}}else throw new Error("Invalid count possible.")}if(s.drop){let o=s.drop,i=o.source,l=i.slot,m=o.amount,u=r.getContainer(i.container.identifier);if(!u)throw new Error(`Invalid container: ${i.container.identifier}`);r.dropItem(l,m,u)}if(s.swap){let o=s.swap,i=o.source.container,l=o.source.slot,m=o.destination.container,u=o.destination.slot,p=r.getContainer(i.identifier,i.dynamicIdentifier);if(!p)throw new Error(`Invalid source container: ${i.identifier}`);let h=r.getContainer(m.identifier,m.dynamicIdentifier);if(!h)throw new Error(`Invalid destination container: ${m.identifier}`);if(!p.getItem(l))throw new Error("Invalid source item.");if(!h.getItem(u))throw new Error("Invalid destination item.");p.swapItems(l,u,h)}if(s.destroyOrConsume){let i=s.destroyOrConsume.source;if(!i)continue;i.container.identifier===ht.ContainerName.Cursor?r.getTrait(ve).container.clearSlot(0):r.getTrait(k).container.clearSlot(i.slot)}if(s.craftRecipe){let o=n.actions[1];if(!o.resultsDeprecated)throw new Error("Invalid item instance action.");let i=o.resultsDeprecated.resultants,l=n.actions.at(-1);if(!l.takeOrPlace)throw new Error("Invalid destination action.");let m=r.getContainer(l.takeOrPlace.destination.container.identifier);if(!m)throw new Error(`Invalid destination: ${l.takeOrPlace.destination.container.identifier}`);for(let u of i){let p=C.fromNetworkInstance(u);if(!p)throw new Error("Failed to convert network descriptor to item stack.");p.setAmount(p.amount*s.craftRecipe.amount),m.addItem(p)}}if(s.craftCreative){let o=n.actions[2];if(!o.takeOrPlace)throw new Error("Invalid destination.");let i=o.takeOrPlace.destination,l=o.takeOrPlace.amount,m=r.getContainer(i.container.identifier);if(!m)throw new Error(`Invalid container: ${i.container.identifier}`);let u=s.craftCreative,p=r.dimension.world,h=p.itemPalette.getCreativeContentByIndex(u.creativeIndex);if(!h)throw new Error(`Received invalid creative item: ${u.creativeIndex}`);let d=new C(h.type,{amount:l,world:p});m.setItem(i.slot,d)}}}};var te=require("@serenityjs/protocol"),ro=require("fast-jwt");var no=class so extends w{static{c(this,"LoginHandler")}static packet=te.Packet.Login;static decoder=(0,ro.createDecoder)();handle(t,a){let r=so.decode(t.tokens),n=r.identityData.XUID,s=r.identityData.identity,o=r.identityData.displayName;if(n.length<16)return this.network.disconnectConnection(a,"Failed to connect due to having an invalid xuid. Make sure you are connected to Xbox Live before joining the server.",te.DisconnectReason.InvalidTenant);this.serenity.getPlayerByXuid(n)&&this.serenity.getPlayerByXuid(n).disconnect("You have been disconnected from the server because you logged in from another location.",te.DisconnectReason.LoggedInOtherLocation);let i=this.serenity.getWorld();if(!i)return this.network.disconnectConnection(a,"There are no worlds registered within the server process.",te.DisconnectReason.WorldCorruption);let l=i.getDimension();if(!l)return this.network.disconnectConnection(a,"There are no dimensions registered within the world instance.",te.DisconnectReason.WorldCorruption);let m=new ca(r.clientData.DeviceId,r.clientData.DeviceModel,r.clientData.DeviceOS,r.clientData.MaxViewDistance,r.clientData.MemoryTier),u=i.provider.readPlayer(s,l),p=te.SerializedSkin.from(r.clientData),h={username:o,xuid:n,uuid:s,device:m,skin:p};u&&(h.uniqueId=u.uniqueId,h.entry=u);let d=new me(l,a,h);if(this.serenity.players.set(a,d),!new hr(d).emit())return d.disconnect("Failed to join the server.",te.DisconnectReason.Kicked);let x=new te.PlayStatusPacket;x.status=te.PlayStatus.LoginSuccess;let H=new te.ResourcePacksInfoPacket;H.mustAccept=!1,H.hasAddons=!1,H.hasScripts=!1,H.packs=[],i.logger.info(`\xA78[\xA79${d.username}\xA78] Event:\xA7r Player joined the server.`),d.send(x,H)}static decode(t){let a=this.decoder(t.client),n=JSON.parse(t.identity).chain.map(i=>this.decoder(i)),s=n.find(i=>i.extraData!==void 0)?.extraData,o=n.find(i=>i.identityPublicKey!==void 0)?.identityPublicKey;return{clientData:a,identityData:s,publicKey:o}}};var Mt=require("@serenityjs/protocol");var oo=class extends w{static{c(this,"MobEquipmentHandler")}static packet=Mt.Packet.MobEquipment;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.getTrait(k);n.selectedSlot=t.selectedSlot;let s=n.getHeldItem(),o=new Mt.MobEquipmentPacket;o.runtimeEntityId=r.runtimeId,o.slot=t.selectedSlot,o.selectedSlot=t.selectedSlot,o.containerId=n.container.identifier,o.item=s===null?new Mt.NetworkItemStackDescriptor(0):C.toNetworkStack(s),r.dimension.broadcastExcept(r,o)}};var dt=require("@serenityjs/protocol");var io=class extends w{static{c(this,"PlayerActionHandler")}static packet=dt.Packet.PlayerAction;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();switch(t.action){default:{this.serenity.logger.debug(`PlayerActionHandler: Unimplemented PlayerActionType: ${dt.PlayerActionType[t.action]}`);break}case dt.PlayerActionType.StartItemUseOn:{r.itemTarget=r.getHeldItem();break}case dt.PlayerActionType.StopItemUseOn:{r.itemTarget=null;break}case dt.PlayerActionType.CreativeDestroyBlock:break}}};var f=require("@serenityjs/protocol");var co=class extends w{static{c(this,"PlayerAuthInputHandler")}static packet=f.Packet.PlayerAuthInput;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();r.position.x=t.position.x,r.position.y=t.position.y,r.position.z=t.position.z,r.rotation.pitch=t.rotation.x,r.rotation.yaw=t.rotation.y,r.rotation.headYaw=t.headYaw,r.device.inputMode=t.inputMode,r.device.interactionMode=t.interactionMode,r.device.playMode=t.playMode;let n=r.position.floor(),s=r.dimension.getPermutation({...n,y:n.y-2});if(r.onGround=s.type.solid,r.inputTick=t.inputTick,r.isMoving=!0,t.blockActions)if(t.itemStackRequest){let o=t.itemStackRequest.actions.find(i=>i.action===f.ItemStackRequestActionType.ScreenHUDMineBlock&&i.mineBlock);o&&this.handleBlockActions(r,t.blockActions.actions,o.mineBlock)}else this.handleBlockActions(r,t.blockActions.actions);this.handleActorActions(r,t.inputData.getFlags())}handleActorActions(t,a){for(let r of a)switch(r){case f.InputData.StartSneaking:case f.InputData.StopSneaking:{let n=t.flags.get(f.ActorFlag.Sneaking)??!1;t.flags.set(f.ActorFlag.Sneaking,!n);break}case f.InputData.StartSprinting:case f.InputData.StopSprinting:{let n=t.flags.get(f.ActorFlag.Sprinting)??!1;t.flags.set(f.ActorFlag.Sprinting,!n);break}case f.InputData.StartSwimming:case f.InputData.StopSwimming:{let n=t.flags.get(f.ActorFlag.Swimming)??!1;t.flags.set(f.ActorFlag.Swimming,!n);break}case f.InputData.StartCrawling:case f.InputData.StopCrawling:{let n=t.flags.get(f.ActorFlag.Crawling)??!1;t.flags.set(f.ActorFlag.Crawling,!n);break}case f.InputData.StartGliding:case f.InputData.StopGliding:{let n=t.flags.get(f.ActorFlag.Gliding)??!1;t.flags.set(f.ActorFlag.Gliding,!n);break}case f.InputData.StartFlying:case f.InputData.StopFlying:{let n=t.abilities.get(f.AbilityIndex.Flying)??!1,s=t.abilities.get(f.AbilityIndex.MayFly)??!1;!n&&!s?t.abilities.set(f.AbilityIndex.Flying,!1):t.abilities.set(f.AbilityIndex.Flying,!n);break}}}handleBlockActions(t,a,r){for(let n of a){let s=t.dimension;switch(n.type){default:{this.serenity.logger.debug(`PlayerAuthInputHandler: Unimplemented block action: ${f.PlayerActionType[n.type]}`);break}case f.PlayerActionType.ContinueDestroyBlock:case f.PlayerActionType.StartDestroyBlock:{if(t.gamemode===f.Gamemode.Creative)continue;if(t.blockTarget){for(let h of s.getBlock(t.blockTarget).traits.values())h.onStopBreak?.(t);let p=new f.LevelEventPacket;p.event=f.LevelEvent.StopBlockCracking,p.position=f.BlockPosition.toVector3f(t.blockTarget),p.data=0,s.broadcast(p),t.blockTarget=null}let o=s.getBlock(n.position);if(o.isAir()){let p=o.permutation,h=new f.UpdateBlockPacket;h.position=f.BlockPosition.toVector3f(o.position),h.layer=f.UpdateBlockLayerType.Normal,h.flags=f.UpdateBlockFlagsType.Network,h.networkBlockId=p.network,t.send(h);continue}let i=!1;for(let p of o.traits.values()){let h=p.onStartBreak?.(t);h!==void 0&&(i=!h)}if(i)continue;t.blockTarget=o.position;let l=t.getHeldItem(),m=o.getBreakTime(l),u=new f.LevelEventPacket;if(u.event=f.LevelEvent.StartBlockCracking,u.position=f.BlockPosition.toVector3f(o.position),u.data=65535/m,s.broadcast(u),l){let p=ae.Break,h=!new wr(t,l,p).emit();for(let d of l.traits.values()){let S=d.onStartUse?.(t,{method:p});S!==void 0&&(h=!S)}if(h)continue;t.itemTarget=l}break}case f.PlayerActionType.AbortDestroyBlock:{if(t.blockTarget){for(let i of s.getBlock(t.blockTarget).traits.values())i.onStopBreak?.(t);let o=new f.LevelEventPacket;o.event=f.LevelEvent.StopBlockCracking,o.position=f.BlockPosition.toVector3f(t.blockTarget),o.data=0,s.broadcast(o),t.blockTarget=null}if(t.itemTarget){new Sr(t,t.itemTarget).emit();for(let o of t.itemTarget.traits.values())o.onStopUse?.(t,{method:ae.Break});t.itemTarget=null}break}case f.PlayerActionType.PredictDestroyBlock:{let o=s.getBlock(n.position),i=new _r(o,t,t.getHeldItem()).emit();if(!t.blockTarget&&t.gamemode!==f.Gamemode.Creative||!i){let h=new f.UpdateBlockPacket;h.position=f.BlockPosition.toVector3f(o.position),h.layer=f.UpdateBlockLayerType.Normal,h.flags=f.UpdateBlockFlagsType.Network,h.networkBlockId=o.permutation.network,t.send(h)}else if(!o.destroy(t)){let d=new f.UpdateBlockPacket;d.position=f.BlockPosition.toVector3f(o.position),d.layer=f.UpdateBlockLayerType.Normal,d.flags=f.UpdateBlockFlagsType.Network,d.networkBlockId=o.permutation.network,t.send(d)}if(!r||!t.itemTarget)continue;let l=t.itemTarget,m=ae.Use,u=r.predictedDurability,p=o;l.use(t,{method:m,predictedDurability:u,targetBlock:p}),new Oe(t,l,m).emit();continue}}}}};var er=require("@serenityjs/protocol");var lo=class extends w{static{c(this,"RequestChunkRadiusHandler")}static packet=er.Packet.RequestChunkRadius;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();let n=r.dimension.viewDistance,s=t.radius,o=r.getTrait(qe),i=s>n?n:s;o.viewDistance=i>r.device.maxViewDistance?r.device.maxViewDistance:i;let l=new er.ChunkRadiusUpdatePacket;l.radius=o.viewDistance,r.sendImmediate(l)}};var Ee=require("@serenityjs/protocol");var mo=class extends w{static{c(this,"RequestNetworkSettingsHandler")}static packet=Ee.Packet.RequestNetworkSettings;handle(t,a){if(Ee.PROTOCOL_VERSION>t.protocol)return this.network.disconnectConnection(a,"Outdated client! Please use the latest version of Minecraft Bedrock.",Ee.DisconnectReason.OutdatedClient);if(Ee.PROTOCOL_VERSION<t.protocol)return this.network.disconnectConnection(a,"Outdated server! Please wait for the server to be updated.",Ee.DisconnectReason.OutdatedServer);let r=new Ee.NetworkSettingsPacket;r.compressionThreshold=this.serenity.properties.compressionThreshold,r.compressionMethod=this.serenity.properties.compressionMethod,r.clientThrottle=!1,r.clientThreshold=0,r.clientScalar=0,this.network.sendNormal(a,r),this.network.setCompression(a,!0)}};var $=require("@serenityjs/protocol"),tr=require("@serenityjs/nbt");var po=class extends w{static{c(this,"ResourcePackClientResponseHandler")}static packet=$.Packet.ResourcePackClientResponse;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension.world;switch(t.response){default:{this.serenity.logger.debug(`Unhandled ResourcePackClientResponse: ${$.ResourcePackResponse[t.response]}`);break}case $.ResourcePackResponse.HaveAllPacks:{let s=new $.ResourcePackStackPacket;return s.mustAccept=!1,s.behaviorPacks=[],s.gameVersion=$.MINECRAFT_VERSION,s.experiments=[],s.experimentsPreviouslyToggled=!1,s.hasEditorPacks=!1,s.texturePacks=[],r.send(s)}case $.ResourcePackResponse.Completed:{let s=new $.StartGamePacket;s.entityId=r.uniqueId,s.runtimeEntityId=r.runtimeId,s.playerGamemode=r.gamemode,s.playerPosition=r.position,s.pitch=r.rotation.pitch,s.yaw=r.rotation.yaw,s.seed=BigInt(r.dimension.generator.properties.seed),s.biomeType=0,s.biomeName="plains",s.dimension=r.dimension.type,s.generator=1,s.worldGamemode=0,s.hardcore=!1,s.difficulty=$.Difficulty.Easy,s.spawnPosition=r.dimension.spawnPosition,s.achievementsDisabled=!0,s.editorWorldType=0,s.createdInEdior=!1,s.exportedFromEdior=!1,s.dayCycleStopTime=r.dimension.world.dayTime,s.eduOffer=0,s.eduFeatures=!0,s.eduProductUuid="",s.rainLevel=0,s.lightningLevel=0,s.confirmedPlatformLockedContent=!1,s.multiplayerGame=!0,s.broadcastToLan=!0,s.xblBroadcastMode=6,s.platformBroadcastMode=6,s.commandsEnabled=!0,s.texturePacksRequired=!1,s.gamerules=[{name:"commandblockoutput",editable:!0,type:1,value:!0},{name:"dodaylightcycle",editable:!0,type:1,value:!0},{name:"doentitydrops",editable:!0,type:1,value:!0},{name:"dofiretick",editable:!0,type:1,value:!0},{name:"recipesunlock",editable:!0,type:1,value:!0},{name:"dolimitedcrafting",editable:!0,type:1,value:!1},{name:"domobloot",editable:!0,type:1,value:!0},{name:"domobspawning",editable:!0,type:1,value:!0},{name:"dotiledrops",editable:!0,type:1,value:!0},{name:"doweathercycle",editable:!0,type:1,value:!0},{name:"drowningdamage",editable:!0,type:1,value:!0},{name:"falldamage",editable:!0,type:1,value:!0},{name:"firedamage",editable:!0,type:1,value:!0},{name:"keepinventory",editable:!0,type:1,value:!1},{name:"mobgriefing",editable:!0,type:1,value:!0},{name:"pvp",editable:!0,type:1,value:!0},{name:"showcoordinates",editable:!0,type:1,value:!0},{name:"naturalregeneration",editable:!0,type:1,value:!0},{name:"tntexplodes",editable:!0,type:1,value:!0},{name:"sendcommandfeedback",editable:!0,type:1,value:!0},{name:"maxcommandchainlength",editable:!0,type:2,value:65535},{name:"doinsomnia",editable:!0,type:1,value:!0},{name:"commandblocksenabled",editable:!0,type:1,value:!0},{name:"randomtickspeed",editable:!0,type:2,value:1},{name:"doimmediaterespawn",editable:!0,type:1,value:!1},{name:"showdeathmessages",editable:!0,type:1,value:!0},{name:"functioncommandlimit",editable:!0,type:2,value:1e4},{name:"spawnradius",editable:!0,type:2,value:10},{name:"showtags",editable:!0,type:1,value:!0},{name:"freezedamage",editable:!0,type:1,value:!0},{name:"respawnblocksexplode",editable:!0,type:1,value:!0},{name:"showbordereffect",editable:!0,type:1,value:!0},{name:"playerssleepingpercentage",editable:!0,type:2,value:100}],s.experiments=[],s.experimentsPreviouslyToggled=!1,s.bonusChest=!1,s.mapEnabled=!1,s.permissionLevel=r.permission,s.serverChunkTickRange=r.dimension.simulationDistance>>4,s.hasLockedBehaviorPack=!1,s.hasLockedResourcePack=!1,s.isFromLockedWorldTemplate=!1,s.useMsaGamertagsOnly=!1,s.isFromWorldTemplate=!1,s.isWorldTemplateOptionLocked=!1,s.onlySpawnV1Villagers=!1,s.personaDisabled=!1,s.customSkinsDisabled=!1,s.emoteChatMuted=!1,s.gameVersion=$.MINECRAFT_VERSION,s.limitedWorldWidth=16,s.limitedWorldLength=16,s.isNewNether=!1,s.eduResourceUriButtonName="",s.eduResourceUriLink="",s.experimentalGameplayOverride=!1,s.chatRestrictionLevel=0,s.disablePlayerInteractions=!1,s.serverIdentfier="SerenityJS",s.worldIdentifier=r.dimension.world.identifier,s.scenarioIdentifier="SerenityJS",s.levelId="SerenityJS",s.worldName=r.dimension.world.identifier,s.premiumWorldTemplateId="00000000-0000-0000-0000-000000000000",s.isTrial=!1,s.movementAuthority=1,s.rewindHistorySize=0,s.serverAuthoritativeBlockBreaking=!0,s.currentTick=r.dimension.world.currentTick,s.enchantmentSeed=0,s.blockProperties=n.blockPalette.getAllCustomTypes().map(m=>Vt.toBlockProperty(m)),s.items=n.itemPalette.getAllTypes().map(m=>Y.toItemData(m)),s.multiplayerCorrelationId="<raknet>a555-7ece-2f1c-8f69",s.serverAuthoritativeInventory=!0,s.engine="*",s.propertyData1=10,s.propertyData2=0,s.propertyData3=0,s.blockPaletteChecksum=0n,s.worldTemplateId="00000000000000000000000000000000",s.clientSideGeneration=!1,s.blockNetworkIdsAreHashes=!0,s.serverControlledSounds=!0;let o=new $.AvailableActorIdentifiersPacket;o.data=new tr.CompoundTag;let i=n.entityPalette.getAllTypes().map(m=>re.toNbt(m));o.data.createListTag("idlist",tr.Tag.Compound,i);let l=new $.PlayStatusPacket;l.status=$.PlayStatus.PlayerSpawn,r.sendImmediate(s,l,o)}}}};var uo=require("@serenityjs/protocol");var ho=class extends w{static{c(this,"SetLocalPlayerAsInitializedHandler")}static packet=uo.Packet.SetLocalPlayerAsInitialized;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();r.spawn()}};var fo=require("@serenityjs/protocol");var go=class extends w{static{c(this,"TextHandler")}static packet=fo.Packet.Text;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();let n=new fr(r,t.message);if(!n.emit())return;t.message=n.message;let s=!1;for(let o of r.traits.values()){let i=o.onChat?.(t.message);i!==void 0&&(s=!i)}s||(r.dimension.world.broadcast(t),r.dimension.world.logger.info(`\xA78[\xA79${r.username}\xA78] Chat:\xA7r ${t.message}`))}};var _o=require("@serenityjs/protocol");var yo=class extends w{static{c(this,"CommandRequestHandler")}static packet=_o.Packet.CommandRequest;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension.world,s=t.command.startsWith("/")?t.command.slice(1):t.command,o=new nt(n.commands.getAll(),s,r),i=!1;for(let l of r.traits.values()){let m=l.onCommand?.(o);m!==void 0&&(i=!m)}if(!i){if((o.command?.registry.permissionLevel??4)+1>r.permission)return r.sendMessage("\xA7cYou do not have permission to execute this command.");try{let l=o.execute();n.logger.info(`\xA78[\xA79${r.username}\xA78] Command:\xA7r ${t.command}`),l.message&&r.sendMessage(`\xA77${l.message}\xA7r`)}catch(l){l instanceof TypeError?r.sendMessage(`\xA7cType Error: ${l.message}\xA7r`):r.sendMessage(`\xA7cSyntax Error: ${l.message}\xA7r`)}}}};var At=require("@serenityjs/protocol");var bo=class extends w{static{c(this,"InteractHandler")}static packet=At.Packet.Interact;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension;switch(t.action){default:return n.world.logger.debug(`InteractHandler: Unimplemented action ${[At.InteractAction[t.action]]}`);case At.InteractAction.InteractUpdate:{if(t.actorRuntimeId===0n)return void(r.entityTarget=null);let s=n.getEntity(t.actorRuntimeId,!0);return s?void(r.entityTarget=s):void 0}case At.InteractAction.OpenInventory:{let s=n.getEntity(t.actorRuntimeId,!0);if(!s||!s.hasTrait(k))return console.log("Entity does not have an inventory trait");let{container:o}=s.getTrait(k);return o.show(r)}}}};var Wt=require("@serenityjs/protocol");var wo=class extends w{static{c(this,"RespawnHandler")}static packet=Wt.Packet.Respawn;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();let n=new Wt.PlayStatusPacket;n.status=Wt.PlayStatus.PlayerSpawn,r.sendImmediate(n);let s=r.getTrait(L);s.currentValue=s.defaultValue,r.spawn()}};var ar=require("@serenityjs/protocol");var Gt=require("@serenityjs/protocol");var De=class ft{static{c(this,"Form")}static pending=new Map;static formId=0;formId=++ft.formId;type;show(t,a){ft.pending.has(this.formId)||ft.pending.set(this.formId,new Map);let r=ft.pending.get(this.formId);if(!r)return this;let n=JSON.stringify(this),s=new Gt.ModalFormRequestPacket;return s.id=this.formId,s.payload=n,t.send(s),r.set(t.uniqueId,{player:t,result:a}),this}close(t){let a=new Gt.ClientboundCloseFormPacket;t.send(a)}update(){if(!ft.pending.has(this.formId))return;let t=ft.pending.get(this.formId);if(!t)return;let a=new Gt.ServerSettingsResponsePacket;a.formId=this.formId,a.payload=JSON.stringify(this);for(let{player:r}of t.values())r.send(a)}};var So=require("@serenityjs/protocol");var Li=class extends De{static{c(this,"MessageForm")}type=So.ModalFormType.Message;title;content;button1;button2};var ko=require("@serenityjs/protocol");var Oi=class extends De{static{c(this,"ActionForm")}type=ko.ModalFormType.Action;title;content;buttons=[];button(t,a){return this.buttons.push({text:t,image:a}),this}};var xo=require("@serenityjs/protocol");var Hi=class extends De{static{c(this,"ModalForm")}type=xo.ModalFormType.Modal;title;content=[];dropdown(t,a,r=0){return this.content.push({type:"dropdown",text:t,options:a,default:r}),this}input(t,a="",r=""){return this.content.push({type:"input",text:t,placeholder:a,default:r}),this}label(t){return this.content.push({type:"label",text:t}),this}slider(t,a,r,n=1,s=a){return this.content.push({type:"slider",text:t,min:a,max:r,step:n,default:s}),this}stepSlider(t,a,r=0){return this.content.push({type:"step_slider",text:t,steps:a,default:r}),this}toggle(t,a=!1){return this.content.push({type:"toggle",text:t,default:a}),this}};var Co=class extends w{static{c(this,"ModalFormResponseHandler")}static packet=ar.Packet.ModalFormResponse;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=De.pending.get(t.id);if(!n)throw new Error(`Failed to fetch form with id ${t.id}, broadcasted to ${r.username}`);let s=n.get(r.uniqueId);if(!s)throw new Error(`Failed to fetch participant with id ${r.uniqueId}, broadcasted to ${r.username}`);if(t.canceled)s.result(null,new Error(`Form was canceled by the player. Reason: ${ar.ModalFormCanceledReason[t.reason]}`));else{let o=JSON.parse(t.data);s.result(o,null)}n.delete(r.uniqueId),n.size===0&&De.pending.delete(t.id)}};var V=require("@serenityjs/protocol");var Po=class extends w{static{c(this,"RequestPermissionsHandler")}static packet=V.Packet.RequestPermissions;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension.getEntity(t.actorUniqueId);if(!n||!n.isPlayer())throw new Error("Invalid target player");let s=t.getFlag(V.PermissionFlag.Build),o=t.getFlag(V.PermissionFlag.Mine),i=t.getFlag(V.PermissionFlag.DoorsAndSwitches),l=t.getFlag(V.PermissionFlag.OpenContainers),m=t.getFlag(V.PermissionFlag.AttackPlayers),u=t.getFlag(V.PermissionFlag.AttackMobs),p=t.getFlag(V.PermissionFlag.OperatorCommands),h=t.getFlag(V.PermissionFlag.Teleport);n.abilities.superSet(V.AbilityIndex.Build,s),n.abilities.superSet(V.AbilityIndex.Mine,o),n.abilities.superSet(V.AbilityIndex.DoorsAndSwitches,i),n.abilities.superSet(V.AbilityIndex.OpenContainers,l),n.abilities.superSet(V.AbilityIndex.AttackPlayers,m),n.abilities.superSet(V.AbilityIndex.AttackMobs,u),n.abilities.superSet(V.AbilityIndex.OperatorCommands,p),n.abilities.superSet(V.AbilityIndex.Teleport,h),n.abilities.update()}};var rr=require("@serenityjs/protocol");var vo=class extends w{static{c(this,"BlockPickRequestHandler")}static packet=rr.Packet.BlockPickRequest;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let{x:n,y:s,z:o,addData:i}=t,m=r.dimension.getBlock({x:n,y:s,z:o});for(let d of m.traits.values())d.onPick?.(r,i);if(r.gamemode!==rr.Gamemode.Creative)return;let u=m.getItemStack({amount:1,auxillary:i?m.permutation.index:0});if(i){let d=m.getDataEntry();u.components.set("block_data",d)}let{container:p,selectedSlot:h}=r.getTrait(k);p.setItem(h,u)}};var la=require("@serenityjs/protocol");var To=class extends w{static{c(this,"EmoteHandler")}static packet=la.Packet.Emote;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension;new kr(r,t.emoteId,t.tickLength).emit()&&(r.flags.set(la.ActorFlag.Emoting,!0),n.schedule(t.tickLength).on(()=>{new xr(r,t.emoteId).emit(),r.flags.set(la.ActorFlag.Emoting,!1)}),n.broadcastExcept(r,t))}};var dn=[mo,no,po,co,ho,vn,Cn,oo,ao,lo,kn,to,io,go,yo,bo,wo,Co,Po,vo,To];var gt=require("fs"),nr=require("path"),Eo=require("@serenityjs/protocol");var Ni={path:null,permissions:[]},fn=class Do extends Map{static{c(this,"Permissions")}serenity;path=null;constructor(t,a){super(),this.serenity=t;let r={...Ni,...a};for(let n of r.permissions)this.set(n.uuid,n.level);r.path&&(this.path=r.path)}get(t){return super.get(t)??Eo.PermissionLevel.Member}set(t,a){if(super.set(t,a),this.path){let r=Array.from(this.entries()).map(([n,s])=>({uuid:n,level:s}));(0,gt.writeFileSync)(this.path,JSON.stringify(r,null,2))}return this}static fromPath(t,a){(0,gt.existsSync)((0,nr.resolve)(a))||(0,gt.writeFileSync)((0,nr.resolve)(a),JSON.stringify([]));let r=JSON.parse((0,gt.readFileSync)((0,nr.resolve)(a),"utf-8"));return new Do(t,{path:a,permissions:r})}};var Mo={port:19132,address:"0.0.0.0",motd:"SerenityJS",compressionMethod:zt.CompressionMethod.Zlib,compressionThreshold:256,packetsPerFrame:64,permissions:[],defaultGenerator:Ra,debugLogging:!1},Ri=class extends Wo.default{static{c(this,"Serenity")}properties=Mo;network;worlds=new Map;providers=new Map;generators=new Map;logger=new ma.Logger("Serenity",ma.LoggerColors.Magenta);players=new Map;console=new nn(this);permissions;alive=!0;ticks=[];tps=0;constructor(t){super(),this.properties={...Mo,...t},ma.Logger.DEBUG=this.properties.debugLogging,this.network=new or(this,dn),this.network.raknet.message=this.properties.motd,this.registerGenerator(Ra),this.registerGenerator(oa),this.permissions=typeof this.properties.permissions=="string"?fn.fromPath(this,this.properties.permissions):new fn(this,{permissions:this.properties.permissions})}start(){this.network.raknet.start(!1);let t=process.hrtime(),a=20,r=c(()=>{if(!this.alive)return;let[n,s]=process.hrtime(t),o=n+s/1e9;if(o>=1/Ao.RAKNET_TPS)for(let i of this.network.raknet.connections.values())i.tick();if(o>=1/a){t=process.hrtime();let i=o*1e3;this.ticks.push(Date.now());let l=Date.now()-1e3;this.ticks=this.ticks.filter(m=>m>l),this.tps=this.ticks.length;for(let m of this.worlds.values())m.onTick(Math.floor(i))}setImmediate(r)},"tick");r(),this.emit(Rt.Start,0),this.logger.info(`\xA7aServer is now running at \xA72${this.properties.address}\xA7a:\xA72${this.properties.port}\xA7a.\xA7r \xA78(v${zt.MINECRAFT_VERSION}, proto-v${zt.PROTOCOL_VERSION})\xA7r`)}stop(){this.console.interface.close(),this.emit(Rt.Stop,0);for(let t of this.players.values())t.getWorld().provider.writePlayer(t.getDataEntry(),t.dimension),t.disconnect("Server closed.");for(let t of this.worlds.values())t.provider.onShutdown();this.alive=!1,process.nextTick(()=>this.network.raknet.stop()),this.logger.info("\xA7cServer has been stopped.\xA7r")}setMotd(t){this.network.raknet.message=t}registerProvider(t,a){if(this.providers.has(t))return this.logger.error(`Provider already registered: ${t.identifier}`),!1;try{return t.initialize(this,{...Na,...a}),this.providers.set(t,{...Na,...a}),this.logger.debug(`Registered provider: ${t.identifier}`),!0}catch(r){return this.logger.error(`Failed to register provider: ${t.identifier}`,r),!1}}registerGenerator(t){return this.generators.has(t.identifier)?(this.logger.error(`Generator already registered: ${t.identifier}`),!1):(this.generators.set(t.identifier,t),this.logger.debug(`Registered generator: ${t.identifier}`),!0)}getGenerator(t){return this.generators.get(t)??null}createWorld(t,a){let r=this.providers.get(t);if(!r)return this.logger.error(`Failed to create world, as the given provider is not registered: ${t.identifier}`),!1;let n=t.create(this,r,a);return this.registerWorld(n),n}getWorld(t){return t?this.worlds.get(t)??null:this.worlds.values().next().value??null}getWorlds(){return[...this.worlds.values()]}registerWorld(t){return this.worlds.has(t.identifier)?(this.logger.error(`World already registered: ${t.identifier}`),!1):(this.worlds.set(t.identifier,t),this.logger.debug(`Registered world: ${t.identifier}`),t.provider.onStartup(),Qt.options.push(t.identifier),!0)}getDimension(t,a){return t.dimensions.get(a)??null}getDimensions(t){return[...t.dimensions.values()]}getPlayerByConnection(t){return this.players.get(t)??null}getPlayerByXuid(t){return[...this.players.values()].find(a=>a.xuid===t)??null}getPlayerByUsername(t){return[...this.players.values()].find(a=>a.username===t)??null}getPlayerByUuid(t){return[...this.players.values()].find(a=>a.uuid===t)??null}getPlayers(){return[...this.players.values()]}};var Fi=class{static{c(this,"LootPool")}entries=[];rolls=1;constructor(t,a){this.entries=t,this.rolls=a}roll(){let t=[],a=this.entries.map(({weight:r})=>r).reduce((r,n)=>n+r);for(let r=0;r<this.rolls;r++){let n=Math.random()*a,s=0;for(let{weight:o,itemStack:i,function:l}of this.entries)if(s+=o,n<s){t.push(l?.(i)??i);break}}return t}addEntry(t){return this.entries.push(t),this}removeEntry(t){return this.entries.splice(this.entries.indexOf(t),1),this}};var $i=class{static{c(this,"LootTable")}pools=new Set;constructor(t){this.pools=new Set(t)}addPool(t){return this.pools.add(t),this}removePool(t){return this.pools.delete(t),this}getLoot(){let t=[];for(let a of this.pools)t.push(...a.roll());return t}};0&&(module.exports={AbilityEnum,AbilityMap,ActionForm,ActorFlagMap,AdminCommands,AttributeMap,Block,BlockCardinalDirectionTrait,BlockContainer,BlockDirectionTrait,BlockEnum,BlockIdentifier,BlockInventoryTrait,BlockOpenBitTrait,BlockPalette,BlockPermutation,BlockStorage,BlockToolType,BlockTrait,BlockTraits,BlockType,BlockUpdateSignal,BlockUpperBitTrait,BlockUpsideDownBitTrait,BlockWeirdoDirectionTrait,BooleanEnum,CardinalDirection,Chunk,ChunkReadySignal,Command,CommandArgumentPointer,CommandExecutionState,CommandRegistry,Commands,CommonCommands,ConsoleInterface,Container,CreativeItem,CustomBlockType,CustomEntityType,CustomEnum,CustomItemType,DefaultDimensionProperties,DefaultItemStackProperties,DefaultWorldProviderProperties,Device,Dimension,EffectAddSignal,EffectRemoveSignal,Entity,EntityAirSupplyTrait,EntityAttributeTrait,EntityAttributeUpdateSignal,EntityCollision,EntityContainer,EntityDespawnedSignal,EntityDieSignal,EntityDimensionChangeSignal,EntityEffectsTrait,EntityEnum,EntityEquipmentTrait,EntityFlagUpdateSignal,EntityGravityTrait,EntityHealthChangedSignal,EntityHealthTrait,EntityHitSignal,EntityHurtSignal,EntityIdentifier,EntityInteractMethod,EntityInventoryTrait,EntityInvisibilityTrait,EntityItemStackTrait,EntityMetadataUpdateSignal,EntityMovementTrait,EntityNameTagTrait,EntityPalette,EntityPhysicsTrait,EntitySpawnedSignal,EntityTrait,EntityTraits,EntityType,Enum,EventSignal,Form,GamemodeEnum,Handlers,IntegerEnum,InternalProvider,ItemBundleTrait,ItemCategory,ItemDrop,ItemEnchantableTrait,ItemEnum,ItemEquippableTrait,ItemGroup,ItemIdentifier,ItemPalette,ItemStack,ItemToolTier,ItemToolType,ItemTrait,ItemTraits,ItemType,ItemUseMethod,LevelDBProvider,LootPool,LootTable,MessageForm,MetadataMap,ModalForm,Network,NetworkBound,NetworkHandler,Player,PlayerAbilityUpdateSignal,PlayerBreakBlockSignal,PlayerChatSignal,PlayerChunkRenderingTrait,PlayerCursorTrait,PlayerDropItemSignal,PlayerEntityRenderingTrait,PlayerExhaustionTrait,PlayerGamemodeChangeSignal,PlayerHungerTrait,PlayerInteractWithBlockSignal,PlayerInteractWithEntitySignal,PlayerJoinSignal,PlayerLeaveSignal,PlayerListTrait,PlayerOpenedContainerSignal,PlayerPlaceBlockSignal,PlayerSaturationTrait,PlayerStartEmotingSignal,PlayerStartUsingItemSignal,PlayerStopEmotingSignal,PlayerStopUsingItemSignal,PlayerTrait,PlayerUseItemSignal,PositionEnum,Serenity,ServerEvent,SoftEnum,StringEnum,SubChunk,SuperflatGenerator,SuperflatWorker,TagEnum,TargetEnum,TerrainGenerator,TerrainWorker,TickSchedule,ValidEnum,VerticalHalfTrait,VoidGenerator,Worker,World,WorldEnum,WorldEvent,WorldInitializeSignal,WorldProvider,WorldTickSignal,hash});
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9zZXJlbml0eS50cyIsICIuLi9zcmMvbmV0d29yay9uZXR3b3JrLnRzIiwgIi4uL3NyYy9lbnVtcy9uZXR3b3JrLWJvdW5kLnRzIiwgIi4uL3NyYy9lbnVtcy9ibG9jay1pZGVudGlmaWVyLnRzIiwgIi4uL3NyYy9lbnVtcy9lbnRpdHktaWRlbnRpZmllci50cyIsICIuLi9zcmMvZW51bXMvaXRlbS1pZGVudGlmaWVyLnRzIiwgIi4uL3NyYy9lbnVtcy9pdGVtLWNhdGVnb3J5LnRzIiwgIi4uL3NyYy9lbnVtcy9pdGVtLWdyb3VwLnRzIiwgIi4uL3NyYy9lbnVtcy90b29sLXRpZXIudHMiLCAiLi4vc3JjL2VudW1zL3Rvb2wtdHlwZS50cyIsICIuLi9zcmMvZW51bXMvYmxvY2stdG9vbC10eXBlLnRzIiwgIi4uL3NyYy9lbnVtcy9pdGVtLXVzZS1tZXRob2QudHMiLCAiLi4vc3JjL2VudW1zL2VudGl0eS1pbnRlcmFjdC1tZXRob2QudHMiLCAiLi4vc3JjL2VudW1zL2NhcmRpbmFsLWRpcmVjdGlvbi50cyIsICIuLi9zcmMvZW51bXMvd29ybGQtZXZlbnQudHMiLCAiLi4vc3JjL2VudW1zL3NlcnZlci1ldmVudC50cyIsICIuLi9zcmMvbmV0d29yay9oYW5kbGVyLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9hbmltYXRlLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9jb250YWluZXItY2xvc2UudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2Rpc2Nvbm5lY3QudHMiLCAiLi4vc3JjL2V2ZW50cy9ldmVudC1zaWduYWwudHMiLCAiLi4vc3JjL2V2ZW50cy93b3JsZC1pbml0aWFsaXplLnRzIiwgIi4uL3NyYy9ldmVudHMvd29ybGQtdGljay50cyIsICIuLi9zcmMvZXZlbnRzL2NodW5rLXJlYWR5LnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LXNwYXduZWQudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktZGVzcGF3bmVkLnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWZsYWctdXBkYXRlLnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LW1ldGFkYXRhLXVwZGF0ZS50cyIsICIuLi9zcmMvZXZlbnRzL2VudGl0eS1hdHRyaWJ1dGUtdXBkYXRlLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLWpvaW4udHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItbGVhdmUudHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItY2hhdC50cyIsICIuLi9zcmMvZXZlbnRzL2Jsb2NrLXVwZGF0ZS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1wbGFjZS1ibG9jay50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1icmVhay1ibG9jay50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1kcm9wLWl0ZW0udHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItYWJpbGl0eS11cGRhdGUudHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItc3RhcnQtdXNpbmctaXRlbS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1zdG9wLXVzaW5nLWl0ZW0udHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItdXNlLWl0ZW0udHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItc3RhcnQtZW1vdGluZy50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1zdG9wLWVtb3RpbmcudHMiLCAiLi4vc3JjL2V2ZW50cy9lZmZlY3QtYWRkLnRzIiwgIi4uL3NyYy9ldmVudHMvZWZmZWN0LXJlbW92ZS50cyIsICIuLi9zcmMvZXZlbnRzL2dhbWVtb2RlLWNoYW5nZS50cyIsICIuLi9zcmMvZXZlbnRzL2VudGl0eS1kaW1lbnNpb24tY2hhbmdlLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLWJsb2NrLWludGVyYWN0LnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLWVudGl0eS1pbnRlcmFjdC50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1vcGVuZWQtY29udGFpbmVyLnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWhpdC50cyIsICIuLi9zcmMvZXZlbnRzL2VudGl0eS1odXJ0LnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWhlYWx0aC1jaGFuZ2VkLnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWRpZS50cyIsICIuLi9zcmMvaGFuZGxlcnMvaW52ZW50b3J5LXRyYW5zYWN0aW9uLnRzIiwgIi4uL3NyYy9lbnRpdHkvaWRlbnRpdHkvcmVnaXN0cnkudHMiLCAiLi4vc3JjL2VudGl0eS9pZGVudGl0eS90eXBlLnRzIiwgIi4uL3NyYy9lbnRpdHkvaWRlbnRpdHkvY3VzdG9tLnRzIiwgIi4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIiwgIi4uL3NyYy9pdGVtL2lkZW50aXR5L3JlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ibG9jay9pZGVudGl0eS9yZWdpc3RyeS50cyIsICIuLi9zcmMvYmxvY2svaWRlbnRpdHkvdHlwZS50cyIsICIuLi9zcmMvYmxvY2svaWRlbnRpdHkvcGVybXV0YXRpb24udHMiLCAiLi4vc3JjL2Jsb2NrL2lkZW50aXR5L2hhc2gudHMiLCAiLi4vc3JjL2Jsb2NrL2lkZW50aXR5L2Ryb3BzLnRzIiwgIi4uL3NyYy9ibG9jay9pZGVudGl0eS9jdXN0b20udHMiLCAiLi4vc3JjL2Jsb2NrL3RyYWl0cy9pbmRleC50cyIsICIuLi9zcmMvdHJhaXQudHMiLCAiLi4vc3JjL2Jsb2NrL3RyYWl0cy90cmFpdC50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL2ludmVudG9yeS50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL3dlaXJkby1kaXJlY3Rpb24udHMiLCAiLi4vc3JjL2Jsb2NrL3RyYWl0cy91cHNpZGUtZG93bi1iaXQudHMiLCAiLi4vc3JjL2Jsb2NrL3RyYWl0cy9vcGVuLWJpdC50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL3VwcGVyLWJsb2NrLWJpdC50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL3ZlcnRpY2FsLWhhbGYudHMiLCAiLi4vc3JjL2Jsb2NrL3RyYWl0cy9jYXJkaW5hbF9kaXJlY3Rpb24udHMiLCAiLi4vc3JjL2Jsb2NrL3RyYWl0cy9kaXJlY3Rpb24udHMiLCAiLi4vc3JjL2Jsb2NrL3BhbGV0dGUudHMiLCAiLi4vc3JjL2Jsb2NrL2Jsb2NrLnRzIiwgIi4uL3NyYy9ibG9jay9tYXBzL25idC1tYXAudHMiLCAiLi4vc3JjL2Jsb2NrL2NvbnRhaW5lci50cyIsICIuLi9zcmMvY29udGFpbmVyLnRzIiwgIi4uL3NyYy9ibG9jay9pbmRleC50cyIsICIuLi9zcmMvaXRlbS9pZGVudGl0eS90eXBlLnRzIiwgIi4uL3NyYy9pdGVtL2lkZW50aXR5L2NyZWF0aXZlLnRzIiwgIi4uL3NyYy9pdGVtL2lkZW50aXR5L2N1c3RvbS50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvZW51bS50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvdmFsaWQvdmFsaWQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL3ZhbGlkL3N0cmluZy50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvdmFsaWQvaW50ZWdlci50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvdmFsaWQvdGFyZ2V0LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy92YWxpZC9wb3NpdGlvbi50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvY3VzdG9tL3NvZnQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9jdXN0b20udHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9ib29sZWFuLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy9jdXN0b20vZ2FtZW1vZGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9hYmlsaXR5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy9jdXN0b20vYmxvY2sudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9lbnRpdHkudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9pdGVtLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy9jdXN0b20vdGFnLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy9jdXN0b20vd29ybGQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRzLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9yZWdpc3RyeS50cyIsICIuLi9zcmMvY29tbWFuZHMvZXhlY3V0aW9uLXN0YXRlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9nYW1lbW9kZS50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vYWJpbGl0eS50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vY2xlYXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL2ZpbGwudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL2dpdmUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL2tpY2sudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3NldGJsb2NrLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi90YWcudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3RwLnRzIiwgIi4uL3NyYy93b3JsZC93b3JsZC50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvaW5kZXgudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL2VmZmVjdC50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvcmVnZW5lcmF0aW9uLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9wb2lzb24udHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL25pZ2h0LXZpc2lvbi50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvaW5zdGFudC1kYW1hZ2UudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL2luc3RhbnQtaGVhbHRoLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9ibGluZG5lc3MudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL2RhcmtuZXNzLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9uYXVzZWFzLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9zcGVlZC50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvd2l0aGVyLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9mYXRhbC1wb2lzb24udHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL3Nsb3duZXNzLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9pbnZpc2liaWxpdHkudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL3dhdGVyLWJyZWF0aGluZy50cyIsICIuLi9zcmMvZWZmZWN0L3BhbGxldGUudHMiLCAiLi4vc3JjL2VmZmVjdC9pbmRleC50cyIsICIuLi9zcmMvd29ybGQvZGltZW5zaW9uLnRzIiwgIi4uL3NyYy93b3JsZC9zY2hlZHVsZS50cyIsICIuLi9zcmMvd29ybGQvc2NvcmVib2FyZC9zY29yZWJvYXJkLnRzIiwgIi4uL3NyYy93b3JsZC9zY29yZWJvYXJkL29iamVjdGl2ZS50cyIsICIuLi9zcmMvd29ybGQvc2NvcmVib2FyZC9pZGVudGl0eS50cyIsICIuLi9zcmMvd29ybGQvY2h1bmsvYmxvY2stc3RvcmFnZS50cyIsICIuLi9zcmMvd29ybGQvY2h1bmsvc3ViLWNodW5rLnRzIiwgIi4uL3NyYy93b3JsZC9jaHVuay9jaHVuay50cyIsICIuLi9zcmMvd29ybGQvcHJvdmlkZXIvcHJvdmlkZXIudHMiLCAiLi4vc3JjL3dvcmxkL3Byb3ZpZGVyL2ludGVybmFsLnRzIiwgIi4uL3NyYy93b3JsZC9wcm92aWRlci9sZXZlbGRiLnRzIiwgIi4uL3NyYy93b3JsZC9nZW5lcmF0b3IvZ2VuZXJhdG9yLnRzIiwgIi4uL3NyYy93b3JsZC9nZW5lcmF0b3Ivd29ya2VyL3dvcmtlci50cyIsICIuLi9zcmMvd29ybGQvZ2VuZXJhdG9yL3dvcmtlci9kZWNvcmF0b3IudHMiLCAiLi4vc3JjL3dvcmxkL2dlbmVyYXRvci92b2lkLnRzIiwgIi4uL3NyYy93b3JsZC9nZW5lcmF0b3Ivc3VwZXJmbGF0L2dlbmVyYXRvci50cyIsICIuLi9zcmMvd29ybGQvZ2VuZXJhdG9yL3N1cGVyZmxhdC93b3JrZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3RyYW5zZmVyLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9zdW1tb24udHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL2tpbGwudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3N0b3AudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3dvcmxkLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9vcC50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vZGVvcC50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vc2F2ZS50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vaW5kZXgudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1vbi9hYm91dC50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbW9uL2luZGV4LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb25zb2xlLnRzIiwgIi4uL3NyYy9pdGVtL3BhbGV0dGUudHMiLCAiLi4vc3JjL2l0ZW0vdHJhaXRzL2luZGV4LnRzIiwgIi4uL3NyYy9pdGVtL3RyYWl0cy90cmFpdC50cyIsICIuLi9zcmMvaXRlbS90cmFpdHMvYnVuZGxlLnRzIiwgIi4uL3NyYy9pdGVtL21hcHMvbmJ0LW1hcC50cyIsICIuLi9zcmMvaXRlbS9zdGFjay50cyIsICIuLi9zcmMvaXRlbS90cmFpdHMvZXF1aXBwYWJsZS50cyIsICIuLi9zcmMvaXRlbS90cmFpdHMvZW5jaGFudGFibGUudHMiLCAiLi4vc3JjL2l0ZW0vaW5kZXgudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvaW5kZXgudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvdHJhaXQudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvYXR0cmlidXRlL2F0dHJpYnV0ZS50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9hdHRyaWJ1dGUvbW92ZW1lbnQudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvYXR0cmlidXRlL2hlYWx0aC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvdHJhaXQudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvcGxheWVyL2NodW5rLXJlbmRlcmluZy50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvZW50aXR5LXJlbmRlcmluZy50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9pbnZlbnRvcnkudHMiLCAiLi4vc3JjL2VudGl0eS9jb250YWluZXIudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvaXRlbS1zdGFjay50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvcGxheWVyLWxpc3QudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvcGxheWVyL2N1cnNvci50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvc2F0dXJhdGlvbi50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvaHVuZ2VyLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BsYXllci9leGhhdXN0aW9uLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL2dyYXZpdHkudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvY29sbGlzaW9uLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL2Fpci1zdXBwbHkudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvbmFtZXRhZy50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9waHlzaWNzLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL2VmZmVjdHMudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvdmlzaWJpbGl0eS50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9lcXVpcG1lbnQudHMiLCAiLi4vc3JjL2VudGl0eS9tYXBzL21ldGFkYXRhLW1hcC50cyIsICIuLi9zcmMvZW50aXR5L21hcHMvYWN0b3ItZmxhZy1tYXAudHMiLCAiLi4vc3JjL2VudGl0eS9tYXBzL2F0dHJpYnV0ZS1tYXAudHMiLCAiLi4vc3JjL2VudGl0eS9tYXBzL2FiaWxpdHktbWFwLnRzIiwgIi4uL3NyYy9lbnRpdHkvcGxheWVyLnRzIiwgIi4uL3NyYy9lbnRpdHkvZGV2aWNlLnRzIiwgIi4uL3NyYy9lbnRpdHkvcGFsZXR0ZS50cyIsICIuLi9zcmMvZW50aXR5L2luZGV4LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9pdGVtLXN0YWNrLXJlcXVlc3QudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2xvZ2luLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9tb2ItZXF1aXBtZW50LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9wbGF5ZXItYWN0aW9uLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9wbGF5ZXItYXV0aC1pbnB1dC50cyIsICIuLi9zcmMvaGFuZGxlcnMvcmVxdWVzdC1jaHVuay1yYWRpdXMudHMiLCAiLi4vc3JjL2hhbmRsZXJzL3JlcXVlc3QtbmV0d29yay1zZXR0aW5ncy50cyIsICIuLi9zcmMvaGFuZGxlcnMvcmVzb3VyY2UtcGFjay1yZXNwb25zZS50cyIsICIuLi9zcmMvaGFuZGxlcnMvc2V0LWxvY2FsLXBsYXllci1hcy1pbml0aWFsaXplZC50cyIsICIuLi9zcmMvaGFuZGxlcnMvdGV4dC50cyIsICIuLi9zcmMvaGFuZGxlcnMvY29tbWFuZC1yZXF1ZXN0LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9pbnRlcmFjdC50cyIsICIuLi9zcmMvaGFuZGxlcnMvcmVzcGF3bi50cyIsICIuLi9zcmMvaGFuZGxlcnMvbW9kYWwtZm9ybS1yZXNwb25zZS50cyIsICIuLi9zcmMvZm9ybXMvZm9ybS50cyIsICIuLi9zcmMvZm9ybXMvbWVzc2FnZS50cyIsICIuLi9zcmMvZm9ybXMvYWN0aW9uLnRzIiwgIi4uL3NyYy9mb3Jtcy9tb2RhbC50cyIsICIuLi9zcmMvaGFuZGxlcnMvcmVxdWVzdC1wZXJtaXNzaW9ucy50cyIsICIuLi9zcmMvaGFuZGxlcnMvYmxvY2stcGljay1yZXF1ZXN0LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9lbW90ZS50cyIsICIuLi9zcmMvaGFuZGxlcnMvaW5kZXgudHMiLCAiLi4vc3JjL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLnRzIiwgIi4uL3NyYy9sb290L3Bvb2wudHMiLCAiLi4vc3JjL2xvb3QvdGFibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCAqIGZyb20gXCIuL3NlcmVuaXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uZXR3b3JrXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21tYW5kc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaXRlbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ibG9ja1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd29ybGRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGFuZGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRhaW5lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mb3Jtc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9vdFwiO1xuIiwgImltcG9ydCB7XG4gIENvbXByZXNzaW9uTWV0aG9kLFxuICBNSU5FQ1JBRlRfVkVSU0lPTixcbiAgUFJPVE9DT0xfVkVSU0lPTlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUkFLTkVUX1RQUyB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcbmltcG9ydCBFbWl0dGVyIGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5cbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tIFwiLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBIYW5kbGVycyB9IGZyb20gXCIuL2hhbmRsZXJzXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0V29ybGRQcm92aWRlclByb3BlcnRpZXMsXG4gIERpbWVuc2lvbixcbiAgU3VwZXJmbGF0R2VuZXJhdG9yLFxuICB0eXBlIFRlcnJhaW5HZW5lcmF0b3IsXG4gIFZvaWRHZW5lcmF0b3IsXG4gIFdvcmxkLFxuICB0eXBlIFdvcmxkUHJvdmlkZXJcbn0gZnJvbSBcIi4vd29ybGRcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuL2VudGl0eVwiO1xuaW1wb3J0IHsgQ29uc29sZUludGVyZmFjZSwgV29ybGRFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25zIH0gZnJvbSBcIi4vcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IFNlcnZlckV2ZW50IH0gZnJvbSBcIi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUge1xuICBTZXJ2ZXJFdmVudHMsXG4gIFNlcnZlclByb3BlcnRpZXMsXG4gIFdvcmxkRXZlbnRTaWduYWxzLFxuICBXb3JsZFByb3BlcnRpZXMsXG4gIFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IERlZmF1bHRTZXJ2ZXJQcm9wZXJ0aWVzOiBTZXJ2ZXJQcm9wZXJ0aWVzID0ge1xuICBwb3J0OiAxOTEzMixcbiAgYWRkcmVzczogXCIwLjAuMC4wXCIsXG4gIG1vdGQ6IFwiU2VyZW5pdHlKU1wiLFxuICBjb21wcmVzc2lvbk1ldGhvZDogQ29tcHJlc3Npb25NZXRob2QuWmxpYixcbiAgY29tcHJlc3Npb25UaHJlc2hvbGQ6IDI1NixcbiAgcGFja2V0c1BlckZyYW1lOiA2NCxcbiAgcGVybWlzc2lvbnM6IFtdLFxuICBkZWZhdWx0R2VuZXJhdG9yOiBWb2lkR2VuZXJhdG9yLFxuICBkZWJ1Z0xvZ2dpbmc6IGZhbHNlXG59O1xuXG5jbGFzcyBTZXJlbml0eSBleHRlbmRzIEVtaXR0ZXI8V29ybGRFdmVudFNpZ25hbHMgJiBTZXJ2ZXJFdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGJlaW5nIHVzZWQgZm9yIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wZXJ0aWVzOiBTZXJ2ZXJQcm9wZXJ0aWVzID0gRGVmYXVsdFNlcnZlclByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGhhbmRsZXIgZm9yIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrOiBOZXR3b3JrO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGRzIHRoYXQgYXJlIGN1cnJlbnRseSBsb2FkZWQgb24gdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmxkcyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JsZD4oKTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvdmlkZXJzID0gbmV3IE1hcDxcbiAgICB0eXBlb2YgV29ybGRQcm92aWRlcixcbiAgICBXb3JsZFByb3ZpZGVyUHJvcGVydGllc1xuICA+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIHRlcnJhaW4gZ2VuZXJhdG9ycyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdlbmVyYXRvcnMgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIFRlcnJhaW5HZW5lcmF0b3I+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiU2VyZW5pdHlcIiwgTG9nZ2VyQ29sb3JzLk1hZ2VudGEpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVycyB0aGF0IGFyZSBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXJzID0gbmV3IE1hcDxDb25uZWN0aW9uLCBQbGF5ZXI+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zb2xlIGNvbW1hbmQgaW50ZXJmYWNlIGZvciB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uc29sZSA9IG5ldyBDb25zb2xlSW50ZXJmYWNlKHRoaXMpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUGVybWlzc2lvbnM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgcnVubmluZyBvciBub3RcbiAgICovXG4gIHB1YmxpYyBhbGl2ZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSB0aWNrcyB0aGF0IGhhdmUgYmVlbiByZWNvcmRlZCBieSB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgdGlja3M6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGlja3MgcGVyIHNlY29uZCBvZiB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgdHBzID0gMDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzZXJlbml0eSBzZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXNcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcGVydGllcz86IFBhcnRpYWw8U2VydmVyUHJvcGVydGllcz4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0U2VydmVyUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gU2V0IHRoZSBlbmFibGVkIHZhbHVlIGZvciBkZWJ1ZyBsb2dnaW5nXG4gICAgTG9nZ2VyLkRFQlVHID0gdGhpcy5wcm9wZXJ0aWVzLmRlYnVnTG9nZ2luZztcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBuZXR3b3JrIGhhbmRsZXIgZm9yIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLm5ldHdvcmsgPSBuZXcgTmV0d29yayh0aGlzLCBIYW5kbGVycyk7XG5cbiAgICAvLyBTZXQgdGhlIG1vdGQgZm9yIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLm5ldHdvcmsucmFrbmV0Lm1lc3NhZ2UgPSB0aGlzLnByb3BlcnRpZXMubW90ZDtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBkZWZhdWx0IHRlcnJhaW4gZ2VuZXJhdG9yc1xuICAgIHRoaXMucmVnaXN0ZXJHZW5lcmF0b3IoVm9pZEdlbmVyYXRvcik7XG4gICAgdGhpcy5yZWdpc3RlckdlbmVyYXRvcihTdXBlcmZsYXRHZW5lcmF0b3IpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBwZXJtaXNzaW9ucyBtYXAgZm9yIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLnBlcm1pc3Npb25zID1cbiAgICAgIHR5cGVvZiB0aGlzLnByb3BlcnRpZXMucGVybWlzc2lvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBQZXJtaXNzaW9ucy5mcm9tUGF0aCh0aGlzLCB0aGlzLnByb3BlcnRpZXMucGVybWlzc2lvbnMpXG4gICAgICAgIDogbmV3IFBlcm1pc3Npb25zKHRoaXMsIHsgcGVybWlzc2lvbnM6IHRoaXMucHJvcGVydGllcy5wZXJtaXNzaW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHNlcnZlciBhbmQgYmVnaW5zIGxpc3RlbmluZyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB0aGUgcmFrbmV0IHNlcnZlclxuICAgIHRoaXMubmV0d29yay5yYWtuZXQuc3RhcnQoZmFsc2UpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgbGFzdCB0aWNrIHZhcmlhYmxlXG4gICAgbGV0IGxhc3RUaWNrID0gcHJvY2Vzcy5ocnRpbWUoKTtcblxuICAgIGNvbnN0IFRQUyA9IDIwO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGlja2luZyBsb29wIHRoYXQgd2lsbCBydW4gZXZlcnkgNTBtc1xuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2VydmVyIGlzIHN0aWxsIGFsaXZlXG4gICAgICBpZiAoIXRoaXMuYWxpdmUpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IFtzZWNvbmRzLCBuYW5vc2Vjb25kc10gPSBwcm9jZXNzLmhydGltZShsYXN0VGljayk7XG4gICAgICBjb25zdCBkZWx0YSA9IHNlY29uZHMgKyBuYW5vc2Vjb25kcyAvIDFlOTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlcnZlciBzaG91bGQgdGljayB0aGUgcmFrbmV0IGNvbm5lY3Rpb25zXG4gICAgICBpZiAoZGVsdGEgPj0gMSAvIFJBS05FVF9UUFMpIHtcbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgY29ubmVjdGlvbnMgYW5kIHRpY2sgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMubmV0d29yay5yYWtuZXQuY29ubmVjdGlvbnMudmFsdWVzKCkpXG4gICAgICAgICAgY29ubmVjdGlvbi50aWNrKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIHRpY2tcbiAgICAgIGlmIChkZWx0YSA+PSAxIC8gVFBTKSB7XG4gICAgICAgIC8vIFNldCB0aGUgbGFzdCB0aWNrIHRvIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgbGFzdFRpY2sgPSBwcm9jZXNzLmhydGltZSgpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVsdGEgdGltZVxuICAgICAgICBjb25zdCBkZWx0YVRpY2sgPSBkZWx0YSAqIDEwMDA7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzZXJ2ZXIgdHBzXG4gICAgICAgIHRoaXMudGlja3MucHVzaChEYXRlLm5vdygpKTtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gRGF0ZS5ub3coKSAtIDEwMDA7XG4gICAgICAgIHRoaXMudGlja3MgPSB0aGlzLnRpY2tzLmZpbHRlcigodGljaykgPT4gdGljayA+IHRocmVzaG9sZCk7XG4gICAgICAgIHRoaXMudHBzID0gdGhpcy50aWNrcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gVGljayBhbGwgdGhlIHdvcmxkc1xuICAgICAgICBmb3IgKGNvbnN0IHdvcmxkIG9mIHRoaXMud29ybGRzLnZhbHVlcygpKVxuICAgICAgICAgIHdvcmxkLm9uVGljayhNYXRoLmZsb29yKGRlbHRhVGljaykpO1xuICAgICAgfVxuXG4gICAgICAvLyBTY2hlZHVsZSB0aGUgbmV4dCB0aWNrXG4gICAgICBzZXRJbW1lZGlhdGUodGljayk7XG4gICAgfTtcblxuICAgIC8vIFN0YXJ0IHRoZSB0aWNraW5nIGxvb3BcbiAgICB0aWNrKCk7XG5cbiAgICAvLyBFbWl0IHRoZSBzZXJ2ZXIgc3RhcnR1cCBldmVudFxuICAgIHRoaXMuZW1pdChTZXJ2ZXJFdmVudC5TdGFydCwgMCBhcyBuZXZlcik7XG5cbiAgICAvLyBMb2cgdGhhdCB0aGUgc2VydmVyIGlzIG5vdyBydW5uaW5nXG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgIGDCp2FTZXJ2ZXIgaXMgbm93IHJ1bm5pbmcgYXQgwqcyJHt0aGlzLnByb3BlcnRpZXMuYWRkcmVzc33Cp2E6wqcyJHt0aGlzLnByb3BlcnRpZXMucG9ydH3Cp2EuwqdyIMKnOCh2JHtNSU5FQ1JBRlRfVkVSU0lPTn0sIHByb3RvLXYke1BST1RPQ09MX1ZFUlNJT059KcKncmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgYW5kIGNsb3NlcyBhbGwgY29ubmVjdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHRoZSBjb25zb2xlIGludGVyZmFjZVxuICAgIHRoaXMuY29uc29sZS5pbnRlcmZhY2UuY2xvc2UoKTtcblxuICAgIC8vIEVtaXQgdGhlIHNlcnZlciBzaHV0ZG93biBldmVudFxuICAgIHRoaXMuZW1pdChTZXJ2ZXJFdmVudC5TdG9wLCAwIGFzIG5ldmVyKTtcblxuICAgIC8vIERpc2Nvbm5lY3QgYWxsIHBsYXllcnNcbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLnBsYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIC8vIFdyaXRlIHRoZSBwbGF5ZXIgZGF0YSB0byB0aGUgd29ybGQgcHJvdmlkZXJcbiAgICAgIHBsYXllclxuICAgICAgICAuZ2V0V29ybGQoKVxuICAgICAgICAucHJvdmlkZXIud3JpdGVQbGF5ZXIocGxheWVyLmdldERhdGFFbnRyeSgpLCBwbGF5ZXIuZGltZW5zaW9uKTtcblxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgcGxheWVyIGZyb20gdGhlIHNlcnZlclxuICAgICAgcGxheWVyLmRpc2Nvbm5lY3QoXCJTZXJ2ZXIgY2xvc2VkLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTaHV0ZG93biBhbGwgd29ybGQgcHJvdmlkZXJzXG4gICAgZm9yIChjb25zdCB3b3JsZCBvZiB0aGlzLndvcmxkcy52YWx1ZXMoKSkgd29ybGQucHJvdmlkZXIub25TaHV0ZG93bigpO1xuXG4gICAgLy8gU2V0IHRoZSBzZXJ2ZXIgdG8gbm90IGJlIGFsaXZlXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gU3RvcCB0aGUgcmFrbmV0IHNlcnZlclxuICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4gdGhpcy5uZXR3b3JrLnJha25ldC5zdG9wKCkpO1xuXG4gICAgLy8gTG9nIHRoYXQgdGhlIHNlcnZlciBoYXMgYmVlbiBzdG9wcGVkXG4gICAgdGhpcy5sb2dnZXIuaW5mbyhgwqdjU2VydmVyIGhhcyBiZWVuIHN0b3BwZWQuwqdyYCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbWVzc2FnZSBvZiB0aGUgZGF5IGZvciB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSBtb3RkIFRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TW90ZChtb3RkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5ldHdvcmsucmFrbmV0Lm1lc3NhZ2UgPSBtb3RkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHByb3ZpZGVyIHdpdGggdGhlIHNlcnZlclxuICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgdGhlIHByb3ZpZGVyXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHByb3ZpZGVyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBvciBub3RcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclByb3ZpZGVyKFxuICAgIHByb3ZpZGVyOiB0eXBlb2YgV29ybGRQcm92aWRlcixcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxXb3JsZFByb3ZpZGVyUHJvcGVydGllcz5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLnByb3ZpZGVycy5oYXMocHJvdmlkZXIpKSB7XG4gICAgICAvLyBMb2cgdGhhdCB0aGUgcHJvdmlkZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgUHJvdmlkZXIgYWxyZWFkeSByZWdpc3RlcmVkOiAke3Byb3ZpZGVyLmlkZW50aWZpZXJ9YCk7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgcHJvdmlkZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBwcm92aWRlciwgY2F0Y2ggYW55IGVycm9yc1xuICAgIHRyeSB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwcm92aWRlclxuICAgICAgcHJvdmlkZXIuaW5pdGlhbGl6ZSh0aGlzLCB7XG4gICAgICAgIC4uLkRlZmF1bHRXb3JsZFByb3ZpZGVyUHJvcGVydGllcyxcbiAgICAgICAgLi4ucHJvcGVydGllc1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcHJvdmlkZXIgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzXG4gICAgICB0aGlzLnByb3ZpZGVycy5zZXQocHJvdmlkZXIsIHtcbiAgICAgICAgLi4uRGVmYXVsdFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzXG4gICAgICB9KTtcblxuICAgICAgLy8gTG9nIHRoYXQgdGhlIHByb3ZpZGVyIGhhcyBiZWVuIHJlZ2lzdGVyZWRcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZWdpc3RlcmVkIHByb3ZpZGVyOiAke3Byb3ZpZGVyLmlkZW50aWZpZXJ9YCk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcHJvdmlkZXIgdG8gdGhlIHNlcnZlclxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWdpc3RlciBwcm92aWRlcjogJHtwcm92aWRlci5pZGVudGlmaWVyfWAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSBwcm92aWRlciBmYWlsZWQgdG8gcmVnaXN0ZXJcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJHZW5lcmF0b3IoZ2VuZXJhdG9yOiB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBnZW5lcmF0b3IgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgaWYgKHRoaXMuZ2VuZXJhdG9ycy5oYXMoZ2VuZXJhdG9yLmlkZW50aWZpZXIpKSB7XG4gICAgICAvLyBMb2cgdGhhdCB0aGUgZ2VuZXJhdG9yIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBHZW5lcmF0b3IgYWxyZWFkeSByZWdpc3RlcmVkOiAke2dlbmVyYXRvci5pZGVudGlmaWVyfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgZ2VuZXJhdG9yIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgZ2VuZXJhdG9yIHRvIHRoZSByZWdpc3RlcmVkIGdlbmVyYXRvcnNcbiAgICB0aGlzLmdlbmVyYXRvcnMuc2V0KGdlbmVyYXRvci5pZGVudGlmaWVyLCBnZW5lcmF0b3IpO1xuXG4gICAgLy8gTG9nIHRoYXQgdGhlIGdlbmVyYXRvciBoYXMgYmVlbiByZWdpc3RlcmVkXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlZ2lzdGVyZWQgZ2VuZXJhdG9yOiAke2dlbmVyYXRvci5pZGVudGlmaWVyfWApO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdlbmVyYXRvciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWRcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRHZW5lcmF0b3IoaWRlbnRpZmllcjogc3RyaW5nKTogdHlwZW9mIFRlcnJhaW5HZW5lcmF0b3IgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3JzLmdldChpZGVudGlmaWVyKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgd29ybGQgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm92aWRlclxuICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRvIHVzZSBmb3IgdGhlIHdvcmxkXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgdGhlIHdvcmxkXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHdvcmxkLCBpZiBzdWNjZXNzZnVsOyBvdGhlcndpc2UsIGZhbHNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlV29ybGQoXG4gICAgcHJvdmlkZXI6IHR5cGVvZiBXb3JsZFByb3ZpZGVyLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFdvcmxkUHJvcGVydGllcz5cbiAgKTogV29ybGQgfCBmYWxzZSB7XG4gICAgLy8gR2V0IHRoZSBwcm92aWRlciBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzXG4gICAgY29uc3QgcHJvdmlkZXJQcm9wZXJ0aWVzID0gdGhpcy5wcm92aWRlcnMuZ2V0KHByb3ZpZGVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyByZWdpc3RlcmVkXG4gICAgaWYgKCFwcm92aWRlclByb3BlcnRpZXMpIHtcbiAgICAgIC8vIExvZyB0aGF0IHRoZSBwcm92aWRlciBpcyBub3QgcmVnaXN0ZXJlZFxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHdvcmxkLCBhcyB0aGUgZ2l2ZW4gcHJvdmlkZXIgaXMgbm90IHJlZ2lzdGVyZWQ6ICR7cHJvdmlkZXIuaWRlbnRpZmllcn1gXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHByb3ZpZGVyIGlzIG5vdCByZWdpc3RlcmVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHdvcmxkIHVzaW5nIHRoZSBwcm92aWRlclxuICAgIGNvbnN0IHdvcmxkID0gcHJvdmlkZXIuY3JlYXRlKHRoaXMsIHByb3ZpZGVyUHJvcGVydGllcywgcHJvcGVydGllcyk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgd29ybGQgd2l0aCB0aGUgc2VydmVyXG4gICAgdGhpcy5yZWdpc3RlcldvcmxkKHdvcmxkKTtcblxuICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCB3b3JsZFxuICAgIHJldHVybiB3b3JsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRXb3JsZCgpOiBXb3JsZDtcbiAgcHVibGljIGdldFdvcmxkKGlkZW50aWZpZXI6IHN0cmluZyk6IFdvcmxkIHwgbnVsbDtcbiAgcHVibGljIGdldFdvcmxkKGlkZW50aWZpZXI/OiBzdHJpbmcpOiBXb3JsZCB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBpZGVudGlmaWVyIGlzIG5vdCBwcm92aWRlZFxuICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgLy8gR2V0IHRoZSBmaXJzdCB3b3JsZCBmcm9tIHRoZSB3b3JsZHMgbWFwXG4gICAgICByZXR1cm4gdGhpcy53b3JsZHMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBmcm9tIHRoZSB3b3JsZHMgbWFwXG4gICAgcmV0dXJuIHRoaXMud29ybGRzLmdldChpZGVudGlmaWVyKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSB3b3JsZHMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCBvbiB0aGUgc2VydmVyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHdvcmxkc1xuICAgKi9cbiAgcHVibGljIGdldFdvcmxkcygpOiBBcnJheTxXb3JsZD4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JsZHMudmFsdWVzKCldO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyV29ybGQod29ybGQ6IFdvcmxkKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdvcmxkIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLndvcmxkcy5oYXMod29ybGQuaWRlbnRpZmllcikpIHtcbiAgICAgIC8vIExvZyB0aGF0IHRoZSB3b3JsZCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBXb3JsZCBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7d29ybGQuaWRlbnRpZmllcn1gKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSB3b3JsZCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHdvcmxkIHRvIHRoZSByZWdpc3RlcmVkIHdvcmxkc1xuICAgIHRoaXMud29ybGRzLnNldCh3b3JsZC5pZGVudGlmaWVyLCB3b3JsZCk7XG5cbiAgICAvLyBMb2cgdGhhdCB0aGUgd29ybGQgaGFzIGJlZW4gcmVnaXN0ZXJlZFxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZWdpc3RlcmVkIHdvcmxkOiAke3dvcmxkLmlkZW50aWZpZXJ9YCk7XG5cbiAgICAvLyBDYWxsIHRoZSBvblN0YXJ0dXAgbWV0aG9kIG9mIHRoZSB3b3JsZCBwcm92aWRlclxuICAgIHdvcmxkLnByb3ZpZGVyLm9uU3RhcnR1cCgpO1xuXG4gICAgLy8gQWRkIHRoZSB3b3JsZCB0byB0aGUgd29ybGRzIGVudW1cbiAgICBXb3JsZEVudW0ub3B0aW9ucy5wdXNoKHdvcmxkLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHdvcmxkIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBkaW1lbnNpb24gZnJvbSBhIHdvcmxkIGJ5IGl0cyBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgdG8gZ2V0IHRoZSBkaW1lbnNpb24gZnJvbVxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGltZW5zaW9uXG4gICAqIEByZXR1cm5zIFRoZSBkaW1lbnNpb24sIGlmIGZvdW5kOyBvdGhlcndpc2UsIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXREaW1lbnNpb24od29ybGQ6IFdvcmxkLCBpZGVudGlmaWVyOiBzdHJpbmcpOiBEaW1lbnNpb24gfCBudWxsIHtcbiAgICByZXR1cm4gd29ybGQuZGltZW5zaW9ucy5nZXQoaWRlbnRpZmllcikgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgZGltZW5zaW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkIGluIGEgd29ybGRcbiAgICogQHBhcmFtIHdvcmxkIFRoZSB3b3JsZCB0byBnZXQgdGhlIGRpbWVuc2lvbnMgZnJvbVxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkaW1lbnNpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0RGltZW5zaW9ucyh3b3JsZDogV29ybGQpOiBBcnJheTxEaW1lbnNpb24+IHtcbiAgICByZXR1cm4gWy4uLndvcmxkLmRpbWVuc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBwbGF5ZXIgYnkgdGhlaXIgcmFrbmV0IGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gZ2V0IHRoZSBwbGF5ZXIgZnJvbVxuICAgKiBAcmV0dXJucyBUaGUgcGxheWVyLCBpZiBmb3VuZDsgb3RoZXJ3aXNlLCBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBQbGF5ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXJzLmdldChjb25uZWN0aW9uKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBwbGF5ZXIgYnkgdGhlaXIgeHVpZFxuICAgKiBAcGFyYW0geHVpZCBUaGUgeHVpZCB0byBnZXQgdGhlIHBsYXllciBmcm9tXG4gICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIsIGlmIGZvdW5kOyBvdGhlcndpc2UsIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRQbGF5ZXJCeVh1aWQoeHVpZDogc3RyaW5nKTogUGxheWVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIFsuLi50aGlzLnBsYXllcnMudmFsdWVzKCldLmZpbmQoKHBsYXllcikgPT4gcGxheWVyLnh1aWQgPT09IHh1aWQpID8/IG51bGxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBwbGF5ZXIgYnkgdGhlaXIgdXNlcm5hbWVcbiAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBnZXQgdGhlIHBsYXllciBmcm9tXG4gICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIsIGlmIGZvdW5kOyBvdGhlcndpc2UsIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRQbGF5ZXJCeVVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpOiBQbGF5ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgWy4uLnRoaXMucGxheWVycy52YWx1ZXMoKV0uZmluZChcbiAgICAgICAgKHBsYXllcikgPT4gcGxheWVyLnVzZXJuYW1lID09PSB1c2VybmFtZVxuICAgICAgKSA/PyBudWxsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcGxheWVyIGJ5IHRoZWlyIHV1aWRcbiAgICogQHBhcmFtIHV1aWQgVGhlIHV1aWQgdG8gZ2V0IHRoZSBwbGF5ZXIgZnJvbVxuICAgKiBAcmV0dXJucyBUaGUgcGxheWVyLCBpZiBmb3VuZDsgb3RoZXJ3aXNlLCBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0UGxheWVyQnlVdWlkKHV1aWQ6IHN0cmluZyk6IFBsYXllciB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICBbLi4udGhpcy5wbGF5ZXJzLnZhbHVlcygpXS5maW5kKChwbGF5ZXIpID0+IHBsYXllci51dWlkID09PSB1dWlkKSA/PyBudWxsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgcGxheWVycyB0aGF0IGFyZSBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgcGxheWVyc1xuICAgKi9cbiAgcHVibGljIGdldFBsYXllcnMoKTogQXJyYXk8UGxheWVyPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBsYXllcnMudmFsdWVzKCldO1xuICB9XG59XG5cbmV4cG9ydCB7IFNlcmVuaXR5IH07XG4iLCAiaW1wb3J0IHsgZGVmbGF0ZVJhd1N5bmMsIGluZmxhdGVSYXdTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbixcbiAgRnJhbWUsXG4gIFByaW9yaXR5LFxuICBSZWxpYWJpbGl0eSxcbiAgU2VydmVyXG59IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHtcbiAgQ29tcHJlc3Npb25NZXRob2QsXG4gIHR5cGUgRGF0YVBhY2tldCxcbiAgRGlzY29ubmVjdE1lc3NhZ2UsXG4gIERpc2Nvbm5lY3RQYWNrZXQsXG4gIERpc2Nvbm5lY3RSZWFzb24sXG4gIEZyYW1lcixcbiAgZ2V0UGFja2V0SWQsXG4gIFBhY2tldCxcbiAgUGFja2V0c1xufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgTmV0d29ya0JvdW5kIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5pbXBvcnQgdHlwZSB7IE5ldHdvcmtFdmVudHMsIFNlcnZlclByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9wZXJ0aWVzIHtcbiAgY29tcHJlc3Npb246IGJvb2xlYW47XG4gIGVuY3J5cHRpb246IGJvb2xlYW47XG59XG5cbmNvbnN0IERlZmF1bHRQcm9wZXJ0aWVzOiBDb25uZWN0aW9uUHJvcGVydGllcyA9IHtcbiAgY29tcHJlc3Npb246IGZhbHNlLFxuICBlbmNyeXB0aW9uOiBmYWxzZVxufTtcblxuY2xhc3MgTmV0d29yayBleHRlbmRzIEVtaXR0ZXI8TmV0d29ya0V2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBoYW5kbGUgaW5jb21pbmcgcGFja2V0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHJha25ldCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHVzZWQgdG8gaGFuZGxlIGluY29taW5nIHBhY2tldHNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByYWtuZXQ6IFNlcnZlcjtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIG5ldHdvcmtcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wZXJ0aWVzOiBTZXJ2ZXJQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBsb2cgbmV0d29yayBldmVudHNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiTmV0d29ya1wiLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGNvbm5lY3Rpb25zIHRoYXQgYXJlIGJlaW5nIGhhbmRsZWQgYnkgdGhlIG5ldHdvcmtcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9ucyA9IG5ldyBNYXA8Q29ubmVjdGlvbiwgQ29ubmVjdGlvblByb3BlcnRpZXM+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIHRoYXQgYXJlIGJlaW5nIHVzZWQgdG8gaGFuZGxlIGluY29taW5nIHBhY2tldHNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBoYW5kbGVycyA9IG5ldyBTZXQ8dHlwZW9mIE5ldHdvcmtIYW5kbGVyPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG5ldHdvcmsgaGFuZGxlciBmb3IgYSByYWtuZXQgc2VydmVyXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgaW5zdGFuY2UgdG8gaGFuZGxlIGluY29taW5nIHBhY2tldHMgd2l0aFxuICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGhhbmRsZXJzIHRvIHJlZ2lzdGVyIHRvIHRoZSBuZXR3b3JrXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIGhhbmRsZXJzPzogQXJyYXk8dHlwZW9mIE5ldHdvcmtIYW5kbGVyPlxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBzZXJlbml0eSBpbnN0YW5jZSB0byB0aGUgbmV0d29ya1xuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgbmV0d29yayB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBzZXJlbml0eS5wcm9wZXJ0aWVzO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHJha25ldCBzZXJ2ZXIgZm9yIHRoZSBuZXR3b3JrIGhhbmRsZXJcbiAgICB0aGlzLnJha25ldCA9IG5ldyBTZXJ2ZXIoXG4gICAgICB0aGlzLnByb3BlcnRpZXMuYWRkcmVzcyxcbiAgICAgIHRoaXMucHJvcGVydGllcy5wb3J0LFxuICAgICAgMTAwMCxcbiAgICAgIDQwMFxuICAgICk7XG5cbiAgICAvLyBCaW5kIHRoZSBpbmNvbWluZyBwYWNrZXRzIHRvIHRoZSBpbmNvbWluZyBtZXRob2RcbiAgICB0aGlzLnJha25ldC5vbihcImVuY2Fwc3VsYXRlZFwiLCB0aGlzLm9uRW5jYXBzdWxhdGVkLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQmluZCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgdG8gdGhlIGNvbm5lY3QgbWV0aG9kXG4gICAgdGhpcy5yYWtuZXQub24oXCJjb25uZWN0XCIsIHRoaXMub25Db25uZWN0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gQmluZCB0aGUgaW5jb21pbmcgZGlzY29ubmVjdGlvbnMgdG8gdGhlIGRpc2Nvbm5lY3QgbWV0aG9kXG4gICAgdGhpcy5yYWtuZXQub24oXCJkaXNjb25uZWN0XCIsIHRoaXMub25EaXNjb25uZWN0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGhhbmRsZXJzIHRvIHRoZSBuZXR3b3JrXG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzIHx8IFtdKSB0aGlzLnJlZ2lzdGVySGFuZGxlcihoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgaGFuZGxlciB0byB0aGUgbmV0d29ya1xuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byByZWdpc3RlciB0byB0aGUgbmV0d29ya1xuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihoYW5kbGVyOiB0eXBlb2YgTmV0d29ya0hhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGhhbmRsZXIgZnJvbSB0aGUgbmV0d29ya1xuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byB1bnJlZ2lzdGVyIGZyb20gdGhlIG5ldHdvcmtcbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVySGFuZGxlcihoYW5kbGVyOiB0eXBlb2YgTmV0d29ya0hhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFsbCBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSByYWtuZXQgc2VydmVyXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRoYXQgaXMgYmVpbmcgZXN0YWJsaXNoZWRcbiAgICovXG4gIHB1YmxpYyBvbkNvbm5lY3QoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgaW4gdGhlIGNvbm5lY3Rpb25zIG1hcFxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uKSkgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIGNvbnN0IG9iamVjdCA9IHsgLi4uRGVmYXVsdFByb3BlcnRpZXMgfSBhcyBDb25uZWN0aW9uUHJvcGVydGllcztcblxuICAgIC8vIEFkZCB0aGUgY29ubmVjdGlvbiB0byB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgdGhpcy5jb25uZWN0aW9ucy5zZXQoY29ubmVjdGlvbiwgb2JqZWN0KTtcblxuICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgdGhhdCBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWRcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb25uZWN0aW9uIGVzdGFibGlzaGVkIHdpdGggJHtjb25uZWN0aW9uLnJpbmZvLmFkZHJlc3N9OiR7Y29ubmVjdGlvbi5yaW5mby5wb3J0fWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYWxsIGRpc2Nvbm5lY3Rpb25zIGZyb20gdGhlIHJha25ldCBzZXJ2ZXJcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdGhhdCBpcyBiZWluZyBkaXNjb25uZWN0ZWRcbiAgICovXG4gIHB1YmxpYyBvbkRpc2Nvbm5lY3QoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIGluIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb24pKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYSBkdW1teSBkaXNjb25uZWN0IHBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBEaXNjb25uZWN0UGFja2V0KCk7XG4gICAgcGFja2V0LnJlYXNvbiA9IERpc2Nvbm5lY3RSZWFzb24uRGlzY29ubmVjdGVkO1xuICAgIHBhY2tldC5oaWRlRGlzY29ubmVjdFNjcmVlbiA9IHRydWU7XG5cbiAgICAvLyBUaGVuIHdlIHdpbGwgY3JlYXRlIGEgZHVtbXkgcGF5bG9hZC5cbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oW1xuICAgICAgMHhmZSxcbiAgICAgIENvbXByZXNzaW9uTWV0aG9kLk5vbmUsXG4gICAgICAuLi5GcmFtZXIuZnJhbWUocGFja2V0LnNlcmlhbGl6ZSgpKVxuICAgIF0pO1xuXG4gICAgLy8gRmluYWxseSB3ZSB3aWxsIGNhbGwgdGhlIG9uRW5jYXBzdWxhdGVkIG1ldGhvZCB3aXRoIHRoZSBkdW1teSBwYXlsb2FkLlxuICAgIHRoaXMub25FbmNhcHN1bGF0ZWQoY29ubmVjdGlvbiwgcGF5bG9hZCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgdGhpcy5jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgcGxheWVycyBtYXBcbiAgICB0aGlzLnNlcmVuaXR5LnBsYXllcnMuZGVsZXRlKGNvbm5lY3Rpb24pO1xuXG4gICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSB0aGF0IGEgY29ubmVjdGlvbiBoYXMgYmVlbiBkaXNjb25uZWN0ZWRcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb25uZWN0aW9uIGRpc2Nvbm5lY3RlZCB3aXRoICR7Y29ubmVjdGlvbi5yaW5mby5hZGRyZXNzfToke2Nvbm5lY3Rpb24ucmluZm8ucG9ydH1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFsbCBpbmNvbWluZyBwYWNrZXQgdHJhZmZpYyBmcm9tIHRoZSByYWtuZXQgc2VydmVyXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSByYWtuZXQgY29ubmVjdGlvbiB0aGUgZGF0YSBpcyBjb21pbmcgZnJvbVxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBidWZmZXJzIHRoYXQgYXJlIGJlaW5nIHNlbnQgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIG9uRW5jYXBzdWxhdGVkKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIC4uLmRhdGE6IEFycmF5PEJ1ZmZlcj4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IGZyb20gdGhlIGNvbm5lY3Rpb25zIG1hcFxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBpbiB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlJlY2VpdmVkIGRhdGEgZnJvbSBhIGNvbm5lY3Rpb24gdGhhdCBpcyBub3QgYSByZWdpc3RlcmVkIGNvbm5lY3Rpb24uXCJcbiAgICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkYXRhIGJ1ZmZlcnMgdGhhdCBhcmUgYmVpbmcgc2VudFxuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGRhdGEpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmaXJzdCBieXRlIGlzIGEgaGVhZGVyIGZvciBhIG1pbmVjcmFmdCBwYWNrZXRcbiAgICAgIGlmIChidWZmZXJbMF0gIT09IDB4ZmUpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFja2V0IGhlYWRlclwiKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZW5jcnlwdGVkLlxuICAgICAgLy8gTk9URTogRW5jcnlwdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiBTbyB3ZSB3aWxsIGp1c3QgaGFuZGxlIHRoZSBwYWNrZXQgYXMgaWYgaXQgd2FzIG5vdCBlbmNyeXB0ZWQuXG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgZW5jcnlwdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb24uXG4gICAgICBsZXQgZGVjcnlwdGVkID0gcHJvcGVydGllcy5lbmNyeXB0aW9uXG4gICAgICAgID8gYnVmZmVyLnN1YmFycmF5KDEpXG4gICAgICAgIDogYnVmZmVyLnN1YmFycmF5KDEpO1xuXG4gICAgICAvLyBHZXQgdGhlIGNvbXByZXNzaW9uIGJ5dGUgZnJvbSB0aGUgZGVjcnlwdGVkIGJ1ZmZlci5cbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uID0gZGVjcnlwdGVkWzBdIGFzIG51bWJlcjtcblxuICAgICAgLy8gU29tZSBwYWNrZXRzIGhhdmUgYSBieXRlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLlxuICAgICAgLy8gUmVhZCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGZyb20gdGhlIGJ1ZmZlci5cbiAgICAgIGNvbnN0IGFsZ29yaXRobTogQ29tcHJlc3Npb25NZXRob2QgPSBDb21wcmVzc2lvbk1ldGhvZFtjb21wcmVzc2lvbl1cbiAgICAgICAgPyBkZWNyeXB0ZWQucmVhZFVpbnQ4KClcbiAgICAgICAgOiBDb21wcmVzc2lvbk1ldGhvZC5Ob3RQcmVzZW50O1xuXG4gICAgICBpZiAoYWxnb3JpdGhtICE9PSBDb21wcmVzc2lvbk1ldGhvZC5Ob3RQcmVzZW50KVxuICAgICAgICBkZWNyeXB0ZWQgPSBkZWNyeXB0ZWQuc3ViYXJyYXkoMSk7XG5cbiAgICAgIC8vIEluZmxhdGUgdGhlIGJ1ZmZlciBiYXNlZCBvbiB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLlxuICAgICAgY29uc3QgaW5mbGF0ZWQgPVxuICAgICAgICBhbGdvcml0aG0gPT09IENvbXByZXNzaW9uTWV0aG9kLk5vbmVcbiAgICAgICAgICA/IGRlY3J5cHRlZFxuICAgICAgICAgIDogYWxnb3JpdGhtID09PSBDb21wcmVzc2lvbk1ldGhvZC5Ob3RQcmVzZW50XG4gICAgICAgICAgICA/IGRlY3J5cHRlZFxuICAgICAgICAgICAgOiBhbGdvcml0aG0gPT09IENvbXByZXNzaW9uTWV0aG9kLlpsaWJcbiAgICAgICAgICAgICAgPyB0aGlzLmluZmxhdGVabGliKGRlY3J5cHRlZClcbiAgICAgICAgICAgICAgOiBhbGdvcml0aG0gPT09IENvbXByZXNzaW9uTWV0aG9kLlNuYXBweVxuICAgICAgICAgICAgICAgID8gdGhpcy5pbmZsYXRlU25hcHB5KGRlY3J5cHRlZClcbiAgICAgICAgICAgICAgICA6IGRlY3J5cHRlZDtcblxuICAgICAgLy8gVW5mcmFtZSB0aGUgaW5mbGF0ZWQgYnVmZmVyLlxuICAgICAgLy8gQnVmZmVycyBjYW4gY29udGFpbnMgbXVsdGlwbGUgcGFja2V0cywgc28gd2UgbmVlZCB0byB1bmZyYW1lIHRoZW0uXG4gICAgICBjb25zdCBmcmFtZXMgPSBGcmFtZXIudW5mcmFtZShpbmZsYXRlZCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZXMgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGFja2V0cyBwZXIgZnJhbWUuXG4gICAgICAvLyBJZiBzbywgd2Ugd2lsbCBsb2cgYSB3YXJuaW5nIGFuZCBkaXNjb25uZWN0IHRoZSBzZXNzaW9uLlxuICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhbiBhdHRlbXB0IHRvIGNyYXNoIHRoZSBzZXJ2ZXIsIG9yIHNvbWUgb3RoZXIgbWFsaWNpb3VzIGludGVudC5cbiAgICAgIGlmIChmcmFtZXMubGVuZ3RoID4gdGhpcy5wcm9wZXJ0aWVzLnBhY2tldHNQZXJGcmFtZSkge1xuICAgICAgICAvLyBMb2cgYSB3YXJuaW5nIGlmIHRvbyBtYW55IHBhY2tldHMgd2VyZSBzZW50IGF0IG9uY2UuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFJlY2VpdmVkIHRvbyBtYW55IHBhY2tldHMgZnJvbSBcIiR7Y29ubmVjdGlvbi5yaW5mby5hZGRyZXNzfToke2Nvbm5lY3Rpb24ucmluZm8ucG9ydH1cIiwgZGlzY29ubmVjdGluZyB0aGUgc2Vzc2lvbi5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgc2Vzc2lvbiBpZiB0b28gbWFueSBwYWNrZXRzIHdlcmUgc2VudCBhdCBvbmNlLlxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGZyYW1lcyB0aGF0IHdlcmUgdW5mcmFtZWQuXG4gICAgICAvLyBBbmQgcGFzcyB0aGUgcGFja2V0cyB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzKSB7XG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2tldCBpZCBmcm9tIHRoZSBmcmFtZS5cbiAgICAgICAgY29uc3QgcGFja2V0SWQgPSBnZXRQYWNrZXRJZChmcmFtZSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwYWNrZXQgZnJvbSB0aGUgcGFja2V0IGlkLlxuICAgICAgICBjb25zdCBwYWNrZXRUeXBlID0gUGFja2V0c1twYWNrZXRJZF07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vIHBhY2tldCB3YXMgZm91bmQgZm9yIHRoZSBwYWNrZXQgaWQuXG4gICAgICAgIGlmICghcGFja2V0VHlwZSkge1xuICAgICAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgaWYgbm8gcGFja2V0IHdhcyBmb3VuZCBmb3IgdGhlIHBhY2tldCBpZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBObyBwYWNrZXQgc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIgZm91bmQgZm9yIHBhY2tldCBpZCAke3BhY2tldElkfS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBhY2tldCBpZiBubyBwYWNrZXQgd2FzIGZvdW5kIGZvciB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSB0aGUgcGFja2V0IGZyb20gdGhlIGZyYW1lLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIERlc2VyaWFsaXplIHRoZSBwYWNrZXQgZnJvbSB0aGUgZnJhbWUuXG4gICAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IHBhY2tldFR5cGUoZnJhbWUpLmRlc2VyaWFsaXplKCk7XG5cbiAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHBhY2tldCBldmVudCBmb3IgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICBib3VuZDogTmV0d29ya0JvdW5kLlNlcnZlcixcbiAgICAgICAgICAgIGNvbm5lY3Rpb24sXG4gICAgICAgICAgICBwYWNrZXRcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gRW1pdCB0aGUgcGFja2V0IGV2ZW50IHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLlxuICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmVtaXQocGFja2V0SWQsIGV2ZW50KTtcbiAgICAgICAgICBjb25zdCBhbGwgPSB0aGlzLmVtaXQoXCJhbGxcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyLlxuICAgICAgICAgIC8vIElmIHNvLCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyB3aWxsIG5vdCBiZSBjYWxsZWQuXG4gICAgICAgICAgaWYgKCFuZXR3b3JrIHx8ICFhbGwpIHtcbiAgICAgICAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgaWYgdGhlIHBhY2tldCB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyLlxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBQYWNrZXQgcmVjZWl2ZWQgd2l0aCBpZCAke3BhY2tldElkfSB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBhY2tldCBpZiBpdCB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyLlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGhhbmRsZXJzIHRoYXQgaGF2ZSBhIHBhY2tldCB0aGF0IG1hdGNoZXMgdGhlIHBhY2tldCBpZC5cbiAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IEFycmF5LmZyb20odGhpcy5oYW5kbGVycykuZmlsdGVyKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlci5wYWNrZXQgPT09IHBhY2tldElkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbm8gaGFuZGxlcnMgd2VyZSBmb3VuZCBmb3IgdGhlIHBhY2tldCBpZC5cbiAgICAgICAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBEZWJ1ZyBsb2cgdGhhdCBubyBoYW5kbGVycyB3ZXJlIGZvdW5kIGZvciB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBObyBoYW5kbGVycyBmb3VuZCBmb3IgcGFja2V0ICR7UGFja2V0W3BhY2tldElkXX0sIHdpdGggaWQgJHtwYWNrZXRJZH1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwYWNrZXQgaWYgbm8gaGFuZGxlcnMgd2VyZSBmb3VuZCBmb3IgdGhlIHBhY2tldCBpZC5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuXG4gICAgICAgICAgLy8gQW5kIGNhbGwgdGhlIGhhbmRsZSBtZXRob2QgZm9yIGVhY2ggaGFuZGxlci5cbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBoYW5kbGVyIGhhcyBhIHBhY2tldCB0aGF0IG1hdGNoZXMgdGhlIHBhY2tldCBpZC5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyLnBhY2tldCA9PT0gcGFja2V0SWQpIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBoYW5kbGUgdGhlIHBhY2tldCB3aXRoIHRoZSBoYW5kbGVyLlxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaGFuZGxlciB3aXRoIHRoZSBzZXJlbml0eSBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBoYW5kbGVyKHRoaXMuc2VyZW5pdHkpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlIG1ldGhvZCBmb3IgdGhlIGhhbmRsZXIuXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuaGFuZGxlKHBhY2tldCwgY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgaGFuZGxpbmcgZXJyb3IgaWYgdGhlIHBhY2tldCBjb3VsZCBub3QgYmUgaGFuZGxlZC5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gaGFuZGxlIHBhY2tldCB3aXRoIGlkICR7cGFja2V0SWR9YCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgIC8vIExvZyB0aGUgZGVzZXJpYWxpemF0aW9uIGVycm9yIGlmIHRoZSBwYWNrZXQgY291bGQgbm90IGJlIGRlc2VyaWFsaXplZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgcGFja2V0IHdpdGggaWQgJHtwYWNrZXRJZH1gLFxuICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmZsYXRlcyBhIHpsaWIgY29tcHJlc3NlZCBidWZmZXJcbiAgICogQHBhcmFtIGJ1ZmZlciBUaGUgemxpYiBjb21wcmVzc2VkIGJ1ZmZlciB0byBpbmZsYXRlXG4gICAqIEByZXR1cm5zIFRoZSBpbmZsYXRlZCBidWZmZXJcbiAgICovXG4gIHB1YmxpYyBpbmZsYXRlWmxpYihidWZmZXI6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGluZmxhdGVSYXdTeW5jKGJ1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogSW5mbGF0ZXMgYSBzbmFwcHkgY29tcHJlc3NlZCBidWZmZXJcbiAgICogQHBhcmFtIGJ1ZmZlciBUaGUgc25hcHB5IGNvbXByZXNzZWQgYnVmZmVyIHRvIGluZmxhdGVcbiAgICogQHJldHVybnMgVGhlIGluZmxhdGVkIGJ1ZmZlclxuICAgKi9cbiAgcHVibGljIGluZmxhdGVTbmFwcHkoX2J1ZmZlcjogQnVmZmVyKTogQnVmZmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGJhdGNoIG9mIHBhY2tldHMgdG8gYSBjb25uZWN0aW9uIHdpdGggYSBzcGVjaWZpZWQgcHJpb3JpdHlcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gc2VuZCB0aGUgcGFja2V0cyB0b1xuICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBwYWNrZXRzIGJlaW5nIHNlbnRcbiAgICogQHBhcmFtIHBhY2tldHMgVGhlIHBhY2tldHMgdG8gc2VuZCB0byB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHNlbmQoXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAgICBwcmlvcml0eSA9IFByaW9yaXR5Lk5vcm1hbCxcbiAgICAuLi5wYWNrZXRzOiBBcnJheTxEYXRhUGFja2V0PlxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IGZyb20gdGhlIGNvbm5lY3Rpb25zIG1hcFxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBpbiB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF0dGVtcHRlZCB0byBzZW5kIHBhY2tldHMgdG8gYSBjb25uZWN0aW9uIHRoYXQgaXMgbm90IGEgcmVnaXN0ZXJlZCBjb25uZWN0aW9uLlwiXG4gICAgICApO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGF0YSBidWZmZXJzIHRvIHNlbmQgdG8gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBkYXRhOiBBcnJheTxCdWZmZXI+ID0gW107XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwYWNrZXRzIHRoYXQgYXJlIGJlaW5nIHNlbnQsIGFuZCBhdHRlbXB0IHRvIHNlcmlhbGl6ZSB0aGVtXG4gICAgLy8gV2Ugd2lsbCBhbHNvIGVtaXQgdGhlIHBhY2tldCBldmVudCB0byB0aHJvdWdoIHRoZSBuZXR3b3JrIGV2ZW50IGVtaXR0ZXJcbiAgICBmb3IgKGNvbnN0IHBhY2tldCBvZiBwYWNrZXRzKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcGFja2V0IGV2ZW50IGZvciB0aGUgcGFja2V0XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgYm91bmQ6IE5ldHdvcmtCb3VuZC5DbGllbnQsXG4gICAgICAgIGNvbm5lY3Rpb24sXG4gICAgICAgIHBhY2tldFxuICAgICAgfTtcblxuICAgICAgLy8gRW1pdCB0aGUgcGFja2V0IGV2ZW50IHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5lbWl0KHBhY2tldC5nZXRJZCgpIGFzIFBhY2tldCwgZXZlbnQpO1xuICAgICAgY29uc3QgYWxsID0gdGhpcy5lbWl0KFwiYWxsXCIsIGV2ZW50KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyXG4gICAgICAvLyBJZiBzbywgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2lsbCBub3QgYmUgY2FsbGVkXG4gICAgICBpZiAoIW5ldHdvcmsgfHwgIWFsbCkge1xuICAgICAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGlmIHRoZSBwYWNrZXQgd2FzIGNhbmNlbGxlZCBieSBhbiBleHRlcm5hbCBsaXN0ZW5lclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgUGFja2V0IHNlbnQgd2l0aCBpZCAke3BhY2tldC5nZXRJZCgpfSB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwYWNrZXQgaWYgaXQgd2FzIGNhbmNlbGxlZCBieSBhbiBleHRlcm5hbCBsaXN0ZW5lclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBzZXJpYWxpemUgdGhlIHBhY2tldFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBwYWNrZXQgYW5kIGFkZCBpdCB0byB0aGUgZGF0YSBidWZmZXJzXG4gICAgICAgIGRhdGEucHVzaChwYWNrZXQuc2VyaWFsaXplKCkpO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgc2VyaWFsaXphdGlvbiBlcnJvciBpZiB0aGUgcGFja2V0IGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc2VyaWFsaXplIHBhY2tldCB3aXRoIGlkICR7cGFja2V0LmdldElkKCl9YCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGcmFtZSB0aGUgZGF0YSBidWZmZXJzIGludG8gYSBzaW5ndWxhciBidWZmZXJcbiAgICBjb25zdCBmcmFtZWQgPSBGcmFtZXIuZnJhbWUoLi4uZGF0YSk7XG5cbiAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGZyYW1lZCBidWZmZXIsIHdlIHdpbGwgY29tcHJlc3MgaXRcbiAgICBjb25zdCBkZWZsYXRlZCA9XG4gICAgICBmcmFtZWQuYnl0ZUxlbmd0aCA+IHRoaXMucHJvcGVydGllcy5jb21wcmVzc2lvblRocmVzaG9sZCAmJlxuICAgICAgcHJvcGVydGllcy5jb21wcmVzc2lvblxuICAgICAgICA/IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgICAgQnVmZmVyLmZyb20oW3RoaXMucHJvcGVydGllcy5jb21wcmVzc2lvbk1ldGhvZF0pLFxuICAgICAgICAgICAgdGhpcy5kZWZsYXRlWmxpYihmcmFtZWQpXG4gICAgICAgICAgXSlcbiAgICAgICAgOiBwcm9wZXJ0aWVzLmNvbXByZXNzaW9uXG4gICAgICAgICAgPyBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbQ29tcHJlc3Npb25NZXRob2QuTm9uZV0pLCBmcmFtZWRdKVxuICAgICAgICAgIDogZnJhbWVkO1xuXG4gICAgLy8gV2Ugd2lsbCB0aGVuIGNoZWNrIGlmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIHNlc3Npb24uXG4gICAgLy8gSWYgc28sIHdlIHdpbGwgZW5jcnlwdCB0aGUgZGVmbGF0ZWQgcGF5bG9hZC5cbiAgICAvLyBJZiBub3QsIHdlIHdpbGwganVzdCB1c2UgdGhlIGRlZmxhdGVkIHBheWxvYWQuXG4gICAgLy8gTk9URTogRW5jcnlwdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiBTbyB3ZSB3aWxsIGp1c3QgdXNlIHRoZSBkZWZsYXRlZCBwYXlsb2FkIGZvciBub3cuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IGVuY3J5cHRpb24gZm9yIHRoZSBzZXNzaW9uLlxuICAgIGNvbnN0IGVuY3J5cHRlZCA9IHByb3BlcnRpZXMuZW5jcnlwdGlvbiA/IGRlZmxhdGVkIDogZGVmbGF0ZWQ7XG5cbiAgICAvLyBXZSB3aWxsIHRoZW4gY29uc3RydWN0IHRoZSBmaW5hbCBwYXlsb2FkIHdpdGggdGhlIGdhbWUgaGVhZGVyIGFuZCB0aGUgZW5jcnlwdGVkIGNvbXByZXNzZWQgcGF5bG9hZC5cbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzB4ZmVdKSwgZW5jcnlwdGVkXSk7XG5cbiAgICAvLyBGaW5hbGx5IHdlIHdpbGwgYXNzZW1ibGUgYSBuZXcgZnJhbWUgd2l0aCB0aGUgcGF5bG9hZC5cbiAgICAvLyBUaGUgZnJhbWUgY29udGFpbnMgdGhlIHJlbGlhYmlsaXR5IGFuZCBwcmlvcml0eSBvZiB0aGUgcGFja2V0LlxuICAgIC8vIEFzIHdlbGwgYXMgdGhlIHBheWxvYWQgaXRzZWxmLlxuICAgIGNvbnN0IGZyYW1lID0gbmV3IEZyYW1lKCk7XG4gICAgZnJhbWUucmVsaWFiaWxpdHkgPSBSZWxpYWJpbGl0eS5SZWxpYWJsZTtcbiAgICBmcmFtZS5vcmRlckNoYW5uZWwgPSAwO1xuICAgIGZyYW1lLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgLy8gQW5kIHNlbmQgdGhlIGZyYW1lIHRvIHRoZSBzZXNzaW9uLlxuICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmRGcmFtZShmcmFtZSwgcHJpb3JpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgYmF0Y2ggb2YgcGFja2V0cyB0byBhIGNvbm5lY3Rpb24gd2l0aCBub3JtYWwgcHJpb3JpdHlcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gc2VuZCB0aGUgcGFja2V0cyB0byB3aXRoIG5vcm1hbCBwcmlvcml0eVxuICAgKiBAcGFyYW0gcGFja2V0cyBUaGUgcGFja2V0cyB0byBzZW5kIHRvIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc2VuZE5vcm1hbChcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uLFxuICAgIC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2VuZChjb25uZWN0aW9uLCBQcmlvcml0eS5Ob3JtYWwsIC4uLnBhY2tldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgYmF0Y2ggb2YgcGFja2V0cyB0byBhIGNvbm5lY3Rpb24gd2l0aCBpbW1lZGlhdGUgcHJpb3JpdHlcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gc2VuZCB0aGUgcGFja2V0cyB0byBpbW1lZGlhdGVseVxuICAgKiBAcGFyYW0gcGFja2V0cyBUaGUgcGFja2V0cyB0byBzZW5kIHRvIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc2VuZEltbWVkaWF0ZShcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uLFxuICAgIC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2VuZChjb25uZWN0aW9uLCBQcmlvcml0eS5JbW1lZGlhdGUsIC4uLnBhY2tldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmxhdGVzIGEgYnVmZmVyIHVzaW5nIHRoZSB6bGliIGNvbXByZXNzaW9uIGFsZ29yaXRobVxuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdG8gZGVmbGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgZGVmbGF0ZWQgYnVmZmVyXG4gICAqL1xuICBwdWJsaWMgZGVmbGF0ZVpsaWIoYnVmZmVyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiBkZWZsYXRlUmF3U3luYyhidWZmZXIpO1xuICB9XG5cbiAgcHVibGljIHNldENvbXByZXNzaW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IGZyb20gdGhlIGNvbm5lY3Rpb25zIG1hcFxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBpbiB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdGhlIGNvbXByZXNzaW9uIHByb3BlcnR5IGZvciB0aGUgY29ubmVjdGlvblxuICAgIHByb3BlcnRpZXMuY29tcHJlc3Npb24gPSBlbmFibGVkO1xuICB9XG5cbiAgcHVibGljIHNldEVuY3J5cHRpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgY29ubmVjdGlvbiBvYmplY3QgZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGluIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcblxuICAgIC8vIFNldCB0aGUgZW5jcnlwdGlvbiBwcm9wZXJ0eSBmb3IgdGhlIGNvbm5lY3Rpb25cbiAgICBwcm9wZXJ0aWVzLmVuY3J5cHRpb24gPSBlbmFibGVkO1xuICB9XG5cbiAgcHVibGljIGRpc2Nvbm5lY3RDb25uZWN0aW9uKFxuICAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHJlYXNvbjogRGlzY29ubmVjdFJlYXNvblxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRGlzY29ubmVjdFBhY2tldCB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgcmVhc29uXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IERpc2Nvbm5lY3RQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgbWVzc2FnZSBhbmQgcmVhc29uIHRvIHRoZSBwYWNrZXRcbiAgICBwYWNrZXQubWVzc2FnZSA9IG5ldyBEaXNjb25uZWN0TWVzc2FnZShtZXNzYWdlLCBTdHJpbmcoKSk7XG4gICAgcGFja2V0LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBwYWNrZXQuaGlkZURpc2Nvbm5lY3RTY3JlZW4gPSBmYWxzZTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgY29ubmVjdGlvblxuICAgIHRoaXMuc2VuZEltbWVkaWF0ZShjb25uZWN0aW9uLCBwYWNrZXQpO1xuICB9XG59XG5cbmV4cG9ydCB7IE5ldHdvcmsgfTtcbiIsICJlbnVtIE5ldHdvcmtCb3VuZCB7XG4gIFNlcnZlciA9IDAsXG4gIENsaWVudCA9IDFcbn1cblxuZXhwb3J0IHsgTmV0d29ya0JvdW5kIH07XG4iLCAiZXhwb3J0IGVudW0gQmxvY2tJZGVudGlmaWVyIHtcbiAgUGlua1R1bGlwID0gXCJtaW5lY3JhZnQ6cGlua190dWxpcFwiLFxuICBCdWRkaW5nQW1ldGh5c3QgPSBcIm1pbmVjcmFmdDpidWRkaW5nX2FtZXRoeXN0XCIsXG4gIExpZ2h0Qmx1ZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgR3JhdmVsID0gXCJtaW5lY3JhZnQ6Z3JhdmVsXCIsXG4gIERldGVjdG9yUmFpbCA9IFwibWluZWNyYWZ0OmRldGVjdG9yX3JhaWxcIixcbiAgQ3lhblRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpjeWFuX3RlcnJhY290dGFcIixcbiAgSGFyZFBpbmtTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3Bpbmtfc3RhaW5lZF9nbGFzc1wiLFxuICBMaWdodEdyYXlDYW5kbGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2NhbmRsZVwiLFxuICBOZXRoZXJHb2xkT3JlID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2dvbGRfb3JlXCIsXG4gIFBvbGlzaGVkQmFzYWx0ID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmFzYWx0XCIsXG4gIEJsdWVDYW5kbGUgPSBcIm1pbmVjcmFmdDpibHVlX2NhbmRsZVwiLFxuICBEYXJrT2FrV29vZCA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3dvb2RcIixcbiAgVHVmZkJyaWNrV2FsbCA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfd2FsbFwiLFxuICBBY2FjaWFXYWxsU2lnbiA9IFwibWluZWNyYWZ0OmFjYWNpYV93YWxsX3NpZ25cIixcbiAgQmFtYm9vUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmJhbWJvb19wcmVzc3VyZV9wbGF0ZVwiLFxuICBNZWxvbkJsb2NrID0gXCJtaW5lY3JhZnQ6bWVsb25fYmxvY2tcIixcbiAgUmVkV29vbCA9IFwibWluZWNyYWZ0OnJlZF93b29sXCIsXG4gIEdvbGRPcmUgPSBcIm1pbmVjcmFmdDpnb2xkX29yZVwiLFxuICBCaXJjaFN0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0OmJpcmNoX3N0YW5kaW5nX3NpZ25cIixcbiAgRWxlbWVudDkzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85M1wiLFxuICBXYXhlZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIENvcm5mbG93ZXIgPSBcIm1pbmVjcmFmdDpjb3JuZmxvd2VyXCIsXG4gIFJlZE5ldGhlckJyaWNrID0gXCJtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja1wiLFxuICBPeGlkaXplZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIFdhcnBlZERvb3IgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZG9vclwiLFxuICBQb2xpc2hlZEdyYW5pdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ncmFuaXRlX3N0YWlyc1wiLFxuICBSZWRNdXNocm9vbUJsb2NrID0gXCJtaW5lY3JhZnQ6cmVkX211c2hyb29tX2Jsb2NrXCIsXG4gIEVsZW1lbnQzMCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzBcIixcbiAgRGVhZEJ1YmJsZUNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsX3dhbGxfZmFuXCIsXG4gIEJsdWVDYXJwZXQgPSBcIm1pbmVjcmFmdDpibHVlX2NhcnBldFwiLFxuICBCYW1ib29CbG9jayA9IFwibWluZWNyYWZ0OmJhbWJvb19ibG9ja1wiLFxuICBEZWVwc2xhdGVCcmlja3MgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfYnJpY2tzXCIsXG4gIFdheGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyXCIsXG4gIFdoaXRlV29vbCA9IFwibWluZWNyYWZ0OndoaXRlX3dvb2xcIixcbiAgV29vZGVuRG9vciA9IFwibWluZWNyYWZ0Ondvb2Rlbl9kb29yXCIsXG4gIFBpc3RvbkFybUNvbGxpc2lvbiA9IFwibWluZWNyYWZ0OnBpc3Rvbl9hcm1fY29sbGlzaW9uXCIsXG4gIFJlZFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpyZWRfc2FuZHN0b25lX3NsYWJcIixcbiAgRGFya1ByaXNtYXJpbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpkYXJrX3ByaXNtYXJpbmVfc3RhaXJzXCIsXG4gIEVuZEJyaWNrcyA9IFwibWluZWNyYWZ0OmVuZF9icmlja3NcIixcbiAgU2N1bGtTaHJpZWtlciA9IFwibWluZWNyYWZ0OnNjdWxrX3Nocmlla2VyXCIsXG4gIEJhbWJvb01vc2FpY1N0YWlycyA9IFwibWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc3RhaXJzXCIsXG4gIFZpbmUgPSBcIm1pbmVjcmFmdDp2aW5lXCIsXG4gIFdheGVkT3hpZGl6ZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBXaGl0ZVR1bGlwID0gXCJtaW5lY3JhZnQ6d2hpdGVfdHVsaXBcIixcbiAgR3Jhbml0ZSA9IFwibWluZWNyYWZ0OmdyYW5pdGVcIixcbiAgUG9saXNoZWRUdWZmU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfc2xhYlwiLFxuICBCcm93bk11c2hyb29tID0gXCJtaW5lY3JhZnQ6YnJvd25fbXVzaHJvb21cIixcbiAgQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6Y3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgQmx1ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBFbGVtZW50MCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMFwiLFxuICBFeHBvc2VkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2Rvb3JcIixcbiAgQmxhY2tzdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lX2RvdWJsZV9zbGFiXCIsXG4gIFNwcnVjZVN0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0OnNwcnVjZV9zdGFuZGluZ19zaWduXCIsXG4gIEVsZW1lbnQxMTggPSBcIm1pbmVjcmFmdDplbGVtZW50XzExOFwiLFxuICBGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpmZW5jZV9nYXRlXCIsXG4gIERlZXBzbGF0ZVRpbGVTbGFiID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfc2xhYlwiLFxuICBQb3dkZXJTbm93ID0gXCJtaW5lY3JhZnQ6cG93ZGVyX3Nub3dcIixcbiAgTWFnZW50YUNhbmRsZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfY2FuZGxlXCIsXG4gIERlZXBzbGF0ZVRpbGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfZG91YmxlX3NsYWJcIixcbiAgQ2FsY2l0ZSA9IFwibWluZWNyYWZ0OmNhbGNpdGVcIixcbiAgR3JheVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpncmF5X3RlcnJhY290dGFcIixcbiAgQ3lhbkNhcnBldCA9IFwibWluZWNyYWZ0OmN5YW5fY2FycGV0XCIsXG4gIEN5YW5TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpjeWFuX3N0YWluZWRfZ2xhc3NcIixcbiAgRGFya09ha0J1dHRvbiA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2J1dHRvblwiLFxuICBEZWVwc2xhdGVDb3BwZXJPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfY29wcGVyX29yZVwiLFxuICBTdG9uZUJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnJpY2tfc3RhaXJzXCIsXG4gIFdheGVkT3hpZGl6ZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFdhcnBlZFdhbGxTaWduID0gXCJtaW5lY3JhZnQ6d2FycGVkX3dhbGxfc2lnblwiLFxuICBMYWRkZXIgPSBcIm1pbmVjcmFmdDpsYWRkZXJcIixcbiAgQ2hpc2VsZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3N0b25lX2JyaWNrc1wiLFxuICBTcHJ1Y2VQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6c3BydWNlX3ByZXNzdXJlX3BsYXRlXCIsXG4gIERpYW1vbmRPcmUgPSBcIm1pbmVjcmFmdDpkaWFtb25kX29yZVwiLFxuICBXYXhlZE94aWRpemVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlclwiLFxuICBEZWFkSG9ybkNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfaG9ybl9jb3JhbF93YWxsX2ZhblwiLFxuICBHcmF5Q29uY3JldGUgPSBcIm1pbmVjcmFmdDpncmF5X2NvbmNyZXRlXCIsXG4gIEVsZW1lbnQ3MyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzNcIixcbiAgQ29iYmxlc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6Y29iYmxlc3RvbmVfc2xhYlwiLFxuICBHcmVlblRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpncmVlbl90ZXJyYWNvdHRhXCIsXG4gIEhhcmRQdXJwbGVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9wdXJwbGVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFdheGVkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgTmV0aGVyQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tfc3RhaXJzXCIsXG4gIEhhcmRCbHVlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfYmx1ZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgWWVsbG93U2h1bGtlckJveCA9IFwibWluZWNyYWZ0OnllbGxvd19zaHVsa2VyX2JveFwiLFxuICBDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX2NvcHBlclwiLFxuICBHcmFuaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZV9zdGFpcnNcIixcbiAgR3JheVdvb2wgPSBcIm1pbmVjcmFmdDpncmF5X3dvb2xcIixcbiAgR3JlZW5Db25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmdyZWVuX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBMaW1lU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bGltZV9zdGFpbmVkX2dsYXNzXCIsXG4gIE94aWRpemVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9idWxiXCIsXG4gIENvYmJsZWREZWVwc2xhdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZV9zdGFpcnNcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJcIixcbiAgU3RyaXBwZWRBY2FjaWFXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYWNhY2lhX3dvb2RcIixcbiAgRWxlbWVudDE2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xNlwiLFxuICBKdW5nbGVCdXR0b24gPSBcIm1pbmVjcmFmdDpqdW5nbGVfYnV0dG9uXCIsXG4gIERlYWRCdWJibGVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsX2ZhblwiLFxuICBQb3dlcmVkUmVwZWF0ZXIgPSBcIm1pbmVjcmFmdDpwb3dlcmVkX3JlcGVhdGVyXCIsXG4gIFNwcnVjZVN0YWlycyA9IFwibWluZWNyYWZ0OnNwcnVjZV9zdGFpcnNcIixcbiAgTG9vbSA9IFwibWluZWNyYWZ0Omxvb21cIixcbiAgSGFyZEdyZWVuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfZ3JlZW5fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEVsZW1lbnQxMDQgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwNFwiLFxuICBZZWxsb3dTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfc3RhaW5lZF9nbGFzc1wiLFxuICBPeGlkaXplZERvdWJsZUN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9kb3VibGVfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIEp1bmdsZURvb3IgPSBcIm1pbmVjcmFmdDpqdW5nbGVfZG9vclwiLFxuICBEaW9yaXRlID0gXCJtaW5lY3JhZnQ6ZGlvcml0ZVwiLFxuICBEYXJrb2FrV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDpkYXJrb2FrX3dhbGxfc2lnblwiLFxuICBJbmZvVXBkYXRlMiA9IFwibWluZWNyYWZ0OmluZm9fdXBkYXRlMlwiLFxuICBEcmlwc3RvbmVCbG9jayA9IFwibWluZWNyYWZ0OmRyaXBzdG9uZV9ibG9ja1wiLFxuICBHcmF5Q2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OmdyYXlfY2FuZGxlX2Nha2VcIixcbiAgRXhwb3NlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgQmx1ZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpibHVlX3RlcnJhY290dGFcIixcbiAgSGFuZ2luZ1Jvb3RzID0gXCJtaW5lY3JhZnQ6aGFuZ2luZ19yb290c1wiLFxuICBTbW9vdGhTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZUJ1dHRvbiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnV0dG9uXCIsXG4gIFN0cmlwcGVkQmlyY2hXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYmlyY2hfd29vZFwiLFxuICBSZWRDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6cmVkX2NhbmRsZV9jYWtlXCIsXG4gIE1vc3N5U3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDptb3NzeV9zdG9uZV9icmlja3NcIixcbiAgSGFyZExpZ2h0Qmx1ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2xpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIENoZXJyeVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpjaGVycnlfcHJlc3N1cmVfcGxhdGVcIixcbiAgSGFyZEJyb3duU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9icm93bl9zdGFpbmVkX2dsYXNzXCIsXG4gIENoZXJyeUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2hhbmdpbmdfc2lnblwiLFxuICBZZWxsb3dXb29sID0gXCJtaW5lY3JhZnQ6eWVsbG93X3dvb2xcIixcbiAgQmxhY2tDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6YmxhY2tfY2FuZGxlX2Nha2VcIixcbiAgQ3JpbXNvbldhbGxTaWduID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl93YWxsX3NpZ25cIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3N0YWlyc1wiLFxuICBMaWdodEJsb2NrMSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzFcIixcbiAgRWxlbWVudDQ2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF80NlwiLFxuICBTbW9vdGhTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZV9zbGFiXCIsXG4gIEdyYXlDYXJwZXQgPSBcIm1pbmVjcmFmdDpncmF5X2NhcnBldFwiLFxuICBEYXJrT2FrRG9vciA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2Rvb3JcIixcbiAgV2hlYXQgPSBcIm1pbmVjcmFmdDp3aGVhdFwiLFxuICBHcmluZHN0b25lID0gXCJtaW5lY3JhZnQ6Z3JpbmRzdG9uZVwiLFxuICBPYWtGZW5jZSA9IFwibWluZWNyYWZ0Om9ha19mZW5jZVwiLFxuICBZZWxsb3dTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6eWVsbG93X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBEYXJrT2FrU2xhYiA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3NsYWJcIixcbiAgUG9saXNoZWRHcmFuaXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfZG91YmxlX3NsYWJcIixcbiAgSG9uZXljb21iQmxvY2sgPSBcIm1pbmVjcmFmdDpob25leWNvbWJfYmxvY2tcIixcbiAgRW5kR2F0ZXdheSA9IFwibWluZWNyYWZ0OmVuZF9nYXRld2F5XCIsXG4gIEF6dXJlQmx1ZXQgPSBcIm1pbmVjcmFmdDphenVyZV9ibHVldFwiLFxuICBTdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnN0b25lX3N0YWlyc1wiLFxuICBCZWFjb24gPSBcIm1pbmVjcmFmdDpiZWFjb25cIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja193YWxsXCIsXG4gIFNub3dMYXllciA9IFwibWluZWNyYWZ0OnNub3dfbGF5ZXJcIixcbiAgSGFyZFBpbmtTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9waW5rX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpicmlja19kb3VibGVfc2xhYlwiLFxuICBXaGl0ZUNhcnBldCA9IFwibWluZWNyYWZ0OndoaXRlX2NhcnBldFwiLFxuICBCbGFja0NhbmRsZSA9IFwibWluZWNyYWZ0OmJsYWNrX2NhbmRsZVwiLFxuICBDYWN0dXMgPSBcIm1pbmVjcmFmdDpjYWN0dXNcIixcbiAgR2xvd0ZyYW1lID0gXCJtaW5lY3JhZnQ6Z2xvd19mcmFtZVwiLFxuICBNdWRCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDptdWRfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgQmFtYm9vTW9zYWljU2xhYiA9IFwibWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc2xhYlwiLFxuICBCYW1ib29GZW5jZSA9IFwibWluZWNyYWZ0OmJhbWJvb19mZW5jZVwiLFxuICBEYXJrUHJpc21hcmluZVNsYWIgPSBcIm1pbmVjcmFmdDpkYXJrX3ByaXNtYXJpbmVfc2xhYlwiLFxuICBQcmlzbWFyaW5lQnJpY2tzU3RhaXJzID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja3Nfc3RhaXJzXCIsXG4gIE15Y2VsaXVtID0gXCJtaW5lY3JhZnQ6bXljZWxpdW1cIixcbiAgRGlvcml0ZVNsYWIgPSBcIm1pbmVjcmFmdDpkaW9yaXRlX3NsYWJcIixcbiAgUmVkQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpyZWRfY29uY3JldGVcIixcbiAgQ3JpbXNvbkh5cGhhZSA9IFwibWluZWNyYWZ0OmNyaW1zb25faHlwaGFlXCIsXG4gIEJsYWNrVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJsYWNrX3RlcnJhY290dGFcIixcbiAgU3RyaXBwZWREYXJrT2FrTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfZGFya19vYWtfbG9nXCIsXG4gIEhhcmRPcmFuZ2VTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9vcmFuZ2Vfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIE94aWRpemVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJfZ3JhdGVcIixcbiAgSnVuZ2xlTG9nID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2xvZ1wiLFxuICBCdWJibGVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmJ1YmJsZV9jb3JhbF9mYW5cIixcbiAgQmFtYm9vU2xhYiA9IFwibWluZWNyYWZ0OmJhbWJvb19zbGFiXCIsXG4gIExpdFJlZHN0b25lT3JlID0gXCJtaW5lY3JhZnQ6bGl0X3JlZHN0b25lX29yZVwiLFxuICBOZXRoZXJXYXJ0ID0gXCJtaW5lY3JhZnQ6bmV0aGVyX3dhcnRcIixcbiAgT3JhbmdlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgU3RyaXBwZWRNYW5ncm92ZVdvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9tYW5ncm92ZV93b29kXCIsXG4gIEN1dFJlZFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OmN1dF9yZWRfc2FuZHN0b25lXCIsXG4gIExpbWVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6bGltZV9zaHVsa2VyX2JveFwiLFxuICBIYXJkQmxhY2tTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9ibGFja19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVcIixcbiAgTGlseU9mVGhlVmFsbGV5ID0gXCJtaW5lY3JhZnQ6bGlseV9vZl90aGVfdmFsbGV5XCIsXG4gIEJsdWVPcmNoaWQgPSBcIm1pbmVjcmFmdDpibHVlX29yY2hpZFwiLFxuICBMaW1lR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpbWVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp0cmFwZG9vclwiLFxuICBIYXJkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9nbGFzc19wYW5lXCIsXG4gIERlYWRCcmFpbkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9icmFpbl9jb3JhbF9mYW5cIixcbiAgQWNhY2lhU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3N0YW5kaW5nX3NpZ25cIixcbiAgVW5keWVkU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OnVuZHllZF9zaHVsa2VyX2JveFwiLFxuICBRdWFydHpPcmUgPSBcIm1pbmVjcmFmdDpxdWFydHpfb3JlXCIsXG4gIEluZm9VcGRhdGUgPSBcIm1pbmVjcmFmdDppbmZvX3VwZGF0ZVwiLFxuICBTZWFncmFzcyA9IFwibWluZWNyYWZ0OnNlYWdyYXNzXCIsXG4gIFR1YmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OnR1YmVfY29yYWxfZmFuXCIsXG4gIFVua25vd24gPSBcIm1pbmVjcmFmdDp1bmtub3duXCIsXG4gIENoZXJyeVN0YWlycyA9IFwibWluZWNyYWZ0OmNoZXJyeV9zdGFpcnNcIixcbiAgQmFycmVsID0gXCJtaW5lY3JhZnQ6YmFycmVsXCIsXG4gIEJpZ0RyaXBsZWFmID0gXCJtaW5lY3JhZnQ6YmlnX2RyaXBsZWFmXCIsXG4gIFF1YXJ0elNsYWIgPSBcIm1pbmVjcmFmdDpxdWFydHpfc2xhYlwiLFxuICBGaXJlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmZpcmVfY29yYWxfYmxvY2tcIixcbiAgV2F4ZWRFeHBvc2VkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIERlYWRIb3JuQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2hvcm5fY29yYWxcIixcbiAgSW5mZXN0ZWRNb3NzeVN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfbW9zc3lfc3RvbmVfYnJpY2tzXCIsXG4gIEVsZW1lbnQ2OCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjhcIixcbiAgUmVkc3RvbmVMYW1wID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfbGFtcFwiLFxuICBNb3NzeUNvYmJsZXN0b25lID0gXCJtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVcIixcbiAgRWxlbWVudDExMyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTEzXCIsXG4gIEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpibHVlX3N0YWluZWRfZ2xhc3NcIixcbiAgQ2FrZSA9IFwibWluZWNyYWZ0OmNha2VcIixcbiAgRGFya09ha0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19kb3VibGVfc2xhYlwiLFxuICBTdHJpcHBlZENyaW1zb25IeXBoYWUgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9jcmltc29uX2h5cGhhZVwiLFxuICBEYXJrT2FrSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpkYXJrX29ha19oYW5naW5nX3NpZ25cIixcbiAgR3JlZW5Db25jcmV0ZSA9IFwibWluZWNyYWZ0OmdyZWVuX2NvbmNyZXRlXCIsXG4gIERlZXBzbGF0ZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZVwiLFxuICBTdHJpcHBlZE9ha1dvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9vYWtfd29vZFwiLFxuICBQdXJwdXJTbGFiID0gXCJtaW5lY3JhZnQ6cHVycHVyX3NsYWJcIixcbiAgTWFnZW50YUNhcnBldCA9IFwibWluZWNyYWZ0Om1hZ2VudGFfY2FycGV0XCIsXG4gIFBpdGNoZXJDcm9wID0gXCJtaW5lY3JhZnQ6cGl0Y2hlcl9jcm9wXCIsXG4gIEJyb3duV29vbCA9IFwibWluZWNyYWZ0OmJyb3duX3dvb2xcIixcbiAgUGlua1dvb2wgPSBcIm1pbmVjcmFmdDpwaW5rX3dvb2xcIixcbiAgV2FycGVkU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6d2FycGVkX3N0YW5kaW5nX3NpZ25cIixcbiAgRGVhZGJ1c2ggPSBcIm1pbmVjcmFmdDpkZWFkYnVzaFwiLFxuICBFbmRlckNoZXN0ID0gXCJtaW5lY3JhZnQ6ZW5kZXJfY2hlc3RcIixcbiAgV2F4ZWRFeHBvc2VkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBUdWZmU2xhYiA9IFwibWluZWNyYWZ0OnR1ZmZfc2xhYlwiLFxuICBSZWRzdG9uZVdpcmUgPSBcIm1pbmVjcmFmdDpyZWRzdG9uZV93aXJlXCIsXG4gIFdhcnBlZFByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDp3YXJwZWRfcHJlc3N1cmVfcGxhdGVcIixcbiAgR3JlZW5DYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6Z3JlZW5fY2FuZGxlX2Nha2VcIixcbiAgRGlhbW9uZEJsb2NrID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9ibG9ja1wiLFxuICBFeHBvc2VkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2J1bGJcIixcbiAgRWxlbWVudDU4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF81OFwiLFxuICBCYW1ib29Nb3NhaWNEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6YmFtYm9vX21vc2FpY19kb3VibGVfc2xhYlwiLFxuICBEYXJrUHJpc21hcmluZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpkYXJrX3ByaXNtYXJpbmVfZG91YmxlX3NsYWJcIixcbiAgQ3J5aW5nT2JzaWRpYW4gPSBcIm1pbmVjcmFmdDpjcnlpbmdfb2JzaWRpYW5cIixcbiAgT2FrU3RhaXJzID0gXCJtaW5lY3JhZnQ6b2FrX3N0YWlyc1wiLFxuICBIYXJkR3JheVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfZ3JheV9zdGFpbmVkX2dsYXNzXCIsXG4gIE9ha0xvZyA9IFwibWluZWNyYWZ0Om9ha19sb2dcIixcbiAgV2F4ZWRXZWF0aGVyZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlclwiLFxuICBBbmRlc2l0ZSA9IFwibWluZWNyYWZ0OmFuZGVzaXRlXCIsXG4gIEJyb3duU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmJyb3duX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBTY3Vsa1ZlaW4gPSBcIm1pbmVjcmFmdDpzY3Vsa192ZWluXCIsXG4gIFBpbmtTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6cGlua19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRXhwb3NlZERvdWJsZUN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2RvdWJsZV9jdXRfY29wcGVyX3NsYWJcIixcbiAgQ2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OmNhbmRsZV9jYWtlXCIsXG4gIE1hZ2VudGFTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9zaHVsa2VyX2JveFwiLFxuICBQdXJwbGVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cHVycGxlX3RlcnJhY290dGFcIixcbiAgU21vb3RoUXVhcnR6ID0gXCJtaW5lY3JhZnQ6c21vb3RoX3F1YXJ0elwiLFxuICBQYWNrZWRJY2UgPSBcIm1pbmVjcmFmdDpwYWNrZWRfaWNlXCIsXG4gIElyb25CYXJzID0gXCJtaW5lY3JhZnQ6aXJvbl9iYXJzXCIsXG4gIE94aWRpemVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlclwiLFxuICBQb2xpc2hlZEdyYW5pdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ncmFuaXRlXCIsXG4gIEVsZW1lbnQzOSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzlcIixcbiAgTGlnaHRCbHVlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIEZlcm4gPSBcIm1pbmVjcmFmdDpmZXJuXCIsXG4gIFBhY2tlZE11ZCA9IFwibWluZWNyYWZ0OnBhY2tlZF9tdWRcIixcbiAgTGlnaHRCbHVlQ2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FuZGxlX2Nha2VcIixcbiAgRWxlbWVudDEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzFcIixcbiAgUG9wcHkgPSBcIm1pbmVjcmFmdDpwb3BweVwiLFxuICBNb3NzQ2FycGV0ID0gXCJtaW5lY3JhZnQ6bW9zc19jYXJwZXRcIixcbiAgQ3JpbXNvblN0YWlycyA9IFwibWluZWNyYWZ0OmNyaW1zb25fc3RhaXJzXCIsXG4gIEdyZWVuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmdyZWVuX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBXYXJwZWRGdW5ndXMgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZnVuZ3VzXCIsXG4gIEVsZW1lbnQxMDIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwMlwiLFxuICBTdG9uZUJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnN0b25lX2JyaWNrX2RvdWJsZV9zbGFiXCIsXG4gIENvcHBlck9yZSA9IFwibWluZWNyYWZ0OmNvcHBlcl9vcmVcIixcbiAgR3JheUNhbmRsZSA9IFwibWluZWNyYWZ0OmdyYXlfY2FuZGxlXCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zbGFiXCIsXG4gIEJhbWJvb0Rvb3IgPSBcIm1pbmVjcmFmdDpiYW1ib29fZG9vclwiLFxuICBCbGFja0NvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6YmxhY2tfY29uY3JldGVfcG93ZGVyXCIsXG4gIE1lbG9uU3RlbSA9IFwibWluZWNyYWZ0Om1lbG9uX3N0ZW1cIixcbiAgQW1ldGh5c3RCbG9jayA9IFwibWluZWNyYWZ0OmFtZXRoeXN0X2Jsb2NrXCIsXG4gIEdvbGRCbG9jayA9IFwibWluZWNyYWZ0OmdvbGRfYmxvY2tcIixcbiAgU3RyaXBwZWRPYWtMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9vYWtfbG9nXCIsXG4gIEZsb3dlclBvdCA9IFwibWluZWNyYWZ0OmZsb3dlcl9wb3RcIixcbiAgQ2hpc2VsZWRCb29rc2hlbGYgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9ib29rc2hlbGZcIixcbiAgSnVuZ2xlRmVuY2UgPSBcIm1pbmVjcmFmdDpqdW5nbGVfZmVuY2VcIixcbiAgU3BydWNlTG9nID0gXCJtaW5lY3JhZnQ6c3BydWNlX2xvZ1wiLFxuICBQb2xpc2hlZERlZXBzbGF0ZVN0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zdGFpcnNcIixcbiAgSGFyZExpbWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2xpbWVfc3RhaW5lZF9nbGFzc1wiLFxuICBTaG9ydEdyYXNzID0gXCJtaW5lY3JhZnQ6c2hvcnRfZ3Jhc3NcIixcbiAgTGFwaXNCbG9jayA9IFwibWluZWNyYWZ0OmxhcGlzX2Jsb2NrXCIsXG4gIFdlYXRoZXJlZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBDb2Fyc2VEaXJ0ID0gXCJtaW5lY3JhZnQ6Y29hcnNlX2RpcnRcIixcbiAgU21hbGxBbWV0aHlzdEJ1ZCA9IFwibWluZWNyYWZ0OnNtYWxsX2FtZXRoeXN0X2J1ZFwiLFxuICBBY3RpdmF0b3JSYWlsID0gXCJtaW5lY3JhZnQ6YWN0aXZhdG9yX3JhaWxcIixcbiAgUG9kem9sID0gXCJtaW5lY3JhZnQ6cG9kem9sXCIsXG4gIE1hbmdyb3ZlQnV0dG9uID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfYnV0dG9uXCIsXG4gIElyb25UcmFwZG9vciA9IFwibWluZWNyYWZ0Omlyb25fdHJhcGRvb3JcIixcbiAgUG90YXRvZXMgPSBcIm1pbmVjcmFmdDpwb3RhdG9lc1wiLFxuICBMYXJnZUFtZXRoeXN0QnVkID0gXCJtaW5lY3JhZnQ6bGFyZ2VfYW1ldGh5c3RfYnVkXCIsXG4gIE11ZGR5TWFuZ3JvdmVSb290cyA9IFwibWluZWNyYWZ0Om11ZGR5X21hbmdyb3ZlX3Jvb3RzXCIsXG4gIEhhcmRMaWdodEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2xpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzc1wiLFxuICBUcmlhbFNwYXduZXIgPSBcIm1pbmVjcmFmdDp0cmlhbF9zcGF3bmVyXCIsXG4gIFN0cmlwcGVkSnVuZ2xlV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2p1bmdsZV93b29kXCIsXG4gIERlYWRUdWJlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfdHViZV9jb3JhbF9ibG9ja1wiLFxuICBOb3RlYmxvY2sgPSBcIm1pbmVjcmFmdDpub3RlYmxvY2tcIixcbiAgVHVmZiA9IFwibWluZWNyYWZ0OnR1ZmZcIixcbiAgUmVzZXJ2ZWQ2ID0gXCJtaW5lY3JhZnQ6cmVzZXJ2ZWQ2XCIsXG4gIFNvdWxUb3JjaCA9IFwibWluZWNyYWZ0OnNvdWxfdG9yY2hcIixcbiAgUXVhcnR6QnJpY2tzID0gXCJtaW5lY3JhZnQ6cXVhcnR6X2JyaWNrc1wiLFxuICBNYW5ncm92ZUxvZyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2xvZ1wiLFxuICBTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c2FuZHN0b25lX3NsYWJcIixcbiAgV2hpdGVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6d2hpdGVfc2h1bGtlcl9ib3hcIixcbiAgQmlyY2hXb29kID0gXCJtaW5lY3JhZnQ6YmlyY2hfd29vZFwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBNb3NzeVN0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfc2xhYlwiLFxuICBSYXdHb2xkQmxvY2sgPSBcIm1pbmVjcmFmdDpyYXdfZ29sZF9ibG9ja1wiLFxuICBBbGxpdW0gPSBcIm1pbmVjcmFmdDphbGxpdW1cIixcbiAgQ3JhY2tlZFBvbGlzaGVkQmxhY2tzdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmNyYWNrZWRfcG9saXNoZWRfYmxhY2tzdG9uZV9icmlja3NcIixcbiAgTW9iU3Bhd25lciA9IFwibWluZWNyYWZ0Om1vYl9zcGF3bmVyXCIsXG4gIENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6Y29wcGVyX2dyYXRlXCIsXG4gIFdlYXRoZXJlZERvdWJsZUN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfZG91YmxlX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBEZWVwc2xhdGVUaWxlcyA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlc1wiLFxuICBCbGFja1dvb2wgPSBcIm1pbmVjcmFmdDpibGFja193b29sXCIsXG4gIExhdmEgPSBcIm1pbmVjcmFmdDpsYXZhXCIsXG4gIExpZ2h0QmxvY2sxNCA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzE0XCIsXG4gIEFjYWNpYUZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmFjYWNpYV9mZW5jZV9nYXRlXCIsXG4gIEN5YW5DYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6Y3lhbl9jYW5kbGVfY2FrZVwiLFxuICBPcmFuZ2VDYW5kbGUgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfY2FuZGxlXCIsXG4gIENvbG9yZWRUb3JjaEJwID0gXCJtaW5lY3JhZnQ6Y29sb3JlZF90b3JjaF9icFwiLFxuICBTY2FmZm9sZGluZyA9IFwibWluZWNyYWZ0OnNjYWZmb2xkaW5nXCIsXG4gIFBvd2VyZWRDb21wYXJhdG9yID0gXCJtaW5lY3JhZnQ6cG93ZXJlZF9jb21wYXJhdG9yXCIsXG4gIExpZ2h0QmxvY2s4ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfOFwiLFxuICBTcHJ1Y2VTYXBsaW5nID0gXCJtaW5lY3JhZnQ6c3BydWNlX3NhcGxpbmdcIixcbiAgQ3V0U2FuZHN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmN1dF9zYW5kc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgQmxhc3RGdXJuYWNlID0gXCJtaW5lY3JhZnQ6Ymxhc3RfZnVybmFjZVwiLFxuICBDdXRTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X3NhbmRzdG9uZV9zbGFiXCIsXG4gIFNwcnVjZUZlbmNlID0gXCJtaW5lY3JhZnQ6c3BydWNlX2ZlbmNlXCIsXG4gIEhhcmRZZWxsb3dTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF95ZWxsb3dfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEhhcmRHcmVlblN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfZ3JlZW5fc3RhaW5lZF9nbGFzc1wiLFxuICBEYXJrT2FrU2FwbGluZyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3NhcGxpbmdcIixcbiAgU2FuZHN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnNhbmRzdG9uZV9kb3VibGVfc2xhYlwiLFxuICBQaW5rUGV0YWxzID0gXCJtaW5lY3JhZnQ6cGlua19wZXRhbHNcIixcbiAgU291bEZpcmUgPSBcIm1pbmVjcmFmdDpzb3VsX2ZpcmVcIixcbiAgUGlua0NhcnBldCA9IFwibWluZWNyYWZ0OnBpbmtfY2FycGV0XCIsXG4gIE1hbmdyb3ZlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2RvdWJsZV9zbGFiXCIsXG4gIEJyb3duQ2FycGV0ID0gXCJtaW5lY3JhZnQ6YnJvd25fY2FycGV0XCIsXG4gIEdyZWVuQ2FuZGxlID0gXCJtaW5lY3JhZnQ6Z3JlZW5fY2FuZGxlXCIsXG4gIFB1cnBsZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpwdXJwbGVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFNtb290aFF1YXJ0ekRvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6X2RvdWJsZV9zbGFiXCIsXG4gIE94aWRpemVkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgTGlnaHRHcmF5U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zdGFpbmVkX2dsYXNzXCIsXG4gIEJyYWluQ29yYWwgPSBcIm1pbmVjcmFmdDpicmFpbl9jb3JhbFwiLFxuICBPYnNpZGlhbiA9IFwibWluZWNyYWZ0Om9ic2lkaWFuXCIsXG4gIENoZXN0ID0gXCJtaW5lY3JhZnQ6Y2hlc3RcIixcbiAgRGVhZEJ1YmJsZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2J1YmJsZV9jb3JhbF9ibG9ja1wiLFxuICBMaWdodEdyYXlTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgQmxhY2tzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lX3NsYWJcIixcbiAgU3RyaXBwZWRTcHJ1Y2VXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfc3BydWNlX3dvb2RcIixcbiAgQ2F1bGRyb24gPSBcIm1pbmVjcmFmdDpjYXVsZHJvblwiLFxuICBHbG93aW5nb2JzaWRpYW4gPSBcIm1pbmVjcmFmdDpnbG93aW5nb2JzaWRpYW5cIixcbiAgRGVlcHNsYXRlQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3dhbGxcIixcbiAgRGFya29ha1N0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0OmRhcmtvYWtfc3RhbmRpbmdfc2lnblwiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2dyYXRlXCIsXG4gIFR1YmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6dHViZV9jb3JhbF9ibG9ja1wiLFxuICBBY2FjaWFQbGFua3MgPSBcIm1pbmVjcmFmdDphY2FjaWFfcGxhbmtzXCIsXG4gIEVsZW1lbnQ4NSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODVcIixcbiAgSnVuZ2xlV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDpqdW5nbGVfd2FsbF9zaWduXCIsXG4gIEVuZEJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZW5kX2JyaWNrX3N0YWlyc1wiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9kb3VibGVfc2xhYlwiLFxuICBPcmFuZ2VDYXJwZXQgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfY2FycGV0XCIsXG4gIEV4cG9zZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlclwiLFxuICBQb2xpc2hlZERlZXBzbGF0ZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kZWVwc2xhdGVfZG91YmxlX3NsYWJcIixcbiAgTmV0aGVyQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX3NsYWJcIixcbiAgSGVhdnlXZWlnaHRlZFByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpoZWF2eV93ZWlnaHRlZF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBFbGVtZW50ODkgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzg5XCIsXG4gIFN0b25lQnV0dG9uID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnV0dG9uXCIsXG4gIFN0b25lID0gXCJtaW5lY3JhZnQ6c3RvbmVcIixcbiAgUmVkTmV0aGVyQnJpY2tEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19kb3VibGVfc2xhYlwiLFxuICBQaXRjaGVyUGxhbnQgPSBcIm1pbmVjcmFmdDpwaXRjaGVyX3BsYW50XCIsXG4gIEVsZW1lbnQxMDEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwMVwiLFxuICBXYXhlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJfYnVsYlwiLFxuICBBbmRlc2l0ZVN0YWlycyA9IFwibWluZWNyYWZ0OmFuZGVzaXRlX3N0YWlyc1wiLFxuICBTcG9uZ2UgPSBcIm1pbmVjcmFmdDpzcG9uZ2VcIixcbiAgQm9uZUJsb2NrID0gXCJtaW5lY3JhZnQ6Ym9uZV9ibG9ja1wiLFxuICBOb3JtYWxTdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9zdGFpcnNcIixcbiAgV2FycGVkSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfaGFuZ2luZ19zaWduXCIsXG4gIEdyZWVuU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6Z3JlZW5fc3RhaW5lZF9nbGFzc1wiLFxuICBEaW9yaXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmRpb3JpdGVfZG91YmxlX3NsYWJcIixcbiAgR3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpncmF5X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBFbmRTdG9uZUJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OmVuZF9zdG9uZV9icmlja19zbGFiXCIsXG4gIEZyYW1lID0gXCJtaW5lY3JhZnQ6ZnJhbWVcIixcbiAgU21va2VyID0gXCJtaW5lY3JhZnQ6c21va2VyXCIsXG4gIEhhcmRlbmVkQ2xheSA9IFwibWluZWNyYWZ0OmhhcmRlbmVkX2NsYXlcIixcbiAgQmlyY2hIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmJpcmNoX2hhbmdpbmdfc2lnblwiLFxuICBQb2xpc2hlZFR1ZmZXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZl93YWxsXCIsXG4gIFVubGl0UmVkc3RvbmVUb3JjaCA9IFwibWluZWNyYWZ0OnVubGl0X3JlZHN0b25lX3RvcmNoXCIsXG4gIFN0cmlwcGVkSnVuZ2xlTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfanVuZ2xlX2xvZ1wiLFxuICBMYXBpc09yZSA9IFwibWluZWNyYWZ0OmxhcGlzX29yZVwiLFxuICBIYXJkQmx1ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfYmx1ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIFBvbGlzaGVkR3Jhbml0ZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ncmFuaXRlX3NsYWJcIixcbiAgTGlnaHRCbG9jazkgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja185XCIsXG4gIE94aWRpemVkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBCZWVoaXZlID0gXCJtaW5lY3JhZnQ6YmVlaGl2ZVwiLFxuICBMaW1lU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmxpbWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIExpZ2h0QmxvY2s3ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfN1wiLFxuICBDaGVycnlEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2RvdWJsZV9zbGFiXCIsXG4gIExpZ2h0QmxvY2s2ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfNlwiLFxuICBMaWdodEJsb2NrNSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzVcIixcbiAgV2F4ZWRPeGlkaXplZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIExpZ2h0QmxvY2s0ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfNFwiLFxuICBXYXJwZWRSb290cyA9IFwibWluZWNyYWZ0OndhcnBlZF9yb290c1wiLFxuICBTbWFsbERyaXBsZWFmQmxvY2sgPSBcIm1pbmVjcmFmdDpzbWFsbF9kcmlwbGVhZl9ibG9ja1wiLFxuICBHcmVlbldvb2wgPSBcIm1pbmVjcmFmdDpncmVlbl93b29sXCIsXG4gIExpbWVDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6bGltZV9jYW5kbGVfY2FrZVwiLFxuICBNYW5ncm92ZUxlYXZlcyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2xlYXZlc1wiLFxuICBMaWdodEJsb2NrMyA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzNcIixcbiAgQWNhY2lhTGVhdmVzID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2xlYXZlc1wiLFxuICBCYXJyaWVyID0gXCJtaW5lY3JhZnQ6YmFycmllclwiLFxuICBSYXdJcm9uQmxvY2sgPSBcIm1pbmVjcmFmdDpyYXdfaXJvbl9ibG9ja1wiLFxuICBEaXNwZW5zZXIgPSBcIm1pbmVjcmFmdDpkaXNwZW5zZXJcIixcbiAgQ3JpbXNvblJvb3RzID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9yb290c1wiLFxuICBMaWdodEJsb2NrMiA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzJcIixcbiAgTGlnaHRCbG9jazAgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18wXCIsXG4gIFN0b25lY3V0dGVyID0gXCJtaW5lY3JhZnQ6c3RvbmVjdXR0ZXJcIixcbiAgQW5kZXNpdGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6YW5kZXNpdGVfZG91YmxlX3NsYWJcIixcbiAgVW5wb3dlcmVkUmVwZWF0ZXIgPSBcIm1pbmVjcmFmdDp1bnBvd2VyZWRfcmVwZWF0ZXJcIixcbiAgT2FrU2FwbGluZyA9IFwibWluZWNyYWZ0Om9ha19zYXBsaW5nXCIsXG4gIExpZ2h0R3JheVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3RlcnJhY290dGFcIixcbiAgUGlua1N0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OnBpbmtfc3RhaW5lZF9nbGFzc1wiLFxuICBIYXJkTWFnZW50YVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX21hZ2VudGFfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEJyb3duU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6YnJvd25fc3RhaW5lZF9nbGFzc1wiLFxuICBGaXJlQ29yYWwgPSBcIm1pbmVjcmFmdDpmaXJlX2NvcmFsXCIsXG4gIENvYmJsZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZVwiLFxuICBFbGVtZW50OTkgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzk5XCIsXG4gIEJpcmNoTG9nID0gXCJtaW5lY3JhZnQ6YmlyY2hfbG9nXCIsXG4gIE9yYW5nZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0Om9yYW5nZV9zdGFpbmVkX2dsYXNzXCIsXG4gIE9yYW5nZVdvb2wgPSBcIm1pbmVjcmFmdDpvcmFuZ2Vfd29vbFwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX2RvdWJsZV9zbGFiXCIsXG4gIEJ1YmJsZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpidWJibGVfY29yYWxfYmxvY2tcIixcbiAgQ3JpbXNvbkRvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpjcmltc29uX2RvdWJsZV9zbGFiXCIsXG4gIEtlbHAgPSBcIm1pbmVjcmFmdDprZWxwXCIsXG4gIFVuZGVyd2F0ZXJUb3JjaCA9IFwibWluZWNyYWZ0OnVuZGVyd2F0ZXJfdG9yY2hcIixcbiAgUmVzcGF3bkFuY2hvciA9IFwibWluZWNyYWZ0OnJlc3Bhd25fYW5jaG9yXCIsXG4gIERlYWRGaXJlQ29yYWxXYWxsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFsX3dhbGxfZmFuXCIsXG4gIExpZ2h0R3JheUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jb25jcmV0ZVwiLFxuICBCaXJjaFBsYW5rcyA9IFwibWluZWNyYWZ0OmJpcmNoX3BsYW5rc1wiLFxuICBTZWFQaWNrbGUgPSBcIm1pbmVjcmFmdDpzZWFfcGlja2xlXCIsXG4gIFJlZFNhbmRzdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpyZWRfc2FuZHN0b25lX2RvdWJsZV9zbGFiXCIsXG4gIEVsZW1lbnQ3NCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzRcIixcbiAgUmVkU2FuZCA9IFwibWluZWNyYWZ0OnJlZF9zYW5kXCIsXG4gIEhheUJsb2NrID0gXCJtaW5lY3JhZnQ6aGF5X2Jsb2NrXCIsXG4gIFN1c3BpY2lvdXNHcmF2ZWwgPSBcIm1pbmVjcmFmdDpzdXNwaWNpb3VzX2dyYXZlbFwiLFxuICBIZWF2eUNvcmUgPSBcIm1pbmVjcmFmdDpoZWF2eV9jb3JlXCIsXG4gIEp1bmdsZVdvb2QgPSBcIm1pbmVjcmFmdDpqdW5nbGVfd29vZFwiLFxuICBSZWRTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpyZWRfc3RhaW5lZF9nbGFzc1wiLFxuICBQdXJwbGVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6cHVycGxlX3NodWxrZXJfYm94XCIsXG4gIFBvbGlzaGVkVHVmZkRvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF90dWZmX2RvdWJsZV9zbGFiXCIsXG4gIE94aWRpemVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9kb29yXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlclwiLFxuICBDaGlzZWxlZFF1YXJ0ekJsb2NrID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfcXVhcnR6X2Jsb2NrXCIsXG4gIEluZmVzdGVkQ3JhY2tlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfY3JhY2tlZF9zdG9uZV9icmlja3NcIixcbiAgTGlnaHRCbHVlVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfdGVycmFjb3R0YVwiLFxuICBEZWVwc2xhdGVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfYnJpY2tfc2xhYlwiLFxuICBGbG93ZXJpbmdBemFsZWEgPSBcIm1pbmVjcmFmdDpmbG93ZXJpbmdfYXphbGVhXCIsXG4gIEludmlzaWJsZUJlZHJvY2sgPSBcIm1pbmVjcmFmdDppbnZpc2libGVfYmVkcm9ja1wiLFxuICBPYWtMZWF2ZXMgPSBcIm1pbmVjcmFmdDpvYWtfbGVhdmVzXCIsXG4gIEJyYWluQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpicmFpbl9jb3JhbF9mYW5cIixcbiAgQmFtYm9vU3RhaXJzID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3N0YWlyc1wiLFxuICBUb3JjaCA9IFwibWluZWNyYWZ0OnRvcmNoXCIsXG4gIEdsb3dMaWNoZW4gPSBcIm1pbmVjcmFmdDpnbG93X2xpY2hlblwiLFxuICBDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OmNvcHBlcl90cmFwZG9vclwiLFxuICBSZWRDYW5kbGUgPSBcIm1pbmVjcmFmdDpyZWRfY2FuZGxlXCIsXG4gIE11ZEJyaWNrV2FsbCA9IFwibWluZWNyYWZ0Om11ZF9icmlja193YWxsXCIsXG4gIEhvbmV5QmxvY2sgPSBcIm1pbmVjcmFmdDpob25leV9ibG9ja1wiLFxuICBDaGVycnlUcmFwZG9vciA9IFwibWluZWNyYWZ0OmNoZXJyeV90cmFwZG9vclwiLFxuICBCcm93bkNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6YnJvd25fY29uY3JldGVcIixcbiAgTGl0UHVtcGtpbiA9IFwibWluZWNyYWZ0OmxpdF9wdW1wa2luXCIsXG4gIFBpbmtDb25jcmV0ZSA9IFwibWluZWNyYWZ0OnBpbmtfY29uY3JldGVcIixcbiAgWWVsbG93R2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnllbGxvd19nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBTbW9vdGhCYXNhbHQgPSBcIm1pbmVjcmFmdDpzbW9vdGhfYmFzYWx0XCIsXG4gIFdhcnBlZFBsYW5rcyA9IFwibWluZWNyYWZ0OndhcnBlZF9wbGFua3NcIixcbiAgUGlzdG9uID0gXCJtaW5lY3JhZnQ6cGlzdG9uXCIsXG4gIENoZXJyeUZlbmNlID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2ZlbmNlXCIsXG4gIE1hbmdyb3ZlUGxhbmtzID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcGxhbmtzXCIsXG4gIEhhcmRMaWdodEdyYXlTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9saWdodF9ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBSZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cmVkX3RlcnJhY290dGFcIixcbiAgV2F0ZXIgPSBcIm1pbmVjcmFmdDp3YXRlclwiLFxuICBXZWF0aGVyZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgRWxlbWVudDc3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83N1wiLFxuICBXZWF0aGVyZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfZ3JhdGVcIixcbiAgU3BydWNlQnV0dG9uID0gXCJtaW5lY3JhZnQ6c3BydWNlX2J1dHRvblwiLFxuICBXYWxsQmFubmVyID0gXCJtaW5lY3JhZnQ6d2FsbF9iYW5uZXJcIixcbiAgRGVhZEZpcmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFsX2Jsb2NrXCIsXG4gIE1hZ2VudGFXb29sID0gXCJtaW5lY3JhZnQ6bWFnZW50YV93b29sXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY29wcGVyX2dyYXRlXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfYnVsYlwiLFxuICBWZXJkYW50RnJvZ2xpZ2h0ID0gXCJtaW5lY3JhZnQ6dmVyZGFudF9mcm9nbGlnaHRcIixcbiAgTW9zc3lDb2JibGVzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDptb3NzeV9jb2JibGVzdG9uZV9zbGFiXCIsXG4gIE1hZ2VudGFHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBQb2xpc2hlZEFuZGVzaXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVcIixcbiAgUHVycGxlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6cHVycGxlX3N0YWluZWRfZ2xhc3NcIixcbiAgUXVhcnR6RG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnF1YXJ0el9kb3VibGVfc2xhYlwiLFxuICBNYW5ncm92ZVNsYWIgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9zbGFiXCIsXG4gIFdhbGxTaWduID0gXCJtaW5lY3JhZnQ6d2FsbF9zaWduXCIsXG4gIEluZmVzdGVkRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfZGVlcHNsYXRlXCIsXG4gIE9yYW5nZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQmlyY2hTYXBsaW5nID0gXCJtaW5lY3JhZnQ6YmlyY2hfc2FwbGluZ1wiLFxuICBDbGllbnRSZXF1ZXN0UGxhY2Vob2xkZXJCbG9jayA9IFwibWluZWNyYWZ0OmNsaWVudF9yZXF1ZXN0X3BsYWNlaG9sZGVyX2Jsb2NrXCIsXG4gIEhhcmRCcm93blN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2Jyb3duX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBUb3JjaGZsb3dlciA9IFwibWluZWNyYWZ0OnRvcmNoZmxvd2VyXCIsXG4gIFNwb3JlQmxvc3NvbSA9IFwibWluZWNyYWZ0OnNwb3JlX2Jsb3Nzb21cIixcbiAgV2F0ZXJsaWx5ID0gXCJtaW5lY3JhZnQ6d2F0ZXJsaWx5XCIsXG4gIEVtZXJhbGRCbG9jayA9IFwibWluZWNyYWZ0OmVtZXJhbGRfYmxvY2tcIixcbiAgQ29uZHVpdCA9IFwibWluZWNyYWZ0OmNvbmR1aXRcIixcbiAgQW52aWwgPSBcIm1pbmVjcmFmdDphbnZpbFwiLFxuICBTdXNwaWNpb3VzU2FuZCA9IFwibWluZWNyYWZ0OnN1c3BpY2lvdXNfc2FuZFwiLFxuICBBbmNpZW50RGVicmlzID0gXCJtaW5lY3JhZnQ6YW5jaWVudF9kZWJyaXNcIixcbiAgRGFya09ha1BsYW5rcyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3BsYW5rc1wiLFxuICBKdW5nbGVMZWF2ZXMgPSBcIm1pbmVjcmFmdDpqdW5nbGVfbGVhdmVzXCIsXG4gIExpZ2h0bmluZ1JvZCA9IFwibWluZWNyYWZ0OmxpZ2h0bmluZ19yb2RcIixcbiAgTmV0aGVyQnJpY2tGZW5jZSA9IFwibWluZWNyYWZ0Om5ldGhlcl9icmlja19mZW5jZVwiLFxuICBCbGFja1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpibGFja19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgTWFnZW50YUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jb25jcmV0ZVwiLFxuICBDb2JibGVzdG9uZVdhbGwgPSBcIm1pbmVjcmFmdDpjb2JibGVzdG9uZV93YWxsXCIsXG4gIExpZ2h0Qmx1ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBEZWVwc2xhdGVCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgVHViZUNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OnR1YmVfY29yYWxfd2FsbF9mYW5cIixcbiAgU3BydWNlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnNwcnVjZV9kb3VibGVfc2xhYlwiLFxuICBSZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpyZWRfc2FuZHN0b25lXCIsXG4gIERhcmtPYWtMb2cgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19sb2dcIixcbiAgT2FrUGxhbmtzID0gXCJtaW5lY3JhZnQ6b2FrX3BsYW5rc1wiLFxuICBSZWRzdG9uZU9yZSA9IFwibWluZWNyYWZ0OnJlZHN0b25lX29yZVwiLFxuICBBY2FjaWFIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmFjYWNpYV9oYW5naW5nX3NpZ25cIixcbiAgTGlnaHRCbG9jazEzID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTNcIixcbiAgT2NocmVGcm9nbGlnaHQgPSBcIm1pbmVjcmFmdDpvY2hyZV9mcm9nbGlnaHRcIixcbiAgUG9saXNoZWRCbGFja3N0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9zdGFpcnNcIixcbiAgVHVmZldhbGwgPSBcIm1pbmVjcmFmdDp0dWZmX3dhbGxcIixcbiAgTWFuZ3JvdmVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcHJlc3N1cmVfcGxhdGVcIixcbiAgT2JzZXJ2ZXIgPSBcIm1pbmVjcmFmdDpvYnNlcnZlclwiLFxuICBQaW5rR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnBpbmtfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgWWVsbG93VGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnllbGxvd190ZXJyYWNvdHRhXCIsXG4gIEJyb3duR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJyb3duX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEJyb3duQ2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OmJyb3duX2NhbmRsZV9jYWtlXCIsXG4gIFBpbmtDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6cGlua19jYW5kbGVfY2FrZVwiLFxuICBRdWFydHpCbG9jayA9IFwibWluZWNyYWZ0OnF1YXJ0el9ibG9ja1wiLFxuICBSZWRzdG9uZVRvcmNoID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfdG9yY2hcIixcbiAgQmlyY2hMZWF2ZXMgPSBcIm1pbmVjcmFmdDpiaXJjaF9sZWF2ZXNcIixcbiAgU2lsdmVyR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnNpbHZlcl9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBDeWFuQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpjeWFuX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBPeGlkaXplZENvcHBlciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlclwiLFxuICBCaXJjaFByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpiaXJjaF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBFbGVtZW50MTkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzE5XCIsXG4gIFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnNhbmRzdG9uZV9zdGFpcnNcIixcbiAgU3RyaXBwZWRCYW1ib29CbG9jayA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2JhbWJvb19ibG9ja1wiLFxuICBDcmFja2VkU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpjcmFja2VkX3N0b25lX2JyaWNrc1wiLFxuICBEZWFkVHViZUNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfdHViZV9jb3JhbF93YWxsX2ZhblwiLFxuICBCaXJjaEZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmJpcmNoX2ZlbmNlX2dhdGVcIixcbiAgU2N1bGtDYXRhbHlzdCA9IFwibWluZWNyYWZ0OnNjdWxrX2NhdGFseXN0XCIsXG4gIEVsZW1lbnQxMTUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzExNVwiLFxuICBDb2JibGVzdG9uZSA9IFwibWluZWNyYWZ0OmNvYmJsZXN0b25lXCIsXG4gIEhvcm5Db3JhbCA9IFwibWluZWNyYWZ0Omhvcm5fY29yYWxcIixcbiAgV2hpdGVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OndoaXRlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBZZWxsb3dDb25jcmV0ZSA9IFwibWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZVwiLFxuICBPYWtEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6b2FrX2RvdWJsZV9zbGFiXCIsXG4gIFN0cmlwcGVkV2FycGVkU3RlbSA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX3dhcnBlZF9zdGVtXCIsXG4gIERheWxpZ2h0RGV0ZWN0b3IgPSBcIm1pbmVjcmFmdDpkYXlsaWdodF9kZXRlY3RvclwiLFxuICBTbW9vdGhTYW5kc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lX3N0YWlyc1wiLFxuICBKdW5nbGVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3ByZXNzdXJlX3BsYXRlXCIsXG4gIEhhcmRXaGl0ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfd2hpdGVfc3RhaW5lZF9nbGFzc1wiLFxuICBEb3VibGVDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6ZG91YmxlX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBCaXJjaEJ1dHRvbiA9IFwibWluZWNyYWZ0OmJpcmNoX2J1dHRvblwiLFxuICBDcmltc29uUGxhbmtzID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9wbGFua3NcIixcbiAgU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6c2FuZHN0b25lXCIsXG4gIEJsYWNrc3RvbmVXYWxsID0gXCJtaW5lY3JhZnQ6YmxhY2tzdG9uZV93YWxsXCIsXG4gIExpZ2h0V2VpZ2h0ZWRQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6bGlnaHRfd2VpZ2h0ZWRfcHJlc3N1cmVfcGxhdGVcIixcbiAgUG9saXNoZWRCbGFja3N0b25lID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZVwiLFxuICBCYW1ib28gPSBcIm1pbmVjcmFmdDpiYW1ib29cIixcbiAgUmVkTmV0aGVyQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19zbGFiXCIsXG4gIElyb25PcmUgPSBcIm1pbmVjcmFmdDppcm9uX29yZVwiLFxuICBXYXhlZFdlYXRoZXJlZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBFbGVtZW50MTcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzE3XCIsXG4gIFN0aWNreVBpc3RvbkFybUNvbGxpc2lvbiA9IFwibWluZWNyYWZ0OnN0aWNreV9waXN0b25fYXJtX2NvbGxpc2lvblwiLFxuICBFbGVtZW50NTEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzUxXCIsXG4gIEdyYXlTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgRXhwb3NlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBFbGVtZW50NTIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzUyXCIsXG4gIFdhcnBlZFN0YWlycyA9IFwibWluZWNyYWZ0OndhcnBlZF9zdGFpcnNcIixcbiAgQmVkcm9jayA9IFwibWluZWNyYWZ0OmJlZHJvY2tcIixcbiAgU21pdGhpbmdUYWJsZSA9IFwibWluZWNyYWZ0OnNtaXRoaW5nX3RhYmxlXCIsXG4gIExpZ2h0QmxvY2sxMCA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzEwXCIsXG4gIFR1ZmZCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDp0dWZmX2JyaWNrX3NsYWJcIixcbiAgUm9zZUJ1c2ggPSBcIm1pbmVjcmFmdDpyb3NlX2J1c2hcIixcbiAgR3JlZW5DYXJwZXQgPSBcIm1pbmVjcmFmdDpncmVlbl9jYXJwZXRcIixcbiAgUHVycGxlQ2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9jYW5kbGVfY2FrZVwiLFxuICBQcmlzbWFyaW5lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja19zbGFiXCIsXG4gIEN5YW5Db25jcmV0ZSA9IFwibWluZWNyYWZ0OmN5YW5fY29uY3JldGVcIixcbiAgTmV0aGVyaXRlQmxvY2sgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfYmxvY2tcIixcbiAgUmVkc3RvbmVCbG9jayA9IFwibWluZWNyYWZ0OnJlZHN0b25lX2Jsb2NrXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZVdhbGwgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3dhbGxcIixcbiAgUXVhcnR6UGlsbGFyID0gXCJtaW5lY3JhZnQ6cXVhcnR6X3BpbGxhclwiLFxuICBXYXhlZEV4cG9zZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2N1dF9jb3BwZXJcIixcbiAgR2lsZGVkQmxhY2tzdG9uZSA9IFwibWluZWNyYWZ0OmdpbGRlZF9ibGFja3N0b25lXCIsXG4gIEp1bmdsZUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2hhbmdpbmdfc2lnblwiLFxuICBCbHVlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpibHVlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBDaGVycnlXb29kID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3dvb2RcIixcbiAgQmlyY2hTbGFiID0gXCJtaW5lY3JhZnQ6YmlyY2hfc2xhYlwiLFxuICBFbmRTdG9uZSA9IFwibWluZWNyYWZ0OmVuZF9zdG9uZVwiLFxuICBDcmltc29uRG9vciA9IFwibWluZWNyYWZ0OmNyaW1zb25fZG9vclwiLFxuICBKdW5nbGVTbGFiID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3NsYWJcIixcbiAgV2F4ZWRPeGlkaXplZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlclwiLFxuICBHbG93c3RvbmUgPSBcIm1pbmVjcmFmdDpnbG93c3RvbmVcIixcbiAgU3RvbmVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6c3RvbmVfcHJlc3N1cmVfcGxhdGVcIixcbiAgUXVhcnR6U3RhaXJzID0gXCJtaW5lY3JhZnQ6cXVhcnR6X3N0YWlyc1wiLFxuICBXYXhlZEV4cG9zZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIEhhcmRMaW1lU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfbGltZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgTXVkQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrX3NsYWJcIixcbiAgQ3JhY2tlZERlZXBzbGF0ZVRpbGVzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9kZWVwc2xhdGVfdGlsZXNcIixcbiAgRmFybWxhbmQgPSBcIm1pbmVjcmFmdDpmYXJtbGFuZFwiLFxuICBEZWFkQnJhaW5Db3JhbFdhbGxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2JyYWluX2NvcmFsX3dhbGxfZmFuXCIsXG4gIFBpbmtDYW5kbGUgPSBcIm1pbmVjcmFmdDpwaW5rX2NhbmRsZVwiLFxuICBOb3JtYWxTdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpub3JtYWxfc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgQnJvd25DYW5kbGUgPSBcIm1pbmVjcmFmdDpicm93bl9jYW5kbGVcIixcbiAgTGlnaHRCbG9jazEyID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTJcIixcbiAgUmFpbCA9IFwibWluZWNyYWZ0OnJhaWxcIixcbiAgU291bExhbnRlcm4gPSBcIm1pbmVjcmFmdDpzb3VsX2xhbnRlcm5cIixcbiAgQ2Fycm90cyA9IFwibWluZWNyYWZ0OmNhcnJvdHNcIixcbiAgQWNhY2lhVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDphY2FjaWFfdHJhcGRvb3JcIixcbiAgU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpzdG9uZV9icmlja3NcIixcbiAgTW9zc3lDb2JibGVzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lX3N0YWlyc1wiLFxuICBIYXJkTWFnZW50YVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfbWFnZW50YV9zdGFpbmVkX2dsYXNzXCIsXG4gIFBpbmtUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cGlua190ZXJyYWNvdHRhXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfZG9vclwiLFxuICBEYXJrUHJpc21hcmluZSA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZVwiLFxuICBJbmZlc3RlZENvYmJsZXN0b25lID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfY29iYmxlc3RvbmVcIixcbiAgQnJhaW5Db3JhbFdhbGxGYW4gPSBcIm1pbmVjcmFmdDpicmFpbl9jb3JhbF93YWxsX2ZhblwiLFxuICBNYW5ncm92ZVdvb2QgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV93b29kXCIsXG4gIENyYWZ0aW5nVGFibGUgPSBcIm1pbmVjcmFmdDpjcmFmdGluZ190YWJsZVwiLFxuICBSZWRHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cmVkX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIERhcmtPYWtGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19mZW5jZV9nYXRlXCIsXG4gIENoZXJyeUJ1dHRvbiA9IFwibWluZWNyYWZ0OmNoZXJyeV9idXR0b25cIixcbiAgQ3JpbXNvbk55bGl1bSA9IFwibWluZWNyYWZ0OmNyaW1zb25fbnlsaXVtXCIsXG4gIFdhcnBlZERvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZG91YmxlX3NsYWJcIixcbiAgU3RydWN0dXJlVm9pZCA9IFwibWluZWNyYWZ0OnN0cnVjdHVyZV92b2lkXCIsXG4gIEJhbWJvb0ZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmJhbWJvb19mZW5jZV9nYXRlXCIsXG4gIFB1cnBsZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6cHVycGxlX2NvbmNyZXRlXCIsXG4gIFdoaXRlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OndoaXRlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfYnVsYlwiLFxuICBCdWJibGVDb3JhbCA9IFwibWluZWNyYWZ0OmJ1YmJsZV9jb3JhbFwiLFxuICBDb2FsT3JlID0gXCJtaW5lY3JhZnQ6Y29hbF9vcmVcIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja19zbGFiXCIsXG4gIE5vcm1hbFN0b25lU2xhYiA9IFwibWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9zbGFiXCIsXG4gIFB1cnBsZUNhbmRsZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9jYW5kbGVcIixcbiAgU25vdyA9IFwibWluZWNyYWZ0OnNub3dcIixcbiAgQ2FsaWJyYXRlZFNjdWxrU2Vuc29yID0gXCJtaW5lY3JhZnQ6Y2FsaWJyYXRlZF9zY3Vsa19zZW5zb3JcIixcbiAgWWVsbG93Q29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfY29uY3JldGVfcG93ZGVyXCIsXG4gIE9ha1NsYWIgPSBcIm1pbmVjcmFmdDpvYWtfc2xhYlwiLFxuICBTYW5kID0gXCJtaW5lY3JhZnQ6c2FuZFwiLFxuICBNYW5ncm92ZVN0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3N0YW5kaW5nX3NpZ25cIixcbiAgU2xpbWUgPSBcIm1pbmVjcmFmdDpzbGltZVwiLFxuICBFbGVtZW50MTE3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMTdcIixcbiAgSnVuZ2xlU3RhaXJzID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3N0YWlyc1wiLFxuICBNb3NzeVN0b25lQnJpY2tEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgQ3V0UmVkU2FuZHN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmN1dF9yZWRfc2FuZHN0b25lX2RvdWJsZV9zbGFiXCIsXG4gIEF6YWxlYUxlYXZlcyA9IFwibWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXNcIixcbiAgQmFtYm9vRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmJhbWJvb19kb3VibGVfc2xhYlwiLFxuICBDaGlzZWxlZFBvbGlzaGVkQmxhY2tzdG9uZSA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3BvbGlzaGVkX2JsYWNrc3RvbmVcIixcbiAgU21vb3RoU3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3N0b25lX3NsYWJcIixcbiAgSW5mZXN0ZWRDaGlzZWxlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfY2hpc2VsZWRfc3RvbmVfYnJpY2tzXCIsXG4gIEJyb3duQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpicm93bl9jb25jcmV0ZV9wb3dkZXJcIixcbiAgUGlua0NvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6cGlua19jb25jcmV0ZV9wb3dkZXJcIixcbiAgQ3JhY2tlZERlZXBzbGF0ZUJyaWNrcyA9IFwibWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX2JyaWNrc1wiLFxuICBEZWFkVHViZUNvcmFsID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsXCIsXG4gIEFjYWNpYURvb3IgPSBcIm1pbmVjcmFmdDphY2FjaWFfZG9vclwiLFxuICBPcmFuZ2VTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3NodWxrZXJfYm94XCIsXG4gIE5ldGhlcldhcnRCbG9jayA9IFwibWluZWNyYWZ0Om5ldGhlcl93YXJ0X2Jsb2NrXCIsXG4gIExpZ2h0Qmx1ZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFByaXNtYXJpbmVTbGFiID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9zbGFiXCIsXG4gIFByaXNtYXJpbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9kb3VibGVfc2xhYlwiLFxuICBMaWdodEJsb2NrMTEgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xMVwiLFxuICBDaGVycnlEb29yID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2Rvb3JcIixcbiAgV2VhdGhlcmVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIEFjYWNpYUxvZyA9IFwibWluZWNyYWZ0OmFjYWNpYV9sb2dcIixcbiAgRmxvd2luZ0xhdmEgPSBcIm1pbmVjcmFmdDpmbG93aW5nX2xhdmFcIixcbiAgV2hpdGVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6d2hpdGVfdGVycmFjb3R0YVwiLFxuICBDcmltc29uVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpjcmltc29uX3RyYXBkb29yXCIsXG4gIEJsdWVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Ymx1ZV9zaHVsa2VyX2JveFwiLFxuICBCYXNhbHQgPSBcIm1pbmVjcmFmdDpiYXNhbHRcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgSGFyZEN5YW5TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2N5YW5fc3RhaW5lZF9nbGFzc1wiLFxuICBQb2xpc2hlZERpb3JpdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kaW9yaXRlXCIsXG4gIEVsZW1lbnQxMyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTNcIixcbiAgQ3lhbkdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpjeWFuX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIExpdFJlZHN0b25lTGFtcCA9IFwibWluZWNyYWZ0OmxpdF9yZWRzdG9uZV9sYW1wXCIsXG4gIEhhcmRQdXJwbGVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3B1cnBsZV9zdGFpbmVkX2dsYXNzXCIsXG4gIFllbGxvd0NhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfY2FuZGxlX2Nha2VcIixcbiAgU3RpY2t5UGlzdG9uID0gXCJtaW5lY3JhZnQ6c3RpY2t5X3Bpc3RvblwiLFxuICBNZWRpdW1BbWV0aHlzdEJ1ZCA9IFwibWluZWNyYWZ0Om1lZGl1bV9hbWV0aHlzdF9idWRcIixcbiAgQnJvd25TaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6YnJvd25fc2h1bGtlcl9ib3hcIixcbiAgUGlua1NodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpwaW5rX3NodWxrZXJfYm94XCIsXG4gIExpZ2h0Qmx1ZUNhbmRsZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FuZGxlXCIsXG4gIERlZXBzbGF0ZVRpbGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfdGlsZV9zdGFpcnNcIixcbiAgU2N1bGtTZW5zb3IgPSBcIm1pbmVjcmFmdDpzY3Vsa19zZW5zb3JcIixcbiAgQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OmNvcHBlcl9idWxiXCIsXG4gIEVsZW1lbnQ2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82XCIsXG4gIEVsZW1lbnQ5NyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOTdcIixcbiAgRGlvcml0ZVN0YWlycyA9IFwibWluZWNyYWZ0OmRpb3JpdGVfc3RhaXJzXCIsXG4gIFNtb290aFN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9zdG9uZV9kb3VibGVfc2xhYlwiLFxuICBTcHJ1Y2VMZWF2ZXMgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfbGVhdmVzXCIsXG4gIFJlZFN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpyZWRfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEZyb2dTcGF3biA9IFwibWluZWNyYWZ0OmZyb2dfc3Bhd25cIixcbiAgRWxlbWVudDExMSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTExXCIsXG4gIENyaW1zb25GZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpjcmltc29uX2ZlbmNlX2dhdGVcIixcbiAgUmVkQ2FycGV0ID0gXCJtaW5lY3JhZnQ6cmVkX2NhcnBldFwiLFxuICBTbW9vdGhTYW5kc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZV9kb3VibGVfc2xhYlwiLFxuICBSZWRTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6cmVkX3NodWxrZXJfYm94XCIsXG4gIERpcnRXaXRoUm9vdHMgPSBcIm1pbmVjcmFmdDpkaXJ0X3dpdGhfcm9vdHNcIixcbiAgU3RyaXBwZWRDaGVycnlMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9jaGVycnlfbG9nXCIsXG4gIEhvcm5Db3JhbFdhbGxGYW4gPSBcIm1pbmVjcmFmdDpob3JuX2NvcmFsX3dhbGxfZmFuXCIsXG4gIENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDpjb3BwZXJfZG9vclwiLFxuICBDcmltc29uQnV0dG9uID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9idXR0b25cIixcbiAgTWFnZW50YUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgUHJpc21hcmluZVN0YWlycyA9IFwibWluZWNyYWZ0OnByaXNtYXJpbmVfc3RhaXJzXCIsXG4gIElyb25Eb29yID0gXCJtaW5lY3JhZnQ6aXJvbl9kb29yXCIsXG4gIE1hbmdyb3ZlVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV90cmFwZG9vclwiLFxuICBEYXlsaWdodERldGVjdG9ySW52ZXJ0ZWQgPSBcIm1pbmVjcmFmdDpkYXlsaWdodF9kZXRlY3Rvcl9pbnZlcnRlZFwiLFxuICBKdW5nbGVQbGFua3MgPSBcIm1pbmVjcmFmdDpqdW5nbGVfcGxhbmtzXCIsXG4gIENob3J1c0Zsb3dlciA9IFwibWluZWNyYWZ0OmNob3J1c19mbG93ZXJcIixcbiAgVG9yY2hmbG93ZXJDcm9wID0gXCJtaW5lY3JhZnQ6dG9yY2hmbG93ZXJfY3JvcFwiLFxuICBDcmFja2VkTmV0aGVyQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9uZXRoZXJfYnJpY2tzXCIsXG4gIFB1bXBraW4gPSBcIm1pbmVjcmFmdDpwdW1wa2luXCIsXG4gIFNtb290aFN0b25lID0gXCJtaW5lY3JhZnQ6c21vb3RoX3N0b25lXCIsXG4gIEdyYW5pdGVTbGFiID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZV9zbGFiXCIsXG4gIExpbWVDb25jcmV0ZSA9IFwibWluZWNyYWZ0OmxpbWVfY29uY3JldGVcIixcbiAgV2F4ZWRXZWF0aGVyZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBSZWRNdXNocm9vbSA9IFwibWluZWNyYWZ0OnJlZF9tdXNocm9vbVwiLFxuICBIYXJkWWVsbG93U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF95ZWxsb3dfc3RhaW5lZF9nbGFzc1wiLFxuICBNYWdlbnRhVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfdGVycmFjb3R0YVwiLFxuICBCbGFja0NhcnBldCA9IFwibWluZWNyYWZ0OmJsYWNrX2NhcnBldFwiLFxuICBFeHBvc2VkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVyX3N0YWlyc1wiLFxuICBNYW5ncm92ZVN0YWlycyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3N0YWlyc1wiLFxuICBQb2xpc2hlZERpb3JpdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZV9zbGFiXCIsXG4gIFJlZFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVfc3RhaXJzXCIsXG4gIExpZ2h0Qmx1ZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jb25jcmV0ZVwiLFxuICBNYW5ncm92ZUZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlX2dhdGVcIixcbiAgQnViYmxlQ29sdW1uID0gXCJtaW5lY3JhZnQ6YnViYmxlX2NvbHVtblwiLFxuICBTdW5mbG93ZXIgPSBcIm1pbmVjcmFmdDpzdW5mbG93ZXJcIixcbiAgQWxsb3cgPSBcIm1pbmVjcmFmdDphbGxvd1wiLFxuICBHcmF5Q29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpncmF5X2NvbmNyZXRlX3Bvd2RlclwiLFxuICBCYW1ib29IYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmJhbWJvb19oYW5naW5nX3NpZ25cIixcbiAgV2l0aGVyUm9zZSA9IFwibWluZWNyYWZ0OndpdGhlcl9yb3NlXCIsXG4gIENvcHBlckJsb2NrID0gXCJtaW5lY3JhZnQ6Y29wcGVyX2Jsb2NrXCIsXG4gIEJpcmNoRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmJpcmNoX2RvdWJsZV9zbGFiXCIsXG4gIFdheGVkV2VhdGhlcmVkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9kb3VibGVfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tzXCIsXG4gIEN1dENvcHBlciA9IFwibWluZWNyYWZ0OmN1dF9jb3BwZXJcIixcbiAgRnJvc3RlZEljZSA9IFwibWluZWNyYWZ0OmZyb3N0ZWRfaWNlXCIsXG4gIFNwcnVjZURvb3IgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfZG9vclwiLFxuICBDaGlzZWxlZFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3NhbmRzdG9uZVwiLFxuICBDaGlwcGVkQW52aWwgPSBcIm1pbmVjcmFmdDpjaGlwcGVkX2FudmlsXCIsXG4gIFdhcnBlZFRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2FycGVkX3RyYXBkb29yXCIsXG4gIE9yYW5nZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBGbG93aW5nV2F0ZXIgPSBcIm1pbmVjcmFmdDpmbG93aW5nX3dhdGVyXCIsXG4gIEJyaWNrQmxvY2sgPSBcIm1pbmVjcmFmdDpicmlja19ibG9ja1wiLFxuICBIYXJkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2dsYXNzXCIsXG4gIENhdmVWaW5lcyA9IFwibWluZWNyYWZ0OmNhdmVfdmluZXNcIixcbiAgTWFnZW50YVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDptYWdlbnRhX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBFbGVtZW50NjIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzYyXCIsXG4gIExpZ2h0Qmx1ZUNhcnBldCA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FycGV0XCIsXG4gIE9ha0hhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6b2FrX2hhbmdpbmdfc2lnblwiLFxuICBTdHJpcHBlZERhcmtPYWtXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfZGFya19vYWtfd29vZFwiLFxuICBXaGl0ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OndoaXRlX3N0YWluZWRfZ2xhc3NcIixcbiAgT2FrV29vZCA9IFwibWluZWNyYWZ0Om9ha193b29kXCIsXG4gIFdheGVkRXhwb3NlZERvdWJsZUN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2RvdWJsZV9jdXRfY29wcGVyX3NsYWJcIixcbiAgV2F4ZWRPeGlkaXplZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX3RyYXBkb29yXCIsXG4gIEp1a2Vib3ggPSBcIm1pbmVjcmFmdDpqdWtlYm94XCIsXG4gIFN0cmlwcGVkQ2hlcnJ5V29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV93b29kXCIsXG4gIEFjYWNpYVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDphY2FjaWFfcHJlc3N1cmVfcGxhdGVcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX3NsYWJcIixcbiAgSmlnc2F3ID0gXCJtaW5lY3JhZnQ6amlnc2F3XCIsXG4gIEJvcmRlckJsb2NrID0gXCJtaW5lY3JhZnQ6Ym9yZGVyX2Jsb2NrXCIsXG4gIFNocm9vbWxpZ2h0ID0gXCJtaW5lY3JhZnQ6c2hyb29tbGlnaHRcIixcbiAgWWVsbG93Q2FuZGxlID0gXCJtaW5lY3JhZnQ6eWVsbG93X2NhbmRsZVwiLFxuICBEYXJrT2FrU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfc3RhaXJzXCIsXG4gIERlZXBzbGF0ZVRpbGVXYWxsID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfd2FsbFwiLFxuICBHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpnbGFzc19wYW5lXCIsXG4gIENoaXNlbGVkRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfZGVlcHNsYXRlXCIsXG4gIEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpjdXRfY29wcGVyX3NsYWJcIixcbiAgSW5mZXN0ZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmluZmVzdGVkX3N0b25lX2JyaWNrc1wiLFxuICBCYW1ib29UcmFwZG9vciA9IFwibWluZWNyYWZ0OmJhbWJvb190cmFwZG9vclwiLFxuICBPeGlkaXplZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIERhcmtPYWtUcmFwZG9vciA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3RyYXBkb29yXCIsXG4gIE1hbmdyb3ZlV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDptYW5ncm92ZV93YWxsX3NpZ25cIixcbiAgQmVldHJvb3QgPSBcIm1pbmVjcmFmdDpiZWV0cm9vdFwiLFxuICBSYXdDb3BwZXJCbG9jayA9IFwibWluZWNyYWZ0OnJhd19jb3BwZXJfYmxvY2tcIixcbiAgSG9ybkNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpob3JuX2NvcmFsX2Jsb2NrXCIsXG4gIFNrdWxsID0gXCJtaW5lY3JhZnQ6c2t1bGxcIixcbiAgTGlnaHRHcmF5Q2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FuZGxlX2Nha2VcIixcbiAgRWxlbWVudDk1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85NVwiLFxuICBXaGl0ZUNhbmRsZSA9IFwibWluZWNyYWZ0OndoaXRlX2NhbmRsZVwiLFxuICBHb2xkZW5SYWlsID0gXCJtaW5lY3JhZnQ6Z29sZGVuX3JhaWxcIixcbiAgTGl0RnVybmFjZSA9IFwibWluZWNyYWZ0OmxpdF9mdXJuYWNlXCIsXG4gIEN5YW5Xb29sID0gXCJtaW5lY3JhZnQ6Y3lhbl93b29sXCIsXG4gIFBldHJpZmllZE9ha0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwZXRyaWZpZWRfb2FrX2RvdWJsZV9zbGFiXCIsXG4gIFN0cnVjdHVyZUJsb2NrID0gXCJtaW5lY3JhZnQ6c3RydWN0dXJlX2Jsb2NrXCIsXG4gIFRpbnRlZEdsYXNzID0gXCJtaW5lY3JhZnQ6dGludGVkX2dsYXNzXCIsXG4gIERlcHJlY2F0ZWRBbnZpbCA9IFwibWluZWNyYWZ0OmRlcHJlY2F0ZWRfYW52aWxcIixcbiAgR3JheVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpncmF5X3NodWxrZXJfYm94XCIsXG4gIEZpcmVDb3JhbFdhbGxGYW4gPSBcIm1pbmVjcmFmdDpmaXJlX2NvcmFsX3dhbGxfZmFuXCIsXG4gIEp1bmdsZUZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0Omp1bmdsZV9mZW5jZV9nYXRlXCIsXG4gIEV4cG9zZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2dyYXRlXCIsXG4gIFdheGVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJfZ3JhdGVcIixcbiAgRGVhZEJyYWluQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2JyYWluX2NvcmFsXCIsXG4gIEp1bmdsZVRyYXBkb29yID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3RyYXBkb29yXCIsXG4gIFNwcnVjZVdhbGxTaWduID0gXCJtaW5lY3JhZnQ6c3BydWNlX3dhbGxfc2lnblwiLFxuICBDb2FsQmxvY2sgPSBcIm1pbmVjcmFmdDpjb2FsX2Jsb2NrXCIsXG4gIFdhcnBlZEZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OndhcnBlZF9mZW5jZV9nYXRlXCIsXG4gIENvbXBvc3RlciA9IFwibWluZWNyYWZ0OmNvbXBvc3RlclwiLFxuICBFbGVtZW50NDQgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQ0XCIsXG4gIFdheGVkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX2RvdWJsZV9jdXRfY29wcGVyX3NsYWJcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2Rvb3JcIixcbiAgQmx1ZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpibHVlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEJsdWVXb29sID0gXCJtaW5lY3JhZnQ6Ymx1ZV93b29sXCIsXG4gIENsYXkgPSBcIm1pbmVjcmFmdDpjbGF5XCIsXG4gIFdlZXBpbmdWaW5lcyA9IFwibWluZWNyYWZ0OndlZXBpbmdfdmluZXNcIixcbiAgQ2hvcnVzUGxhbnQgPSBcIm1pbmVjcmFmdDpjaG9ydXNfcGxhbnRcIixcbiAgTXVkQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDptdWRfYnJpY2tfc3RhaXJzXCIsXG4gIFNtb290aFJlZFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX3N0YWlyc1wiLFxuICBFbGVtZW50MTAwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMDBcIixcbiAgRWxlbWVudDEwMyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTAzXCIsXG4gIEVsZW1lbnQxMDUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwNVwiLFxuICBDcmltc29uUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmNyaW1zb25fcHJlc3N1cmVfcGxhdGVcIixcbiAgRWxlbWVudDEwNiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTA2XCIsXG4gIEVsZW1lbnQxMDcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwN1wiLFxuICBIYXJkR3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2dyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEVsZW1lbnQxMDggPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwOFwiLFxuICBFbGVtZW50MTA5ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMDlcIixcbiAgTGlnaHRHcmF5U2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfc2h1bGtlcl9ib3hcIixcbiAgRWxlbWVudDExMiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTEyXCIsXG4gIEVsZW1lbnQxMTAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzExMFwiLFxuICBFbGVtZW50MTE2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMTZcIixcbiAgRWxlbWVudDExNCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTE0XCIsXG4gIFdoaXRlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OndoaXRlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFN0cmlwcGVkV2FycGVkSHlwaGFlID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfd2FycGVkX2h5cGhhZVwiLFxuICBFbGVtZW50NTAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzUwXCIsXG4gIFB1bXBraW5TdGVtID0gXCJtaW5lY3JhZnQ6cHVtcGtpbl9zdGVtXCIsXG4gIExldmVyID0gXCJtaW5lY3JhZnQ6bGV2ZXJcIixcbiAgTW92aW5nQmxvY2sgPSBcIm1pbmVjcmFmdDptb3ZpbmdfYmxvY2tcIixcbiAgVHJhcHBlZENoZXN0ID0gXCJtaW5lY3JhZnQ6dHJhcHBlZF9jaGVzdFwiLFxuICBMaWdodEdyYXlDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY29uY3JldGVfcG93ZGVyXCIsXG4gIEJyYWluQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmJyYWluX2NvcmFsX2Jsb2NrXCIsXG4gIFN0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0OnN0YW5kaW5nX3NpZ25cIixcbiAgUHVycGxlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY29uY3JldGVfcG93ZGVyXCIsXG4gIEJhbWJvb1BsYW5rcyA9IFwibWluZWNyYWZ0OmJhbWJvb19wbGFua3NcIixcbiAgQ29tbWFuZEJsb2NrID0gXCJtaW5lY3JhZnQ6Y29tbWFuZF9ibG9ja1wiLFxuICBUd2lzdGluZ1ZpbmVzID0gXCJtaW5lY3JhZnQ6dHdpc3RpbmdfdmluZXNcIixcbiAgQWNhY2lhRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmFjYWNpYV9kb3VibGVfc2xhYlwiLFxuICBQb2xpc2hlZEFuZGVzaXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2FuZGVzaXRlX2RvdWJsZV9zbGFiXCIsXG4gIE1hZ21hID0gXCJtaW5lY3JhZnQ6bWFnbWFcIixcbiAgRGlydCA9IFwibWluZWNyYWZ0OmRpcnRcIixcbiAgUmVlZHMgPSBcIm1pbmVjcmFmdDpyZWVkc1wiLFxuICBEZW55ID0gXCJtaW5lY3JhZnQ6ZGVueVwiLFxuICBCZWVOZXN0ID0gXCJtaW5lY3JhZnQ6YmVlX25lc3RcIixcbiAgQ2FtcGZpcmUgPSBcIm1pbmVjcmFmdDpjYW1wZmlyZVwiLFxuICBTb3VsU29pbCA9IFwibWluZWNyYWZ0OnNvdWxfc29pbFwiLFxuICBFbGVtZW50OCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOFwiLFxuICBFbGVtZW50MjggPSBcIm1pbmVjcmFmdDplbGVtZW50XzI4XCIsXG4gIERhcmtPYWtQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfcHJlc3N1cmVfcGxhdGVcIixcbiAgU291bFNhbmQgPSBcIm1pbmVjcmFmdDpzb3VsX3NhbmRcIixcbiAgQ29iYmxlZERlZXBzbGF0ZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZV9kb3VibGVfc2xhYlwiLFxuICBTcHJ1Y2VIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OnNwcnVjZV9oYW5naW5nX3NpZ25cIixcbiAgUmVpbmZvcmNlZERlZXBzbGF0ZSA9IFwibWluZWNyYWZ0OnJlaW5mb3JjZWRfZGVlcHNsYXRlXCIsXG4gIEVuZFJvZCA9IFwibWluZWNyYWZ0OmVuZF9yb2RcIixcbiAgRmxldGNoaW5nVGFibGUgPSBcIm1pbmVjcmFmdDpmbGV0Y2hpbmdfdGFibGVcIixcbiAgQ2hlcnJ5TGVhdmVzID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2xlYXZlc1wiLFxuICBCbGFja0dsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpibGFja19nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBTdHJpcHBlZEFjYWNpYUxvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2FjYWNpYV9sb2dcIixcbiAgU25pZmZlckVnZyA9IFwibWluZWNyYWZ0OnNuaWZmZXJfZWdnXCIsXG4gIFdhcnBlZEZlbmNlID0gXCJtaW5lY3JhZnQ6d2FycGVkX2ZlbmNlXCIsXG4gIENhdmVWaW5lc0JvZHlXaXRoQmVycmllcyA9IFwibWluZWNyYWZ0OmNhdmVfdmluZXNfYm9keV93aXRoX2JlcnJpZXNcIixcbiAgQ2hlcnJ5U3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3N0YW5kaW5nX3NpZ25cIixcbiAgTWFuZ3JvdmVIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2hhbmdpbmdfc2lnblwiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX3RyYXBkb29yXCIsXG4gIE1vc3N5U3RvbmVCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0Om1vc3N5X3N0b25lX2JyaWNrX3N0YWlyc1wiLFxuICBDcmltc29uU3RlbSA9IFwibWluZWNyYWZ0OmNyaW1zb25fc3RlbVwiLFxuICBDb2xvcmVkVG9yY2hSZyA9IFwibWluZWNyYWZ0OmNvbG9yZWRfdG9yY2hfcmdcIixcbiAgVHVmZkJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgVmF1bHQgPSBcIm1pbmVjcmFmdDp2YXVsdFwiLFxuICBBemFsZWFMZWF2ZXNGbG93ZXJlZCA9IFwibWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXNfZmxvd2VyZWRcIixcbiAgRWxlbWVudDE4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xOFwiLFxuICBDcmltc29uU2xhYiA9IFwibWluZWNyYWZ0OmNyaW1zb25fc2xhYlwiLFxuICBXYXJwZWRIeXBoYWUgPSBcIm1pbmVjcmFmdDp3YXJwZWRfaHlwaGFlXCIsXG4gIE94ZXllRGFpc3kgPSBcIm1pbmVjcmFmdDpveGV5ZV9kYWlzeVwiLFxuICBCYW1ib29CdXR0b24gPSBcIm1pbmVjcmFmdDpiYW1ib29fYnV0dG9uXCIsXG4gIFdhcnBlZFdhcnRCbG9jayA9IFwibWluZWNyYWZ0OndhcnBlZF93YXJ0X2Jsb2NrXCIsXG4gIFR1ZmZTdGFpcnMgPSBcIm1pbmVjcmFmdDp0dWZmX3N0YWlyc1wiLFxuICBZZWxsb3dDYXJwZXQgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfY2FycGV0XCIsXG4gIEJsYWNrU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6YmxhY2tfc3RhaW5lZF9nbGFzc1wiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9kb29yXCIsXG4gIEdyYXNzQmxvY2sgPSBcIm1pbmVjcmFmdDpncmFzc19ibG9ja1wiLFxuICBUcmlwd2lyZUhvb2sgPSBcIm1pbmVjcmFmdDp0cmlwd2lyZV9ob29rXCIsXG4gIEhhcmRCbGFja1N0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfYmxhY2tfc3RhaW5lZF9nbGFzc1wiLFxuICBTdHJpcHBlZEJpcmNoTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYmlyY2hfbG9nXCIsXG4gIFJlZFR1bGlwID0gXCJtaW5lY3JhZnQ6cmVkX3R1bGlwXCIsXG4gIEN1dFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OmN1dF9zYW5kc3RvbmVcIixcbiAgTGltZVdvb2wgPSBcIm1pbmVjcmFmdDpsaW1lX3dvb2xcIixcbiAgQmx1ZUNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpibHVlX2NhbmRsZV9jYWtlXCIsXG4gIExhcmdlRmVybiA9IFwibWluZWNyYWZ0OmxhcmdlX2Zlcm5cIixcbiAgU3dlZXRCZXJyeUJ1c2ggPSBcIm1pbmVjcmFmdDpzd2VldF9iZXJyeV9idXNoXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3NsYWJcIixcbiAgQmxhY2tTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6YmxhY2tfc2h1bGtlcl9ib3hcIixcbiAgSnVuZ2xlU2FwbGluZyA9IFwibWluZWNyYWZ0Omp1bmdsZV9zYXBsaW5nXCIsXG4gIEJsdWVDb25jcmV0ZSA9IFwibWluZWNyYWZ0OmJsdWVfY29uY3JldGVcIixcbiAgSnVuZ2xlU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3N0YW5kaW5nX3NpZ25cIixcbiAgV2ViID0gXCJtaW5lY3JhZnQ6d2ViXCIsXG4gIFdlYXRoZXJlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIENvY29hID0gXCJtaW5lY3JhZnQ6Y29jb2FcIixcbiAgRGFya09ha0xlYXZlcyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2xlYXZlc1wiLFxuICBPcmFuZ2VUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3RlcnJhY290dGFcIixcbiAgRmlyZSA9IFwibWluZWNyYWZ0OmZpcmVcIixcbiAgUHVycHVyRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnB1cnB1cl9kb3VibGVfc2xhYlwiLFxuICBFeHBvc2VkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBJbmZlc3RlZFN0b25lID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfc3RvbmVcIixcbiAgRW5kUG9ydGFsRnJhbWUgPSBcIm1pbmVjcmFmdDplbmRfcG9ydGFsX2ZyYW1lXCIsXG4gIFByaXNtYXJpbmUgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lXCIsXG4gIE1hZ2VudGFDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jYW5kbGVfY2FrZVwiLFxuICBEZWVwc2xhdGVHb2xkT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2dvbGRfb3JlXCIsXG4gIEhhcmRPcmFuZ2VTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX29yYW5nZV9zdGFpbmVkX2dsYXNzXCIsXG4gIEdsYXNzID0gXCJtaW5lY3JhZnQ6Z2xhc3NcIixcbiAgTW9zc0Jsb2NrID0gXCJtaW5lY3JhZnQ6bW9zc19ibG9ja1wiLFxuICBOZXRoZXJCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgRXhwb3NlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlclwiLFxuICBQcmlzbWFyaW5lQnJpY2tEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja19kb3VibGVfc2xhYlwiLFxuICBCb29rc2hlbGYgPSBcIm1pbmVjcmFmdDpib29rc2hlbGZcIixcbiAgV2F4ZWRXZWF0aGVyZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgTWFuZ3JvdmVSb290cyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3Jvb3RzXCIsXG4gIEFjYWNpYVN0YWlycyA9IFwibWluZWNyYWZ0OmFjYWNpYV9zdGFpcnNcIixcbiAgUG9saXNoZWRBbmRlc2l0ZVN0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2FuZGVzaXRlX3N0YWlyc1wiLFxuICBDaGVycnlTbGFiID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3NsYWJcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX2RvdWJsZV9zbGFiXCIsXG4gIExpdEJsYXN0RnVybmFjZSA9IFwibWluZWNyYWZ0OmxpdF9ibGFzdF9mdXJuYWNlXCIsXG4gIEVsZW1lbnQxMSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTFcIixcbiAgU2N1bGsgPSBcIm1pbmVjcmFmdDpzY3Vsa1wiLFxuICBUdWZmQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDp0dWZmX2JyaWNrX3N0YWlyc1wiLFxuICBDaGVtaXN0cnlUYWJsZSA9IFwibWluZWNyYWZ0OmNoZW1pc3RyeV90YWJsZVwiLFxuICBEZWFkRmlyZUNvcmFsID0gXCJtaW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFsXCIsXG4gIFN0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnJpY2tfc2xhYlwiLFxuICBTdHJpcHBlZFNwcnVjZUxvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX3NwcnVjZV9sb2dcIixcbiAgV2F4ZWRPeGlkaXplZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jb3BwZXJfYnVsYlwiLFxuICBEZWVwc2xhdGVCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zdGFpcnNcIixcbiAgV2FycGVkTnlsaXVtID0gXCJtaW5lY3JhZnQ6d2FycGVkX255bGl1bVwiLFxuICBEZWVwc2xhdGVFbWVyYWxkT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2VtZXJhbGRfb3JlXCIsXG4gIFN0cmlwcGVkQ3JpbXNvblN0ZW0gPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9jcmltc29uX3N0ZW1cIixcbiAgQWNhY2lhU2FwbGluZyA9IFwibWluZWNyYWZ0OmFjYWNpYV9zYXBsaW5nXCIsXG4gIFN0b25lY3V0dGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpzdG9uZWN1dHRlcl9ibG9ja1wiLFxuICBBbmRlc2l0ZVNsYWIgPSBcIm1pbmVjcmFmdDphbmRlc2l0ZV9zbGFiXCIsXG4gIEN5YW5TaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Y3lhbl9zaHVsa2VyX2JveFwiLFxuICBVbnBvd2VyZWRDb21wYXJhdG9yID0gXCJtaW5lY3JhZnQ6dW5wb3dlcmVkX2NvbXBhcmF0b3JcIixcbiAgTGltZUNhbmRsZSA9IFwibWluZWNyYWZ0OmxpbWVfY2FuZGxlXCIsXG4gIFRhcmdldCA9IFwibWluZWNyYWZ0OnRhcmdldFwiLFxuICBXb29kZW5CdXR0b24gPSBcIm1pbmVjcmFmdDp3b29kZW5fYnV0dG9uXCIsXG4gIE1hbmdyb3ZlRG9vciA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2Rvb3JcIixcbiAgRW5kU3RvbmVCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDplbmRfc3RvbmVfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgV2VhdGhlcmVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfZG9vclwiLFxuICBQZWFybGVzY2VudEZyb2dsaWdodCA9IFwibWluZWNyYWZ0OnBlYXJsZXNjZW50X2Zyb2dsaWdodFwiLFxuICBUYWxsR3Jhc3MgPSBcIm1pbmVjcmFmdDp0YWxsX2dyYXNzXCIsXG4gIExpZ2h0QmxvY2sxNSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzE1XCIsXG4gIEVsZW1lbnQ2NCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjRcIixcbiAgTmV0aGVyU3Byb3V0cyA9IFwibWluZWNyYWZ0Om5ldGhlcl9zcHJvdXRzXCIsXG4gIEVsZW1lbnQ5MiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOTJcIixcbiAgQ3lhblN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpjeWFuX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBEZWFkSG9ybkNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2hvcm5fY29yYWxfYmxvY2tcIixcbiAgRWxlbWVudDEyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMlwiLFxuICBEZWFkSG9ybkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsX2ZhblwiLFxuICBGdXJuYWNlID0gXCJtaW5lY3JhZnQ6ZnVybmFjZVwiLFxuICBXYXJwZWRTbGFiID0gXCJtaW5lY3JhZnQ6d2FycGVkX3NsYWJcIixcbiAgTmV0aGVycmFjayA9IFwibWluZWNyYWZ0Om5ldGhlcnJhY2tcIixcbiAgV2FycGVkU3RlbSA9IFwibWluZWNyYWZ0OndhcnBlZF9zdGVtXCIsXG4gIENoYWluID0gXCJtaW5lY3JhZnQ6Y2hhaW5cIixcbiAgSG9ybkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6aG9ybl9jb3JhbF9mYW5cIixcbiAgR3JlZW5TaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Z3JlZW5fc2h1bGtlcl9ib3hcIixcbiAgQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpicmlja19zdGFpcnNcIixcbiAgUHVycGxlQ2FycGV0ID0gXCJtaW5lY3JhZnQ6cHVycGxlX2NhcnBldFwiLFxuICBGaXJlQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpmaXJlX2NvcmFsX2ZhblwiLFxuICBFbGVtZW50NjkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzY5XCIsXG4gIFNwcnVjZVRyYXBkb29yID0gXCJtaW5lY3JhZnQ6c3BydWNlX3RyYXBkb29yXCIsXG4gIFB1cnBsZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpwdXJwbGVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQ2hhaW5Db21tYW5kQmxvY2sgPSBcIm1pbmVjcmFmdDpjaGFpbl9jb21tYW5kX2Jsb2NrXCIsXG4gIFNwcnVjZUZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OnNwcnVjZV9mZW5jZV9nYXRlXCIsXG4gIFJlZE5ldGhlckJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19zdGFpcnNcIixcbiAgR3JlZW5HbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Z3JlZW5fZ2xhemVkX3RlcnJhY290dGFcIixcbiAgRGVlcHNsYXRlUmVkc3RvbmVPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfcmVkc3RvbmVfb3JlXCIsXG4gIERlYWRCcmFpbkNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2JyYWluX2NvcmFsX2Jsb2NrXCIsXG4gIE1hbmdyb3ZlRmVuY2UgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9mZW5jZVwiLFxuICBCaXJjaFRyYXBkb29yID0gXCJtaW5lY3JhZnQ6YmlyY2hfdHJhcGRvb3JcIixcbiAgVHVmZkJyaWNrcyA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tzXCIsXG4gIE11ZCA9IFwibWluZWNyYWZ0Om11ZFwiLFxuICBJY2UgPSBcIm1pbmVjcmFmdDppY2VcIixcbiAgQWlyID0gXCJtaW5lY3JhZnQ6YWlyXCIsXG4gIEJlZCA9IFwibWluZWNyYWZ0OmJlZFwiLFxuICBMaWdodEJsdWVXb29sID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV93b29sXCIsXG4gIEJsYWNrQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpibGFja19jb25jcmV0ZVwiLFxuICBUbnQgPSBcIm1pbmVjcmFmdDp0bnRcIixcbiAgRGVhZFR1YmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfdHViZV9jb3JhbF9mYW5cIixcbiAgUG9saXNoZWREaW9yaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZV9zdGFpcnNcIixcbiAgRWxlbWVudDgzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84M1wiLFxuICBPcmFuZ2VDb25jcmV0ZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9jb25jcmV0ZVwiLFxuICBOZXRoZXJyZWFjdG9yID0gXCJtaW5lY3JhZnQ6bmV0aGVycmVhY3RvclwiLFxuICBMaW1lQ2FycGV0ID0gXCJtaW5lY3JhZnQ6bGltZV9jYXJwZXRcIixcbiAgRGVhZEZpcmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfZmlyZV9jb3JhbF9mYW5cIixcbiAgRGVjb3JhdGVkUG90ID0gXCJtaW5lY3JhZnQ6ZGVjb3JhdGVkX3BvdFwiLFxuICBHcmFuaXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmdyYW5pdGVfZG91YmxlX3NsYWJcIixcbiAgRW5jaGFudGluZ1RhYmxlID0gXCJtaW5lY3JhZnQ6ZW5jaGFudGluZ190YWJsZVwiLFxuICBCdWJibGVDb3JhbFdhbGxGYW4gPSBcIm1pbmVjcmFmdDpidWJibGVfY29yYWxfd2FsbF9mYW5cIixcbiAgT3JhbmdlVHVsaXAgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfdHVsaXBcIixcbiAgQXphbGVhID0gXCJtaW5lY3JhZnQ6YXphbGVhXCIsXG4gIEJlbGwgPSBcIm1pbmVjcmFmdDpiZWxsXCIsXG4gIE11ZEJyaWNrcyA9IFwibWluZWNyYWZ0Om11ZF9icmlja3NcIixcbiAgQmlyY2hXYWxsU2lnbiA9IFwibWluZWNyYWZ0OmJpcmNoX3dhbGxfc2lnblwiLFxuICBCYW1ib29XYWxsU2lnbiA9IFwibWluZWNyYWZ0OmJhbWJvb193YWxsX3NpZ25cIixcbiAgQWNhY2lhV29vZCA9IFwibWluZWNyYWZ0OmFjYWNpYV93b29kXCIsXG4gIEhvcHBlciA9IFwibWluZWNyYWZ0OmhvcHBlclwiLFxuICBIYXJkUmVkU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9yZWRfc3RhaW5lZF9nbGFzc1wiLFxuICBQcmlzbWFyaW5lQnJpY2tzID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja3NcIixcbiAgTGVjdGVybiA9IFwibWluZWNyYWZ0OmxlY3Rlcm5cIixcbiAgQWNhY2lhQnV0dG9uID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2J1dHRvblwiLFxuICBTdGFuZGluZ0Jhbm5lciA9IFwibWluZWNyYWZ0OnN0YW5kaW5nX2Jhbm5lclwiLFxuICBTZWFMYW50ZXJuID0gXCJtaW5lY3JhZnQ6c2VhX2xhbnRlcm5cIixcbiAgV2F4ZWRPeGlkaXplZERvdWJsZUN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9kb3VibGVfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIExpZ2h0Qmx1ZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3NodWxrZXJfYm94XCIsXG4gIE1hbmdyb3ZlUHJvcGFndWxlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcHJvcGFndWxlXCIsXG4gIFBvbGlzaGVkRGlvcml0ZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kaW9yaXRlX2RvdWJsZV9zbGFiXCIsXG4gIE1vc3N5Q29iYmxlc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgQmlyY2hTdGFpcnMgPSBcIm1pbmVjcmFmdDpiaXJjaF9zdGFpcnNcIixcbiAgU3BydWNlU2xhYiA9IFwibWluZWNyYWZ0OnNwcnVjZV9zbGFiXCIsXG4gIEJsYWNrc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lX3N0YWlyc1wiLFxuICBCbHVlSWNlID0gXCJtaW5lY3JhZnQ6Ymx1ZV9pY2VcIixcbiAgSGFyZFJlZFN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3JlZF9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgTGFudGVybiA9IFwibWluZWNyYWZ0OmxhbnRlcm5cIixcbiAgRGFya09ha0ZlbmNlID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfZmVuY2VcIixcbiAgQmlyY2hEb29yID0gXCJtaW5lY3JhZnQ6YmlyY2hfZG9vclwiLFxuICBEZWVwc2xhdGVMYXBpc09yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9sYXBpc19vcmVcIixcbiAgQ3JpbXNvbkhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9oYW5naW5nX3NpZ25cIixcbiAgRGVlcHNsYXRlQ29hbE9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9jb2FsX29yZVwiLFxuICBXZWF0aGVyZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY3V0X2NvcHBlclwiLFxuICBCYW1ib29TdGFuZGluZ1NpZ24gPSBcIm1pbmVjcmFmdDpiYW1ib29fc3RhbmRpbmdfc2lnblwiLFxuICBTdHJpcHBlZE1hbmdyb3ZlTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfbWFuZ3JvdmVfbG9nXCIsXG4gIFBvbGlzaGVkVHVmZiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZcIixcbiAgTWFnZW50YVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0Om1hZ2VudGFfc3RhaW5lZF9nbGFzc1wiLFxuICBXZWF0aGVyZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9idWxiXCIsXG4gIEhhcmRXaGl0ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3doaXRlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBIYXJkQ3lhblN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2N5YW5fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIENoaXNlbGVkTmV0aGVyQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfbmV0aGVyX2JyaWNrc1wiLFxuICBXYXJwZWRCdXR0b24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfYnV0dG9uXCIsXG4gIFJlZENvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6cmVkX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBEZWFkQnViYmxlQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2J1YmJsZV9jb3JhbFwiLFxuICBDaGVycnlTYXBsaW5nID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3NhcGxpbmdcIixcbiAgQ2hlcnJ5TG9nID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2xvZ1wiLFxuICBQb2xpc2hlZFR1ZmZTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF90dWZmX3N0YWlyc1wiLFxuICBEcmFnb25FZ2cgPSBcIm1pbmVjcmFmdDpkcmFnb25fZWdnXCIsXG4gIE5ldGhlckJyaWNrID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrXCIsXG4gIERlZXBzbGF0ZUlyb25PcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfaXJvbl9vcmVcIixcbiAgRWxlbWVudDMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzNcIixcbiAgRWxlbWVudDIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzJcIixcbiAgRWxlbWVudDUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzVcIixcbiAgRWxlbWVudDQgPSBcIm1pbmVjcmFmdDplbGVtZW50XzRcIixcbiAgRWxlbWVudDcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzdcIixcbiAgRWxlbWVudDkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzlcIixcbiAgQ2FtZXJhID0gXCJtaW5lY3JhZnQ6Y2FtZXJhXCIsXG4gIFdheGVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlclwiLFxuICBFbGVtZW50NDcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQ3XCIsXG4gIENvYmJsZWREZWVwc2xhdGVTbGFiID0gXCJtaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGVfc2xhYlwiLFxuICBMaWxhYyA9IFwibWluZWNyYWZ0OmxpbGFjXCIsXG4gIENyaW1zb25TdGFuZGluZ1NpZ24gPSBcIm1pbmVjcmFmdDpjcmltc29uX3N0YW5kaW5nX3NpZ25cIixcbiAgRW1lcmFsZE9yZSA9IFwibWluZWNyYWZ0OmVtZXJhbGRfb3JlXCIsXG4gIEJyb3duTXVzaHJvb21CbG9jayA9IFwibWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrXCIsXG4gIFBldHJpZmllZE9ha1NsYWIgPSBcIm1pbmVjcmFmdDpwZXRyaWZpZWRfb2FrX3NsYWJcIixcbiAgQ2FydmVkUHVtcGtpbiA9IFwibWluZWNyYWZ0OmNhcnZlZF9wdW1wa2luXCIsXG4gIERyb3BwZXIgPSBcIm1pbmVjcmFmdDpkcm9wcGVyXCIsXG4gIENhbmRsZSA9IFwibWluZWNyYWZ0OmNhbmRsZVwiLFxuICBQb2xpc2hlZEFuZGVzaXRlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2FuZGVzaXRlX3NsYWJcIixcbiAgQWNhY2lhU2xhYiA9IFwibWluZWNyYWZ0OmFjYWNpYV9zbGFiXCIsXG4gIENvYmJsZWREZWVwc2xhdGVXYWxsID0gXCJtaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGVfd2FsbFwiLFxuICBQb2ludGVkRHJpcHN0b25lID0gXCJtaW5lY3JhZnQ6cG9pbnRlZF9kcmlwc3RvbmVcIixcbiAgQ3V0UmVkU2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OmN1dF9yZWRfc2FuZHN0b25lX3NsYWJcIixcbiAgQ2hpc2VsZWRUdWZmQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfdHVmZl9icmlja3NcIixcbiAgQ2hlbWljYWxIZWF0ID0gXCJtaW5lY3JhZnQ6Y2hlbWljYWxfaGVhdFwiLFxuICBUcmlwV2lyZSA9IFwibWluZWNyYWZ0OnRyaXBfd2lyZVwiLFxuICBDYXZlVmluZXNIZWFkV2l0aEJlcnJpZXMgPSBcIm1pbmVjcmFmdDpjYXZlX3ZpbmVzX2hlYWRfd2l0aF9iZXJyaWVzXCIsXG4gIENoaXNlbGVkUmVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfcmVkX3NhbmRzdG9uZVwiLFxuICBCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpicmlja19zbGFiXCIsXG4gIEJyZXdpbmdTdGFuZCA9IFwibWluZWNyYWZ0OmJyZXdpbmdfc3RhbmRcIixcbiAgQmFtYm9vU2FwbGluZyA9IFwibWluZWNyYWZ0OmJhbWJvb19zYXBsaW5nXCIsXG4gIFNtb290aFF1YXJ0elNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6X3NsYWJcIixcbiAgV2hpdGVDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6d2hpdGVfY2FuZGxlX2Nha2VcIixcbiAgRW5kUG9ydGFsID0gXCJtaW5lY3JhZnQ6ZW5kX3BvcnRhbFwiLFxuICBKdW5nbGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2RvdWJsZV9zbGFiXCIsXG4gIFNwcnVjZVdvb2QgPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfd29vZFwiLFxuICBCbGFja3N0b25lID0gXCJtaW5lY3JhZnQ6YmxhY2tzdG9uZVwiLFxuICBMaXREZWVwc2xhdGVSZWRzdG9uZU9yZSA9IFwibWluZWNyYWZ0OmxpdF9kZWVwc2xhdGVfcmVkc3RvbmVfb3JlXCIsXG4gIEVsZW1lbnQxMCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTBcIixcbiAgRWxlbWVudDE0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xNFwiLFxuICBFbGVtZW50MTUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzE1XCIsXG4gIEVsZW1lbnQzNiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzZcIixcbiAgRWxlbWVudDM3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zN1wiLFxuICBFbGVtZW50MzQgPSBcIm1pbmVjcmFmdDplbGVtZW50XzM0XCIsXG4gIEVsZW1lbnQzNSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzVcIixcbiAgRWxlbWVudDMyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zMlwiLFxuICBFbGVtZW50MzMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzMzXCIsXG4gIEVsZW1lbnQzMSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzFcIixcbiAgRWxlbWVudDM4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zOFwiLFxuICBFbGVtZW50MjkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzI5XCIsXG4gIEVsZW1lbnQyMSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjFcIixcbiAgRWxlbWVudDIwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8yMFwiLFxuICBFbGVtZW50MjMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzIzXCIsXG4gIEVsZW1lbnQyMiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjJcIixcbiAgRWxlbWVudDI1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8yNVwiLFxuICBFbGVtZW50MjQgPSBcIm1pbmVjcmFmdDplbGVtZW50XzI0XCIsXG4gIEVsZW1lbnQyNyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjdcIixcbiAgRWxlbWVudDI2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8yNlwiLFxuICBFbGVtZW50NTkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzU5XCIsXG4gIEVsZW1lbnQ1NCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTRcIixcbiAgRWxlbWVudDU1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF81NVwiLFxuICBFbGVtZW50NTYgPSBcIm1pbmVjcmFmdDplbGVtZW50XzU2XCIsXG4gIEVsZW1lbnQ1NyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTdcIixcbiAgRWxlbWVudDUzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF81M1wiLFxuICBFbGVtZW50NDkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQ5XCIsXG4gIEVsZW1lbnQ0OCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDhcIixcbiAgRWxlbWVudDQ1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF80NVwiLFxuICBFbGVtZW50NDMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQzXCIsXG4gIEVsZW1lbnQ0MiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDJcIixcbiAgRWxlbWVudDQxID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF80MVwiLFxuICBFbGVtZW50NDAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQwXCIsXG4gIEVsZW1lbnQ3MiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzJcIixcbiAgRWxlbWVudDcwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83MFwiLFxuICBFbGVtZW50NzEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzcxXCIsXG4gIEVsZW1lbnQ3NiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzZcIixcbiAgRWxlbWVudDc1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83NVwiLFxuICBFbGVtZW50NzggPSBcIm1pbmVjcmFmdDplbGVtZW50Xzc4XCIsXG4gIEVsZW1lbnQ3OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzlcIixcbiAgRWxlbWVudDY1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82NVwiLFxuICBFbGVtZW50NjcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzY3XCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlV2FsbCA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV93YWxsXCIsXG4gIEVsZW1lbnQ2NiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjZcIixcbiAgRWxlbWVudDYxID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82MVwiLFxuICBFbGVtZW50NjAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzYwXCIsXG4gIEVsZW1lbnQ2MyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjNcIixcbiAgRWxlbWVudDk4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85OFwiLFxuICBFbGVtZW50OTAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzkwXCIsXG4gIEVsZW1lbnQ5MSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOTFcIixcbiAgRWxlbWVudDk0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85NFwiLFxuICBFbGVtZW50OTYgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzk2XCIsXG4gIEVsZW1lbnQ4OCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODhcIixcbiAgRWxlbWVudDgyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84MlwiLFxuICBFbGVtZW50ODEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzgxXCIsXG4gIEVsZW1lbnQ4MCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODBcIixcbiAgRWxlbWVudDg3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84N1wiLFxuICBFbGVtZW50ODYgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzg2XCIsXG4gIEVsZW1lbnQ4NCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODRcIixcbiAgTGl0U21va2VyID0gXCJtaW5lY3JhZnQ6bGl0X3Ntb2tlclwiLFxuICBTbW9vdGhRdWFydHpTdGFpcnMgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6X3N0YWlyc1wiLFxuICBMaWdodEdyYXlDYXJwZXQgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2NhcnBldFwiLFxuICBQdXJwdXJCbG9jayA9IFwibWluZWNyYWZ0OnB1cnB1cl9ibG9ja1wiLFxuICBDaGVycnlXYWxsU2lnbiA9IFwibWluZWNyYWZ0OmNoZXJyeV93YWxsX3NpZ25cIixcbiAgQ3lhbkNhbmRsZSA9IFwibWluZWNyYWZ0OmN5YW5fY2FuZGxlXCIsXG4gIFJlcGVhdGluZ0NvbW1hbmRCbG9jayA9IFwibWluZWNyYWZ0OnJlcGVhdGluZ19jb21tYW5kX2Jsb2NrXCIsXG4gIENyaW1zb25GdW5ndXMgPSBcIm1pbmVjcmFmdDpjcmltc29uX2Z1bmd1c1wiLFxuICBDaGVycnlQbGFua3MgPSBcIm1pbmVjcmFmdDpjaGVycnlfcGxhbmtzXCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlXCIsXG4gIFR1ZmZEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6dHVmZl9kb3VibGVfc2xhYlwiLFxuICBQdXJwdXJTdGFpcnMgPSBcIm1pbmVjcmFmdDpwdXJwdXJfc3RhaXJzXCIsXG4gIFR1YmVDb3JhbCA9IFwibWluZWNyYWZ0OnR1YmVfY29yYWxcIixcbiAgV2F4ZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2Rvb3JcIixcbiAgUG9ydGFsID0gXCJtaW5lY3JhZnQ6cG9ydGFsXCIsXG4gIFBlb255ID0gXCJtaW5lY3JhZnQ6cGVvbnlcIixcbiAgQ3JhZnRlciA9IFwibWluZWNyYWZ0OmNyYWZ0ZXJcIixcbiAgU3BydWNlUGxhbmtzID0gXCJtaW5lY3JhZnQ6c3BydWNlX3BsYW5rc1wiLFxuICBBbWV0aHlzdENsdXN0ZXIgPSBcIm1pbmVjcmFmdDphbWV0aHlzdF9jbHVzdGVyXCIsXG4gIFdheGVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jaGlzZWxlZF9jb3BwZXJcIixcbiAgV2F4ZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIERyaWVkS2VscEJsb2NrID0gXCJtaW5lY3JhZnQ6ZHJpZWRfa2VscF9ibG9ja1wiLFxuICBIYXJkTGlnaHRHcmF5U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9saWdodF9ncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgQ3JpbXNvbkZlbmNlID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9mZW5jZVwiLFxuICBDaGlzZWxlZFR1ZmYgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF90dWZmXCIsXG4gIExpbWVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmxpbWVfY29uY3JldGVfcG93ZGVyXCIsXG4gIEJpcmNoRmVuY2UgPSBcIm1pbmVjcmFmdDpiaXJjaF9mZW5jZVwiLFxuICBUdXJ0bGVFZ2cgPSBcIm1pbmVjcmFmdDp0dXJ0bGVfZWdnXCIsXG4gIEJyb3duVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJyb3duX3RlcnJhY290dGFcIixcbiAgQ29iYmxlc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6Y29iYmxlc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgRGVlcHNsYXRlRGlhbW9uZE9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9kaWFtb25kX29yZVwiLFxuICBMaWdodEdyYXlXb29sID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV93b29sXCIsXG4gIFNvdWxDYW1wZmlyZSA9IFwibWluZWNyYWZ0OnNvdWxfY2FtcGZpcmVcIixcbiAgV29vZGVuUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0Ondvb2Rlbl9wcmVzc3VyZV9wbGF0ZVwiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jb3BwZXJfZ3JhdGVcIixcbiAgRGFtYWdlZEFudmlsID0gXCJtaW5lY3JhZnQ6ZGFtYWdlZF9hbnZpbFwiLFxuICBXaGl0ZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6d2hpdGVfY29uY3JldGVcIixcbiAgQWNhY2lhRmVuY2UgPSBcIm1pbmVjcmFmdDphY2FjaWFfZmVuY2VcIixcbiAgR3Jhc3NQYXRoID0gXCJtaW5lY3JhZnQ6Z3Jhc3NfcGF0aFwiLFxuICBPcmFuZ2VDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2NhbmRsZV9jYWtlXCIsXG4gIFdlYXRoZXJlZENvcHBlciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJcIixcbiAgTGltZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaW1lX3RlcnJhY290dGFcIixcbiAgQ2hlcnJ5RmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2ZlbmNlX2dhdGVcIixcbiAgR3JheUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpncmF5X2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIExvZGVzdG9uZSA9IFwibWluZWNyYWZ0OmxvZGVzdG9uZVwiLFxuICBCYW1ib29Nb3NhaWMgPSBcIm1pbmVjcmFmdDpiYW1ib29fbW9zYWljXCIsXG4gIFB1cnBsZVdvb2wgPSBcIm1pbmVjcmFmdDpwdXJwbGVfd29vbFwiLFxuICBJcm9uQmxvY2sgPSBcIm1pbmVjcmFmdDppcm9uX2Jsb2NrXCIsXG4gIENhcnRvZ3JhcGh5VGFibGUgPSBcIm1pbmVjcmFmdDpjYXJ0b2dyYXBoeV90YWJsZVwiLFxuICBEYW5kZWxpb24gPSBcIm1pbmVjcmFmdDpkYW5kZWxpb25cIlxufVxuIiwgImV4cG9ydCBlbnVtIEVudGl0eUlkZW50aWZpZXIge1xuICBCYWxsb29uID0gXCJtaW5lY3JhZnQ6YmFsbG9vblwiLFxuICBGYWxsaW5nQmxvY2sgPSBcIm1pbmVjcmFmdDpmYWxsaW5nX2Jsb2NrXCIsXG4gIFZpbmRpY2F0b3IgPSBcIm1pbmVjcmFmdDp2aW5kaWNhdG9yXCIsXG4gIFZpbGxhZ2VyVjIgPSBcIm1pbmVjcmFmdDp2aWxsYWdlcl92MlwiLFxuICBJY2VCb21iID0gXCJtaW5lY3JhZnQ6aWNlX2JvbWJcIixcbiAgQ2F0ID0gXCJtaW5lY3JhZnQ6Y2F0XCIsXG4gIEJlZSA9IFwibWluZWNyYWZ0OmJlZVwiLFxuICBXYW5kZXJpbmdUcmFkZXIgPSBcIm1pbmVjcmFmdDp3YW5kZXJpbmdfdHJhZGVyXCIsXG4gIFdvbGYgPSBcIm1pbmVjcmFmdDp3b2xmXCIsXG4gIFJhYmJpdCA9IFwibWluZWNyYWZ0OnJhYmJpdFwiLFxuICBTbmlmZmVyID0gXCJtaW5lY3JhZnQ6c25pZmZlclwiLFxuICBUYWRwb2xlID0gXCJtaW5lY3JhZnQ6dGFkcG9sZVwiLFxuICBXaW5kQ2hhcmdlUHJvamVjdGlsZSA9IFwibWluZWNyYWZ0OndpbmRfY2hhcmdlX3Byb2plY3RpbGVcIixcbiAgU2hlZXAgPSBcIm1pbmVjcmFmdDpzaGVlcFwiLFxuICBXaXRjaCA9IFwibWluZWNyYWZ0OndpdGNoXCIsXG4gIFpvZ2xpbiA9IFwibWluZWNyYWZ0OnpvZ2xpblwiLFxuICBTa2VsZXRvbiA9IFwibWluZWNyYWZ0OnNrZWxldG9uXCIsXG4gIENvdyA9IFwibWluZWNyYWZ0OmNvd1wiLFxuICBSYXZhZ2VyID0gXCJtaW5lY3JhZnQ6cmF2YWdlclwiLFxuICBNb29zaHJvb20gPSBcIm1pbmVjcmFmdDptb29zaHJvb21cIixcbiAgQWxsYXkgPSBcIm1pbmVjcmFmdDphbGxheVwiLFxuICBJcm9uR29sZW0gPSBcIm1pbmVjcmFmdDppcm9uX2dvbGVtXCIsXG4gIERvbHBoaW4gPSBcIm1pbmVjcmFmdDpkb2xwaGluXCIsXG4gIEJyZWV6ZSA9IFwibWluZWNyYWZ0OmJyZWV6ZVwiLFxuICBUcmFkZXJMbGFtYSA9IFwibWluZWNyYWZ0OnRyYWRlcl9sbGFtYVwiLFxuICBUdXJ0bGUgPSBcIm1pbmVjcmFmdDp0dXJ0bGVcIixcbiAgVHJvcGljYWxmaXNoID0gXCJtaW5lY3JhZnQ6dHJvcGljYWxmaXNoXCIsXG4gIFBvbGFyQmVhciA9IFwibWluZWNyYWZ0OnBvbGFyX2JlYXJcIixcbiAgQ2hpY2tlbiA9IFwibWluZWNyYWZ0OmNoaWNrZW5cIixcbiAgUGFuZGEgPSBcIm1pbmVjcmFmdDpwYW5kYVwiLFxuICBTbGltZSA9IFwibWluZWNyYWZ0OnNsaW1lXCIsXG4gIFBpbGxhZ2VyID0gXCJtaW5lY3JhZnQ6cGlsbGFnZXJcIixcbiAgTXVsZSA9IFwibWluZWNyYWZ0Om11bGVcIixcbiAgWm9tYmllVmlsbGFnZXIgPSBcIm1pbmVjcmFmdDp6b21iaWVfdmlsbGFnZXJcIixcbiAgQXJyb3cgPSBcIm1pbmVjcmFmdDphcnJvd1wiLFxuICBMbGFtYSA9IFwibWluZWNyYWZ0OmxsYW1hXCIsXG4gIEhvcnNlID0gXCJtaW5lY3JhZnQ6aG9yc2VcIixcbiAgRG9ua2V5ID0gXCJtaW5lY3JhZnQ6ZG9ua2V5XCIsXG4gIEJvZ2dlZCA9IFwibWluZWNyYWZ0OmJvZ2dlZFwiLFxuICBDYW1lbCA9IFwibWluZWNyYWZ0OmNhbWVsXCIsXG4gIEJyZWV6ZVdpbmRDaGFyZ2VQcm9qZWN0aWxlID0gXCJtaW5lY3JhZnQ6YnJlZXplX3dpbmRfY2hhcmdlX3Byb2plY3RpbGVcIixcbiAgWm9tYmllSG9yc2UgPSBcIm1pbmVjcmFmdDp6b21iaWVfaG9yc2VcIixcbiAgWm9tYmllID0gXCJtaW5lY3JhZnQ6em9tYmllXCIsXG4gIFZpbGxhZ2VyID0gXCJtaW5lY3JhZnQ6dmlsbGFnZXJcIixcbiAgU3RyaWRlciA9IFwibWluZWNyYWZ0OnN0cmlkZXJcIixcbiAgT21pbm91c0l0ZW1TcGF3bmVyID0gXCJtaW5lY3JhZnQ6b21pbm91c19pdGVtX3NwYXduZXJcIixcbiAgV2FyZGVuID0gXCJtaW5lY3JhZnQ6d2FyZGVuXCIsXG4gIEFnZW50ID0gXCJtaW5lY3JhZnQ6YWdlbnRcIixcbiAgU3RyYXkgPSBcIm1pbmVjcmFmdDpzdHJheVwiLFxuICBTcGlkZXIgPSBcIm1pbmVjcmFmdDpzcGlkZXJcIixcbiAgUGxheWVyID0gXCJtaW5lY3JhZnQ6cGxheWVyXCIsXG4gIFNtYWxsRmlyZWJhbGwgPSBcIm1pbmVjcmFmdDpzbWFsbF9maXJlYmFsbFwiLFxuICBTa2VsZXRvbkhvcnNlID0gXCJtaW5lY3JhZnQ6c2tlbGV0b25faG9yc2VcIixcbiAgSHVzayA9IFwibWluZWNyYWZ0Omh1c2tcIixcbiAgSG9nbGluID0gXCJtaW5lY3JhZnQ6aG9nbGluXCIsXG4gIEVuZGVyQ3J5c3RhbCA9IFwibWluZWNyYWZ0OmVuZGVyX2NyeXN0YWxcIixcbiAgU2lsdmVyZmlzaCA9IFwibWluZWNyYWZ0OnNpbHZlcmZpc2hcIixcbiAgQXJtYWRpbGxvID0gXCJtaW5lY3JhZnQ6YXJtYWRpbGxvXCIsXG4gIFBpZ2xpbiA9IFwibWluZWNyYWZ0OnBpZ2xpblwiLFxuICBHdWFyZGlhbiA9IFwibWluZWNyYWZ0Omd1YXJkaWFuXCIsXG4gIFdpdGhlciA9IFwibWluZWNyYWZ0OndpdGhlclwiLFxuICBWZXggPSBcIm1pbmVjcmFmdDp2ZXhcIixcbiAgUGlnID0gXCJtaW5lY3JhZnQ6cGlnXCIsXG4gIFBhcnJvdCA9IFwibWluZWNyYWZ0OnBhcnJvdFwiLFxuICBPY2Vsb3QgPSBcIm1pbmVjcmFmdDpvY2Vsb3RcIixcbiAgQmxhemUgPSBcIm1pbmVjcmFmdDpibGF6ZVwiLFxuICBHb2F0ID0gXCJtaW5lY3JhZnQ6Z29hdFwiLFxuICBGcm9nID0gXCJtaW5lY3JhZnQ6ZnJvZ1wiLFxuICBGb3ggPSBcIm1pbmVjcmFmdDpmb3hcIixcbiAgQ2F2ZVNwaWRlciA9IFwibWluZWNyYWZ0OmNhdmVfc3BpZGVyXCIsXG4gIFdpdGhlclNrZWxldG9uID0gXCJtaW5lY3JhZnQ6d2l0aGVyX3NrZWxldG9uXCIsXG4gIFNxdWlkID0gXCJtaW5lY3JhZnQ6c3F1aWRcIixcbiAgU2h1bGtlciA9IFwibWluZWNyYWZ0OnNodWxrZXJcIixcbiAgU2FsbW9uID0gXCJtaW5lY3JhZnQ6c2FsbW9uXCIsXG4gIENyZWVwZXIgPSBcIm1pbmVjcmFmdDpjcmVlcGVyXCIsXG4gIFB1ZmZlcmZpc2ggPSBcIm1pbmVjcmFmdDpwdWZmZXJmaXNoXCIsXG4gIFBpZ2xpbkJydXRlID0gXCJtaW5lY3JhZnQ6cGlnbGluX2JydXRlXCIsXG4gIFBoYW50b20gPSBcIm1pbmVjcmFmdDpwaGFudG9tXCIsXG4gIE5wYyA9IFwibWluZWNyYWZ0Om5wY1wiLFxuICBNYWdtYUN1YmUgPSBcIm1pbmVjcmFmdDptYWdtYV9jdWJlXCIsXG4gIExsYW1hU3BpdCA9IFwibWluZWNyYWZ0OmxsYW1hX3NwaXRcIixcbiAgR2xvd1NxdWlkID0gXCJtaW5lY3JhZnQ6Z2xvd19zcXVpZFwiLFxuICBFbmRlckRyYWdvbiA9IFwibWluZWNyYWZ0OmVuZGVyX2RyYWdvblwiLFxuICBHaGFzdCA9IFwibWluZWNyYWZ0OmdoYXN0XCIsXG4gIENvZCA9IFwibWluZWNyYWZ0OmNvZFwiLFxuICBFdm9jYXRpb25JbGxhZ2VyID0gXCJtaW5lY3JhZnQ6ZXZvY2F0aW9uX2lsbGFnZXJcIixcbiAgRW5kZXJtaXRlID0gXCJtaW5lY3JhZnQ6ZW5kZXJtaXRlXCIsXG4gIEVuZGVybWFuID0gXCJtaW5lY3JhZnQ6ZW5kZXJtYW5cIixcbiAgRWxkZXJHdWFyZGlhbiA9IFwibWluZWNyYWZ0OmVsZGVyX2d1YXJkaWFuXCIsXG4gIERyb3duZWQgPSBcIm1pbmVjcmFmdDpkcm93bmVkXCIsXG4gIEJhdCA9IFwibWluZWNyYWZ0OmJhdFwiLFxuICBBeG9sb3RsID0gXCJtaW5lY3JhZnQ6YXhvbG90bFwiLFxuICBYcE9yYiA9IFwibWluZWNyYWZ0OnhwX29yYlwiLFxuICBab21iaWVWaWxsYWdlclYyID0gXCJtaW5lY3JhZnQ6em9tYmllX3ZpbGxhZ2VyX3YyXCIsXG4gIFpvbWJpZVBpZ21hbiA9IFwibWluZWNyYWZ0OnpvbWJpZV9waWdtYW5cIixcbiAgU25vd0dvbGVtID0gXCJtaW5lY3JhZnQ6c25vd19nb2xlbVwiLFxuICBGaXJlYmFsbCA9IFwibWluZWNyYWZ0OmZpcmViYWxsXCIsXG4gIENoZXN0Qm9hdCA9IFwibWluZWNyYWZ0OmNoZXN0X2JvYXRcIixcbiAgQm9hdCA9IFwibWluZWNyYWZ0OmJvYXRcIixcbiAgU2h1bGtlckJ1bGxldCA9IFwibWluZWNyYWZ0OnNodWxrZXJfYnVsbGV0XCIsXG4gIFhwQm90dGxlID0gXCJtaW5lY3JhZnQ6eHBfYm90dGxlXCIsXG4gIFRudCA9IFwibWluZWNyYWZ0OnRudFwiLFxuICBTcGxhc2hQb3Rpb24gPSBcIm1pbmVjcmFmdDpzcGxhc2hfcG90aW9uXCIsXG4gIExpbmdlcmluZ1BvdGlvbiA9IFwibWluZWNyYWZ0OmxpbmdlcmluZ19wb3Rpb25cIixcbiAgV2l0aGVyU2t1bGxEYW5nZXJvdXMgPSBcIm1pbmVjcmFmdDp3aXRoZXJfc2t1bGxfZGFuZ2Vyb3VzXCIsXG4gIFdpdGhlclNrdWxsID0gXCJtaW5lY3JhZnQ6d2l0aGVyX3NrdWxsXCIsXG4gIFRocm93blRyaWRlbnQgPSBcIm1pbmVjcmFmdDp0aHJvd25fdHJpZGVudFwiLFxuICBTbm93YmFsbCA9IFwibWluZWNyYWZ0OnNub3diYWxsXCIsXG4gIEZpc2hpbmdIb29rID0gXCJtaW5lY3JhZnQ6ZmlzaGluZ19ob29rXCIsXG4gIEVuZGVyUGVhcmwgPSBcIm1pbmVjcmFmdDplbmRlcl9wZWFybFwiLFxuICBFZ2cgPSBcIm1pbmVjcmFmdDplZ2dcIixcbiAgRHJhZ29uRmlyZWJhbGwgPSBcIm1pbmVjcmFmdDpkcmFnb25fZmlyZWJhbGxcIixcbiAgQXJtb3JTdGFuZCA9IFwibWluZWNyYWZ0OmFybW9yX3N0YW5kXCIsXG4gIExpZ2h0bmluZ0JvbHQgPSBcIm1pbmVjcmFmdDpsaWdodG5pbmdfYm9sdFwiLFxuICBUcmlwb2RDYW1lcmEgPSBcIm1pbmVjcmFmdDp0cmlwb2RfY2FtZXJhXCIsXG4gIFRudE1pbmVjYXJ0ID0gXCJtaW5lY3JhZnQ6dG50X21pbmVjYXJ0XCIsXG4gIE1pbmVjYXJ0ID0gXCJtaW5lY3JhZnQ6bWluZWNhcnRcIixcbiAgSG9wcGVyTWluZWNhcnQgPSBcIm1pbmVjcmFmdDpob3BwZXJfbWluZWNhcnRcIixcbiAgRmlyZXdvcmtzUm9ja2V0ID0gXCJtaW5lY3JhZnQ6ZmlyZXdvcmtzX3JvY2tldFwiLFxuICBFeWVPZkVuZGVyU2lnbmFsID0gXCJtaW5lY3JhZnQ6ZXllX29mX2VuZGVyX3NpZ25hbFwiLFxuICBDb21tYW5kQmxvY2tNaW5lY2FydCA9IFwibWluZWNyYWZ0OmNvbW1hbmRfYmxvY2tfbWluZWNhcnRcIixcbiAgQ2hlc3RNaW5lY2FydCA9IFwibWluZWNyYWZ0OmNoZXN0X21pbmVjYXJ0XCIsXG4gIEFyZWFFZmZlY3RDbG91ZCA9IFwibWluZWNyYWZ0OmFyZWFfZWZmZWN0X2Nsb3VkXCIsXG4gIEl0ZW0gPSBcIm1pbmVjcmFmdDppdGVtXCJcbn1cbiIsICJleHBvcnQgZW51bSBJdGVtSWRlbnRpZmllciB7XG4gIE9yYW5nZUNhbmRsZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9jYW5kbGVcIixcbiAgQ29sb3JlZFRvcmNoQnAgPSBcIm1pbmVjcmFmdDpjb2xvcmVkX3RvcmNoX2JwXCIsXG4gIFRyb3BpY2FsRmlzaEJ1Y2tldCA9IFwibWluZWNyYWZ0OnRyb3BpY2FsX2Zpc2hfYnVja2V0XCIsXG4gIExpZ2h0QmxvY2sxNCA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzE0XCIsXG4gIEFjYWNpYUZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmFjYWNpYV9mZW5jZV9nYXRlXCIsXG4gIEN5YW5EeWUgPSBcIm1pbmVjcmFmdDpjeWFuX2R5ZVwiLFxuICBTY2FmZm9sZGluZyA9IFwibWluZWNyYWZ0OnNjYWZmb2xkaW5nXCIsXG4gIFNjdWxrQ2F0YWx5c3QgPSBcIm1pbmVjcmFmdDpzY3Vsa19jYXRhbHlzdFwiLFxuICBIb25leWNvbWIgPSBcIm1pbmVjcmFmdDpob25leWNvbWJcIixcbiAgQmlyY2hGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpiaXJjaF9mZW5jZV9nYXRlXCIsXG4gIFNoZWFycyA9IFwibWluZWNyYWZ0OnNoZWFyc1wiLFxuICBCbHVlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpibHVlX2NvbmNyZXRlXCIsXG4gIEZpZWxkTWFzb25lZEJhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpmaWVsZF9tYXNvbmVkX2Jhbm5lcl9wYXR0ZXJuXCIsXG4gIFdheGVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlclwiLFxuICBDYW1lbFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Y2FtZWxfc3Bhd25fZWdnXCIsXG4gIFN0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnJpY2tfc2xhYlwiLFxuICBHb2xkSW5nb3QgPSBcIm1pbmVjcmFmdDpnb2xkX2luZ290XCIsXG4gIFNwcnVjZVBsYW5rcyA9IFwibWluZWNyYWZ0OnNwcnVjZV9wbGFua3NcIixcbiAgUm9zZUJ1c2ggPSBcIm1pbmVjcmFmdDpyb3NlX2J1c2hcIixcbiAgVHVmZkJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfc2xhYlwiLFxuICBXb29kZW5QaWNrYXhlID0gXCJtaW5lY3JhZnQ6d29vZGVuX3BpY2theGVcIixcbiAgTGlnaHRCbG9jazEwID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTBcIixcbiAgQ29va2llID0gXCJtaW5lY3JhZnQ6Y29va2llXCIsXG4gIEJsdWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6Ymx1ZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6Y3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgV2hpdGVXb29sID0gXCJtaW5lY3JhZnQ6d2hpdGVfd29vbFwiLFxuICBXYXhlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlclwiLFxuICBXb29kZW5Eb29yID0gXCJtaW5lY3JhZnQ6d29vZGVuX2Rvb3JcIixcbiAgT2FrU2lnbiA9IFwibWluZWNyYWZ0Om9ha19zaWduXCIsXG4gIFllbGxvd0NhbmRsZSA9IFwibWluZWNyYWZ0OnllbGxvd19jYW5kbGVcIixcbiAgU2hyb29tbGlnaHQgPSBcIm1pbmVjcmFmdDpzaHJvb21saWdodFwiLFxuICBNaWxrQnVja2V0ID0gXCJtaW5lY3JhZnQ6bWlsa19idWNrZXRcIixcbiAgUmVkU2FuZHN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6cmVkX3NhbmRzdG9uZV9zdGFpcnNcIixcbiAgUG9saXNoZWREaW9yaXRlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2Rpb3JpdGVfc2xhYlwiLFxuICBEYXJrT2FrUGxhbmtzID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfcGxhbmtzXCIsXG4gIEp1bmdsZUxlYXZlcyA9IFwibWluZWNyYWZ0Omp1bmdsZV9sZWF2ZXNcIixcbiAgU3VzcGljaW91c1NhbmQgPSBcIm1pbmVjcmFmdDpzdXNwaWNpb3VzX3NhbmRcIixcbiAgQW5jaWVudERlYnJpcyA9IFwibWluZWNyYWZ0OmFuY2llbnRfZGVicmlzXCIsXG4gIFNwcnVjZVRyYXBkb29yID0gXCJtaW5lY3JhZnQ6c3BydWNlX3RyYXBkb29yXCIsXG4gIFB1cnBsZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpwdXJwbGVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgTXVzaWNEaXNjMTEgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjXzExXCIsXG4gIElyb25CbG9jayA9IFwibWluZWNyYWZ0Omlyb25fYmxvY2tcIixcbiAgUmVkTmV0aGVyQnJpY2sgPSBcIm1pbmVjcmFmdDpyZWRfbmV0aGVyX2JyaWNrXCIsXG4gIFJlZHN0b25lID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVcIixcbiAgQm9uZU1lYWwgPSBcIm1pbmVjcmFmdDpib25lX21lYWxcIixcbiAgV2FycGVkUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OndhcnBlZF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBTdHJheVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c3RyYXlfc3Bhd25fZWdnXCIsXG4gIEluZmVzdGVkQ2hpc2VsZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmluZmVzdGVkX2NoaXNlbGVkX3N0b25lX2JyaWNrc1wiLFxuICBQcmlzbWFyaW5lU3RhaXJzID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9zdGFpcnNcIixcbiAgSXJvbkRvb3IgPSBcIm1pbmVjcmFmdDppcm9uX2Rvb3JcIixcbiAgRGFya1ByaXNtYXJpbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpkYXJrX3ByaXNtYXJpbmVfc3RhaXJzXCIsXG4gIFJlZFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpyZWRfc2FuZHN0b25lX3NsYWJcIixcbiAgU2N1bGtTaHJpZWtlciA9IFwibWluZWNyYWZ0OnNjdWxrX3Nocmlla2VyXCIsXG4gIEJhbWJvb01vc2FpY1N0YWlycyA9IFwibWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc3RhaXJzXCIsXG4gIEVuZEJyaWNrcyA9IFwibWluZWNyYWZ0OmVuZF9icmlja3NcIixcbiAgV2F4ZWRPeGlkaXplZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlclwiLFxuICBNYW5ncm92ZVBsYW5rcyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3BsYW5rc1wiLFxuICBXYXhlZFdlYXRoZXJlZENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY29wcGVyX2Rvb3JcIixcbiAgUGlua1RlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpwaW5rX3RlcnJhY290dGFcIixcbiAgQmxhemVSb2QgPSBcIm1pbmVjcmFmdDpibGF6ZV9yb2RcIixcbiAgQnJvd25UZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6YnJvd25fdGVycmFjb3R0YVwiLFxuICBDYXJ2ZWRQdW1wa2luID0gXCJtaW5lY3JhZnQ6Y2FydmVkX3B1bXBraW5cIixcbiAgQmxhemVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmJsYXplX3NwYXduX2VnZ1wiLFxuICBCYWxsb29uID0gXCJtaW5lY3JhZnQ6YmFsbG9vblwiLFxuICBPYWtQbGFua3MgPSBcIm1pbmVjcmFmdDpvYWtfcGxhbmtzXCIsXG4gIERhcmtPYWtMb2cgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19sb2dcIixcbiAgUmVkc3RvbmVPcmUgPSBcIm1pbmVjcmFmdDpyZWRzdG9uZV9vcmVcIixcbiAgQXhvbG90bEJ1Y2tldCA9IFwibWluZWNyYWZ0OmF4b2xvdGxfYnVja2V0XCIsXG4gIEhvcHBlciA9IFwibWluZWNyYWZ0OmhvcHBlclwiLFxuICBQaWdsaW5CcnV0ZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6cGlnbGluX2JydXRlX3NwYXduX2VnZ1wiLFxuICBTZWFQaWNrbGUgPSBcIm1pbmVjcmFmdDpzZWFfcGlja2xlXCIsXG4gIExlYWQgPSBcIm1pbmVjcmFmdDpsZWFkXCIsXG4gIEJpcmNoUGxhbmtzID0gXCJtaW5lY3JhZnQ6YmlyY2hfcGxhbmtzXCIsXG4gIEVuZEJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZW5kX2JyaWNrX3N0YWlyc1wiLFxuICBUdWJlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OnR1YmVfY29yYWxfYmxvY2tcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NvcHBlcl9ncmF0ZVwiLFxuICBBY2FjaWFQbGFua3MgPSBcIm1pbmVjcmFmdDphY2FjaWFfcGxhbmtzXCIsXG4gIFdheGVkRXhwb3NlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBEZWFkSG9ybkNvcmFsID0gXCJtaW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsXCIsXG4gIEZpcmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6ZmlyZV9jb3JhbF9ibG9ja1wiLFxuICBCYXJyZWwgPSBcIm1pbmVjcmFmdDpiYXJyZWxcIixcbiAgUXVhcnR6U2xhYiA9IFwibWluZWNyYWZ0OnF1YXJ0el9zbGFiXCIsXG4gIEJpZ0RyaXBsZWFmID0gXCJtaW5lY3JhZnQ6YmlnX2RyaXBsZWFmXCIsXG4gIENoZXJyeVN0YWlycyA9IFwibWluZWNyYWZ0OmNoZXJyeV9zdGFpcnNcIixcbiAgRmlzaGluZ1JvZCA9IFwibWluZWNyYWZ0OmZpc2hpbmdfcm9kXCIsXG4gIE5hbWVUYWcgPSBcIm1pbmVjcmFmdDpuYW1lX3RhZ1wiLFxuICBKdW5nbGVGZW5jZSA9IFwibWluZWNyYWZ0Omp1bmdsZV9mZW5jZVwiLFxuICBNeWNlbGl1bSA9IFwibWluZWNyYWZ0Om15Y2VsaXVtXCIsXG4gIEdoYXN0U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpnaGFzdF9zcGF3bl9lZ2dcIixcbiAgRGVlcHNsYXRlUmVkc3RvbmVPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfcmVkc3RvbmVfb3JlXCIsXG4gIFllbGxvd1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIERhcmtPYWtTbGFiID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfc2xhYlwiLFxuICBTbW9vdGhRdWFydHpTdGFpcnMgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6X3N0YWlyc1wiLFxuICBGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpmZW5jZV9nYXRlXCIsXG4gIFJvdHRlbkZsZXNoID0gXCJtaW5lY3JhZnQ6cm90dGVuX2ZsZXNoXCIsXG4gIExpZ2h0R3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBFeWVBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6ZXllX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQmxhY2tzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lX3NsYWJcIixcbiAgR29sZGVuUGlja2F4ZSA9IFwibWluZWNyYWZ0OmdvbGRlbl9waWNrYXhlXCIsXG4gIENoZXN0ID0gXCJtaW5lY3JhZnQ6Y2hlc3RcIixcbiAgTGlnaHRCbHVlRHllID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9keWVcIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja193YWxsXCIsXG4gIFN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6c3RvbmVfc3RhaXJzXCIsXG4gIEJlYWNvbiA9IFwibWluZWNyYWZ0OmJlYWNvblwiLFxuICBGdXJuYWNlID0gXCJtaW5lY3JhZnQ6ZnVybmFjZVwiLFxuICBXYXJwZWRTbGFiID0gXCJtaW5lY3JhZnQ6d2FycGVkX3NsYWJcIixcbiAgTGlnaHRHcmF5U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zdGFpbmVkX2dsYXNzXCIsXG4gIE94aWRpemVkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgRGV0ZWN0b3JSYWlsID0gXCJtaW5lY3JhZnQ6ZGV0ZWN0b3JfcmFpbFwiLFxuICBHcmF2ZWwgPSBcIm1pbmVjcmFmdDpncmF2ZWxcIixcbiAgSG9nbGluU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpob2dsaW5fc3Bhd25fZWdnXCIsXG4gIExpZ2h0Qmx1ZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgSnVuZ2xlV29vZCA9IFwibWluZWNyYWZ0Omp1bmdsZV93b29kXCIsXG4gIEhlYXZ5Q29yZSA9IFwibWluZWNyYWZ0OmhlYXZ5X2NvcmVcIixcbiAgU3VzcGljaW91c0dyYXZlbCA9IFwibWluZWNyYWZ0OnN1c3BpY2lvdXNfZ3JhdmVsXCIsXG4gIEJsZWFjaCA9IFwibWluZWNyYWZ0OmJsZWFjaFwiLFxuICBSZWRTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpyZWRfc3RhaW5lZF9nbGFzc1wiLFxuICBQdXJwbGVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6cHVycGxlX3NodWxrZXJfYm94XCIsXG4gIElyb25UcmFwZG9vciA9IFwibWluZWNyYWZ0Omlyb25fdHJhcGRvb3JcIixcbiAgTWFuZ3JvdmVCdXR0b24gPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9idXR0b25cIixcbiAgUHVycGxlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY29uY3JldGVfcG93ZGVyXCIsXG4gIEJhbWJvb1BsYW5rcyA9IFwibWluZWNyYWZ0OmJhbWJvb19wbGFua3NcIixcbiAgQ2hvcnVzRmxvd2VyID0gXCJtaW5lY3JhZnQ6Y2hvcnVzX2Zsb3dlclwiLFxuICBKdW5nbGVQbGFua3MgPSBcIm1pbmVjcmFmdDpqdW5nbGVfcGxhbmtzXCIsXG4gIEp1bmdsZVNpZ24gPSBcIm1pbmVjcmFmdDpqdW5nbGVfc2lnblwiLFxuICBXaW5kQ2hhcmdlID0gXCJtaW5lY3JhZnQ6d2luZF9jaGFyZ2VcIixcbiAgR2xpc3RlcmluZ01lbG9uU2xpY2UgPSBcIm1pbmVjcmFmdDpnbGlzdGVyaW5nX21lbG9uX3NsaWNlXCIsXG4gIENhcnJvdCA9IFwibWluZWNyYWZ0OmNhcnJvdFwiLFxuICBUcmlhbFNwYXduZXIgPSBcIm1pbmVjcmFmdDp0cmlhbF9zcGF3bmVyXCIsXG4gIFN0cmlwcGVkSnVuZ2xlV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2p1bmdsZV93b29kXCIsXG4gIElyb25OdWdnZXQgPSBcIm1pbmVjcmFmdDppcm9uX251Z2dldFwiLFxuICBCb25lQmxvY2sgPSBcIm1pbmVjcmFmdDpib25lX2Jsb2NrXCIsXG4gIFdhcnBlZEhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6d2FycGVkX2hhbmdpbmdfc2lnblwiLFxuICBOb3JtYWxTdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9zdGFpcnNcIixcbiAgTGlnaHRCbHVlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIEZlcm4gPSBcIm1pbmVjcmFmdDpmZXJuXCIsXG4gIFBhY2tlZE11ZCA9IFwibWluZWNyYWZ0OnBhY2tlZF9tdWRcIixcbiAgUG9saXNoZWRHcmFuaXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZ3Jhbml0ZVwiLFxuICBJcm9uQmFycyA9IFwibWluZWNyYWZ0Omlyb25fYmFyc1wiLFxuICBPeGlkaXplZEN1dENvcHBlciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJcIixcbiAgR2xhc3NCb3R0bGUgPSBcIm1pbmVjcmFmdDpnbGFzc19ib3R0bGVcIixcbiAgU21hbGxEcmlwbGVhZkJsb2NrID0gXCJtaW5lY3JhZnQ6c21hbGxfZHJpcGxlYWZfYmxvY2tcIixcbiAgV2FycGVkUm9vdHMgPSBcIm1pbmVjcmFmdDp3YXJwZWRfcm9vdHNcIixcbiAgTWFnZW50YVdvb2wgPSBcIm1pbmVjcmFmdDptYWdlbnRhX3dvb2xcIixcbiAgSGFyZEdyZWVuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfZ3JlZW5fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIElyb25Cb290cyA9IFwibWluZWNyYWZ0Omlyb25fYm9vdHNcIixcbiAgWWVsbG93U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6eWVsbG93X3N0YWluZWRfZ2xhc3NcIixcbiAgUmFiYml0U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpyYWJiaXRfc3Bhd25fZWdnXCIsXG4gIEhvcm5Db3JhbCA9IFwibWluZWNyYWZ0Omhvcm5fY29yYWxcIixcbiAgV2hpdGVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OndoaXRlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBDaGVycnlQbGFua3MgPSBcIm1pbmVjcmFmdDpjaGVycnlfcGxhbmtzXCIsXG4gIEdyYW5pdGVTbGFiID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZV9zbGFiXCIsXG4gIFNvdWxTb2lsID0gXCJtaW5lY3JhZnQ6c291bF9zb2lsXCIsXG4gIERhcmtPYWtQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfcHJlc3N1cmVfcGxhdGVcIixcbiAgR3Jhbml0ZVN0YWlycyA9IFwibWluZWNyYWZ0OmdyYW5pdGVfc3RhaXJzXCIsXG4gIFN0cmlwcGVkV2FycGVkU3RlbSA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX3dhcnBlZF9zdGVtXCIsXG4gIEZyaWVuZFBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmZyaWVuZF9wb3R0ZXJ5X3NoZXJkXCIsXG4gIERheWxpZ2h0RGV0ZWN0b3IgPSBcIm1pbmVjcmFmdDpkYXlsaWdodF9kZXRlY3RvclwiLFxuICBTbW9vdGhTYW5kc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lX3N0YWlyc1wiLFxuICBSZXBlYXRpbmdDb21tYW5kQmxvY2sgPSBcIm1pbmVjcmFmdDpyZXBlYXRpbmdfY29tbWFuZF9ibG9ja1wiLFxuICBEcm93bmVkU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpkcm93bmVkX3NwYXduX2VnZ1wiLFxuICBRdWFydHpCcmlja3MgPSBcIm1pbmVjcmFmdDpxdWFydHpfYnJpY2tzXCIsXG4gIE1hbmdyb3ZlTG9nID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfbG9nXCIsXG4gIEJhbWJvb01vc2FpYyA9IFwibWluZWNyYWZ0OmJhbWJvb19tb3NhaWNcIixcbiAgVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp0cmFwZG9vclwiLFxuICBQZWFybGVzY2VudEZyb2dsaWdodCA9IFwibWluZWNyYWZ0OnBlYXJsZXNjZW50X2Zyb2dsaWdodFwiLFxuICBPcmFuZ2VEeWUgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfZHllXCIsXG4gIEJpcmNoQnV0dG9uID0gXCJtaW5lY3JhZnQ6YmlyY2hfYnV0dG9uXCIsXG4gIENyaW1zb25QbGFua3MgPSBcIm1pbmVjcmFmdDpjcmltc29uX3BsYW5rc1wiLFxuICBOZXRoZXJyYWNrID0gXCJtaW5lY3JhZnQ6bmV0aGVycmFja1wiLFxuICBXYXJwZWRTdGVtID0gXCJtaW5lY3JhZnQ6d2FycGVkX3N0ZW1cIixcbiAgV2FycGVkUGxhbmtzID0gXCJtaW5lY3JhZnQ6d2FycGVkX3BsYW5rc1wiLFxuICBQaWdTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnBpZ19zcGF3bl9lZ2dcIixcbiAgRm94U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpmb3hfc3Bhd25fZWdnXCIsXG4gIFBoYW50b21NZW1icmFuZSA9IFwibWluZWNyYWZ0OnBoYW50b21fbWVtYnJhbmVcIixcbiAgQmFtYm9vUmFmdCA9IFwibWluZWNyYWZ0OmJhbWJvb19yYWZ0XCIsXG4gIEdsb3dTcXVpZFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Z2xvd19zcXVpZF9zcGF3bl9lZ2dcIixcbiAgRW5kZXJEcmFnb25TcGF3bkVnZyA9IFwibWluZWNyYWZ0OmVuZGVyX2RyYWdvbl9zcGF3bl9lZ2dcIixcbiAgUmVkRHllID0gXCJtaW5lY3JhZnQ6cmVkX2R5ZVwiLFxuICBPcmFuZ2VTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpvcmFuZ2Vfc3RhaW5lZF9nbGFzc1wiLFxuICBDb2JibGVzdG9uZVdhbGwgPSBcIm1pbmVjcmFmdDpjb2JibGVzdG9uZV93YWxsXCIsXG4gIE1hZ2VudGFDb25jcmV0ZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfY29uY3JldGVcIixcbiAgQ3Jvc3Nib3cgPSBcIm1pbmVjcmFmdDpjcm9zc2Jvd1wiLFxuICBFeHBvc2VkQ29wcGVyID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJcIixcbiAgUmFpc2VyQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OnJhaXNlcl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIE9yYW5nZUNhcnBldCA9IFwibWluZWNyYWZ0Om9yYW5nZV9jYXJwZXRcIixcbiAgQ2hlcnJ5RmVuY2UgPSBcIm1pbmVjcmFmdDpjaGVycnlfZmVuY2VcIixcbiAgQ3JpbXNvblRyYXBkb29yID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl90cmFwZG9vclwiLFxuICBCbHVlU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmJsdWVfc2h1bGtlcl9ib3hcIixcbiAgQmlyY2hCb2F0ID0gXCJtaW5lY3JhZnQ6YmlyY2hfYm9hdFwiLFxuICBXaGl0ZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDp3aGl0ZV90ZXJyYWNvdHRhXCIsXG4gIE11ZCA9IFwibWluZWNyYWZ0Om11ZFwiLFxuICBCbHVlRHllID0gXCJtaW5lY3JhZnQ6Ymx1ZV9keWVcIixcbiAgT2FrTGVhdmVzID0gXCJtaW5lY3JhZnQ6b2FrX2xlYXZlc1wiLFxuICBGbG93ZXJpbmdBemFsZWEgPSBcIm1pbmVjcmFmdDpmbG93ZXJpbmdfYXphbGVhXCIsXG4gIERlZXBzbGF0ZUJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zbGFiXCIsXG4gIEJsYWNrU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmJsYWNrX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBOZXRoZXJCcmlja0ZlbmNlID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX2ZlbmNlXCIsXG4gIE5ldGhlcml0ZUhvZSA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9ob2VcIixcbiAgR29sZGVuQ2Fycm90ID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2NhcnJvdFwiLFxuICBCbGFja3N0b25lV2FsbCA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVfd2FsbFwiLFxuICBXZWF0aGVyZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY3V0X2NvcHBlclwiLFxuICBNdXNpY0Rpc2NNZWxsb2hpID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19tZWxsb2hpXCIsXG4gIERpYW1vbmRCb290cyA9IFwibWluZWNyYWZ0OmRpYW1vbmRfYm9vdHNcIixcbiAgTWFuZ3JvdmVCb2F0ID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfYm9hdFwiLFxuICBUdWJlQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDp0dWJlX2NvcmFsX2ZhblwiLFxuICBDdXRSZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpjdXRfcmVkX3NhbmRzdG9uZVwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCdXR0b24gPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2J1dHRvblwiLFxuICBTdHJpcHBlZEJpcmNoV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2JpcmNoX3dvb2RcIixcbiAgU21vb3RoU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZVwiLFxuICBBcmNoZXJQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDphcmNoZXJfcG90dGVyeV9zaGVyZFwiLFxuICBSZWRzdG9uZUJsb2NrID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfYmxvY2tcIixcbiAgUG9saXNoZWRCbGFja3N0b25lV2FsbCA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfd2FsbFwiLFxuICBHb2xkZW5BcHBsZSA9IFwibWluZWNyYWZ0OmdvbGRlbl9hcHBsZVwiLFxuICBNYW5ncm92ZUZlbmNlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfZmVuY2VcIixcbiAgQ29va2VkTXV0dG9uID0gXCJtaW5lY3JhZnQ6Y29va2VkX211dHRvblwiLFxuICBQdXJwbGVDYW5kbGUgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY2FuZGxlXCIsXG4gIE5vcm1hbFN0b25lU2xhYiA9IFwibWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9zbGFiXCIsXG4gIEdvbGRlbkF4ZSA9IFwibWluZWNyYWZ0OmdvbGRlbl9heGVcIixcbiAgTWFjZSA9IFwibWluZWNyYWZ0Om1hY2VcIixcbiAgQ2hlcnJ5TGVhdmVzID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2xlYXZlc1wiLFxuICBQb2ludGVkRHJpcHN0b25lID0gXCJtaW5lY3JhZnQ6cG9pbnRlZF9kcmlwc3RvbmVcIixcbiAgQ29iYmxlZERlZXBzbGF0ZVdhbGwgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZV93YWxsXCIsXG4gIFdvb2RlblNob3ZlbCA9IFwibWluZWNyYWZ0Ondvb2Rlbl9zaG92ZWxcIixcbiAgRGFya09ha1RyYXBkb29yID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfdHJhcGRvb3JcIixcbiAgRGVlcHNsYXRlVGlsZVdhbGwgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfdGlsZV93YWxsXCIsXG4gIENvZCA9IFwibWluZWNyYWZ0OmNvZFwiLFxuICBEYXJrT2FrRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfZmVuY2VfZ2F0ZVwiLFxuICBMZXZlciA9IFwibWluZWNyYWZ0OmxldmVyXCIsXG4gIEhlYXJ0T2ZUaGVTZWEgPSBcIm1pbmVjcmFmdDpoZWFydF9vZl90aGVfc2VhXCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlV2FsbCA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV93YWxsXCIsXG4gIENha2UgPSBcIm1pbmVjcmFmdDpjYWtlXCIsXG4gIEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpibHVlX3N0YWluZWRfZ2xhc3NcIixcbiAgTW9zc3lDb2JibGVzdG9uZSA9IFwibWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lXCIsXG4gIEhvc3RBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6aG9zdF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIEJpcmNoVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpiaXJjaF90cmFwZG9vclwiLFxuICBDYXVsZHJvbiA9IFwibWluZWNyYWZ0OmNhdWxkcm9uXCIsXG4gIFN0cmlwcGVkU3BydWNlV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX3NwcnVjZV93b29kXCIsXG4gIERlZXBzbGF0ZUJyaWNrV2FsbCA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja193YWxsXCIsXG4gIEdyYXlTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgQmFtYm9vRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2ZlbmNlX2dhdGVcIixcbiAgUHVycGxlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY29uY3JldGVcIixcbiAgV29vZGVuSG9lID0gXCJtaW5lY3JhZnQ6d29vZGVuX2hvZVwiLFxuICBFbmRlcm1pdGVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmVuZGVybWl0ZV9zcGF3bl9lZ2dcIixcbiAgQ2hlcnJ5RmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2ZlbmNlX2dhdGVcIixcbiAgQmVldHJvb3RTb3VwID0gXCJtaW5lY3JhZnQ6YmVldHJvb3Rfc291cFwiLFxuICBIYXJkUmVkU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfcmVkX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBPeGlkaXplZENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX2dyYXRlXCIsXG4gIEp1bmdsZUxvZyA9IFwibWluZWNyYWZ0Omp1bmdsZV9sb2dcIixcbiAgQmxhY2tHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6YmxhY2tfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgUmFiYml0U3RldyA9IFwibWluZWNyYWZ0OnJhYmJpdF9zdGV3XCIsXG4gIENoZXJyeUNoZXN0Qm9hdCA9IFwibWluZWNyYWZ0OmNoZXJyeV9jaGVzdF9ib2F0XCIsXG4gIENyaW1zb25TbGFiID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zbGFiXCIsXG4gIEJyZWV6ZVJvZCA9IFwibWluZWNyYWZ0OmJyZWV6ZV9yb2RcIixcbiAgTXVkQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrX3dhbGxcIixcbiAgTXVzaWNEaXNjQ3JlYXRvciA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfY3JlYXRvclwiLFxuICBQb2xpc2hlZEdyYW5pdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ncmFuaXRlX3N0YWlyc1wiLFxuICBSZWRNdXNocm9vbUJsb2NrID0gXCJtaW5lY3JhZnQ6cmVkX211c2hyb29tX2Jsb2NrXCIsXG4gIEJvd2wgPSBcIm1pbmVjcmFmdDpib3dsXCIsXG4gIFdhcnBlZERvb3IgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZG9vclwiLFxuICBPeGlkaXplZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIEZyb2dTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmZyb2dfc3Bhd25fZWdnXCIsXG4gIElyb25Ib3JzZUFybW9yID0gXCJtaW5lY3JhZnQ6aXJvbl9ob3JzZV9hcm1vclwiLFxuICBQdW1wa2luID0gXCJtaW5lY3JhZnQ6cHVtcGtpblwiLFxuICBCaXJjaExvZyA9IFwibWluZWNyYWZ0OmJpcmNoX2xvZ1wiLFxuICBTbm91dEFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpzbm91dF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIENvYmJsZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZVwiLFxuICBMaWdodEJsdWVDYXJwZXQgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2NhcnBldFwiLFxuICBXZWF0aGVyZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY29wcGVyXCIsXG4gIEJhbWJvb1N0YWlycyA9IFwibWluZWNyYWZ0OmJhbWJvb19zdGFpcnNcIixcbiAgQ3JhY2tlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9zdG9uZV9icmlja3NcIixcbiAgV2hpdGVEeWUgPSBcIm1pbmVjcmFmdDp3aGl0ZV9keWVcIixcbiAgQ3JlZXBlckJhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpjcmVlcGVyX2Jhbm5lcl9wYXR0ZXJuXCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlXCIsXG4gIERhcmtPYWtEb29yID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfZG9vclwiLFxuICBTbW9vdGhTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZV9zbGFiXCIsXG4gIEdyYXlDYXJwZXQgPSBcIm1pbmVjcmFmdDpncmF5X2NhcnBldFwiLFxuICBXaGVhdCA9IFwibWluZWNyYWZ0OndoZWF0XCIsXG4gIEdyaW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpncmluZHN0b25lXCIsXG4gIE9ha0ZlbmNlID0gXCJtaW5lY3JhZnQ6b2FrX2ZlbmNlXCIsXG4gIExpZ2h0Qmx1ZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jb25jcmV0ZVwiLFxuICBNYW5ncm92ZUZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlX2dhdGVcIixcbiAgSnVuZ2xlRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2ZlbmNlX2dhdGVcIixcbiAgRGVlcHNsYXRlRW1lcmFsZE9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9lbWVyYWxkX29yZVwiLFxuICBTdHJpcHBlZENyaW1zb25TdGVtID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfY3JpbXNvbl9zdGVtXCIsXG4gIFNwcnVjZUZlbmNlID0gXCJtaW5lY3JhZnQ6c3BydWNlX2ZlbmNlXCIsXG4gIExpZ2h0Qmx1ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBNYWdtYUNyZWFtID0gXCJtaW5lY3JhZnQ6bWFnbWFfY3JlYW1cIixcbiAgRWxkZXJHdWFyZGlhblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6ZWxkZXJfZ3VhcmRpYW5fc3Bhd25fZWdnXCIsXG4gIFNhZGRsZSA9IFwibWluZWNyYWZ0OnNhZGRsZVwiLFxuICBSYXdHb2xkQmxvY2sgPSBcIm1pbmVjcmFmdDpyYXdfZ29sZF9ibG9ja1wiLFxuICBDYXJyb3RPbkFTdGljayA9IFwibWluZWNyYWZ0OmNhcnJvdF9vbl9hX3N0aWNrXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3NsYWJcIixcbiAgV2hpdGVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDp3aGl0ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIFNsaW1lID0gXCJtaW5lY3JhZnQ6c2xpbWVcIixcbiAgVHVmZldhbGwgPSBcIm1pbmVjcmFmdDp0dWZmX3dhbGxcIixcbiAgUG9saXNoZWRCbGFja3N0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9zdGFpcnNcIixcbiAgVHVydGxlRWdnID0gXCJtaW5lY3JhZnQ6dHVydGxlX2VnZ1wiLFxuICBCaXJjaEZlbmNlID0gXCJtaW5lY3JhZnQ6YmlyY2hfZmVuY2VcIixcbiAgVG50TWluZWNhcnQgPSBcIm1pbmVjcmFmdDp0bnRfbWluZWNhcnRcIixcbiAgQ29wcGVyT3JlID0gXCJtaW5lY3JhZnQ6Y29wcGVyX29yZVwiLFxuICBXYXJwZWRGdW5ndXMgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZnVuZ3VzXCIsXG4gIEdyZWVuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmdyZWVuX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBHb2xkZW5MZWdnaW5ncyA9IFwibWluZWNyYWZ0OmdvbGRlbl9sZWdnaW5nc1wiLFxuICBHcmF5U3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmdyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEVuZFN0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6ZW5kX3N0b25lX2JyaWNrX3NsYWJcIixcbiAgV3JpdGFibGVCb29rID0gXCJtaW5lY3JhZnQ6d3JpdGFibGVfYm9va1wiLFxuICBBY2FjaWFGZW5jZSA9IFwibWluZWNyYWZ0OmFjYWNpYV9mZW5jZVwiLFxuICBBcm1zVXBQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDphcm1zX3VwX3BvdHRlcnlfc2hlcmRcIixcbiAgRGFya09ha0ZlbmNlID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfZmVuY2VcIixcbiAgV2F4ZWRXZWF0aGVyZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jaGlzZWxlZF9jb3BwZXJcIixcbiAgSXJvbk9yZSA9IFwibWluZWNyYWZ0Omlyb25fb3JlXCIsXG4gIFJlZE5ldGhlckJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2tfc2xhYlwiLFxuICBCZWV0cm9vdFNlZWRzID0gXCJtaW5lY3JhZnQ6YmVldHJvb3Rfc2VlZHNcIixcbiAgTm90ZWJsb2NrID0gXCJtaW5lY3JhZnQ6bm90ZWJsb2NrXCIsXG4gIEljZUJvbWIgPSBcIm1pbmVjcmFmdDppY2VfYm9tYlwiLFxuICBKdW5nbGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpqdW5nbGVfc3RhaXJzXCIsXG4gIEJpcmNoU2FwbGluZyA9IFwibWluZWNyYWZ0OmJpcmNoX3NhcGxpbmdcIixcbiAgSGFyZEJyb3duU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfYnJvd25fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFRvcmNoZmxvd2VyID0gXCJtaW5lY3JhZnQ6dG9yY2hmbG93ZXJcIixcbiAgTGlnaHRCbG9jazEzID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTNcIixcbiAgQWNhY2lhSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDphY2FjaWFfaGFuZ2luZ19zaWduXCIsXG4gIFBpZ2xpbkJhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpwaWdsaW5fYmFubmVyX3BhdHRlcm5cIixcbiAgSXJvbkdvbGVtU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDppcm9uX2dvbGVtX3NwYXduX2VnZ1wiLFxuICBEYXJrUHJpc21hcmluZVNsYWIgPSBcIm1pbmVjcmFmdDpkYXJrX3ByaXNtYXJpbmVfc2xhYlwiLFxuICBQcmlzbWFyaW5lQnJpY2tzU3RhaXJzID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja3Nfc3RhaXJzXCIsXG4gIEJhbWJvb0ZlbmNlID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2ZlbmNlXCIsXG4gIEJhbWJvb01vc2FpY1NsYWIgPSBcIm1pbmVjcmFmdDpiYW1ib29fbW9zYWljX3NsYWJcIixcbiAgQ3JpbXNvbkZlbmNlID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9mZW5jZVwiLFxuICBSZWROZXRoZXJCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2tfc3RhaXJzXCIsXG4gIENyaW1zb25Eb29yID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9kb29yXCIsXG4gIERlbnkgPSBcIm1pbmVjcmFmdDpkZW55XCIsXG4gIFNtb290aFJlZFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX3N0YWlyc1wiLFxuICBDb21wb3N0ZXIgPSBcIm1pbmVjcmFmdDpjb21wb3N0ZXJcIixcbiAgRXhwb3NlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBXYXJwZWRTdGFpcnMgPSBcIm1pbmVjcmFmdDp3YXJwZWRfc3RhaXJzXCIsXG4gIEVjaG9TaGFyZCA9IFwibWluZWNyYWZ0OmVjaG9fc2hhcmRcIixcbiAgU3BydWNlRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6c3BydWNlX2ZlbmNlX2dhdGVcIixcbiAgV2FycGVkRmVuY2UgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZmVuY2VcIixcbiAgU3RyaXBwZWRKdW5nbGVMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9qdW5nbGVfbG9nXCIsXG4gIFNlbnRyeUFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpzZW50cnlfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBDaGVycnlTaWduID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3NpZ25cIixcbiAgRW5jaGFudGVkR29sZGVuQXBwbGUgPSBcIm1pbmVjcmFmdDplbmNoYW50ZWRfZ29sZGVuX2FwcGxlXCIsXG4gIE1vc3N5Q29iYmxlc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDptb3NzeV9jb2JibGVzdG9uZV9zdGFpcnNcIixcbiAgQWNhY2lhRG9vciA9IFwibWluZWNyYWZ0OmFjYWNpYV9kb29yXCIsXG4gIE5ldGhlcldhcnRCbG9jayA9IFwibWluZWNyYWZ0Om5ldGhlcl93YXJ0X2Jsb2NrXCIsXG4gIExpZ2h0Qmx1ZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEJsdWVPcmNoaWQgPSBcIm1pbmVjcmFmdDpibHVlX29yY2hpZFwiLFxuICBMaWx5T2ZUaGVWYWxsZXkgPSBcIm1pbmVjcmFmdDpsaWx5X29mX3RoZV92YWxsZXlcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVcIixcbiAgRGVlcHNsYXRlQ29wcGVyT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2NvcHBlcl9vcmVcIixcbiAgU3RvbmVCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OnN0b25lX2JyaWNrX3N0YWlyc1wiLFxuICBUdWZmU3RhaXJzID0gXCJtaW5lY3JhZnQ6dHVmZl9zdGFpcnNcIixcbiAgU3VnYXJDYW5lID0gXCJtaW5lY3JhZnQ6c3VnYXJfY2FuZVwiLFxuICBDcmltc29uRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9mZW5jZV9nYXRlXCIsXG4gIERpYW1vbmRDaGVzdHBsYXRlID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9jaGVzdHBsYXRlXCIsXG4gIE5ldGhlckdvbGRPcmUgPSBcIm1pbmVjcmFmdDpuZXRoZXJfZ29sZF9vcmVcIixcbiAgTWFuZ3JvdmVTdGFpcnMgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9zdGFpcnNcIixcbiAgV2FycGVkRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6d2FycGVkX2ZlbmNlX2dhdGVcIixcbiAgQmFzYWx0ID0gXCJtaW5lY3JhZnQ6YmFzYWx0XCIsXG4gIE9ha1N0YWlycyA9IFwibWluZWNyYWZ0Om9ha19zdGFpcnNcIixcbiAgSnVuZ2xlRG9vciA9IFwibWluZWNyYWZ0Omp1bmdsZV9kb29yXCIsXG4gIERpb3JpdGUgPSBcIm1pbmVjcmFmdDpkaW9yaXRlXCIsXG4gIENvYXJzZURpcnQgPSBcIm1pbmVjcmFmdDpjb2Fyc2VfZGlydFwiLFxuICBTcHJ1Y2VTdGFpcnMgPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfc3RhaXJzXCIsXG4gIEFsbG93ID0gXCJtaW5lY3JhZnQ6YWxsb3dcIixcbiAgR3JheUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6Z3JheV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgQmlyY2hTdGFpcnMgPSBcIm1pbmVjcmFmdDpiaXJjaF9zdGFpcnNcIixcbiAgRGFya09ha0hhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfaGFuZ2luZ19zaWduXCIsXG4gIEdyZWVuQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpncmVlbl9jb25jcmV0ZVwiLFxuICBTdHJpcHBlZENyaW1zb25IeXBoYWUgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9jcmltc29uX2h5cGhhZVwiLFxuICBQb2xpc2hlZEFuZGVzaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfc3RhaXJzXCIsXG4gIEFjYWNpYVN0YWlycyA9IFwibWluZWNyYWZ0OmFjYWNpYV9zdGFpcnNcIixcbiAgSXJvbkF4ZSA9IFwibWluZWNyYWZ0Omlyb25fYXhlXCIsXG4gIEJpcmNoTGVhdmVzID0gXCJtaW5lY3JhZnQ6YmlyY2hfbGVhdmVzXCIsXG4gIFNpbHZlckdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpzaWx2ZXJfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgVmVyZGFudEZyb2dsaWdodCA9IFwibWluZWNyYWZ0OnZlcmRhbnRfZnJvZ2xpZ2h0XCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY29wcGVyX2dyYXRlXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfYnVsYlwiLFxuICBNb3NzeUNvYmJsZXN0b25lU2xhYiA9IFwibWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lX3NsYWJcIixcbiAgTWFnZW50YUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIERhcmtPYWtTdGFpcnMgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19zdGFpcnNcIixcbiAgUGlua0R5ZSA9IFwibWluZWNyYWZ0OnBpbmtfZHllXCIsXG4gIEJyb3duRHllID0gXCJtaW5lY3JhZnQ6YnJvd25fZHllXCIsXG4gIEJsYWNrRHllID0gXCJtaW5lY3JhZnQ6YmxhY2tfZHllXCIsXG4gIENyaW1zb25OeWxpdW0gPSBcIm1pbmVjcmFmdDpjcmltc29uX255bGl1bVwiLFxuICBTcXVpZFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c3F1aWRfc3Bhd25fZWdnXCIsXG4gIFdheGVkRXhwb3NlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgQmFtYm9vQ2hlc3RSYWZ0ID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2NoZXN0X3JhZnRcIixcbiAgTW9zc3lTdG9uZUJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfc3RhaXJzXCIsXG4gIENvb2tlZFNhbG1vbiA9IFwibWluZWNyYWZ0OmNvb2tlZF9zYWxtb25cIixcbiAgQ293U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjb3dfc3Bhd25fZWdnXCIsXG4gIEFtZXRoeXN0QmxvY2sgPSBcIm1pbmVjcmFmdDphbWV0aHlzdF9ibG9ja1wiLFxuICBUYXJnZXQgPSBcIm1pbmVjcmFmdDp0YXJnZXRcIixcbiAgU2NyYXBlUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6c2NyYXBlX3BvdHRlcnlfc2hlcmRcIixcbiAgRW1lcmFsZCA9IFwibWluZWNyYWZ0OmVtZXJhbGRcIixcbiAgQ29iYmxlZERlZXBzbGF0ZVNsYWIgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZV9zbGFiXCIsXG4gIE11c2hyb29tU3RldyA9IFwibWluZWNyYWZ0Om11c2hyb29tX3N0ZXdcIixcbiAgR3Jhc3NCbG9jayA9IFwibWluZWNyYWZ0OmdyYXNzX2Jsb2NrXCIsXG4gIExpbWVHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bGltZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBEaWFtb25kU3dvcmQgPSBcIm1pbmVjcmFmdDpkaWFtb25kX3N3b3JkXCIsXG4gIFBhbmRhU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwYW5kYV9zcGF3bl9lZ2dcIixcbiAgQWNhY2lhU2lnbiA9IFwibWluZWNyYWZ0OmFjYWNpYV9zaWduXCIsXG4gIFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnNhbmRzdG9uZV9zdGFpcnNcIixcbiAgRGlvcml0ZVN0YWlycyA9IFwibWluZWNyYWZ0OmRpb3JpdGVfc3RhaXJzXCIsXG4gIEFycm93ID0gXCJtaW5lY3JhZnQ6YXJyb3dcIixcbiAgUG9saXNoZWREaW9yaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZV9zdGFpcnNcIixcbiAgU3BvbmdlID0gXCJtaW5lY3JhZnQ6c3BvbmdlXCIsXG4gIEFuZGVzaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6YW5kZXNpdGVfc3RhaXJzXCIsXG4gIEJsYWNrU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6YmxhY2tfc3RhaW5lZF9nbGFzc1wiLFxuICBMaWdodEdyYXlEeWUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2R5ZVwiLFxuICBMaWdodEJsdWVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9zaHVsa2VyX2JveFwiLFxuICBEaWFtb25kID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZFwiLFxuICBTZWFMYW50ZXJuID0gXCJtaW5lY3JhZnQ6c2VhX2xhbnRlcm5cIixcbiAgTW9zc3lTdG9uZUJyaWNrU2xhYiA9IFwibWluZWNyYWZ0Om1vc3N5X3N0b25lX2JyaWNrX3NsYWJcIixcbiAgRGVhZEhvcm5Db3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfaG9ybl9jb3JhbF9mYW5cIixcbiAgRGVhZEhvcm5Db3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsX2Jsb2NrXCIsXG4gIExlY3Rlcm4gPSBcIm1pbmVjcmFmdDpsZWN0ZXJuXCIsXG4gIFByaXNtYXJpbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrc1wiLFxuICBHcmVlblN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmdyZWVuX3N0YWluZWRfZ2xhc3NcIixcbiAgQ29jb2FCZWFucyA9IFwibWluZWNyYWZ0OmNvY29hX2JlYW5zXCIsXG4gIE11c2ljRGlzY1dhaXQgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX3dhaXRcIixcbiAgSGVhcnRicmVha1BvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmhlYXJ0YnJlYWtfcG90dGVyeV9zaGVyZFwiLFxuICBKdW5nbGVIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0Omp1bmdsZV9oYW5naW5nX3NpZ25cIixcbiAgQmx1ZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6Ymx1ZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgTmV0aGVyaXRlSW5nb3QgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfaW5nb3RcIixcbiAgR2lsZGVkQmxhY2tzdG9uZSA9IFwibWluZWNyYWZ0OmdpbGRlZF9ibGFja3N0b25lXCIsXG4gIFBvcHBlZENob3J1c0ZydWl0ID0gXCJtaW5lY3JhZnQ6cG9wcGVkX2Nob3J1c19mcnVpdFwiLFxuICBCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OmJyaWNrX3N0YWlyc1wiLFxuICBXYXhlZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIENvcm5mbG93ZXIgPSBcIm1pbmVjcmFmdDpjb3JuZmxvd2VyXCIsXG4gIFNhbG1vbkJ1Y2tldCA9IFwibWluZWNyYWZ0OnNhbG1vbl9idWNrZXRcIixcbiAgQ3lhblN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmN5YW5fc3RhaW5lZF9nbGFzc1wiLFxuICBDeWFuQ2FycGV0ID0gXCJtaW5lY3JhZnQ6Y3lhbl9jYXJwZXRcIixcbiAgTmV0aGVyYnJpY2sgPSBcIm1pbmVjcmFmdDpuZXRoZXJicmlja1wiLFxuICBDb2JibGVzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpjb2JibGVzdG9uZV9zbGFiXCIsXG4gIEhhcmRQdXJwbGVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9wdXJwbGVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEdyZWVuVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmdyZWVuX3RlcnJhY290dGFcIixcbiAgV2F4ZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBOZXRoZXJCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0Om5ldGhlcl9icmlja19zdGFpcnNcIixcbiAgR3JlZW5HbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Z3JlZW5fZ2xhemVkX3RlcnJhY290dGFcIixcbiAgSGFuZ2luZ1Jvb3RzID0gXCJtaW5lY3JhZnQ6aGFuZ2luZ19yb290c1wiLFxuICBCbHVlVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJsdWVfdGVycmFjb3R0YVwiLFxuICBFeHBvc2VkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlcl90cmFwZG9vclwiLFxuICBCaXJjaERvb3IgPSBcIm1pbmVjcmFmdDpiaXJjaF9kb29yXCIsXG4gIEJpcmNoUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmJpcmNoX3ByZXNzdXJlX3BsYXRlXCIsXG4gIFpvbWJpZVZpbGxhZ2VyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp6b21iaWVfdmlsbGFnZXJfc3Bhd25fZWdnXCIsXG4gIFNwaXJlQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OnNwaXJlX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgRXhwb3NlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlclwiLFxuICBNdXNpY0Rpc2NSZWxpYyA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfcmVsaWNcIixcbiAgV2F4ZWRFeHBvc2VkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jdXRfY29wcGVyX3N0YWlyc1wiLFxuICBTcHJ1Y2VTaWduID0gXCJtaW5lY3JhZnQ6c3BydWNlX3NpZ25cIixcbiAgUXVhcnR6U3RhaXJzID0gXCJtaW5lY3JhZnQ6cXVhcnR6X3N0YWlyc1wiLFxuICBQdXJwdXJTdGFpcnMgPSBcIm1pbmVjcmFmdDpwdXJwdXJfc3RhaXJzXCIsXG4gIENvcHBlckluZ290ID0gXCJtaW5lY3JhZnQ6Y29wcGVyX2luZ290XCIsXG4gIEJyb3duQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpicm93bl9jb25jcmV0ZV9wb3dkZXJcIixcbiAgRmxvd0FybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpmbG93X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQ3JhY2tlZERlZXBzbGF0ZUJyaWNrcyA9IFwibWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX2JyaWNrc1wiLFxuICBQaW5rQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpwaW5rX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBMaWdodEdyYXlXb29sID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV93b29sXCIsXG4gIFJlZFdvb2wgPSBcIm1pbmVjcmFmdDpyZWRfd29vbFwiLFxuICBNZWxvbkJsb2NrID0gXCJtaW5lY3JhZnQ6bWVsb25fYmxvY2tcIixcbiAgQmFtYm9vUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmJhbWJvb19wcmVzc3VyZV9wbGF0ZVwiLFxuICBEcm9wcGVyID0gXCJtaW5lY3JhZnQ6ZHJvcHBlclwiLFxuICBXYXJkQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OndhcmRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBFeHBvc2VkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlcl9ncmF0ZVwiLFxuICBDb2JibGVzdG9uZSA9IFwibWluZWNyYWZ0OmNvYmJsZXN0b25lXCIsXG4gIERhcmtPYWtTaWduID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfc2lnblwiLFxuICBNb3NzQ2FycGV0ID0gXCJtaW5lY3JhZnQ6bW9zc19jYXJwZXRcIixcbiAgQ3JpbXNvblN0YWlycyA9IFwibWluZWNyYWZ0OmNyaW1zb25fc3RhaXJzXCIsXG4gIENhbGNpdGUgPSBcIm1pbmVjcmFmdDpjYWxjaXRlXCIsXG4gIFN0cmlkZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnN0cmlkZXJfc3Bhd25fZWdnXCIsXG4gIEdyYXlUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Z3JheV90ZXJyYWNvdHRhXCIsXG4gIExhcGlzTGF6dWxpID0gXCJtaW5lY3JhZnQ6bGFwaXNfbGF6dWxpXCIsXG4gIEJsYWNrc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lX3N0YWlyc1wiLFxuICBCb29rID0gXCJtaW5lY3JhZnQ6Ym9va1wiLFxuICBEZWFkQnViYmxlQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2J1YmJsZV9jb3JhbF9mYW5cIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3N0YWlyc1wiLFxuICBBY2FjaWFXb29kID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3dvb2RcIixcbiAgT2NocmVGcm9nbGlnaHQgPSBcIm1pbmVjcmFmdDpvY2hyZV9mcm9nbGlnaHRcIixcbiAgQnJ1c2ggPSBcIm1pbmVjcmFmdDpicnVzaFwiLFxuICBFeHBvc2VkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVyX3N0YWlyc1wiLFxuICBFbmRlclBlYXJsID0gXCJtaW5lY3JhZnQ6ZW5kZXJfcGVhcmxcIixcbiAgQ2hpc2VsZWROZXRoZXJCcmlja3MgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9uZXRoZXJfYnJpY2tzXCIsXG4gIEhhcmRMaW1lU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9saW1lX3N0YWluZWRfZ2xhc3NcIixcbiAgUG9saXNoZWREZWVwc2xhdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kZWVwc2xhdGVfc3RhaXJzXCIsXG4gIEJpcmNoSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpiaXJjaF9oYW5naW5nX3NpZ25cIixcbiAgUHVycGxlRHllID0gXCJtaW5lY3JhZnQ6cHVycGxlX2R5ZVwiLFxuICBQb2xpc2hlZFR1ZmZXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZl93YWxsXCIsXG4gIFdlYXRoZXJlZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3N0YWlyc1wiLFxuICBNdXNpY0Rpc2M1ID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY181XCIsXG4gIEJhbWJvb1RyYXBkb29yID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3RyYXBkb29yXCIsXG4gIENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDpjb3BwZXJfZG9vclwiLFxuICBOZXRoZXJpdGVQaWNrYXhlID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX3BpY2theGVcIixcbiAgRXhwb3NlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlcl9idWxiXCIsXG4gIERpYW1vbmRCbG9jayA9IFwibWluZWNyYWZ0OmRpYW1vbmRfYmxvY2tcIixcbiAgUGl0Y2hlclBvZCA9IFwibWluZWNyYWZ0OnBpdGNoZXJfcG9kXCIsXG4gIElyb25Ib2UgPSBcIm1pbmVjcmFmdDppcm9uX2hvZVwiLFxuICBXYXhlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJfYnVsYlwiLFxuICBTY3Vsa1ZlaW4gPSBcIm1pbmVjcmFmdDpzY3Vsa192ZWluXCIsXG4gIEJyb3duU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmJyb3duX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBBbmRlc2l0ZSA9IFwibWluZWNyYWZ0OmFuZGVzaXRlXCIsXG4gIFBpbmtTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6cGlua19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgQ29kU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjb2Rfc3Bhd25fZWdnXCIsXG4gIE5ldGhlcml0ZUJsb2NrID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX2Jsb2NrXCIsXG4gIENvYWwgPSBcIm1pbmVjcmFmdDpjb2FsXCIsXG4gIFdheGVkV2VhdGhlcmVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIExpZ2h0QmxvY2s1ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfNVwiLFxuICBXYXhlZE94aWRpemVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgSW5rU2FjID0gXCJtaW5lY3JhZnQ6aW5rX3NhY1wiLFxuICBOZXRoZXJpdGVTY3JhcCA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9zY3JhcFwiLFxuICBUdWZmQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDp0dWZmX2JyaWNrX3N0YWlyc1wiLFxuICBMaWdodEdyYXlUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV90ZXJyYWNvdHRhXCIsXG4gIEJ1cm5Qb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpidXJuX3BvdHRlcnlfc2hlcmRcIixcbiAgUmF2YWdlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6cmF2YWdlcl9zcGF3bl9lZ2dcIixcbiAgQm9uZSA9IFwibWluZWNyYWZ0OmJvbmVcIixcbiAgQ29iYmxlZERlZXBzbGF0ZVN0YWlycyA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3N0YWlyc1wiLFxuICBTaHVsa2VyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzaHVsa2VyX3NwYXduX2VnZ1wiLFxuICBEZWVwc2xhdGVUaWxlU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfc3RhaXJzXCIsXG4gIFllbGxvd1RlcnJhY290dGEgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfdGVycmFjb3R0YVwiLFxuICBCcm93bkdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpicm93bl9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBTbGltZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c2xpbWVfc3Bhd25fZWdnXCIsXG4gIFBpbGxhZ2VyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwaWxsYWdlcl9zcGF3bl9lZ2dcIixcbiAgT2JzZXJ2ZXIgPSBcIm1pbmVjcmFmdDpvYnNlcnZlclwiLFxuICBQaW5rR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnBpbmtfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQ29tcGFzcyA9IFwibWluZWNyYWZ0OmNvbXBhc3NcIixcbiAgSGFyZExpZ2h0R3JheVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfbGlnaHRfZ3JheV9zdGFpbmVkX2dsYXNzXCIsXG4gIERlZXBzbGF0ZUJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3N0YWlyc1wiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9idWxiXCIsXG4gIEVuY2hhbnRlZEJvb2sgPSBcIm1pbmVjcmFmdDplbmNoYW50ZWRfYm9va1wiLFxuICBDdXRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpjdXRfc2FuZHN0b25lXCIsXG4gIFJlZFR1bGlwID0gXCJtaW5lY3JhZnQ6cmVkX3R1bGlwXCIsXG4gIE11ZEJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrX3N0YWlyc1wiLFxuICBIYXJkTWFnZW50YVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfbWFnZW50YV9zdGFpbmVkX2dsYXNzXCIsXG4gIEZsaW50QW5kU3RlZWwgPSBcIm1pbmVjcmFmdDpmbGludF9hbmRfc3RlZWxcIixcbiAgT21pbm91c0JvdHRsZSA9IFwibWluZWNyYWZ0Om9taW5vdXNfYm90dGxlXCIsXG4gIENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDpjb3BwZXJfYnVsYlwiLFxuICBDcmVlcGVyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjcmVlcGVyX3NwYXduX2VnZ1wiLFxuICBTYWxtb25TcGF3bkVnZyA9IFwibWluZWNyYWZ0OnNhbG1vbl9zcGF3bl9lZ2dcIixcbiAgU3BydWNlRG9vciA9IFwibWluZWNyYWZ0OnNwcnVjZV9kb29yXCIsXG4gIENoaXNlbGVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfc2FuZHN0b25lXCIsXG4gIEZyb3N0ZWRJY2UgPSBcIm1pbmVjcmFmdDpmcm9zdGVkX2ljZVwiLFxuICBDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X2NvcHBlcl9zbGFiXCIsXG4gIFF1YXJ0ek9yZSA9IFwibWluZWNyYWZ0OnF1YXJ0el9vcmVcIixcbiAgQ2FsaWJyYXRlZFNjdWxrU2Vuc29yID0gXCJtaW5lY3JhZnQ6Y2FsaWJyYXRlZF9zY3Vsa19zZW5zb3JcIixcbiAgU25vdyA9IFwibWluZWNyYWZ0OnNub3dcIixcbiAgTWFuZ3JvdmVEb29yID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfZG9vclwiLFxuICBCcm93bldvb2wgPSBcIm1pbmVjcmFmdDpicm93bl93b29sXCIsXG4gIFBpbmtXb29sID0gXCJtaW5lY3JhZnQ6cGlua193b29sXCIsXG4gIEdvbGRCbG9jayA9IFwibWluZWNyYWZ0OmdvbGRfYmxvY2tcIixcbiAgU3RyaXBwZWRPYWtMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9vYWtfbG9nXCIsXG4gIEJsdWVJY2UgPSBcIm1pbmVjcmFmdDpibHVlX2ljZVwiLFxuICBDaGVycnlEb29yID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2Rvb3JcIixcbiAgSnVuZ2xlVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpqdW5nbGVfdHJhcGRvb3JcIixcbiAgU2t1bGxCYW5uZXJQYXR0ZXJuID0gXCJtaW5lY3JhZnQ6c2t1bGxfYmFubmVyX3BhdHRlcm5cIixcbiAgQmxhY2tDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmJsYWNrX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBCYW1ib29Eb29yID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2Rvb3JcIixcbiAgVmluZSA9IFwibWluZWNyYWZ0OnZpbmVcIixcbiAgV2F4ZWRPeGlkaXplZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIFBvbGFyQmVhclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6cG9sYXJfYmVhcl9zcGF3bl9lZ2dcIixcbiAgRmFybWxhbmQgPSBcIm1pbmVjcmFmdDpmYXJtbGFuZFwiLFxuICBBY2FjaWFTYXBsaW5nID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3NhcGxpbmdcIixcbiAgSGFyZEJsdWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBZZWxsb3dTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6eWVsbG93X3NodWxrZXJfYm94XCIsXG4gIENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfY29wcGVyXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlclwiLFxuICBPeGlkaXplZENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJfZG9vclwiLFxuICBDaGlzZWxlZFF1YXJ0ekJsb2NrID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfcXVhcnR6X2Jsb2NrXCIsXG4gIERlZXBzbGF0ZUJyaWNrcyA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja3NcIixcbiAgQmFtYm9vQmxvY2sgPSBcIm1pbmVjcmFmdDpiYW1ib29fYmxvY2tcIixcbiAgTmV0aGVyaXRlVXBncmFkZVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfdXBncmFkZV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBOZXRoZXJpdGVIZWxtZXQgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfaGVsbWV0XCIsXG4gIEd1c3RlclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0Omd1c3Rlcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIExhbnRlcm4gPSBcIm1pbmVjcmFmdDpsYW50ZXJuXCIsXG4gIE5ldGhlcml0ZVN3b3JkID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX3N3b3JkXCIsXG4gIENoYWluQ29tbWFuZEJsb2NrID0gXCJtaW5lY3JhZnQ6Y2hhaW5fY29tbWFuZF9ibG9ja1wiLFxuICBBY2FjaWFUcmFwZG9vciA9IFwibWluZWNyYWZ0OmFjYWNpYV90cmFwZG9vclwiLFxuICBCYWtlZFBvdGF0byA9IFwibWluZWNyYWZ0OmJha2VkX3BvdGF0b1wiLFxuICBNYW5ncm92ZVRyYXBkb29yID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfdHJhcGRvb3JcIixcbiAgQ2hlcnJ5VHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpjaGVycnlfdHJhcGRvb3JcIixcbiAgR2xvd3N0b25lRHVzdCA9IFwibWluZWNyYWZ0Omdsb3dzdG9uZV9kdXN0XCIsXG4gIEJsYWNrc3RvbmUgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lXCIsXG4gIFdhcnBlZFdhcnRCbG9jayA9IFwibWluZWNyYWZ0OndhcnBlZF93YXJ0X2Jsb2NrXCIsXG4gIExsYW1hU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpsbGFtYV9zcGF3bl9lZ2dcIixcbiAgV2FycGVkVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp3YXJwZWRfdHJhcGRvb3JcIixcbiAgRW5kUm9kID0gXCJtaW5lY3JhZnQ6ZW5kX3JvZFwiLFxuICBGbGV0Y2hpbmdUYWJsZSA9IFwibWluZWNyYWZ0OmZsZXRjaGluZ190YWJsZVwiLFxuICBDb2FzdEFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpjb2FzdF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIENoZW1pY2FsSGVhdCA9IFwibWluZWNyYWZ0OmNoZW1pY2FsX2hlYXRcIixcbiAgU3RyaXBwZWREYXJrT2FrTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfZGFya19vYWtfbG9nXCIsXG4gIFJlZENvbmNyZXRlID0gXCJtaW5lY3JhZnQ6cmVkX2NvbmNyZXRlXCIsXG4gIENyaW1zb25IeXBoYWUgPSBcIm1pbmVjcmFmdDpjcmltc29uX2h5cGhhZVwiLFxuICBCbGFja1RlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpibGFja190ZXJyYWNvdHRhXCIsXG4gIERyaWVkS2VscEJsb2NrID0gXCJtaW5lY3JhZnQ6ZHJpZWRfa2VscF9ibG9ja1wiLFxuICBDaGlwcGVkQW52aWwgPSBcIm1pbmVjcmFmdDpjaGlwcGVkX2FudmlsXCIsXG4gIEV4cGxvcmVyUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6ZXhwbG9yZXJfcG90dGVyeV9zaGVyZFwiLFxuICBQb3JrY2hvcCA9IFwibWluZWNyYWZ0OnBvcmtjaG9wXCIsXG4gIEZsb3dlclBvdCA9IFwibWluZWNyYWZ0OmZsb3dlcl9wb3RcIixcbiAgVW5kZXJ3YXRlclRvcmNoID0gXCJtaW5lY3JhZnQ6dW5kZXJ3YXRlcl90b3JjaFwiLFxuICBSZXNwYXduQW5jaG9yID0gXCJtaW5lY3JhZnQ6cmVzcGF3bl9hbmNob3JcIixcbiAgTmV0aGVyaXRlQm9vdHMgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfYm9vdHNcIixcbiAgTWFuZ3JvdmVMZWF2ZXMgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9sZWF2ZXNcIixcbiAgUmF3Q29wcGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpyYXdfY29wcGVyX2Jsb2NrXCIsXG4gIEJlZXRyb290ID0gXCJtaW5lY3JhZnQ6YmVldHJvb3RcIixcbiAgV2FyZGVuU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp3YXJkZW5fc3Bhd25fZWdnXCIsXG4gIEhhcmRDeWFuU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9jeWFuX3N0YWluZWRfZ2xhc3NcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgUG9saXNoZWREaW9yaXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZVwiLFxuICBDeWFuR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmN5YW5fZ2xhemVkX3RlcnJhY290dGFcIixcbiAgUGlua1NodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpwaW5rX3NodWxrZXJfYm94XCIsXG4gIFBhY2tlZEljZSA9IFwibWluZWNyYWZ0OnBhY2tlZF9pY2VcIixcbiAgU21vb3RoUXVhcnR6ID0gXCJtaW5lY3JhZnQ6c21vb3RoX3F1YXJ0elwiLFxuICBQdXJwbGVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cHVycGxlX3RlcnJhY290dGFcIixcbiAgQmVkID0gXCJtaW5lY3JhZnQ6YmVkXCIsXG4gIFdheGVkRXhwb3NlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyXCIsXG4gIFN0cmlwcGVkQWNhY2lhV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2FjYWNpYV93b29kXCIsXG4gIFdheGVkT3hpZGl6ZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9ncmF0ZVwiLFxuICBDaGFpbm1haWxIZWxtZXQgPSBcIm1pbmVjcmFmdDpjaGFpbm1haWxfaGVsbWV0XCIsXG4gIE94aWRpemVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jaGlzZWxlZF9jb3BwZXJcIixcbiAgSGFyZE1hZ2VudGFTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9tYWdlbnRhX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBQaW5rU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6cGlua19zdGFpbmVkX2dsYXNzXCIsXG4gIE11c2ljRGlzY1N0YWwgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX3N0YWxcIixcbiAgQnJvd25TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpicm93bl9zdGFpbmVkX2dsYXNzXCIsXG4gIENvYWxCbG9jayA9IFwibWluZWNyYWZ0OmNvYWxfYmxvY2tcIixcbiAgVmF1bHQgPSBcIm1pbmVjcmFmdDp2YXVsdFwiLFxuICBBemFsZWFMZWF2ZXNGbG93ZXJlZCA9IFwibWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXNfZmxvd2VyZWRcIixcbiAgU3RydWN0dXJlVm9pZCA9IFwibWluZWNyYWZ0OnN0cnVjdHVyZV92b2lkXCIsXG4gIENoYWlubWFpbENoZXN0cGxhdGUgPSBcIm1pbmVjcmFmdDpjaGFpbm1haWxfY2hlc3RwbGF0ZVwiLFxuICBSZWNvdmVyeUNvbXBhc3MgPSBcIm1pbmVjcmFmdDpyZWNvdmVyeV9jb21wYXNzXCIsXG4gIE11ZEJyaWNrcyA9IFwibWluZWNyYWZ0Om11ZF9icmlja3NcIixcbiAgUGVvbnkgPSBcIm1pbmVjcmFmdDpwZW9ueVwiLFxuICBDcmFja2VkUG9saXNoZWRCbGFja3N0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrc1wiLFxuICBBbGxpdW0gPSBcIm1pbmVjcmFmdDphbGxpdW1cIixcbiAgQWNhY2lhQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2NoZXN0X2JvYXRcIixcbiAgT2FrV29vZCA9IFwibWluZWNyYWZ0Om9ha193b29kXCIsXG4gIFdheGVkT3hpZGl6ZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBTa2VsZXRvbkhvcnNlU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpza2VsZXRvbl9ob3JzZV9zcGF3bl9lZ2dcIixcbiAgTGlnaHRCbHVlV29vbCA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfd29vbFwiLFxuICBDbGF5QmFsbCA9IFwibWluZWNyYWZ0OmNsYXlfYmFsbFwiLFxuICBCbGFja0NvbmNyZXRlID0gXCJtaW5lY3JhZnQ6YmxhY2tfY29uY3JldGVcIixcbiAgU2hvcnRHcmFzcyA9IFwibWluZWNyYWZ0OnNob3J0X2dyYXNzXCIsXG4gIExhcGlzQmxvY2sgPSBcIm1pbmVjcmFmdDpsYXBpc19ibG9ja1wiLFxuICBCcmVlemVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmJyZWV6ZV9zcGF3bl9lZ2dcIixcbiAgTGltZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bGltZV9jb25jcmV0ZVwiLFxuICBXYXhlZFdlYXRoZXJlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFNtb290aFF1YXJ0elNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6X3NsYWJcIixcbiAgVG9yY2hmbG93ZXJTZWVkcyA9IFwibWluZWNyYWZ0OnRvcmNoZmxvd2VyX3NlZWRzXCIsXG4gIEhheUJsb2NrID0gXCJtaW5lY3JhZnQ6aGF5X2Jsb2NrXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZUJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc2xhYlwiLFxuICBTdHJpcHBlZEJhbWJvb0Jsb2NrID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYmFtYm9vX2Jsb2NrXCIsXG4gIENoaXNlbGVkU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9zdG9uZV9icmlja3NcIixcbiAgTGFkZGVyID0gXCJtaW5lY3JhZnQ6bGFkZGVyXCIsXG4gIElyb25DaGVzdHBsYXRlID0gXCJtaW5lY3JhZnQ6aXJvbl9jaGVzdHBsYXRlXCIsXG4gIERpYW1vbmRIZWxtZXQgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2hlbG1ldFwiLFxuICBXYXhlZE94aWRpemVkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBQcmlzbWFyaW5lQ3J5c3RhbHMgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2NyeXN0YWxzXCIsXG4gIEJhbm5lciA9IFwibWluZWNyYWZ0OmJhbm5lclwiLFxuICBQdW1wa2luU2VlZHMgPSBcIm1pbmVjcmFmdDpwdW1wa2luX3NlZWRzXCIsXG4gIFdoaXRlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDp3aGl0ZV9jb25jcmV0ZVwiLFxuICBIYXJkR3JheVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfZ3JheV9zdGFpbmVkX2dsYXNzXCIsXG4gIFNsaW1lQmFsbCA9IFwibWluZWNyYWZ0OnNsaW1lX2JhbGxcIixcbiAgVHViZUNvcmFsID0gXCJtaW5lY3JhZnQ6dHViZV9jb3JhbFwiLFxuICBTdGljayA9IFwibWluZWNyYWZ0OnN0aWNrXCIsXG4gIEVnZyA9IFwibWluZWNyYWZ0OmVnZ1wiLFxuICBOZXRoZXJTcHJvdXRzID0gXCJtaW5lY3JhZnQ6bmV0aGVyX3Nwcm91dHNcIixcbiAgV2VhdGhlcmVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfZG9vclwiLFxuICBNdXNpY0Rpc2NCbG9ja3MgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX2Jsb2Nrc1wiLFxuICBCcmlja0Jsb2NrID0gXCJtaW5lY3JhZnQ6YnJpY2tfYmxvY2tcIixcbiAgUmVkc3RvbmVMYW1wID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfbGFtcFwiLFxuICBDaGVycnlTbGFiID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3NsYWJcIixcbiAgQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6Y3V0X2NvcHBlclwiLFxuICBCYW1ib28gPSBcIm1pbmVjcmFmdDpiYW1ib29cIixcbiAgQ3lhbkNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6Y3lhbl9jb25jcmV0ZVwiLFxuICBQcmlzbWFyaW5lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja19zbGFiXCIsXG4gIFNtb2tlciA9IFwibWluZWNyYWZ0OnNtb2tlclwiLFxuICBGcmFtZSA9IFwibWluZWNyYWZ0OmZyYW1lXCIsXG4gIEJyZXdlclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmJyZXdlcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIFJlZFNhbmQgPSBcIm1pbmVjcmFmdDpyZWRfc2FuZFwiLFxuICBQaW5rQ2FycGV0ID0gXCJtaW5lY3JhZnQ6cGlua19jYXJwZXRcIixcbiAgR3JlZW5EeWUgPSBcIm1pbmVjcmFmdDpncmVlbl9keWVcIixcbiAgR3VzdGVyQmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0Omd1c3Rlcl9iYW5uZXJfcGF0dGVyblwiLFxuICBCcm93bkNhcnBldCA9IFwibWluZWNyYWZ0OmJyb3duX2NhcnBldFwiLFxuICBMaWdodEdyYXlDb25jcmV0ZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY29uY3JldGVcIixcbiAgV2VhdGhlcmVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY29wcGVyX2dyYXRlXCIsXG4gIFdlYXRoZXJlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBDaG9ydXNQbGFudCA9IFwibWluZWNyYWZ0OmNob3J1c19wbGFudFwiLFxuICBQdXJwbGVXb29sID0gXCJtaW5lY3JhZnQ6cHVycGxlX3dvb2xcIixcbiAgV2F4ZWRPeGlkaXplZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJcIixcbiAgR3JheUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6Z3JheV9jb25jcmV0ZVwiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9kb29yXCIsXG4gIEZlcm1lbnRlZFNwaWRlckV5ZSA9IFwibWluZWNyYWZ0OmZlcm1lbnRlZF9zcGlkZXJfZXllXCIsXG4gIFNwaWRlckV5ZSA9IFwibWluZWNyYWZ0OnNwaWRlcl9leWVcIixcbiAgTWFnZW50YUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgTGltZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpsaW1lX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBPcmFuZ2VDb25jcmV0ZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9jb25jcmV0ZVwiLFxuICBUcmFkZXJMbGFtYVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6dHJhZGVyX2xsYW1hX3NwYXduX2VnZ1wiLFxuICBHaGFzdFRlYXIgPSBcIm1pbmVjcmFmdDpnaGFzdF90ZWFyXCIsXG4gIFBpbmtDb25jcmV0ZSA9IFwibWluZWNyYWZ0OnBpbmtfY29uY3JldGVcIixcbiAgTGl0UHVtcGtpbiA9IFwibWluZWNyYWZ0OmxpdF9wdW1wa2luXCIsXG4gIEJyb3duQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpicm93bl9jb25jcmV0ZVwiLFxuICBDb21wb3VuZCA9IFwibWluZWNyYWZ0OmNvbXBvdW5kXCIsXG4gIE11ZEJyaWNrU2xhYiA9IFwibWluZWNyYWZ0Om11ZF9icmlja19zbGFiXCIsXG4gIFR1ZmYgPSBcIm1pbmVjcmFmdDp0dWZmXCIsXG4gIEV4cG9zZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfZG9vclwiLFxuICBHcmF5R2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmdyYXlfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgU25vcnRQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpzbm9ydF9wb3R0ZXJ5X3NoZXJkXCIsXG4gIFN0b25lQnV0dG9uID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnV0dG9uXCIsXG4gIFNwcnVjZVNhcGxpbmcgPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfc2FwbGluZ1wiLFxuICBMaWdodEJsb2NrOCA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzhcIixcbiAgV2F4ZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIEZlYXRoZXIgPSBcIm1pbmVjcmFmdDpmZWF0aGVyXCIsXG4gIENsYXkgPSBcIm1pbmVjcmFmdDpjbGF5XCIsXG4gIFdvbGZTcGF3bkVnZyA9IFwibWluZWNyYWZ0OndvbGZfc3Bhd25fZWdnXCIsXG4gIEN5YW5TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6Y3lhbl9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgVmlsbGFnZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnZpbGxhZ2VyX3NwYXduX2VnZ1wiLFxuICBMaW1lRHllID0gXCJtaW5lY3JhZnQ6bGltZV9keWVcIixcbiAgQ3JpbXNvbkZ1bmd1cyA9IFwibWluZWNyYWZ0OmNyaW1zb25fZnVuZ3VzXCIsXG4gIFRyaWRlbnQgPSBcIm1pbmVjcmFmdDp0cmlkZW50XCIsXG4gIEhhcmRlbmVkQ2xheSA9IFwibWluZWNyYWZ0OmhhcmRlbmVkX2NsYXlcIixcbiAgR29hdEhvcm4gPSBcIm1pbmVjcmFmdDpnb2F0X2hvcm5cIixcbiAgQ3JhZnRlciA9IFwibWluZWNyYWZ0OmNyYWZ0ZXJcIixcbiAgU2hlZXBTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnNoZWVwX3NwYXduX2VnZ1wiLFxuICBNdXNpY0Rpc2NQaWdzdGVwID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19waWdzdGVwXCIsXG4gIEF6YWxlYSA9IFwibWluZWNyYWZ0OmF6YWxlYVwiLFxuICBGaXJlQ2hhcmdlID0gXCJtaW5lY3JhZnQ6ZmlyZV9jaGFyZ2VcIixcbiAgQWNhY2lhQm9hdCA9IFwibWluZWNyYWZ0OmFjYWNpYV9ib2F0XCIsXG4gIEN5YW5Xb29sID0gXCJtaW5lY3JhZnQ6Y3lhbl93b29sXCIsXG4gIERlZXBzbGF0ZURpYW1vbmRPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfZGlhbW9uZF9vcmVcIixcbiAgV2hpdGVDYW5kbGUgPSBcIm1pbmVjcmFmdDp3aGl0ZV9jYW5kbGVcIixcbiAgQ2xvY2sgPSBcIm1pbmVjcmFmdDpjbG9ja1wiLFxuICBSZWRDYXJwZXQgPSBcIm1pbmVjcmFmdDpyZWRfY2FycGV0XCIsXG4gIExpZ2h0R3JheUNhcnBldCA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FycGV0XCIsXG4gIFB1cnB1ckJsb2NrID0gXCJtaW5lY3JhZnQ6cHVycHVyX2Jsb2NrXCIsXG4gIERyaWVkS2VscCA9IFwibWluZWNyYWZ0OmRyaWVkX2tlbHBcIixcbiAgQ29va2VkQmVlZiA9IFwibWluZWNyYWZ0OmNvb2tlZF9iZWVmXCIsXG4gIENoZXJyeUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2hhbmdpbmdfc2lnblwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lXCIsXG4gIENyaW1zb25QcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9wcmVzc3VyZV9wbGF0ZVwiLFxuICBDaGFyY29hbCA9IFwibWluZWNyYWZ0OmNoYXJjb2FsXCIsXG4gIExpZ2h0R3JheVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3NodWxrZXJfYm94XCIsXG4gIEhvcnNlU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpob3JzZV9zcGF3bl9lZ2dcIixcbiAgTmF1dGlsdXNTaGVsbCA9IFwibWluZWNyYWZ0Om5hdXRpbHVzX3NoZWxsXCIsXG4gIEJvdyA9IFwibWluZWNyYWZ0OmJvd1wiLFxuICBTdHJpbmcgPSBcIm1pbmVjcmFmdDpzdHJpbmdcIixcbiAgRnJvZ1NwYXduID0gXCJtaW5lY3JhZnQ6ZnJvZ19zcGF3blwiLFxuICBSZWRTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6cmVkX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBSZWRDYW5kbGUgPSBcIm1pbmVjcmFmdDpyZWRfY2FuZGxlXCIsXG4gIEdsb3dMaWNoZW4gPSBcIm1pbmVjcmFmdDpnbG93X2xpY2hlblwiLFxuICBDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OmNvcHBlcl90cmFwZG9vclwiLFxuICBMZWF0aGVySGVsbWV0ID0gXCJtaW5lY3JhZnQ6bGVhdGhlcl9oZWxtZXRcIixcbiAgV2l0aGVyUm9zZSA9IFwibWluZWNyYWZ0OndpdGhlcl9yb3NlXCIsXG4gIERhcmtPYWtDaGVzdEJvYXQgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19jaGVzdF9ib2F0XCIsXG4gIENvcHBlckJsb2NrID0gXCJtaW5lY3JhZnQ6Y29wcGVyX2Jsb2NrXCIsXG4gIFNwbGFzaFBvdGlvbiA9IFwibWluZWNyYWZ0OnNwbGFzaF9wb3Rpb25cIixcbiAgQ2FjdHVzID0gXCJtaW5lY3JhZnQ6Y2FjdHVzXCIsXG4gIFR1cnRsZVNjdXRlID0gXCJtaW5lY3JhZnQ6dHVydGxlX3NjdXRlXCIsXG4gIEdsb3dGcmFtZSA9IFwibWluZWNyYWZ0Omdsb3dfZnJhbWVcIixcbiAgQWNhY2lhU2xhYiA9IFwibWluZWNyYWZ0OmFjYWNpYV9zbGFiXCIsXG4gIFBvbGlzaGVkQW5kZXNpdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfc2xhYlwiLFxuICBHbGFzcyA9IFwibWluZWNyYWZ0OmdsYXNzXCIsXG4gIE1vc3NCbG9jayA9IFwibWluZWNyYWZ0Om1vc3NfYmxvY2tcIixcbiAgR29sZE9yZSA9IFwibWluZWNyYWZ0OmdvbGRfb3JlXCIsXG4gIFNrZWxldG9uU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpza2VsZXRvbl9zcGF3bl9lZ2dcIixcbiAgQ3V0U2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OmN1dF9zYW5kc3RvbmVfc2xhYlwiLFxuICBFbmRDcnlzdGFsID0gXCJtaW5lY3JhZnQ6ZW5kX2NyeXN0YWxcIixcbiAgUHVycGxlQ2FycGV0ID0gXCJtaW5lY3JhZnQ6cHVycGxlX2NhcnBldFwiLFxuICBGaXJlQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpmaXJlX2NvcmFsX2ZhblwiLFxuICBHcmVlbkNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6Z3JlZW5fY29uY3JldGVfcG93ZGVyXCIsXG4gIExpbWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpsaW1lX3N0YWluZWRfZ2xhc3NcIixcbiAgUG9saXNoZWRBbmRlc2l0ZSA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2FuZGVzaXRlXCIsXG4gIFB1cnBsZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OnB1cnBsZV9zdGFpbmVkX2dsYXNzXCIsXG4gIE9ha0JvYXQgPSBcIm1pbmVjcmFmdDpvYWtfYm9hdFwiLFxuICBNYWdlbnRhU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9zdGFpbmVkX2dsYXNzXCIsXG4gIFdlYXRoZXJlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY29wcGVyX2J1bGJcIixcbiAgTGlnaHRXZWlnaHRlZFByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpsaWdodF93ZWlnaHRlZF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBSYXBpZEZlcnRpbGl6ZXIgPSBcIm1pbmVjcmFmdDpyYXBpZF9mZXJ0aWxpemVyXCIsXG4gIEhvbmV5QmxvY2sgPSBcIm1pbmVjcmFmdDpob25leV9ibG9ja1wiLFxuICBTdHJ1Y3R1cmVCbG9jayA9IFwibWluZWNyYWZ0OnN0cnVjdHVyZV9ibG9ja1wiLFxuICBUaW50ZWRHbGFzcyA9IFwibWluZWNyYWZ0OnRpbnRlZF9nbGFzc1wiLFxuICBCdWRkaW5nQW1ldGh5c3QgPSBcIm1pbmVjcmFmdDpidWRkaW5nX2FtZXRoeXN0XCIsXG4gIFBpbmtUdWxpcCA9IFwibWluZWNyYWZ0OnBpbmtfdHVsaXBcIixcbiAgT2FrSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpvYWtfaGFuZ2luZ19zaWduXCIsXG4gIFNwcnVjZVNsYWIgPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfc2xhYlwiLFxuICBHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpnbGFzc19wYW5lXCIsXG4gIFNoZWx0ZXJQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpzaGVsdGVyX3BvdHRlcnlfc2hlcmRcIixcbiAgSW5mZXN0ZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9kZWVwc2xhdGVcIixcbiAgUG9kem9sID0gXCJtaW5lY3JhZnQ6cG9kem9sXCIsXG4gIEFjdGl2YXRvclJhaWwgPSBcIm1pbmVjcmFmdDphY3RpdmF0b3JfcmFpbFwiLFxuICBXaGl0ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDp3aGl0ZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgTGlnaHRCbG9jazEyID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTJcIixcbiAgQnJvd25DYW5kbGUgPSBcIm1pbmVjcmFmdDpicm93bl9jYW5kbGVcIixcbiAgUG9saXNoZWREZWVwc2xhdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3NsYWJcIixcbiAgRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlXCIsXG4gIFN0cmlwcGVkT2FrV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX29ha193b29kXCIsXG4gIE94aWRpemVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyXCIsXG4gIElyb25TaG92ZWwgPSBcIm1pbmVjcmFmdDppcm9uX3Nob3ZlbFwiLFxuICBTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OnN0b25lX2JyaWNrc1wiLFxuICBOZXRoZXJXYXJ0ID0gXCJtaW5lY3JhZnQ6bmV0aGVyX3dhcnRcIixcbiAgT3JhbmdlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgR29hdFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Z29hdF9zcGF3bl9lZ2dcIixcbiAgU3RyaXBwZWRNYW5ncm92ZVdvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9tYW5ncm92ZV93b29kXCIsXG4gIENhbXBmaXJlID0gXCJtaW5lY3JhZnQ6Y2FtcGZpcmVcIixcbiAgT3JhbmdlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfY29uY3JldGVfcG93ZGVyXCIsXG4gIEZsb3dQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpmbG93X3BvdHRlcnlfc2hlcmRcIixcbiAgR3JlZW5DYW5kbGUgPSBcIm1pbmVjcmFmdDpncmVlbl9jYW5kbGVcIixcbiAgUHVycGxlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgSmlnc2F3ID0gXCJtaW5lY3JhZnQ6amlnc2F3XCIsXG4gIEFjYWNpYVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDphY2FjaWFfcHJlc3N1cmVfcGxhdGVcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX3NsYWJcIixcbiAgQ2hpc2VsZWRQb2xpc2hlZEJsYWNrc3RvbmUgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9wb2xpc2hlZF9ibGFja3N0b25lXCIsXG4gIFNtb290aFN0b25lU2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9zdG9uZV9zbGFiXCIsXG4gIEF6YWxlYUxlYXZlcyA9IFwibWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXNcIixcbiAgTWFnZW50YVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDptYWdlbnRhX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBXb29kZW5BeGUgPSBcIm1pbmVjcmFmdDp3b29kZW5fYXhlXCIsXG4gIEN5YW5DYW5kbGUgPSBcIm1pbmVjcmFmdDpjeWFuX2NhbmRsZVwiLFxuICBQcml6ZVBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OnByaXplX3BvdHRlcnlfc2hlcmRcIixcbiAgV2hpdGVDYXJwZXQgPSBcIm1pbmVjcmFmdDp3aGl0ZV9jYXJwZXRcIixcbiAgT2FrQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6b2FrX2NoZXN0X2JvYXRcIixcbiAgQmlyY2hXb29kID0gXCJtaW5lY3JhZnQ6YmlyY2hfd29vZFwiLFxuICBHbG93SW5rU2FjID0gXCJtaW5lY3JhZnQ6Z2xvd19pbmtfc2FjXCIsXG4gIEhhcmRDeWFuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfY3lhbl9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRW1lcmFsZE9yZSA9IFwibWluZWNyYWZ0OmVtZXJhbGRfb3JlXCIsXG4gIFNtb290aFN0b25lID0gXCJtaW5lY3JhZnQ6c21vb3RoX3N0b25lXCIsXG4gIEhhcmRMaWdodEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2xpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzc1wiLFxuICBZZWxsb3dDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZV9wb3dkZXJcIixcbiAgT2FrU2xhYiA9IFwibWluZWNyYWZ0Om9ha19zbGFiXCIsXG4gIEdvbGRlbkhvcnNlQXJtb3IgPSBcIm1pbmVjcmFmdDpnb2xkZW5faG9yc2VfYXJtb3JcIixcbiAgQ2hlcnJ5V29vZCA9IFwibWluZWNyYWZ0OmNoZXJyeV93b29kXCIsXG4gIEJpcmNoU2xhYiA9IFwibWluZWNyYWZ0OmJpcmNoX3NsYWJcIixcbiAgSnVuZ2xlU2xhYiA9IFwibWluZWNyYWZ0Omp1bmdsZV9zbGFiXCIsXG4gIE1hZ2VudGFEeWUgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2R5ZVwiLFxuICBNYW5ncm92ZVNsYWIgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9zbGFiXCIsXG4gIFdhdGVyQnVja2V0ID0gXCJtaW5lY3JhZnQ6d2F0ZXJfYnVja2V0XCIsXG4gIEhhcmRCbHVlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ibHVlX3N0YWluZWRfZ2xhc3NcIixcbiAgUG9saXNoZWRHcmFuaXRlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfc2xhYlwiLFxuICBMYXBpc09yZSA9IFwibWluZWNyYWZ0OmxhcGlzX29yZVwiLFxuICBMaWdodEJsb2NrOSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzlcIixcbiAgQmVlaGl2ZSA9IFwibWluZWNyYWZ0OmJlZWhpdmVcIixcbiAgT3hpZGl6ZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFNjdWxrU2Vuc29yID0gXCJtaW5lY3JhZnQ6c2N1bGtfc2Vuc29yXCIsXG4gIEJhbWJvb1NsYWIgPSBcIm1pbmVjcmFmdDpiYW1ib29fc2xhYlwiLFxuICBQb2lzb25vdXNQb3RhdG8gPSBcIm1pbmVjcmFmdDpwb2lzb25vdXNfcG90YXRvXCIsXG4gIFByaXNtYXJpbmVTbGFiID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9zbGFiXCIsXG4gIFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpzYW5kc3RvbmVfc2xhYlwiLFxuICBXb2xmQXJtb3IgPSBcIm1pbmVjcmFmdDp3b2xmX2FybW9yXCIsXG4gIEhhcmRPcmFuZ2VTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX29yYW5nZV9zdGFpbmVkX2dsYXNzXCIsXG4gIExpbWVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmxpbWVfY29uY3JldGVfcG93ZGVyXCIsXG4gIEdyZWVuQ2FycGV0ID0gXCJtaW5lY3JhZnQ6Z3JlZW5fY2FycGV0XCIsXG4gIFNwcnVjZUJ1dHRvbiA9IFwibWluZWNyYWZ0OnNwcnVjZV9idXR0b25cIixcbiAgQ2hlcnJ5UHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmNoZXJyeV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBDdXRSZWRTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X3JlZF9zYW5kc3RvbmVfc2xhYlwiLFxuICBEaW9yaXRlU2xhYiA9IFwibWluZWNyYWZ0OmRpb3JpdGVfc2xhYlwiLFxuICBNZWRpY2luZSA9IFwibWluZWNyYWZ0Om1lZGljaW5lXCIsXG4gIEFuZGVzaXRlU2xhYiA9IFwibWluZWNyYWZ0OmFuZGVzaXRlX3NsYWJcIixcbiAgSG9ybkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6aG9ybl9jb3JhbF9mYW5cIixcbiAgQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6YnJpY2tfc2xhYlwiLFxuICBOZXRoZXJCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tfc2xhYlwiLFxuICBEcmlwc3RvbmVCbG9jayA9IFwibWluZWNyYWZ0OmRyaXBzdG9uZV9ibG9ja1wiLFxuICBHdW5wb3dkZXIgPSBcIm1pbmVjcmFmdDpndW5wb3dkZXJcIixcbiAgUHVycHVyU2xhYiA9IFwibWluZWNyYWZ0OnB1cnB1cl9zbGFiXCIsXG4gIE1hZ2VudGFDYXJwZXQgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2NhcnBldFwiLFxuICBHbG93QmVycmllcyA9IFwibWluZWNyYWZ0Omdsb3dfYmVycmllc1wiLFxuICBCcmVhZCA9IFwibWluZWNyYWZ0OmJyZWFkXCIsXG4gIFdlYXRoZXJlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFN0b25lU3dvcmQgPSBcIm1pbmVjcmFmdDpzdG9uZV9zd29yZFwiLFxuICBMZWF0aGVyID0gXCJtaW5lY3JhZnQ6bGVhdGhlclwiLFxuICBNYW5ncm92ZVJvb3RzID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcm9vdHNcIixcbiAgQ29tbWFuZEJsb2NrTWluZWNhcnQgPSBcIm1pbmVjcmFmdDpjb21tYW5kX2Jsb2NrX21pbmVjYXJ0XCIsXG4gIFdheGVkRXhwb3NlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlclwiLFxuICBTcHJ1Y2VMZWF2ZXMgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfbGVhdmVzXCIsXG4gIFN0cmlwcGVkQ2hlcnJ5TG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfY2hlcnJ5X2xvZ1wiLFxuICBEZWVwc2xhdGVUaWxlU2xhYiA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3NsYWJcIixcbiAgUG9saXNoZWRUdWZmU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZl9zdGFpcnNcIixcbiAgR29sZE51Z2dldCA9IFwibWluZWNyYWZ0OmdvbGRfbnVnZ2V0XCIsXG4gIENyYWNrZWROZXRoZXJCcmlja3MgPSBcIm1pbmVjcmFmdDpjcmFja2VkX25ldGhlcl9icmlja3NcIixcbiAgQmF0U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpiYXRfc3Bhd25fZWdnXCIsXG4gIERvbmtleVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6ZG9ua2V5X3NwYXduX2VnZ1wiLFxuICBSYWJiaXRIaWRlID0gXCJtaW5lY3JhZnQ6cmFiYml0X2hpZGVcIixcbiAgUmliQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OnJpYl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIEluZmVzdGVkQ29iYmxlc3RvbmUgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9jb2JibGVzdG9uZVwiLFxuICBEYXJrUHJpc21hcmluZSA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZVwiLFxuICBIYXJkTGlnaHRCbHVlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfbGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgTW9zc3lTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0Om1vc3N5X3N0b25lX2JyaWNrc1wiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrc1wiLFxuICBUcm9waWNhbEZpc2hTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnRyb3BpY2FsX2Zpc2hfc3Bhd25fZWdnXCIsXG4gIE1vYlNwYXduZXIgPSBcIm1pbmVjcmFmdDptb2Jfc3Bhd25lclwiLFxuICBDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OmNvcHBlcl9ncmF0ZVwiLFxuICBEZWVwc2xhdGVUaWxlcyA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlc1wiLFxuICBDcmFja2VkRGVlcHNsYXRlVGlsZXMgPSBcIm1pbmVjcmFmdDpjcmFja2VkX2RlZXBzbGF0ZV90aWxlc1wiLFxuICBPcmFuZ2VHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIENoaXNlbGVkRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfZGVlcHNsYXRlXCIsXG4gIEVtZXJhbGRCbG9jayA9IFwibWluZWNyYWZ0OmVtZXJhbGRfYmxvY2tcIixcbiAgVmV4U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp2ZXhfc3Bhd25fZWdnXCIsXG4gIE9ic2lkaWFuID0gXCJtaW5lY3JhZnQ6b2JzaWRpYW5cIixcbiAgS2VscCA9IFwibWluZWNyYWZ0OmtlbHBcIixcbiAgTWVsb25TbGljZSA9IFwibWluZWNyYWZ0Om1lbG9uX3NsaWNlXCIsXG4gIENoaXNlbGVkUmVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfcmVkX3NhbmRzdG9uZVwiLFxuICBEZWFkQnViYmxlQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2J1YmJsZV9jb3JhbFwiLFxuICBEYXJrT2FrV29vZCA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3dvb2RcIixcbiAgVHVmZkJyaWNrV2FsbCA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfd2FsbFwiLFxuICBRdWFydHpQaWxsYXIgPSBcIm1pbmVjcmFmdDpxdWFydHpfcGlsbGFyXCIsXG4gIFBvbGlzaGVkVHVmZlNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF90dWZmX3NsYWJcIixcbiAgV2F4ZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2Rvb3JcIixcbiAgV2F4ZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlcl9ncmF0ZVwiLFxuICBEZWFkQnJhaW5Db3JhbCA9IFwibWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWxcIixcbiAgU21vb3RoQmFzYWx0ID0gXCJtaW5lY3JhZnQ6c21vb3RoX2Jhc2FsdFwiLFxuICBZZWxsb3dHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6eWVsbG93X2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEp1bmdsZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpqdW5nbGVfcHJlc3N1cmVfcGxhdGVcIixcbiAgQ2F0U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjYXRfc3Bhd25fZWdnXCIsXG4gIEhvd2xQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpob3dsX3BvdHRlcnlfc2hlcmRcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2Rvb3JcIixcbiAgTGlnaHRCbHVlVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfdGVycmFjb3R0YVwiLFxuICBXYXhlZFdlYXRoZXJlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyXCIsXG4gIE9ha0xvZyA9IFwibWluZWNyYWZ0Om9ha19sb2dcIixcbiAgRG9scGhpblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6ZG9scGhpbl9zcGF3bl9lZ2dcIixcbiAgSW5mZXN0ZWRTdG9uZSA9IFwibWluZWNyYWZ0OmluZmVzdGVkX3N0b25lXCIsXG4gIEV4cG9zZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIFdlYXRoZXJlZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBDaGVycnlTYXBsaW5nID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3NhcGxpbmdcIixcbiAgV2F4ZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBDb29rZWRSYWJiaXQgPSBcIm1pbmVjcmFmdDpjb29rZWRfcmFiYml0XCIsXG4gIEZsaW50ID0gXCJtaW5lY3JhZnQ6ZmxpbnRcIixcbiAgVHJpYWxLZXkgPSBcIm1pbmVjcmFmdDp0cmlhbF9rZXlcIixcbiAgV2F4ZWRFeHBvc2VkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBFbmRlckNoZXN0ID0gXCJtaW5lY3JhZnQ6ZW5kZXJfY2hlc3RcIixcbiAgRGVlcHNsYXRlQ29hbE9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9jb2FsX29yZVwiLFxuICBPeGlkaXplZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJfYnVsYlwiLFxuICBEcmFnb25FZ2cgPSBcIm1pbmVjcmFmdDpkcmFnb25fZWdnXCIsXG4gIFdheGVkRXhwb3NlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NvcHBlcl9idWxiXCIsXG4gIFBpbmtQZXRhbHMgPSBcIm1pbmVjcmFmdDpwaW5rX3BldGFsc1wiLFxuICBCZWVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmJlZV9zcGF3bl9lZ2dcIixcbiAgQnJhaW5Db3JhbCA9IFwibWluZWNyYWZ0OmJyYWluX2NvcmFsXCIsXG4gIERpc3BlbnNlciA9IFwibWluZWNyYWZ0OmRpc3BlbnNlclwiLFxuICBSYXdJcm9uQmxvY2sgPSBcIm1pbmVjcmFmdDpyYXdfaXJvbl9ibG9ja1wiLFxuICBDcmltc29uUm9vdHMgPSBcIm1pbmVjcmFmdDpjcmltc29uX3Jvb3RzXCIsXG4gIFNwcnVjZVdvb2QgPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfd29vZFwiLFxuICBUYWRwb2xlU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp0YWRwb2xlX3NwYXduX2VnZ1wiLFxuICBUdXJ0bGVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnR1cnRsZV9zcGF3bl9lZ2dcIixcbiAgSG9uZXljb21iQmxvY2sgPSBcIm1pbmVjcmFmdDpob25leWNvbWJfYmxvY2tcIixcbiAgSnVuZ2xlU2FwbGluZyA9IFwibWluZWNyYWZ0Omp1bmdsZV9zYXBsaW5nXCIsXG4gIEVuZGVyRXllID0gXCJtaW5lY3JhZnQ6ZW5kZXJfZXllXCIsXG4gIE5ldGhlckJyaWNrID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrXCIsXG4gIENoZXJyeUJ1dHRvbiA9IFwibWluZWNyYWZ0OmNoZXJyeV9idXR0b25cIixcbiAgTG9kZXN0b25lID0gXCJtaW5lY3JhZnQ6bG9kZXN0b25lXCIsXG4gIEdyYXlXb29sID0gXCJtaW5lY3JhZnQ6Z3JheV93b29sXCIsXG4gIFN0b25lU2hvdmVsID0gXCJtaW5lY3JhZnQ6c3RvbmVfc2hvdmVsXCIsXG4gIEJsYWNrV29vbCA9IFwibWluZWNyYWZ0OmJsYWNrX3dvb2xcIixcbiAgU3RyaXBwZWRCaXJjaExvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2JpcmNoX2xvZ1wiLFxuICBQb3RhdG8gPSBcIm1pbmVjcmFmdDpwb3RhdG9cIixcbiAgT3JhbmdlV29vbCA9IFwibWluZWNyYWZ0Om9yYW5nZV93b29sXCIsXG4gIFllbGxvd1dvb2wgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfd29vbFwiLFxuICBMaW1lV29vbCA9IFwibWluZWNyYWZ0OmxpbWVfd29vbFwiLFxuICBTa3VsbFBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OnNrdWxsX3BvdHRlcnlfc2hlcmRcIixcbiAgR3JlZW5Xb29sID0gXCJtaW5lY3JhZnQ6Z3JlZW5fd29vbFwiLFxuICBNYWdlbnRhVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfdGVycmFjb3R0YVwiLFxuICBCbGFja0NhcnBldCA9IFwibWluZWNyYWZ0OmJsYWNrX2NhcnBldFwiLFxuICBCbHVlV29vbCA9IFwibWluZWNyYWZ0OmJsdWVfd29vbFwiLFxuICBIYXJkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9nbGFzc19wYW5lXCIsXG4gIEdyYXlEeWUgPSBcIm1pbmVjcmFmdDpncmF5X2R5ZVwiLFxuICBKdWtlYm94ID0gXCJtaW5lY3JhZnQ6anVrZWJveFwiLFxuICBTaGllbGQgPSBcIm1pbmVjcmFmdDpzaGllbGRcIixcbiAgSGFyZEJsYWNrU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ibGFja19zdGFpbmVkX2dsYXNzXCIsXG4gIFllbGxvd0NhcnBldCA9IFwibWluZWNyYWZ0OnllbGxvd19jYXJwZXRcIixcbiAgTGltZUNhcnBldCA9IFwibWluZWNyYWZ0OmxpbWVfY2FycGV0XCIsXG4gIEdvbGRlblN3b3JkID0gXCJtaW5lY3JhZnQ6Z29sZGVuX3N3b3JkXCIsXG4gIFN1bmZsb3dlciA9IFwibWluZWNyYWZ0OnN1bmZsb3dlclwiLFxuICBNdXNpY0Rpc2NGYXIgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX2ZhclwiLFxuICBCbHVlQ2FycGV0ID0gXCJtaW5lY3JhZnQ6Ymx1ZV9jYXJwZXRcIixcbiAgTGlnaHRHcmF5Q29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2NvbmNyZXRlX3Bvd2RlclwiLFxuICBSZWRDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OnJlZF9jb25jcmV0ZV9wb3dkZXJcIixcbiAgRGFya09ha0xlYXZlcyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2xlYXZlc1wiLFxuICBCcmFpbkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6YnJhaW5fY29yYWxfZmFuXCIsXG4gIEVseXRyYSA9IFwibWluZWNyYWZ0OmVseXRyYVwiLFxuICBDeWFuQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpjeWFuX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBZZWxsb3dDb25jcmV0ZSA9IFwibWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZVwiLFxuICBOZXRoZXJpdGVDaGVzdHBsYXRlID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX2NoZXN0cGxhdGVcIixcbiAgRGVhZFR1YmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX2Jsb2NrXCIsXG4gIEhhcmRMaWdodEdyYXlTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9saWdodF9ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBSZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cmVkX3RlcnJhY290dGFcIixcbiAgT3JhbmdlVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0Om9yYW5nZV90ZXJyYWNvdHRhXCIsXG4gIExpbWVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bGltZV90ZXJyYWNvdHRhXCIsXG4gIFR3aXN0aW5nVmluZXMgPSBcIm1pbmVjcmFmdDp0d2lzdGluZ192aW5lc1wiLFxuICBDb21tYW5kQmxvY2sgPSBcIm1pbmVjcmFmdDpjb21tYW5kX2Jsb2NrXCIsXG4gIEN5YW5UZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Y3lhbl90ZXJyYWNvdHRhXCIsXG4gIFN0b25lQXhlID0gXCJtaW5lY3JhZnQ6c3RvbmVfYXhlXCIsXG4gIERhbmRlbGlvbiA9IFwibWluZWNyYWZ0OmRhbmRlbGlvblwiLFxuICBXYXJwZWROeWxpdW0gPSBcIm1pbmVjcmFmdDp3YXJwZWRfbnlsaXVtXCIsXG4gIEhvcm5Db3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6aG9ybl9jb3JhbF9ibG9ja1wiLFxuICBXaGl0ZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDp3aGl0ZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBSZWRHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cmVkX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEJsdWVHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Ymx1ZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBCb2dnZWRTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmJvZ2dlZF9zcGF3bl9lZ2dcIixcbiAgQnJpY2sgPSBcIm1pbmVjcmFmdDpicmlja1wiLFxuICBMYXJnZUFtZXRoeXN0QnVkID0gXCJtaW5lY3JhZnQ6bGFyZ2VfYW1ldGh5c3RfYnVkXCIsXG4gIENhcnRvZ3JhcGh5VGFibGUgPSBcIm1pbmVjcmFmdDpjYXJ0b2dyYXBoeV90YWJsZVwiLFxuICBXYXlmaW5kZXJBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6d2F5ZmluZGVyX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQmx1ZUNhbmRsZSA9IFwibWluZWNyYWZ0OmJsdWVfY2FuZGxlXCIsXG4gIFBvbGlzaGVkQmFzYWx0ID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmFzYWx0XCIsXG4gIEdyYXNzUGF0aCA9IFwibWluZWNyYWZ0OmdyYXNzX3BhdGhcIixcbiAgQ29sb3JlZFRvcmNoUmcgPSBcIm1pbmVjcmFmdDpjb2xvcmVkX3RvcmNoX3JnXCIsXG4gIENyaW1zb25TdGVtID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zdGVtXCIsXG4gIFN0cmlwcGVkU3BydWNlTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfc3BydWNlX2xvZ1wiLFxuICBPcmFuZ2VUdWxpcCA9IFwibWluZWNyYWZ0Om9yYW5nZV90dWxpcFwiLFxuICBEaWFtb25kT3JlID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9vcmVcIixcbiAgQ2F2ZVNwaWRlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Y2F2ZV9zcGlkZXJfc3Bhd25fZWdnXCIsXG4gIEJ1YmJsZUNvcmFsID0gXCJtaW5lY3JhZnQ6YnViYmxlX2NvcmFsXCIsXG4gIENvYWxPcmUgPSBcIm1pbmVjcmFmdDpjb2FsX29yZVwiLFxuICBFbXB0eU1hcCA9IFwibWluZWNyYWZ0OmVtcHR5X21hcFwiLFxuICBKdW5nbGVCb2F0ID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2JvYXRcIixcbiAgUG9wcHkgPSBcIm1pbmVjcmFmdDpwb3BweVwiLFxuICBTaHVsa2VyU2hlbGwgPSBcIm1pbmVjcmFmdDpzaHVsa2VyX3NoZWxsXCIsXG4gIERlZXBzbGF0ZUlyb25PcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfaXJvbl9vcmVcIixcbiAgRGVlcHNsYXRlR29sZE9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9nb2xkX29yZVwiLFxuICBEZWVwc2xhdGVMYXBpc09yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9sYXBpc19vcmVcIixcbiAgR3Jhbml0ZSA9IFwibWluZWNyYWZ0OmdyYW5pdGVcIixcbiAgUGV0cmlmaWVkT2FrU2xhYiA9IFwibWluZWNyYWZ0OnBldHJpZmllZF9vYWtfc2xhYlwiLFxuICBOZXRoZXJpdGVMZWdnaW5ncyA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9sZWdnaW5nc1wiLFxuICBTdHJpcHBlZEFjYWNpYUxvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2FjYWNpYV9sb2dcIixcbiAgTGlnaHRCbG9jazEgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xXCIsXG4gIFNwcnVjZUxvZyA9IFwibWluZWNyYWZ0OnNwcnVjZV9sb2dcIixcbiAgQ2hlc3RNaW5lY2FydCA9IFwibWluZWNyYWZ0OmNoZXN0X21pbmVjYXJ0XCIsXG4gIEFjYWNpYUxvZyA9IFwibWluZWNyYWZ0OmFjYWNpYV9sb2dcIixcbiAgV2FycGVkSHlwaGFlID0gXCJtaW5lY3JhZnQ6d2FycGVkX2h5cGhhZVwiLFxuICBPeGV5ZURhaXN5ID0gXCJtaW5lY3JhZnQ6b3hleWVfZGFpc3lcIixcbiAgUGl0Y2hlclBsYW50ID0gXCJtaW5lY3JhZnQ6cGl0Y2hlcl9wbGFudFwiLFxuICBNYW5ncm92ZVNpZ24gPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9zaWduXCIsXG4gIE1hZ21hQ3ViZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6bWFnbWFfY3ViZV9zcGF3bl9lZ2dcIixcbiAgTWFuZ3JvdmVXb29kID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfd29vZFwiLFxuICBab21iaWVQaWdtYW5TcGF3bkVnZyA9IFwibWluZWNyYWZ0OnpvbWJpZV9waWdtYW5fc3Bhd25fZWdnXCIsXG4gIFBvbGlzaGVkVHVmZiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZcIixcbiAgU3RyaXBwZWRNYW5ncm92ZUxvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX2xvZ1wiLFxuICBDaGVycnlMb2cgPSBcIm1pbmVjcmFmdDpjaGVycnlfbG9nXCIsXG4gIERlYWRGaXJlQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2ZpcmVfY29yYWxfZmFuXCIsXG4gIElyb25MZWdnaW5ncyA9IFwibWluZWNyYWZ0Omlyb25fbGVnZ2luZ3NcIixcbiAgUHVmZmVyZmlzaCA9IFwibWluZWNyYWZ0OnB1ZmZlcmZpc2hcIixcbiAgQW1ldGh5c3RTaGFyZCA9IFwibWluZWNyYWZ0OmFtZXRoeXN0X3NoYXJkXCIsXG4gIFN0cmlwcGVkRGFya09ha1dvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9kYXJrX29ha193b29kXCIsXG4gIFN0cmlwcGVkQ2hlcnJ5V29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV93b29kXCIsXG4gIFN0cmlwcGVkV2FycGVkSHlwaGFlID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfd2FycGVkX2h5cGhhZVwiLFxuICBCYXJyaWVyID0gXCJtaW5lY3JhZnQ6YmFycmllclwiLFxuICBBY2FjaWFMZWF2ZXMgPSBcIm1pbmVjcmFmdDphY2FjaWFfbGVhdmVzXCIsXG4gIE1hbmdyb3ZlUHJvcGFndWxlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcHJvcGFndWxlXCIsXG4gIFN0aWNreVBpc3RvbiA9IFwibWluZWNyYWZ0OnN0aWNreV9waXN0b25cIixcbiAgT2FrU2FwbGluZyA9IFwibWluZWNyYWZ0Om9ha19zYXBsaW5nXCIsXG4gIFdoaXRlVHVsaXAgPSBcIm1pbmVjcmFmdDp3aGl0ZV90dWxpcFwiLFxuICBEYXJrT2FrU2FwbGluZyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3NhcGxpbmdcIixcbiAgU3VzcGljaW91c1N0ZXcgPSBcIm1pbmVjcmFmdDpzdXNwaWNpb3VzX3N0ZXdcIixcbiAgQmVlTmVzdCA9IFwibWluZWNyYWZ0OmJlZV9uZXN0XCIsXG4gIFRhZHBvbGVCdWNrZXQgPSBcIm1pbmVjcmFmdDp0YWRwb2xlX2J1Y2tldFwiLFxuICBXaGVhdFNlZWRzID0gXCJtaW5lY3JhZnQ6d2hlYXRfc2VlZHNcIixcbiAgTWVsb25TZWVkcyA9IFwibWluZWNyYWZ0Om1lbG9uX3NlZWRzXCIsXG4gIFNvdWxTYW5kID0gXCJtaW5lY3JhZnQ6c291bF9zYW5kXCIsXG4gIFN1Z2FyID0gXCJtaW5lY3JhZnQ6c3VnYXJcIixcbiAgU3BydWNlQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6c3BydWNlX2NoZXN0X2JvYXRcIixcbiAgQ2hlcnJ5Qm9hdCA9IFwibWluZWNyYWZ0OmNoZXJyeV9ib2F0XCIsXG4gIE1hbmdyb3ZlQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfY2hlc3RfYm9hdFwiLFxuICBDb29rZWRDb2QgPSBcIm1pbmVjcmFmdDpjb29rZWRfY29kXCIsXG4gIFNtYWxsQW1ldGh5c3RCdWQgPSBcIm1pbmVjcmFmdDpzbWFsbF9hbWV0aHlzdF9idWRcIixcbiAgQXBwbGUgPSBcIm1pbmVjcmFmdDphcHBsZVwiLFxuICBTd2VldEJlcnJpZXMgPSBcIm1pbmVjcmFmdDpzd2VldF9iZXJyaWVzXCIsXG4gIExhcmdlRmVybiA9IFwibWluZWNyYWZ0OmxhcmdlX2Zlcm5cIixcbiAgVGFsbEdyYXNzID0gXCJtaW5lY3JhZnQ6dGFsbF9ncmFzc1wiLFxuICBQdWZmZXJmaXNoU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwdWZmZXJmaXNoX3NwYXduX2VnZ1wiLFxuICBMZWF0aGVyTGVnZ2luZ3MgPSBcIm1pbmVjcmFmdDpsZWF0aGVyX2xlZ2dpbmdzXCIsXG4gIEJ1YmJsZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6YnViYmxlX2NvcmFsX2ZhblwiLFxuICBGaXJlQ29yYWwgPSBcIm1pbmVjcmFmdDpmaXJlX2NvcmFsXCIsXG4gIERlYWRGaXJlQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2ZpcmVfY29yYWxcIixcbiAgQ3J5aW5nT2JzaWRpYW4gPSBcIm1pbmVjcmFmdDpjcnlpbmdfb2JzaWRpYW5cIixcbiAgTGlsYWMgPSBcIm1pbmVjcmFmdDpsaWxhY1wiLFxuICBEZWFkVHViZUNvcmFsID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsXCIsXG4gIERlYWRCcmFpbkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9icmFpbl9jb3JhbF9mYW5cIixcbiAgRGVhZFR1YmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfdHViZV9jb3JhbF9mYW5cIixcbiAgTGluZ2VyaW5nUG90aW9uID0gXCJtaW5lY3JhZnQ6bGluZ2VyaW5nX3BvdGlvblwiLFxuICBBenVyZUJsdWV0ID0gXCJtaW5lY3JhZnQ6YXp1cmVfYmx1ZXRcIixcbiAgWWVsbG93RHllID0gXCJtaW5lY3JhZnQ6eWVsbG93X2R5ZVwiLFxuICBXYW5kZXJpbmdUcmFkZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OndhbmRlcmluZ190cmFkZXJfc3Bhd25fZWdnXCIsXG4gIERlYWRCcmFpbkNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2JyYWluX2NvcmFsX2Jsb2NrXCIsXG4gIFdlZXBpbmdWaW5lcyA9IFwibWluZWNyYWZ0OndlZXBpbmdfdmluZXNcIixcbiAgV2F0ZXJsaWx5ID0gXCJtaW5lY3JhZnQ6d2F0ZXJsaWx5XCIsXG4gIExpZ2h0Qmx1ZUNhbmRsZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FuZGxlXCIsXG4gIFNlYWdyYXNzID0gXCJtaW5lY3JhZnQ6c2VhZ3Jhc3NcIixcbiAgRGlhbW9uZFBpY2theGUgPSBcIm1pbmVjcmFmdDpkaWFtb25kX3BpY2theGVcIixcbiAgRGVhZGJ1c2ggPSBcIm1pbmVjcmFmdDpkZWFkYnVzaFwiLFxuICBKdW5nbGVCdXR0b24gPSBcIm1pbmVjcmFmdDpqdW5nbGVfYnV0dG9uXCIsXG4gIEljZSA9IFwibWluZWNyYWZ0OmljZVwiLFxuICBDeWFuU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmN5YW5fc2h1bGtlcl9ib3hcIixcbiAgSGFyZFBpbmtTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9waW5rX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBTbm93TGF5ZXIgPSBcIm1pbmVjcmFmdDpzbm93X2xheWVyXCIsXG4gIExpZ2h0QmxvY2swID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMFwiLFxuICBEYXJrT2FrQm9hdCA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2JvYXRcIixcbiAgRGlydFdpdGhSb290cyA9IFwibWluZWNyYWZ0OmRpcnRfd2l0aF9yb290c1wiLFxuICBNdWRkeU1hbmdyb3ZlUm9vdHMgPSBcIm1pbmVjcmFmdDptdWRkeV9tYW5ncm92ZV9yb290c1wiLFxuICBUcm9waWNhbEZpc2ggPSBcIm1pbmVjcmFmdDp0cm9waWNhbF9maXNoXCIsXG4gIFNwb3JlQmxvc3NvbSA9IFwibWluZWNyYWZ0OnNwb3JlX2Jsb3Nzb21cIixcbiAgSGFyZFllbGxvd1N0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfeWVsbG93X3N0YWluZWRfZ2xhc3NcIixcbiAgQW1ldGh5c3RDbHVzdGVyID0gXCJtaW5lY3JhZnQ6YW1ldGh5c3RfY2x1c3RlclwiLFxuICBNZWRpdW1BbWV0aHlzdEJ1ZCA9IFwibWluZWNyYWZ0Om1lZGl1bV9hbWV0aHlzdF9idWRcIixcbiAgV29vZGVuUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0Ondvb2Rlbl9wcmVzc3VyZV9wbGF0ZVwiLFxuICBIdXNrU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpodXNrX3NwYXduX2VnZ1wiLFxuICBJcm9uU3dvcmQgPSBcIm1pbmVjcmFmdDppcm9uX3N3b3JkXCIsXG4gIFR1ZmZTbGFiID0gXCJtaW5lY3JhZnQ6dHVmZl9zbGFiXCIsXG4gIENoaXNlbGVkVHVmZiA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3R1ZmZcIixcbiAgSnVuZ2xlQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2NoZXN0X2JvYXRcIixcbiAgVHVmZkJyaWNrcyA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tzXCIsXG4gIENoaXNlbGVkVHVmZkJyaWNrcyA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3R1ZmZfYnJpY2tzXCIsXG4gIENoaWNrZW4gPSBcIm1pbmVjcmFmdDpjaGlja2VuXCIsXG4gIFN0b25lSG9lID0gXCJtaW5lY3JhZnQ6c3RvbmVfaG9lXCIsXG4gIEJlZWYgPSBcIm1pbmVjcmFmdDpiZWVmXCIsXG4gIEFybWFkaWxsb1NjdXRlID0gXCJtaW5lY3JhZnQ6YXJtYWRpbGxvX3NjdXRlXCIsXG4gIENoYWlubWFpbEJvb3RzID0gXCJtaW5lY3JhZnQ6Y2hhaW5tYWlsX2Jvb3RzXCIsXG4gIE11dHRvbiA9IFwibWluZWNyYWZ0Om11dHRvblwiLFxuICBSYWJiaXQgPSBcIm1pbmVjcmFmdDpyYWJiaXRcIixcbiAgRGlhbW9uZEhvcnNlQXJtb3IgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2hvcnNlX2FybW9yXCIsXG4gIFNhbG1vbiA9IFwibWluZWNyYWZ0OnNhbG1vblwiLFxuICBCb2x0QXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OmJvbHRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBCcm93bk11c2hyb29tID0gXCJtaW5lY3JhZnQ6YnJvd25fbXVzaHJvb21cIixcbiAgUmVkTXVzaHJvb20gPSBcIm1pbmVjcmFmdDpyZWRfbXVzaHJvb21cIixcbiAgQnJvd25NdXNocm9vbUJsb2NrID0gXCJtaW5lY3JhZnQ6YnJvd25fbXVzaHJvb21fYmxvY2tcIixcbiAgV2ViID0gXCJtaW5lY3JhZnQ6d2ViXCIsXG4gIEVuZFBvcnRhbEZyYW1lID0gXCJtaW5lY3JhZnQ6ZW5kX3BvcnRhbF9mcmFtZVwiLFxuICBBcm1vclN0YW5kID0gXCJtaW5lY3JhZnQ6YXJtb3Jfc3RhbmRcIixcbiAgSW5mZXN0ZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmluZmVzdGVkX3N0b25lX2JyaWNrc1wiLFxuICBJbmZlc3RlZE1vc3N5U3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9tb3NzeV9zdG9uZV9icmlja3NcIixcbiAgSW5mZXN0ZWRDcmFja2VkU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9jcmFja2VkX3N0b25lX2JyaWNrc1wiLFxuICBTbmlmZmVyRWdnID0gXCJtaW5lY3JhZnQ6c25pZmZlcl9lZ2dcIixcbiAgQ2hhaW5tYWlsTGVnZ2luZ3MgPSBcIm1pbmVjcmFmdDpjaGFpbm1haWxfbGVnZ2luZ3NcIixcbiAgQ2hpY2tlblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Y2hpY2tlbl9zcGF3bl9lZ2dcIixcbiAgT2NlbG90U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpvY2Vsb3Rfc3Bhd25fZWdnXCIsXG4gIFJlaW5mb3JjZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpyZWluZm9yY2VkX2RlZXBzbGF0ZVwiLFxuICBNb29zaHJvb21TcGF3bkVnZyA9IFwibWluZWNyYWZ0Om1vb3Nocm9vbV9zcGF3bl9lZ2dcIixcbiAgUGFycm90U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwYXJyb3Rfc3Bhd25fZWdnXCIsXG4gIE11bGVTcGF3bkVnZyA9IFwibWluZWNyYWZ0Om11bGVfc3Bhd25fZWdnXCIsXG4gIEhhcmRPcmFuZ2VTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9vcmFuZ2Vfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFpvbWJpZUhvcnNlU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp6b21iaWVfaG9yc2Vfc3Bhd25fZWdnXCIsXG4gIEVuZGVybWFuU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDplbmRlcm1hbl9zcGF3bl9lZ2dcIixcbiAgU2lsdmVyZmlzaFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c2lsdmVyZmlzaF9zcGF3bl9lZ2dcIixcbiAgV2l0aGVyU2tlbGV0b25TcGF3bkVnZyA9IFwibWluZWNyYWZ0OndpdGhlcl9za2VsZXRvbl9zcGF3bl9lZ2dcIixcbiAgQ29va2VkUG9ya2Nob3AgPSBcIm1pbmVjcmFmdDpjb29rZWRfcG9ya2Nob3BcIixcbiAgTXVzaWNEaXNjT3RoZXJzaWRlID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19vdGhlcnNpZGVcIixcbiAgTGVhdGhlckJvb3RzID0gXCJtaW5lY3JhZnQ6bGVhdGhlcl9ib290c1wiLFxuICBTcGlkZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnNwaWRlcl9zcGF3bl9lZ2dcIixcbiAgU2N1bGsgPSBcIm1pbmVjcmFmdDpzY3Vsa1wiLFxuICBab21iaWVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnpvbWJpZV9zcGF3bl9lZ2dcIixcbiAgTXVzaWNEaXNjUHJlY2lwaWNlID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19wcmVjaXBpY2VcIixcbiAgV2l0Y2hTcGF3bkVnZyA9IFwibWluZWNyYWZ0OndpdGNoX3NwYXduX2VnZ1wiLFxuICBHdWFyZGlhblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Z3VhcmRpYW5fc3Bhd25fZWdnXCIsXG4gIERhbWFnZWRBbnZpbCA9IFwibWluZWNyYWZ0OmRhbWFnZWRfYW52aWxcIixcbiAgUGlnbGluU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwaWdsaW5fc3Bhd25fZWdnXCIsXG4gIFpvZ2xpblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6em9nbGluX3NwYXduX2VnZ1wiLFxuICBMb29tID0gXCJtaW5lY3JhZnQ6bG9vbVwiLFxuICBBeG9sb3RsU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpheG9sb3RsX3NwYXduX2VnZ1wiLFxuICBBbGxheVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6YWxsYXlfc3Bhd25fZWdnXCIsXG4gIE5ldGhlcml0ZUF4ZSA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9heGVcIixcbiAgVmluZGljYXRvclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6dmluZGljYXRvcl9zcGF3bl9lZ2dcIixcbiAgRXZva2VyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpldm9rZXJfc3Bhd25fZWdnXCIsXG4gIFBoYW50b21TcGF3bkVnZyA9IFwibWluZWNyYWZ0OnBoYW50b21fc3Bhd25fZWdnXCIsXG4gIFNub3dHb2xlbVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c25vd19nb2xlbV9zcGF3bl9lZ2dcIixcbiAgU25pZmZlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c25pZmZlcl9zcGF3bl9lZ2dcIixcbiAgQXJtYWRpbGxvU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDphcm1hZGlsbG9fc3Bhd25fZWdnXCIsXG4gIE11c2ljRGlzYzEzID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY18xM1wiLFxuICBCZWRyb2NrID0gXCJtaW5lY3JhZnQ6YmVkcm9ja1wiLFxuICBEaXJ0ID0gXCJtaW5lY3JhZnQ6ZGlydFwiLFxuICBNYWdtYSA9IFwibWluZWNyYWZ0Om1hZ21hXCIsXG4gIEVuZFN0b25lID0gXCJtaW5lY3JhZnQ6ZW5kX3N0b25lXCIsXG4gIENob3J1c0ZydWl0ID0gXCJtaW5lY3JhZnQ6Y2hvcnVzX2ZydWl0XCIsXG4gIEJyYWluQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmJyYWluX2NvcmFsX2Jsb2NrXCIsXG4gIEJ1YmJsZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpidWJibGVfY29yYWxfYmxvY2tcIixcbiAgRGVhZEJ1YmJsZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2J1YmJsZV9jb3JhbF9ibG9ja1wiLFxuICBEZWFkRmlyZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2ZpcmVfY29yYWxfYmxvY2tcIixcbiAgSXJvbkhlbG1ldCA9IFwibWluZWNyYWZ0Omlyb25faGVsbWV0XCIsXG4gIEdvbGRlbkhlbG1ldCA9IFwibWluZWNyYWZ0OmdvbGRlbl9oZWxtZXRcIixcbiAgTGVhdGhlckNoZXN0cGxhdGUgPSBcIm1pbmVjcmFmdDpsZWF0aGVyX2NoZXN0cGxhdGVcIixcbiAgR29sZGVuQ2hlc3RwbGF0ZSA9IFwibWluZWNyYWZ0OmdvbGRlbl9jaGVzdHBsYXRlXCIsXG4gIE1hbmdyb3ZlSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9oYW5naW5nX3NpZ25cIixcbiAgRGlhbW9uZExlZ2dpbmdzID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9sZWdnaW5nc1wiLFxuICBXb29kZW5CdXR0b24gPSBcIm1pbmVjcmFmdDp3b29kZW5fYnV0dG9uXCIsXG4gIEdvbGRlbkJvb3RzID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2Jvb3RzXCIsXG4gIFdvb2RlblN3b3JkID0gXCJtaW5lY3JhZnQ6d29vZGVuX3N3b3JkXCIsXG4gIERpYW1vbmRBeGUgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2F4ZVwiLFxuICBTdG9uZVBpY2theGUgPSBcIm1pbmVjcmFmdDpzdG9uZV9waWNrYXhlXCIsXG4gIElyb25QaWNrYXhlID0gXCJtaW5lY3JhZnQ6aXJvbl9waWNrYXhlXCIsXG4gIEJhbWJvb1NpZ24gPSBcIm1pbmVjcmFmdDpiYW1ib29fc2lnblwiLFxuICBQaW5rQ2FuZGxlID0gXCJtaW5lY3JhZnQ6cGlua19jYW5kbGVcIixcbiAgR29sZGVuU2hvdmVsID0gXCJtaW5lY3JhZnQ6Z29sZGVuX3Nob3ZlbFwiLFxuICBEaWFtb25kU2hvdmVsID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9zaG92ZWxcIixcbiAgTmV0aGVyaXRlU2hvdmVsID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX3Nob3ZlbFwiLFxuICBHb2xkZW5Ib2UgPSBcIm1pbmVjcmFmdDpnb2xkZW5faG9lXCIsXG4gIERpYW1vbmRIb2UgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2hvZVwiLFxuICBCcm93blNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpicm93bl9zaHVsa2VyX2JveFwiLFxuICBDb29rZWRDaGlja2VuID0gXCJtaW5lY3JhZnQ6Y29va2VkX2NoaWNrZW5cIixcbiAgUHVtcGtpblBpZSA9IFwibWluZWNyYWZ0OnB1bXBraW5fcGllXCIsXG4gIFdhcnBlZEZ1bmd1c09uQVN0aWNrID0gXCJtaW5lY3JhZnQ6d2FycGVkX2Z1bmd1c19vbl9hX3N0aWNrXCIsXG4gIFNub3diYWxsID0gXCJtaW5lY3JhZnQ6c25vd2JhbGxcIixcbiAgTGVhdGhlckhvcnNlQXJtb3IgPSBcIm1pbmVjcmFmdDpsZWF0aGVyX2hvcnNlX2FybW9yXCIsXG4gIFR1cnRsZUhlbG1ldCA9IFwibWluZWNyYWZ0OnR1cnRsZV9oZWxtZXRcIixcbiAgVG90ZW1PZlVuZHlpbmcgPSBcIm1pbmVjcmFmdDp0b3RlbV9vZl91bmR5aW5nXCIsXG4gIEV4cGVyaWVuY2VCb3R0bGUgPSBcIm1pbmVjcmFmdDpleHBlcmllbmNlX2JvdHRsZVwiLFxuICBQb3Rpb24gPSBcIm1pbmVjcmFmdDpwb3Rpb25cIixcbiAgTXVzaWNEaXNjQ2F0ID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19jYXRcIixcbiAgU3B5Z2xhc3MgPSBcIm1pbmVjcmFmdDpzcHlnbGFzc1wiLFxuICBUb3JjaCA9IFwibWluZWNyYWZ0OnRvcmNoXCIsXG4gIFNvdWxUb3JjaCA9IFwibWluZWNyYWZ0OnNvdWxfdG9yY2hcIixcbiAgUmFpbCA9IFwibWluZWNyYWZ0OnJhaWxcIixcbiAgU291bExhbnRlcm4gPSBcIm1pbmVjcmFmdDpzb3VsX2xhbnRlcm5cIixcbiAgQ2FuZGxlID0gXCJtaW5lY3JhZnQ6Y2FuZGxlXCIsXG4gIE1hZ2VudGFDYW5kbGUgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2NhbmRsZVwiLFxuICBMaW1lQ2FuZGxlID0gXCJtaW5lY3JhZnQ6bGltZV9jYW5kbGVcIixcbiAgR3JheUNhbmRsZSA9IFwibWluZWNyYWZ0OmdyYXlfY2FuZGxlXCIsXG4gIEhhcmRQaW5rU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9waW5rX3N0YWluZWRfZ2xhc3NcIixcbiAgTGlnaHRHcmF5Q2FuZGxlID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jYW5kbGVcIixcbiAgUG93ZGVyU25vd0J1Y2tldCA9IFwibWluZWNyYWZ0OnBvd2Rlcl9zbm93X2J1Y2tldFwiLFxuICBCbGFja0NhbmRsZSA9IFwibWluZWNyYWZ0OmJsYWNrX2NhbmRsZVwiLFxuICBTaGVhZlBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OnNoZWFmX3BvdHRlcnlfc2hlcmRcIixcbiAgQ3JhZnRpbmdUYWJsZSA9IFwibWluZWNyYWZ0OmNyYWZ0aW5nX3RhYmxlXCIsXG4gIFNtaXRoaW5nVGFibGUgPSBcIm1pbmVjcmFmdDpzbWl0aGluZ190YWJsZVwiLFxuICBNdXNpY0Rpc2NTdHJhZCA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2Nfc3RyYWRcIixcbiAgU291bENhbXBmaXJlID0gXCJtaW5lY3JhZnQ6c291bF9jYW1wZmlyZVwiLFxuICBCbGFzdEZ1cm5hY2UgPSBcIm1pbmVjcmFmdDpibGFzdF9mdXJuYWNlXCIsXG4gIENoZW1pc3RyeVRhYmxlID0gXCJtaW5lY3JhZnQ6Y2hlbWlzdHJ5X3RhYmxlXCIsXG4gIEJyZXdpbmdTdGFuZCA9IFwibWluZWNyYWZ0OmJyZXdpbmdfc3RhbmRcIixcbiAgRW5jaGFudGluZ1RhYmxlID0gXCJtaW5lY3JhZnQ6ZW5jaGFudGluZ190YWJsZVwiLFxuICBCb29rc2hlbGYgPSBcIm1pbmVjcmFmdDpib29rc2hlbGZcIixcbiAgQ2hpc2VsZWRCb29rc2hlbGYgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9ib29rc2hlbGZcIixcbiAgVHJhcHBlZENoZXN0ID0gXCJtaW5lY3JhZnQ6dHJhcHBlZF9jaGVzdFwiLFxuICBSYWJiaXRGb290ID0gXCJtaW5lY3JhZnQ6cmFiYml0X2Zvb3RcIixcbiAgVW5keWVkU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OnVuZHllZF9zaHVsa2VyX2JveFwiLFxuICBXaGl0ZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDp3aGl0ZV9zaHVsa2VyX2JveFwiLFxuICBHcmF5U2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmdyYXlfc2h1bGtlcl9ib3hcIixcbiAgQmxhY2tTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6YmxhY2tfc2h1bGtlcl9ib3hcIixcbiAgUmVkU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OnJlZF9zaHVsa2VyX2JveFwiLFxuICBPcmFuZ2VTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3NodWxrZXJfYm94XCIsXG4gIEhhcmRCbGFja1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2JsYWNrX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBMaW1lU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmxpbWVfc2h1bGtlcl9ib3hcIixcbiAgR3JlZW5TaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Z3JlZW5fc2h1bGtlcl9ib3hcIixcbiAgUXVhcnR6ID0gXCJtaW5lY3JhZnQ6cXVhcnR6XCIsXG4gIE1hZ2VudGFTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9zaHVsa2VyX2JveFwiLFxuICBNdXNpY0Rpc2NDaGlycCA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfY2hpcnBcIixcbiAgTXVzaWNEaXNjTWFsbCA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfbWFsbFwiLFxuICBNdXNpY0Rpc2NXYXJkID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY193YXJkXCIsXG4gIExpZ2h0bmluZ1JvZCA9IFwibWluZWNyYWZ0OmxpZ2h0bmluZ19yb2RcIixcbiAgTXVzaWNEaXNjQ3JlYXRvck11c2ljQm94ID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19jcmVhdG9yX211c2ljX2JveFwiLFxuICBEYW5nZXJQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpkYW5nZXJfcG90dGVyeV9zaGVyZFwiLFxuICBEaXNjRnJhZ21lbnQ1ID0gXCJtaW5lY3JhZnQ6ZGlzY19mcmFnbWVudF81XCIsXG4gIEdsb3dzdG9uZSA9IFwibWluZWNyYWZ0Omdsb3dzdG9uZVwiLFxuICBCaXJjaFNpZ24gPSBcIm1pbmVjcmFmdDpiaXJjaF9zaWduXCIsXG4gIENyaW1zb25TaWduID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zaWduXCIsXG4gIFdhcnBlZFNpZ24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfc2lnblwiLFxuICBGaXJld29ya1N0YXIgPSBcIm1pbmVjcmFmdDpmaXJld29ya19zdGFyXCIsXG4gIFNwcnVjZUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6c3BydWNlX2hhbmdpbmdfc2lnblwiLFxuICBCYW1ib29IYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmJhbWJvb19oYW5naW5nX3NpZ25cIixcbiAgQ3JpbXNvbkhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9oYW5naW5nX3NpZ25cIixcbiAgSGFyZEdyYXlTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBQYWludGluZyA9IFwibWluZWNyYWZ0OnBhaW50aW5nXCIsXG4gIEhvbmV5Qm90dGxlID0gXCJtaW5lY3JhZnQ6aG9uZXlfYm90dGxlXCIsXG4gIExhdmFCdWNrZXQgPSBcIm1pbmVjcmFmdDpsYXZhX2J1Y2tldFwiLFxuICBDb2RCdWNrZXQgPSBcIm1pbmVjcmFmdDpjb2RfYnVja2V0XCIsXG4gIFdpdGhlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6d2l0aGVyX3NwYXduX2VnZ1wiLFxuICBQdWZmZXJmaXNoQnVja2V0ID0gXCJtaW5lY3JhZnQ6cHVmZmVyZmlzaF9idWNrZXRcIixcbiAgU2t1bGwgPSBcIm1pbmVjcmFmdDpza3VsbFwiLFxuICBIZWFydFBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmhlYXJ0X3BvdHRlcnlfc2hlcmRcIixcbiAgQmVsbCA9IFwibWluZWNyYWZ0OmJlbGxcIixcbiAgQW52aWwgPSBcIm1pbmVjcmFmdDphbnZpbFwiLFxuICBDb25kdWl0ID0gXCJtaW5lY3JhZnQ6Y29uZHVpdFwiLFxuICBTdG9uZWN1dHRlckJsb2NrID0gXCJtaW5lY3JhZnQ6c3RvbmVjdXR0ZXJfYmxvY2tcIixcbiAgUmF3SXJvbiA9IFwibWluZWNyYWZ0OnJhd19pcm9uXCIsXG4gIFJhd0dvbGQgPSBcIm1pbmVjcmFmdDpyYXdfZ29sZFwiLFxuICBIYXJkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2dsYXNzXCIsXG4gIFJhd0NvcHBlciA9IFwibWluZWNyYWZ0OnJhd19jb3BwZXJcIixcbiAgSXJvbkluZ290ID0gXCJtaW5lY3JhZnQ6aXJvbl9pbmdvdFwiLFxuICBQcmlzbWFyaW5lU2hhcmQgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX3NoYXJkXCIsXG4gIEJsYXplUG93ZGVyID0gXCJtaW5lY3JhZnQ6YmxhemVfcG93ZGVyXCIsXG4gIERyYWdvbkJyZWF0aCA9IFwibWluZWNyYWZ0OmRyYWdvbl9icmVhdGhcIixcbiAgSGFyZEdyZWVuU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmVlbl9zdGFpbmVkX2dsYXNzXCIsXG4gIE5ldGhlclN0YXIgPSBcIm1pbmVjcmFmdDpuZXRoZXJfc3RhclwiLFxuICBQYXBlciA9IFwibWluZWNyYWZ0OnBhcGVyXCIsXG4gIExpZ2h0QmxvY2s0ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfNFwiLFxuICBUbnQgPSBcIm1pbmVjcmFmdDp0bnRcIixcbiAgSGFyZFdoaXRlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF93aGl0ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIEhhcmRQdXJwbGVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3B1cnBsZV9zdGFpbmVkX2dsYXNzXCIsXG4gIEhhcmRCcm93blN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfYnJvd25fc3RhaW5lZF9nbGFzc1wiLFxuICBIYXJkUmVkU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9yZWRfc3RhaW5lZF9nbGFzc1wiLFxuICBIYXJkV2hpdGVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF93aGl0ZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgSGFyZFllbGxvd1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3llbGxvd19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgSGFyZExpbWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9saW1lX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBHbG93U3RpY2sgPSBcIm1pbmVjcmFmdDpnbG93X3N0aWNrXCIsXG4gIEJhbWJvb0J1dHRvbiA9IFwibWluZWNyYWZ0OmJhbWJvb19idXR0b25cIixcbiAgU3BhcmtsZXIgPSBcIm1pbmVjcmFmdDpzcGFya2xlclwiLFxuICBTcHJ1Y2VCb2F0ID0gXCJtaW5lY3JhZnQ6c3BydWNlX2JvYXRcIixcbiAgTG9kZXN0b25lQ29tcGFzcyA9IFwibWluZWNyYWZ0OmxvZGVzdG9uZV9jb21wYXNzXCIsXG4gIEFpciA9IFwibWluZWNyYWZ0OmFpclwiLFxuICBGaXJld29ya1JvY2tldCA9IFwibWluZWNyYWZ0OmZpcmV3b3JrX3JvY2tldFwiLFxuICBCaXJjaENoZXN0Qm9hdCA9IFwibWluZWNyYWZ0OmJpcmNoX2NoZXN0X2JvYXRcIixcbiAgR29sZGVuUmFpbCA9IFwibWluZWNyYWZ0OmdvbGRlbl9yYWlsXCIsXG4gIE1pbmVjYXJ0ID0gXCJtaW5lY3JhZnQ6bWluZWNhcnRcIixcbiAgSG9wcGVyTWluZWNhcnQgPSBcIm1pbmVjcmFmdDpob3BwZXJfbWluZWNhcnRcIixcbiAgUmVkc3RvbmVUb3JjaCA9IFwibWluZWNyYWZ0OnJlZHN0b25lX3RvcmNoXCIsXG4gIEFjYWNpYUJ1dHRvbiA9IFwibWluZWNyYWZ0OmFjYWNpYV9idXR0b25cIixcbiAgRGFya09ha0J1dHRvbiA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2J1dHRvblwiLFxuICBDcmltc29uQnV0dG9uID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9idXR0b25cIixcbiAgV2FycGVkQnV0dG9uID0gXCJtaW5lY3JhZnQ6d2FycGVkX2J1dHRvblwiLFxuICBUcmlwd2lyZUhvb2sgPSBcIm1pbmVjcmFmdDp0cmlwd2lyZV9ob29rXCIsXG4gIFNwcnVjZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfcHJlc3N1cmVfcGxhdGVcIixcbiAgTWFuZ3JvdmVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcHJlc3N1cmVfcGxhdGVcIixcbiAgU3RvbmVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6c3RvbmVfcHJlc3N1cmVfcGxhdGVcIixcbiAgSGVhdnlXZWlnaHRlZFByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpoZWF2eV93ZWlnaHRlZF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBSZXBlYXRlciA9IFwibWluZWNyYWZ0OnJlcGVhdGVyXCIsXG4gIENvbXBhcmF0b3IgPSBcIm1pbmVjcmFmdDpjb21wYXJhdG9yXCIsXG4gIFBpc3RvbiA9IFwibWluZWNyYWZ0OnBpc3RvblwiLFxuICBGbG93ZXJCYW5uZXJQYXR0ZXJuID0gXCJtaW5lY3JhZnQ6Zmxvd2VyX2Jhbm5lcl9wYXR0ZXJuXCIsXG4gIE1vamFuZ0Jhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDptb2phbmdfYmFubmVyX3BhdHRlcm5cIixcbiAgQm9yZHVyZUluZGVudGVkQmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0OmJvcmR1cmVfaW5kZW50ZWRfYmFubmVyX3BhdHRlcm5cIixcbiAgR2xvYmVCYW5uZXJQYXR0ZXJuID0gXCJtaW5lY3JhZnQ6Z2xvYmVfYmFubmVyX3BhdHRlcm5cIixcbiAgV2lsZEFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDp3aWxkX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgRmxvd0Jhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpmbG93X2Jhbm5lcl9wYXR0ZXJuXCIsXG4gIEFuZ2xlclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmFuZ2xlcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIEJsYWRlUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6YmxhZGVfcG90dGVyeV9zaGVyZFwiLFxuICBNaW5lclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0Om1pbmVyX3BvdHRlcnlfc2hlcmRcIixcbiAgTW91cm5lclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0Om1vdXJuZXJfcG90dGVyeV9zaGVyZFwiLFxuICBQbGVudHlQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpwbGVudHlfcG90dGVyeV9zaGVyZFwiLFxuICBWZXhBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6dmV4X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgRHVuZUFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpkdW5lX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgU2hhcGVyQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OnNoYXBlcl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIFNpbGVuY2VBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6c2lsZW5jZV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIFRpZGVBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6dGlkZV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIENoYWluID0gXCJtaW5lY3JhZnQ6Y2hhaW5cIixcbiAgRGVjb3JhdGVkUG90ID0gXCJtaW5lY3JhZnQ6ZGVjb3JhdGVkX3BvdFwiLFxuICBPbWlub3VzVHJpYWxLZXkgPSBcIm1pbmVjcmFmdDpvbWlub3VzX3RyaWFsX2tleVwiLFxuICBMaWdodEJsb2NrMTUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xNVwiLFxuICBGaWxsZWRNYXAgPSBcIm1pbmVjcmFmdDpmaWxsZWRfbWFwXCIsXG4gIEJvcmRlckJsb2NrID0gXCJtaW5lY3JhZnQ6Ym9yZGVyX2Jsb2NrXCIsXG4gIExpZ2h0QmxvY2syID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMlwiLFxuICBMaWdodEJsb2NrMyA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzNcIixcbiAgTGlnaHRCbG9jazYgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja182XCIsXG4gIExpZ2h0QmxvY2s3ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfN1wiLFxuICBMaWdodEJsb2NrMTEgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xMVwiLFxuICBTdG9uZSA9IFwibWluZWNyYWZ0OnN0b25lXCIsXG4gIFNhbmQgPSBcIm1pbmVjcmFmdDpzYW5kXCIsXG4gIFJlZFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVcIixcbiAgU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6c2FuZHN0b25lXCIsXG4gIFF1YXJ0ekJsb2NrID0gXCJtaW5lY3JhZnQ6cXVhcnR6X2Jsb2NrXCIsXG4gIFByaXNtYXJpbmUgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lXCIsXG4gIEJ1Y2tldCA9IFwibWluZWNyYWZ0OmJ1Y2tldFwiLFxuICBCdW5kbGUgPSBcIm1pbmVjcmFmdDpidW5kbGVcIixcbiAgQmx1ZUJ1bmRsZSA9IFwibWluZWNyYWZ0OmJsdWVfYnVuZGxlXCIsXG4gIEJsYWNrQnVuZGxlID0gXCJtaW5lY3JhZnQ6YmxhY2tfYnVuZGxlXCIsXG4gIEJyb3duQnVuZGxlID0gXCJtaW5lY3JhZnQ6YnJvd25fYnVuZGxlXCIsXG4gIEN5YW5CdW5kbGUgPSBcIm1pbmVjcmFmdDpjeWFuX2J1bmRsZVwiLFxuICBHcmF5QnVuZGxlID0gXCJtaW5lY3JhZnQ6Z3JheV9idW5kbGVcIixcbiAgR3JlZW5CdW5kbGUgPSBcIm1pbmVjcmFmdDpncmVlbl9idW5kbGVcIixcbiAgTGlnaHRCbHVlQnVuZGxlID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9idW5kbGVcIixcbiAgTGlnaHRHcmF5QnVuZGxlID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9idW5kbGVcIixcbiAgTGltZUJ1bmRsZSA9IFwibWluZWNyYWZ0OmxpbWVfYnVuZGxlXCIsXG4gIE1hZ2VudGFCdW5kbGUgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2J1bmRsZVwiLFxuICBPcmFuZ2VCdW5kbGUgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfYnVuZGxlXCIsXG4gIFBpbmtCdW5kbGUgPSBcIm1pbmVjcmFmdDpwaW5rX2J1bmRsZVwiLFxuICBQdXJwbGVCdW5kbGUgPSBcIm1pbmVjcmFmdDpwdXJwbGVfYnVuZGxlXCIsXG4gIFJlZEJ1bmRsZSA9IFwibWluZWNyYWZ0OnJlZF9idW5kbGVcIixcbiAgV2hpdGVCdW5kbGUgPSBcIm1pbmVjcmFmdDp3aGl0ZV9idW5kbGVcIixcbiAgWWVsbG93QnVuZGxlID0gXCJtaW5lY3JhZnQ6eWVsbG93X2J1bmRsZVwiXG59XG4iLCAiZW51bSBJdGVtQ2F0ZWdvcnkge1xuICBDb25zdHJ1Y3Rpb24gPSBcImNvbnN0cnVjdGlvblwiLFxuICBFcXVpcG1lbnQgPSBcImVxdWlwbWVudFwiLFxuICBJdGVtcyA9IFwiaXRlbXNcIixcbiAgTmF0dXJlID0gXCJuYXR1cmVcIixcbiAgTm9uZSA9IFwibm9uZVwiXG59XG5cbmV4cG9ydCB7IEl0ZW1DYXRlZ29yeSB9O1xuIiwgImVudW0gSXRlbUdyb3VwIHtcbiAgQW52aWwgPSBcIml0ZW1Hcm91cC5uYW1lLmFudmlsXCIsXG4gIEFycm93ID0gXCJpdGVtR3JvdXAubmFtZS5hcnJvd1wiLFxuICBBeGUgPSBcIml0ZW1Hcm91cC5uYW1lLmF4ZVwiLFxuICBCYW5uZXIgPSBcIml0ZW1Hcm91cC5uYW1lLmJhbm5lclwiLFxuICBCYW5uZXJQYXR0ZXJuID0gXCJpdGVtR3JvdXAubmFtZS5iYW5uZXJfcGF0dGVyblwiLFxuICBCZWQgPSBcIml0ZW1Hcm91cC5uYW1lLmJlZFwiLFxuICBCb2F0ID0gXCJpdGVtR3JvdXAubmFtZS5ib2F0XCIsXG4gIEJvb3RzID0gXCJpdGVtR3JvdXAubmFtZS5ib290c1wiLFxuICBCdXR0b25zID0gXCJpdGVtR3JvdXAubmFtZS5idXR0b25zXCIsXG4gIENhbmRsZXMgPSBcIml0ZW1Hcm91cC5uYW1lLmNhbmRsZXNcIixcbiAgQ2hhbGtib2FyZCA9IFwiaXRlbUdyb3VwLm5hbWUuY2hhbGtib2FyZFwiLFxuICBDaGVzdCA9IFwiaXRlbUdyb3VwLm5hbWUuY2hlc3RcIixcbiAgQ2hlc3Rib2F0ID0gXCJpdGVtR3JvdXAubmFtZS5jaGVzdGJvYXRcIixcbiAgQ2hlc3RwbGF0ZSA9IFwiaXRlbUdyb3VwLm5hbWUuY2hlc3RwbGF0ZVwiLFxuICBDb25jcmV0ZSA9IFwiaXRlbUdyb3VwLm5hbWUuY29uY3JldGVcIixcbiAgQ29uY3JldGVQb3dkZXIgPSBcIml0ZW1Hcm91cC5uYW1lLmNvbmNyZXRlUG93ZGVyXCIsXG4gIENvb2tlZEZvb2QgPSBcIml0ZW1Hcm91cC5uYW1lLmNvb2tlZEZvb2RcIixcbiAgQ29wcGVyID0gXCJpdGVtR3JvdXAubmFtZS5jb3BwZXJcIixcbiAgQ29yYWwgPSBcIml0ZW1Hcm91cC5uYW1lLmNvcmFsXCIsXG4gIENvcmFsRGVjb3JhdGlvbnMgPSBcIml0ZW1Hcm91cC5uYW1lLmNvcmFsX2RlY29yYXRpb25zXCIsXG4gIENyb3AgPSBcIml0ZW1Hcm91cC5uYW1lLmNyb3BcIixcbiAgRG9vciA9IFwiaXRlbUdyb3VwLm5hbWUuZG9vclwiLFxuICBEeWUgPSBcIml0ZW1Hcm91cC5uYW1lLmR5ZVwiLFxuICBFbmNoYW50ZWRCb29rID0gXCJpdGVtR3JvdXAubmFtZS5lbmNoYW50ZWRCb29rXCIsXG4gIEZlbmNlID0gXCJpdGVtR3JvdXAubmFtZS5mZW5jZVwiLFxuICBGZW5jZUdhdGUgPSBcIml0ZW1Hcm91cC5uYW1lLmZlbmNlR2F0ZVwiLFxuICBGaXJld29yayA9IFwiaXRlbUdyb3VwLm5hbWUuZmlyZXdvcmtcIixcbiAgRmlyZXdvcmtTdGFycyA9IFwiaXRlbUdyb3VwLm5hbWUuZmlyZXdvcmtTdGFyc1wiLFxuICBGbG93ZXIgPSBcIml0ZW1Hcm91cC5uYW1lLmZsb3dlclwiLFxuICBHbGFzcyA9IFwiaXRlbUdyb3VwLm5hbWUuZ2xhc3NcIixcbiAgR2xhc3NQYW5lID0gXCJpdGVtR3JvdXAubmFtZS5nbGFzc1BhbmVcIixcbiAgR2xhemVkVGVycmFjb3R0YSA9IFwiaXRlbUdyb3VwLm5hbWUuZ2xhemVkVGVycmFjb3R0YVwiLFxuICBHb2F0SG9ybiA9IFwiaXRlbUdyb3VwLm5hbWUuZ29hdEhvcm5cIixcbiAgR3Jhc3MgPSBcIml0ZW1Hcm91cC5uYW1lLmdyYXNzXCIsXG4gIEhhbmdpbmdTaWduID0gXCJpdGVtR3JvdXAubmFtZS5oYW5naW5nX3NpZ25cIixcbiAgSGVsbWV0ID0gXCJpdGVtR3JvdXAubmFtZS5oZWxtZXRcIixcbiAgSG9lID0gXCJpdGVtR3JvdXAubmFtZS5ob2VcIixcbiAgSG9yc2VBcm1vciA9IFwiaXRlbUdyb3VwLm5hbWUuaG9yc2VBcm1vclwiLFxuICBMZWF2ZXMgPSBcIml0ZW1Hcm91cC5uYW1lLmxlYXZlc1wiLFxuICBMZWdnaW5ncyA9IFwiaXRlbUdyb3VwLm5hbWUubGVnZ2luZ3NcIixcbiAgTGluZ2VyaW5nUG90aW9uID0gXCJpdGVtR3JvdXAubmFtZS5saW5nZXJpbmdQb3Rpb25cIixcbiAgTG9nID0gXCJpdGVtR3JvdXAubmFtZS5sb2dcIixcbiAgTWluZWNhcnQgPSBcIml0ZW1Hcm91cC5uYW1lLm1pbmVjYXJ0XCIsXG4gIE1pc2NGb29kID0gXCJpdGVtR3JvdXAubmFtZS5taXNjRm9vZFwiLFxuICBNb2JFZ2cgPSBcIml0ZW1Hcm91cC5uYW1lLm1vYkVnZ1wiLFxuICBNb25zdGVyU3RvbmVFZ2cgPSBcIml0ZW1Hcm91cC5uYW1lLm1vbnN0ZXJTdG9uZUVnZ1wiLFxuICBNdXNocm9vbSA9IFwiaXRlbUdyb3VwLm5hbWUubXVzaHJvb21cIixcbiAgTmV0aGVyV2FydEJsb2NrID0gXCJpdGVtR3JvdXAubmFtZS5uZXRoZXJXYXJ0QmxvY2tcIixcbiAgT3JlID0gXCJpdGVtR3JvdXAubmFtZS5vcmVcIixcbiAgUGVybWlzc2lvbiA9IFwiaXRlbUdyb3VwLm5hbWUucGVybWlzc2lvblwiLFxuICBQaWNrYXhlID0gXCJpdGVtR3JvdXAubmFtZS5waWNrYXhlXCIsXG4gIFBsYW5rcyA9IFwiaXRlbUdyb3VwLm5hbWUucGxhbmtzXCIsXG4gIFBvdGlvbiA9IFwiaXRlbUdyb3VwLm5hbWUucG90aW9uXCIsXG4gIFBvdHRlcnlTaGVyZHMgPSBcIml0ZW1Hcm91cC5uYW1lLnBvdHRlcnlTaGVyZHNcIixcbiAgUHJlc3N1cmVQbGF0ZSA9IFwiaXRlbUdyb3VwLm5hbWUucHJlc3N1cmVQbGF0ZVwiLFxuICBSYWlsID0gXCJpdGVtR3JvdXAubmFtZS5yYWlsXCIsXG4gIFJhd0Zvb2QgPSBcIml0ZW1Hcm91cC5uYW1lLnJhd0Zvb2RcIixcbiAgUmVjb3JkID0gXCJpdGVtR3JvdXAubmFtZS5yZWNvcmRcIixcbiAgU2FuZHN0b25lID0gXCJpdGVtR3JvdXAubmFtZS5zYW5kc3RvbmVcIixcbiAgU2FwbGluZyA9IFwiaXRlbUdyb3VwLm5hbWUuc2FwbGluZ1wiLFxuICBTY3VsayA9IFwiaXRlbUdyb3VwLm5hbWUuc2N1bGtcIixcbiAgU2VlZCA9IFwiaXRlbUdyb3VwLm5hbWUuc2VlZFwiLFxuICBTaG92ZWwgPSBcIml0ZW1Hcm91cC5uYW1lLnNob3ZlbFwiLFxuICBTaHVsa2VyQm94ID0gXCJpdGVtR3JvdXAubmFtZS5zaHVsa2VyQm94XCIsXG4gIFNpZ24gPSBcIml0ZW1Hcm91cC5uYW1lLnNpZ25cIixcbiAgU2t1bGwgPSBcIml0ZW1Hcm91cC5uYW1lLnNrdWxsXCIsXG4gIFNsYWIgPSBcIml0ZW1Hcm91cC5uYW1lLnNsYWJcIixcbiAgU21pdGhpbmdUZW1wbGF0ZXMgPSBcIml0ZW1Hcm91cC5uYW1lLnNtaXRoaW5nX3RlbXBsYXRlc1wiLFxuICBTcGxhc2hQb3Rpb24gPSBcIml0ZW1Hcm91cC5uYW1lLnNwbGFzaFBvdGlvblwiLFxuICBTdGFpbmVkQ2xheSA9IFwiaXRlbUdyb3VwLm5hbWUuc3RhaW5lZENsYXlcIixcbiAgU3RhaXJzID0gXCJpdGVtR3JvdXAubmFtZS5zdGFpcnNcIixcbiAgU3RvbmUgPSBcIml0ZW1Hcm91cC5uYW1lLnN0b25lXCIsXG4gIFN0b25lQnJpY2sgPSBcIml0ZW1Hcm91cC5uYW1lLnN0b25lQnJpY2tcIixcbiAgU3dvcmQgPSBcIml0ZW1Hcm91cC5uYW1lLnN3b3JkXCIsXG4gIFRyYXBkb29yID0gXCJpdGVtR3JvdXAubmFtZS50cmFwZG9vclwiLFxuICBXYWxscyA9IFwiaXRlbUdyb3VwLm5hbWUud2FsbHNcIixcbiAgV29vZCA9IFwiaXRlbUdyb3VwLm5hbWUud29vZFwiLFxuICBXb29sID0gXCJpdGVtR3JvdXAubmFtZS53b29sXCIsXG4gIFdvb2xDYXJwZXQgPSBcIml0ZW1Hcm91cC5uYW1lLndvb2xDYXJwZXRcIlxufVxuXG5leHBvcnQgeyBJdGVtR3JvdXAgfTtcbiIsICJlbnVtIEl0ZW1Ub29sVGllciB7XG4gIE5vbmUsXG4gIFdvb2RlbixcbiAgU3RvbmUsXG4gIElyb24sXG4gIEdvbGQsXG4gIERpYW1vbmQsXG4gIE5ldGhlcml0ZVxufVxuXG5leHBvcnQgeyBJdGVtVG9vbFRpZXIgfTtcbiIsICJlbnVtIEl0ZW1Ub29sVHlwZSB7XG4gIE5vbmUsXG4gIEF4ZSxcbiAgSG9lLFxuICBTaG92ZWwsXG4gIFN3b3JkLFxuICBQaWNrYXhlXG59XG5cbmV4cG9ydCB7IEl0ZW1Ub29sVHlwZSB9O1xuIiwgImVudW0gQmxvY2tUb29sVHlwZSB7XG4gIE5vbmUsXG4gIFN3b3JkLFxuICBTaG92ZWwsXG4gIFBpY2theGUsXG4gIEF4ZSxcbiAgSG9lLFxuICBTaGVhcnNcbn1cblxuZXhwb3J0IHsgQmxvY2tUb29sVHlwZSB9O1xuIiwgImVudW0gSXRlbVVzZU1ldGhvZCB7XG4gIENsaWNrLFxuICBCcmVhayxcbiAgUGxhY2UsXG4gIFVzZVxufVxuXG5leHBvcnQgeyBJdGVtVXNlTWV0aG9kIH07XG4iLCAiaW1wb3J0IHsgSXRlbVVzZU9uRW50aXR5SW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmVudW0gRW50aXR5SW50ZXJhY3RNZXRob2Qge1xuICBJbnRlcmFjdCA9IEl0ZW1Vc2VPbkVudGl0eUludmVudG9yeVRyYW5zYWN0aW9uVHlwZS5JbnRlcmFjdCxcbiAgQXR0YWNrID0gSXRlbVVzZU9uRW50aXR5SW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlLkF0dGFja1xufVxuXG5leHBvcnQgeyBFbnRpdHlJbnRlcmFjdE1ldGhvZCB9O1xuIiwgImVudW0gQ2FyZGluYWxEaXJlY3Rpb24ge1xuICBOb3J0aCA9IDMsXG4gIEVhc3QgPSAwLFxuICBTb3V0aCA9IDIsXG4gIFdlc3QgPSAxXG59XG5cbmV4cG9ydCB7IENhcmRpbmFsRGlyZWN0aW9uIH07XG4iLCAiZW51bSBXb3JsZEV2ZW50IHtcbiAgV29ybGRJbml0aWFsaXplLFxuICBXb3JsZFRpY2ssXG4gIENodW5rUmVhZHksXG4gIEhlYWx0aENoYW5nZWQsXG4gIEVudGl0eVNwYXduZWQsXG4gIEVudGl0eURlc3Bhd25lZCxcbiAgRW50aXR5RGllLFxuICBFbnRpdHlGbGFnVXBkYXRlLFxuICBFbnRpdHlEaW1lbnNpb25DaGFuZ2UsXG4gIEVudGl0eU1ldGFkYXRhVXBkYXRlLFxuICBFbnRpdHlBdHRyaWJ1dGVVcGRhdGUsXG4gIEVudGl0eUhpdCxcbiAgRW50aXR5SHVydCxcbiAgRWZmZWN0QWRkLFxuICBFZmZlY3RSZW1vdmUsXG4gIFBsYXllckpvaW4sXG4gIFBsYXllckxlYXZlLFxuICBQbGF5ZXJDaGF0LFxuICBQbGF5ZXJQbGFjZUJsb2NrLFxuICBQbGF5ZXJCcmVha0Jsb2NrLFxuICBQbGF5ZXJEcm9wSXRlbSxcbiAgUGxheWVyR2FtZW1vZGVDaGFuZ2UsXG4gIFBsYXllckFiaWxpdHlVcGRhdGUsXG4gIFBsYXllclN0YXJ0VXNpbmdJdGVtLFxuICBQbGF5ZXJTdG9wVXNpbmdJdGVtLFxuICBQbGF5ZXJVc2VJdGVtLFxuICBQbGF5ZXJTdGFydEVtb3RpbmcsXG4gIFBsYXllclN0b3BFbW90aW5nLFxuICBQbGF5ZXJJbnRlcmFjdFdpdGhCbG9jayxcbiAgUGxheWVySW50ZXJhY3RXaXRoRW50aXR5LFxuICBQbGF5ZXJPcGVuZWRDb250YWluZXIsXG4gIEJsb2NrVXBkYXRlXG59XG5cbmV4cG9ydCB7IFdvcmxkRXZlbnQgfTtcbiIsICJlbnVtIFNlcnZlckV2ZW50IHtcbiAgU3RhcnQgPSAxMDAwLFxuICBTdG9wXG59XG5cbmV4cG9ydCB7IFNlcnZlckV2ZW50IH07XG4iLCAiaW1wb3J0IHR5cGUgeyBTZXJlbml0eSB9IGZyb20gXCIuLi9zZXJlbml0eVwiO1xuaW1wb3J0IHR5cGUgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhUGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB0eXBlIHsgTmV0d29yayB9IGZyb20gXCIuXCI7XG5cbmNsYXNzIE5ldHdvcmtIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYWNrZXQgdGhhdCB0aGUgbmV0d29yayBoYW5kbGVyIGlzIGxpc3RlbmluZyBmb3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldDogUGFja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2UgdGhhdCB0aGUgbmV0d29yayBoYW5kbGVyIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaW5zdGFuY2UgdGhhdCB0aGUgbmV0d29yayBoYW5kbGVyIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IE5ldHdvcms7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbmV0d29yayBoYW5kbGVyIHdpdGggdGhlIHNwZWNpZmllZCBzZXJlbml0eSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBpbnN0YW5jZSB0aGF0IHRoZSBuZXR3b3JrIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc2VyZW5pdHk6IFNlcmVuaXR5KSB7XG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuICAgIHRoaXMubmV0d29yayA9IHNlcmVuaXR5Lm5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIHBhY2tldCBhbiBpbmNvbWluZyBwYWNrZXQgZnJvbSBhIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSBwYWNrZXQgVGhlIHBhY2tldCB0byBoYW5kbGUuXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSByYWtuZXQgY29ubmVjdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYmVpbmcgc2VudCBmcm9tLlxuICAgKi9cbiAgcHVibGljIGhhbmRsZShfcGFja2V0OiBEYXRhUGFja2V0LCBfY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldHdvcmtIYW5kbGVyLmhhbmRsZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFcIik7XG4gIH1cbn1cblxuZXhwb3J0IHsgTmV0d29ya0hhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBBbmltYXRlUGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcblxuY2xhc3MgQW5pbWF0ZUhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkFuaW1hdGU7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IEFuaW1hdGVQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5wbGF5ZXJzLmdldChjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBhbmltYXRpb24gdG8gYWxsIHBsYXllcnNcbiAgICBwbGF5ZXIuZGltZW5zaW9uLmJyb2FkY2FzdEV4Y2VwdChwbGF5ZXIsIHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5pbWF0ZUhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBDb250YWluZXJDbG9zZVBhY2tldCwgUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5cbmNsYXNzIENvbnRhaW5lckNsb3NlSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuQ29udGFpbmVyQ2xvc2U7XG5cbiAgcHVibGljIGhhbmRsZShfOiBDb250YWluZXJDbG9zZVBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGJ5IHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIGFuIG9wZW5lZCBjb250YWluZXJcbiAgICBpZiAoIXBsYXllci5vcGVuZWRDb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIENsb3NlIHRoZSBjb250YWluZXJcbiAgICBwbGF5ZXIub3BlbmVkQ29udGFpbmVyLmNsb3NlKHBsYXllcik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29udGFpbmVyQ2xvc2VIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHsgRGlzY29ubmVjdFBhY2tldCwgUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBQbGF5ZXJMZWF2ZVNpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcblxuY2xhc3MgRGlzY29ubmVjdEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkRpc2Nvbm5lY3Q7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IERpc2Nvbm5lY3RQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBieSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBDcmVhdGUgYSBQbGF5ZXJMZWF2ZVNpZ25hbFxuICAgIG5ldyBQbGF5ZXJMZWF2ZVNpZ25hbChcbiAgICAgIHBsYXllcixcbiAgICAgIHBhY2tldC5yZWFzb24sXG4gICAgICBwYWNrZXQubWVzc2FnZS5tZXNzYWdlID8/IFN0cmluZygpXG4gICAgKS5lbWl0KCk7XG5cbiAgICAvLyBEZXNwYXduIHRoZSBwbGF5ZXJcbiAgICBwbGF5ZXIuZGVzcGF3bigpO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBkaW1lbnNpb25cbiAgICBjb25zdCBkaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uO1xuXG4gICAgLy8gU2F2ZSB0aGUgcGxheWVyJ3MgZGF0YVxuICAgIGRpbWVuc2lvbi53b3JsZC5wcm92aWRlci53cml0ZVBsYXllcihwbGF5ZXIuZ2V0RGF0YUVudHJ5KCksIGRpbWVuc2lvbik7XG5cbiAgICAvLyBMb2cgdGhlIGxlYXZlIGV2ZW50IHRvIHRoZSBjb25zb2xlXG4gICAgZGltZW5zaW9uLndvcmxkLmxvZ2dlci5pbmZvKFxuICAgICAgYMKnOFvCpzkke3BsYXllci51c2VybmFtZX3CpzhdIEV2ZW50OsKnciBQbGF5ZXIgbGVmdCB0aGUgc2VydmVyLmBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IERpc2Nvbm5lY3RIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcblxuY2xhc3MgRXZlbnRTaWduYWwge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25hbC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25hbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEV2ZW50U2lnbmFsKVxuICAgIC5pZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgaW5zdGFuY2UgdGhlIHNpZ25hbCB3YXMgZW1pdHRlZCBpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JsZDogV29ybGQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc2lnbmFsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIGluc3RhbmNlIHRoZSBzaWduYWwgd2FzIGVtaXR0ZWQgaW4uXG4gICAqIEByZXR1cm5zIEEgbmV3IHNpZ25hbCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3JsZDogV29ybGQpIHtcbiAgICB0aGlzLndvcmxkID0gd29ybGQ7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNpZ25hbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgc2lnbmFsIHdhcyBlbWl0dGVkIHN1Y2Nlc3NmdWxseTsgZGVmYXVsdCBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGVtaXQoKTogYm9vbGVhbiB7XG4gICAgLy8gRW1pdCB0aGUgc2lnbmFsIGluIHRoZSB3b3JsZCBhbmQgc2VydmVyXG4gICAgY29uc3Qgd29ybGQgPSB0aGlzLndvcmxkLmVtaXQodGhpcy5pZGVudGlmaWVyLCB0aGlzKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLndvcmxkLnNlcmVuaXR5LmVtaXQodGhpcy5pZGVudGlmaWVyLCB0aGlzKTtcblxuICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBzaWduYWwgd2FzIGVtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgcmV0dXJuIHdvcmxkICYmIHNlcnZlcjtcbiAgfVxufVxuXG5leHBvcnQgeyBFdmVudFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgV29ybGRJbml0aWFsaXplU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZTtcbn1cblxuZXhwb3J0IHsgV29ybGRJbml0aWFsaXplU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5cbmNsYXNzIFdvcmxkVGlja1NpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5Xb3JsZFRpY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRpY2sgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRUaWNrOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGRlbHRhIGJldHdlZW4gdGhlIGN1cnJlbnQgdGljayBhbmQgdGhlIGxhc3QgdGljay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWx0YVRpY2s6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHdvcmxkIHRoYXQgaGFzIGJlZW4gdGlja2VkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB3b3JsZCB0aWNrIHNpZ25hbC5cbiAgICogQHBhcmFtIGN1cnJlbnRUaWNrIFRoZSBjdXJyZW50IHRpY2sgb2YgdGhlIHdvcmxkLlxuICAgKiBAcGFyYW0gZGVsdGFUaWNrIFRoZSB0aW1lIGRlbHRhIGJldHdlZW4gdGhlIGN1cnJlbnQgdGljayBhbmQgdGhlIGxhc3QgdGljay5cbiAgICogQHBhcmFtIHdvcmxkIFRoZSB3b3JsZCB0aGF0IGhhcyBiZWVuIHRpY2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjdXJyZW50VGljazogYmlnaW50LCBkZWx0YVRpY2s6IGJpZ2ludCwgd29ybGQ6IFdvcmxkKSB7XG4gICAgc3VwZXIod29ybGQpO1xuICAgIHRoaXMuY3VycmVudFRpY2sgPSBjdXJyZW50VGljaztcbiAgICB0aGlzLmRlbHRhVGljayA9IGRlbHRhVGljaztcbiAgICB0aGlzLndvcmxkID0gd29ybGQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgV29ybGRUaWNrU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgQ2h1bmssIERpbWVuc2lvbiB9IGZyb20gXCIuLi93b3JsZFwiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBDaHVua1JlYWR5U2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LkNodW5rUmVhZHk7XG5cbiAgLyoqXG4gICAqIFRoZSBjaHVuayB0aGF0IGlzIHJlYWR5IHRvIGJlIGJyb2FkY2FzdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNodW5rOiBDaHVuaztcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiB0aGF0IHRoZSBjaHVuayBpcyBpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkaW1lbnNpb246IERpbWVuc2lvbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjaHVuayByZWFkeSBzaWduYWwuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0aGF0IHRoZSBjaHVuayBpcyBpbi5cbiAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0aGF0IGlzIHJlYWR5IHRvIGJlIGJyb2FkY2FzdGVkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRpbWVuc2lvbjogRGltZW5zaW9uLCBjaHVuazogQ2h1bmspIHtcbiAgICBzdXBlcihkaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMuZGltZW5zaW9uID0gZGltZW5zaW9uO1xuICAgIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgfVxufVxuXG5leHBvcnQgeyBDaHVua1JlYWR5U2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5pbXBvcnQgdHlwZSB7IERpbWVuc2lvbiB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbi8qKlxuICogU2lnbmFsIGVtaXR0ZWQgd2hlbiBhbiBlbnRpdHkgc3Bhd25zLlxuICovXG5jbGFzcyBFbnRpdHlTcGF3bmVkU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LkVudGl0eVNwYXduZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCBzcGF3bmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHRoZSBlbnRpdHkgc3Bhd25lZCBpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkaW1lbnNpb246IERpbWVuc2lvbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgc3Bhd25lZCBzaWduYWwuXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0aGF0IHNwYXduZWQuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0aGUgZW50aXR5IHNwYXduZWQgaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHksIGRpbWVuc2lvbjogRGltZW5zaW9uKSB7XG4gICAgc3VwZXIoZW50aXR5LmRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5U3Bhd25lZFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuaW1wb3J0IHR5cGUgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG4vKipcbiAqIFNpZ25hbCBlbWl0dGVkIHdoZW4gYW4gZW50aXR5IGRlc3Bhd25zLlxuICovXG5jbGFzcyBFbnRpdHlEZXNwYXduZWRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuRW50aXR5RGVzcGF3bmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgZGVzcGF3bmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHRoZSBlbnRpdHkgZGVzcGF3bmVkIGluLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBkZXNwYXduZWQgc2lnbmFsLlxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdGhhdCBkZXNwYXduZWQuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0aGUgZW50aXR5IGRlc3Bhd25lZCBpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSwgZGltZW5zaW9uOiBEaW1lbnNpb24pIHtcbiAgICBzdXBlcihlbnRpdHkuZGltZW5zaW9uLndvcmxkKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlEZXNwYXduZWRTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBBY3RvckZsYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBFbnRpdHlGbGFnVXBkYXRlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuRW50aXR5RmxhZ1VwZGF0ZTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSBpbiB3aGljaCB0aGUgZmxhZyB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGZsYWcgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmbGFnOiBBY3RvckZsYWc7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWcuXG4gICAqL1xuICBwdWJsaWMgdmFsdWU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgZmxhZyB1cGRhdGUgZXZlbnQuXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSBpbiB3aGljaCB0aGUgZmxhZyB3YXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWcuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHksIGZsYWc6IEFjdG9yRmxhZywgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICBzdXBlcihlbnRpdHkuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgdGhpcy5mbGFnID0gZmxhZztcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5RmxhZ1VwZGF0ZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEFjdG9yRGF0YUlkLCBEYXRhSXRlbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuRW50aXR5TWV0YWRhdGFVcGRhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgaW4gd2hpY2ggdGhlIG1ldGFkYXRhIHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEga2V5IHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkga2V5OiBBY3RvckRhdGFJZDtcblxuICAvKipcbiAgICogVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbWV0YWRhdGEuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YUl0ZW06IERhdGFJdGVtO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IG1ldGFkYXRhIHVwZGF0ZSBldmVudC5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IGluIHdoaWNoIHRoZSBtZXRhZGF0YSB3YXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGtleSBUaGUgbWV0YWRhdGEga2V5IHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBkYXRhSXRlbSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBtZXRhZGF0YS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSwga2V5OiBBY3RvckRhdGFJZCwgZGF0YUl0ZW06IERhdGFJdGVtKSB7XG4gICAgc3VwZXIoZW50aXR5LmdldFdvcmxkKCkpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuZGF0YUl0ZW0gPSBkYXRhSXRlbTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlNZXRhZGF0YVVwZGF0ZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEF0dHJpYnV0ZSwgQXR0cmlidXRlTmFtZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eUF0dHJpYnV0ZVVwZGF0ZVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5FbnRpdHlBdHRyaWJ1dGVVcGRhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgaW4gd2hpY2ggdGhlIGF0dHJpYnV0ZSB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZSB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF0dHJpYnV0ZTogQXR0cmlidXRlTmFtZTtcblxuICAvKipcbiAgICogVGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBBdHRyaWJ1dGU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgYXR0cmlidXRlIHVwZGF0ZSBldmVudC5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IGluIHdoaWNoIHRoZSBhdHRyaWJ1dGUgd2FzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGF0dHJpYnV0ZTogQXR0cmlidXRlTmFtZSxcbiAgICB2YWx1ZTogQXR0cmlidXRlXG4gICkge1xuICAgIHN1cGVyKGVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5QXR0cmlidXRlVXBkYXRlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJKb2luU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllckpvaW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgam9pbmluZyB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxheWVyIGpvaW4gZXZlbnQgc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgam9pbmluZyB0aGUgd29ybGQuLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIocGxheWVyLmRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVySm9pblNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuaW1wb3J0IHR5cGUgeyBEaXNjb25uZWN0UmVhc29uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmNsYXNzIFBsYXllckxlYXZlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllckxlYXZlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIGxlYXZpbmcgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVhc29uIHRoZSBwbGF5ZXIgbGVmdCB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVhc29uOiBEaXNjb25uZWN0UmVhc29uO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSB0aGF0IHdhcyBkaXNwbGF5ZWQgdG8gdGhlIHBsYXllciwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxheWVyIGpvaW4gZXZlbnQgc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgbGVhdmluZyB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiB0aGUgcGxheWVyIGxlZnQgdGhlIHdvcmxkLlxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0aGF0IHdhcyBkaXNwbGF5ZWQgdG8gdGhlIHBsYXllciwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICByZWFzb246IERpc2Nvbm5lY3RSZWFzb24sXG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHBsYXllci5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyTGVhdmVTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllckNoYXRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyQ2hhdDtcblxuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHNlbnQgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRoYXQgd2FzIHNlbnQuXG4gICAqL1xuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQbGF5ZXJDaGF0U2lnbmFsIGNsYXNzLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBzZW50IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0aGF0IHdhcyBzZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihwbGF5ZXIuZGltZW5zaW9uLndvcmxkKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckNoYXRTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmltcG9ydCB0eXBlIHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQgdHlwZSB7IEJsb2NrIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5cbmNsYXNzIEJsb2NrVXBkYXRlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPSBXb3JsZEV2ZW50LkJsb2NrVXBkYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9jazogQmxvY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gdGhlIGJsb2NrIHdhcyB1cGRhdGVkIGluLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGJsb2NrIHVwZGF0ZSBzaWduYWwuXG4gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRoZSBibG9jayB3YXMgdXBkYXRlZCBpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihibG9jazogQmxvY2spIHtcbiAgICBzdXBlcihibG9jay5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMuYmxvY2sgPSBibG9jaztcbiAgICB0aGlzLmRpbWVuc2lvbiA9IGJsb2NrLmRpbWVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja1VwZGF0ZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgQmxvY2tVcGRhdGVTaWduYWwgfSBmcm9tIFwiLi9ibG9jay11cGRhdGVcIjtcblxuaW1wb3J0IHR5cGUgeyBCbG9jaywgQmxvY2tQZXJtdXRhdGlvbiB9IGZyb20gXCIuLi9ibG9ja1wiO1xuaW1wb3J0IHR5cGUgeyBCbG9ja0ZhY2UsIFZlY3RvcjNmIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmNsYXNzIFBsYXllclBsYWNlQmxvY2tTaWduYWwgZXh0ZW5kcyBCbG9ja1VwZGF0ZVNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyUGxhY2VCbG9jaztcblxuICAvKipcbiAgICogVGhlIGZhY2Ugb2YgdGhlIGJsb2NrIHRoZSBuZXcgYmxvY2sgaXMgYmVpbmcgcGxhY2VkIG9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZhY2U6IEJsb2NrRmFjZTtcblxuICAvKipcbiAgICogTG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJvdHRvbSBub3J0aC13ZXN0IGNvcm5lciBvZiB0aGUgYmxvY2sgd2hlcmUgdGhlIG5ldyBibG9jayBpcyBiZWluZyBwbGFjZWQgb250by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmYWNlTG9jYXRpb246IFZlY3RvcjNmO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrIGJlaW5nIHBsYWNlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZXJtdXRhdGlvbkJlaW5nUGxhY2VkOiBCbG9ja1Blcm11dGF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHBsYWNpbmcgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsYXllciBwbGFjZSBibG9jayBzaWduYWwuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciBwbGFjaW5nIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHBlcm11dGF0aW9uQmVpbmdQbGFjZWQgVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9jayBiZWluZyBwbGFjZWQuXG4gICAqIEBwYXJhbSBmYWNlIFRoZSBmYWNlIG9mIHRoZSBibG9jayB0aGUgbmV3IGJsb2NrIGlzIGJlaW5nIHBsYWNlZCBvbi5cbiAgICogQHBhcmFtIGZhY2VMb2NhdGlvbiBMb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgYm90dG9tIG5vcnRoLXdlc3QgY29ybmVyIG9mIHRoZSBibG9jayB3aGVyZSB0aGUgbmV3IGJsb2NrIGlzIGJlaW5nIHBsYWNlZCBvbnRvLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGJsb2NrOiBCbG9jayxcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBwZXJtdXRhdGlvbkJlaW5nUGxhY2VkOiBCbG9ja1Blcm11dGF0aW9uLFxuICAgIGZhY2U6IEJsb2NrRmFjZSxcbiAgICBmYWNlTG9jYXRpb246IFZlY3RvcjNmXG4gICkge1xuICAgIHN1cGVyKGJsb2NrKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLnBlcm11dGF0aW9uQmVpbmdQbGFjZWQgPSBwZXJtdXRhdGlvbkJlaW5nUGxhY2VkO1xuICAgIHRoaXMuZmFjZSA9IGZhY2U7XG4gICAgdGhpcy5mYWNlTG9jYXRpb24gPSBmYWNlTG9jYXRpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyUGxhY2VCbG9ja1NpZ25hbCB9O1xuIiwgImltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgQmxvY2tVcGRhdGVTaWduYWwgfSBmcm9tIFwiLi9ibG9jay11cGRhdGVcIjtcblxuaW1wb3J0IHR5cGUgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHR5cGUgeyBCbG9jayB9IGZyb20gXCIuLi9ibG9ja1wiO1xuXG5jbGFzcyBQbGF5ZXJCcmVha0Jsb2NrU2lnbmFsIGV4dGVuZHMgQmxvY2tVcGRhdGVTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllckJyZWFrQmxvY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgcGxhY2luZyB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHN0YWNrIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBicmVhayB0aGUgYmxvY2ssIG9yIG51bGwgaWYgZW1wdHkgaGFuZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtU3RhY2s6IEl0ZW1TdGFjayB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxheWVyIGJyZWFrIGJsb2NrIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGJyZWFraW5nIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB0aGF0IGlzIGJlaW5nIHVzZWQgdG8gYnJlYWsgdGhlIGJsb2NrLCBvciBudWxsIGlmIGVtcHR5IGhhbmQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgYmxvY2s6IEJsb2NrLFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIGl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihibG9jayk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5pdGVtU3RhY2sgPSBpdGVtU3RhY2s7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyQnJlYWtCbG9ja1NpZ25hbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllckRyb3BJdGVtU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllckRyb3BJdGVtO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgZHJvcHBlZCB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gc3RhY2sgdGhhdCB3YXMgZHJvcHBlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtU3RhY2s6IEl0ZW1TdGFjaztcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBpdGVtcyB0aGF0IHdlcmUgZHJvcHBlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhbW91bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbGF5ZXIgZHJvcCBpdGVtIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgZHJvcHBlZCB0aGUgaXRlbS5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB0aGF0IHdhcyBkcm9wcGVkLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgb2YgaXRlbXMgdGhhdCB3ZXJlIGRyb3BwZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGl0ZW1TdGFjazogSXRlbVN0YWNrLCBhbW91bnQ6IG51bWJlcikge1xuICAgIHN1cGVyKHBsYXllci5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICAgIHRoaXMuYW1vdW50ID0gYW1vdW50O1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckRyb3BJdGVtU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQWJpbGl0eUluZGV4IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyQWJpbGl0eVVwZGF0ZVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJBYmlsaXR5VXBkYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIGluIHdoaWNoIHRoZSBhYmlsaXR5IHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJpbGl0eSB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFiaWxpdHk6IEFiaWxpdHlJbmRleDtcblxuICAvKipcbiAgICogVGhlIG5ldyB2YWx1ZSBvZiB0aGUgYWJpbGl0eS5cbiAgICovXG4gIHB1YmxpYyB2YWx1ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsYXllciBhYmlsaXR5IHVwZGF0ZSBldmVudC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGluIHdoaWNoIHRoZSBhYmlsaXR5IHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gYWJpbGl0eSBUaGUgYWJpbGl0eSB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgYWJpbGl0eS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgYWJpbGl0eTogQWJpbGl0eUluZGV4LCB2YWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyKHBsYXllci5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLmFiaWxpdHkgPSBhYmlsaXR5O1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVVzZU1ldGhvZCwgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyU3RhcnRVc2luZ0l0ZW1TaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyU3RhcnRVc2luZ0l0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCBzdGFydGVkIHVzaW5nIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBwbGF5ZXIgc3RhcnRlZCB1c2luZy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtU3RhY2s6IEl0ZW1TdGFjaztcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCB0aGF0IHRoZSBwbGF5ZXIgc3RhcnRlZCB1c2luZyB0aGUgaXRlbSB3aXRoLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZU1ldGhvZDogSXRlbVVzZU1ldGhvZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbGF5ZXIgc3RhcnQgdXNpbmcgaXRlbSBzaWduYWwuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHN0YXJ0ZWQgdXNpbmcgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSBpdGVtU3RhY2sgVGhlIGl0ZW0gc3RhY2sgdGhhdCB0aGUgcGxheWVyIHN0YXJ0ZWQgdXNpbmcuXG4gICAqIEBwYXJhbSB1c2VNZXRob2QgVGhlIG1ldGhvZCB0aGF0IHRoZSBwbGF5ZXIgc3RhcnRlZCB1c2luZyB0aGUgaXRlbSB3aXRoLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIGl0ZW1TdGFjazogSXRlbVN0YWNrLFxuICAgIHVzZU1ldGhvZDogSXRlbVVzZU1ldGhvZFxuICApIHtcbiAgICBzdXBlcihwbGF5ZXIuZGltZW5zaW9uLndvcmxkKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLml0ZW1TdGFjayA9IGl0ZW1TdGFjaztcbiAgICB0aGlzLnVzZU1ldGhvZCA9IHVzZU1ldGhvZDtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllclN0b3BVc2luZ0l0ZW1TaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyU3RvcFVzaW5nSXRlbTtcblxuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHN0b3BwZWQgdXNpbmcgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHN0YWNrIHRoYXQgdGhlIHBsYXllciBzdG9wcGVkIHVzaW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1TdGFjazogSXRlbVN0YWNrO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsYXllciBzdGFydCB1c2luZyBpdGVtIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgc3RvcHBlZCB1c2luZyB0aGUgaXRlbS5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBwbGF5ZXIgc3RvcHBlZCB1c2luZy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgaXRlbVN0YWNrOiBJdGVtU3RhY2spIHtcbiAgICBzdXBlcihwbGF5ZXIuZGltZW5zaW9uLndvcmxkKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLml0ZW1TdGFjayA9IGl0ZW1TdGFjaztcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJTdG9wVXNpbmdJdGVtU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVVzZU1ldGhvZCwgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyVXNlSXRlbVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJVc2VJdGVtO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgdXNlZCB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gc3RhY2sgdGhhdCB0aGUgcGxheWVyIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbVN0YWNrOiBJdGVtU3RhY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZWQgdGhlIGl0ZW0gd2l0aC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VNZXRob2Q6IEl0ZW1Vc2VNZXRob2Q7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxheWVyIHVzZSBpdGVtIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgdXNlZCB0aGUgaXRlbS5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBwbGF5ZXIgdXNlZC5cbiAgICogQHBhcmFtIHVzZU1ldGhvZCBUaGUgbWV0aG9kIHRoYXQgdGhlIHBsYXllciB1c2VkIHRoZSBpdGVtIHdpdGguXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgaXRlbVN0YWNrOiBJdGVtU3RhY2ssXG4gICAgdXNlTWV0aG9kOiBJdGVtVXNlTWV0aG9kXG4gICkge1xuICAgIHN1cGVyKHBsYXllci5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICAgIHRoaXMudXNlTWV0aG9kID0gdXNlTWV0aG9kO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllclVzZUl0ZW1TaWduYWwgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllclN0YXJ0RW1vdGluZztcblxuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHN0YXJ0ZWQgZW1vdGluZy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGVtb3RlIHRoZSBwbGF5ZXIgc3RhcnRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbW90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIGVtb3RlIGluIHRpY2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpY2tMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsYXllciBzdGFydCBlbW90aW5nIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgc3RhcnRlZCBlbW90aW5nLlxuICAgKiBAcGFyYW0gZW1vdGUgVGhlIGVtb3RlIHRoZSBwbGF5ZXIgc3RhcnRlZC5cbiAgICogQHBhcmFtIHRpY2tMZW5ndGggVGhlIGR1cmF0aW9uIG9mIHRoZSBlbW90ZSBpbiB0aWNrcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZW1vdGU6IHN0cmluZywgdGlja0xlbmd0aDogbnVtYmVyKSB7XG4gICAgc3VwZXIocGxheWVyLmdldFdvcmxkKCkpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuZW1vdGUgPSBlbW90ZTtcbiAgICB0aGlzLnRpY2tMZW5ndGggPSB0aWNrTGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyU3RvcEVtb3RpbmdTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJTdG9wRW1vdGluZztcblxuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHN0YXJ0ZWQgZW1vdGluZy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGVtb3RlIHRoZSBwbGF5ZXIgc3RhcnRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbW90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGxheWVyIHN0b3AgZW1vdGluZyBzaWduYWwuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHN0b3BwZWQgZW1vdGluZy5cbiAgICogQHBhcmFtIGVtb3RlIFRoZSBlbW90ZSB0aGUgcGxheWVyIHN0b3BwZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGVtb3RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihwbGF5ZXIuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5lbW90ZSA9IGVtb3RlO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllclN0b3BFbW90aW5nU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4uL2VmZmVjdFwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBFZmZlY3RBZGRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuRWZmZWN0QWRkO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHdoZXJlIHRoZSBlZmZlY3Qgd2FzIGFkZGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBlZmZlY3QgdGhhdCB3YXMgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0OiBFZmZlY3Q7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5LCBlZmZlY3Q6IEVmZmVjdCkge1xuICAgIHN1cGVyKGVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmVmZmVjdCA9IGVmZmVjdDtcbiAgfVxufVxuXG5leHBvcnQgeyBFZmZlY3RBZGRTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgRWZmZWN0UmVtb3ZlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPSBXb3JsZEV2ZW50LkVmZmVjdFJlbW92ZTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB3aGVyZSB0aGUgZWZmZWN0IHdhcyByZW1vdmVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBlZmZlY3QgdGhhdCB3YXMgcmVtb3ZlZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdDogRWZmZWN0VHlwZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHksIGVmZmVjdDogRWZmZWN0VHlwZSkge1xuICAgIHN1cGVyKGVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmVmZmVjdCA9IGVmZmVjdDtcbiAgfVxufVxuXG5leHBvcnQgeyBFZmZlY3RSZW1vdmVTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBHYW1lbW9kZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllckdhbWVtb2RlQ2hhbmdlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPVxuICAgIFdvcmxkRXZlbnQuUGxheWVyR2FtZW1vZGVDaGFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCBoYXMgY2hhbmdlZCBoaXMgZ2FtZW1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBnYW1lbW9kZSB0aGF0IHRoZSBwbGF5ZXIgd2FzIHByZXZpb3VzbHkgaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnJvbUdhbWVtb2RlOiBHYW1lbW9kZTtcblxuICAvKipcbiAgICogVGhlIG5ldyBwbGF5ZXIncyBnYW1lbW9kZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvR2FtZW1vZGU6IEdhbWVtb2RlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBmcm9tR2FtZW1vZGU6IEdhbWVtb2RlLFxuICAgIHRvR2FtZW1vZGU6IEdhbWVtb2RlXG4gICkge1xuICAgIHN1cGVyKHBsYXllci5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLmZyb21HYW1lbW9kZSA9IGZyb21HYW1lbW9kZTtcbiAgICB0aGlzLnRvR2FtZW1vZGUgPSB0b0dhbWVtb2RlO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckdhbWVtb2RlQ2hhbmdlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50ID1cbiAgICBXb3JsZEV2ZW50LkVudGl0eURpbWVuc2lvbkNoYW5nZTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IGNoYW5nZWQgZGltZW5zaW9ucy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiB0aGUgZW50aXR5IG1vdmVkIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZyb21EaW1lbnNpb246IERpbWVuc2lvbjtcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiB0aGUgZW50aXR5IG1vdmVkIGZyb20uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9EaW1lbnNpb246IERpbWVuc2lvbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZnJvbURpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIHRvRGltZW5zaW9uOiBEaW1lbnNpb25cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5LmdldFdvcmxkKCkpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMuZnJvbURpbWVuc2lvbiA9IGZyb21EaW1lbnNpb247XG4gICAgdGhpcy50b0RpbWVuc2lvbiA9IHRvRGltZW5zaW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEJsb2NrIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50ID1cbiAgICBXb3JsZEV2ZW50LlBsYXllckludGVyYWN0V2l0aEJsb2NrO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBpbnRlcmFjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzb3VyY2U6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHRoYXQgd2FzIGludGVyYWN0ZWQgd2l0aC5cbiAgICovXG4gIHB1YmxpYyBibG9jazogQmxvY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIncyBoZWxkIGl0ZW0gYmVmb3JlIHRoZSBpbnRlcmFjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBiZWZvcmVJdGVtU3RhY2s6IEl0ZW1TdGFjayB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIncyBoZWxkIGl0ZW0gYWZ0ZXIgdGhlIGludGVyYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc291cmNlOiBQbGF5ZXIsXG4gICAgYmxvY2s6IEJsb2NrLFxuICAgIGJlZm9yZUl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbCxcbiAgICBpdGVtU3RhY2s6IEl0ZW1TdGFjayB8IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoc291cmNlLmdldFdvcmxkKCkpO1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuYmxvY2sgPSBibG9jaztcbiAgICB0aGlzLmJlZm9yZUl0ZW1TdGFjayA9IGJlZm9yZUl0ZW1TdGFjaztcbiAgICB0aGlzLml0ZW1TdGFjayA9IGl0ZW1TdGFjaztcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbCB9O1xuIiwgImltcG9ydCB7IEVudGl0eSwgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVySW50ZXJhY3RXaXRoRW50aXR5U2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPVxuICAgIFdvcmxkRXZlbnQuUGxheWVySW50ZXJhY3RXaXRoRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBpbnRlcmFjdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHdhcyBpbnRlcmFjdGVkIHdpdGguXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIncyBoZWxkIGl0ZW0gdGhhdCB3YXMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIGFmdGVyIHRoZSBpbnRlcmFjdGlvblxuICAgKi9cbiAgcHVibGljIGl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHBsYXllcidzIGl0ZW0gdGhhdCB3YXMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIGJlZm9yZSB0aGUgaW50ZXJhY3Rpb25cbiAgICovXG4gIHB1YmxpYyBiZWZvcmVJdGVtU3RhY2s6IEl0ZW1TdGFjayB8IG51bGw7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNvdXJjZTogUGxheWVyLFxuICAgIHRhcmdldDogRW50aXR5LFxuICAgIGJlZm9yZUl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbCxcbiAgICBpdGVtU3RhY2s6IEl0ZW1TdGFjayB8IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoc291cmNlLmdldFdvcmxkKCkpO1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMuYmVmb3JlSXRlbVN0YWNrID0gYmVmb3JlSXRlbVN0YWNrO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckludGVyYWN0V2l0aEVudGl0eVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi9jb250YWluZXJcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyT3BlbmVkQ29udGFpbmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgb3BlbmVkIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdGhhdCB3YXMgb3BlbmVkIGJ5IHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyOiBDb250YWluZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbGF5ZXIgb3BlbmVkIGNvbnRhaW5lciBldmVudC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgb3BlbmVkIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciB0aGF0IHdhcyBvcGVuZWQgYnkgdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgY29udGFpbmVyOiBDb250YWluZXIpIHtcbiAgICBzdXBlcihwbGF5ZXIuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBFbnRpdHlIaXRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuRW50aXR5SGl0O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgd2FzIGhpdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBoaXRFbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IGhpdHRlZCB0aGUgb3RoZXIgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhbWFnaW5nRW50aXR5OiBFbnRpdHk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRhbWFnaW5nRW50aXR5OiBFbnRpdHksIGhpdEVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoZGFtYWdpbmdFbnRpdHkuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5kYW1hZ2luZ0VudGl0eSA9IGRhbWFnaW5nRW50aXR5O1xuICAgIHRoaXMuaGl0RW50aXR5ID0gaGl0RW50aXR5O1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUhpdFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEFjdG9yRGFtYWdlQ2F1c2UgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBFbnRpdHlIdXJ0U2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPSBXb3JsZEV2ZW50LkVudGl0eUh1cnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCB3YXMgaHVydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBodXJ0RW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCBodXJ0ZWQgdGhlIGVudGl0eSwgaWYgdGhlIGRhbWFnZSB3YXMgY2F1c2VkIGJ5IGFuIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYW1hZ2luZ0VudGl0eT86IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBkYW1hZ2UgZGVhbGVkIHRvIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGFtYWdlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjYXVzZSBvZiB0aGUgZGFtYWdlIGRlYWxlZCB0byB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiBBY3RvckRhbWFnZUNhdXNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBodXJ0RW50aXR5OiBFbnRpdHksXG4gICAgZGFtYWdlOiBudW1iZXIsXG4gICAgY2F1c2U/OiBBY3RvckRhbWFnZUNhdXNlLFxuICAgIGRhbWFnaW5nRW50aXR5PzogRW50aXR5XG4gICkge1xuICAgIHN1cGVyKGh1cnRFbnRpdHkuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5odXJ0RW50aXR5ID0gaHVydEVudGl0eTtcbiAgICB0aGlzLmRhbWFnaW5nRW50aXR5ID0gZGFtYWdpbmdFbnRpdHk7XG4gICAgdGhpcy5kYW1hZ2UgPSBkYW1hZ2U7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUh1cnRTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eUhlYWx0aENoYW5nZWRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuSGVhbHRoQ2hhbmdlZDtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB3aGljaCBoZWFsdGggY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIHByZXZpb3VzIGhlYWx0aCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmcm9tSGVhbHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgaGVhbHRoIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvSGVhbHRoOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5LCBmcm9tSGVhbHRoOiBudW1iZXIsIHRvSGVhbHRoOiBudW1iZXIpIHtcbiAgICBzdXBlcihlbnRpdHkuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgdGhpcy5mcm9tSGVhbHRoID0gZnJvbUhlYWx0aDtcbiAgICB0aGlzLnRvSGVhbHRoID0gdG9IZWFsdGg7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5SGVhbHRoQ2hhbmdlZFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEFjdG9yRGFtYWdlQ2F1c2UgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBFbnRpdHlEaWVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuRW50aXR5RGllO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgZGllZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IGtpbGxlZCB0aGUgZW50aXR5LCBvbmx5IGlmIHRoZSBkZWF0aCB3YXMgY2F1c2VkIGJ5IGFuIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYW1hZ2luZ0VudGl0eT86IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGxhc3QgZGFtYWdlIGNhdXNlIGJlZm9yZSB0aGUgZW50aXR5IGRlYXRoLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhbWFnZUNhdXNlPzogQWN0b3JEYW1hZ2VDYXVzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZGFtYWdpbmdFbnRpdHk/OiBFbnRpdHksXG4gICAgZGFtYWdlQ2F1c2U/OiBBY3RvckRhbWFnZUNhdXNlXG4gICkge1xuICAgIHN1cGVyKGVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmRhbWFnaW5nRW50aXR5ID0gZGFtYWdpbmdFbnRpdHk7XG4gICAgdGhpcy5kYW1hZ2VDYXVzZSA9IGRhbWFnZUNhdXNlO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eURpZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7XG4gIEJsb2NrUG9zaXRpb24sXG4gIENvbXBsZXhJbnZlbnRvcnlUcmFuc2FjdGlvbixcbiAgR2FtZW1vZGUsXG4gIEludmVudG9yeUFjdGlvbixcbiAgSW52ZW50b3J5U291cmNlVHlwZSxcbiAgSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQsXG4gIEl0ZW1Vc2VJbnZlbnRvcnlUcmFuc2FjdGlvbixcbiAgSXRlbVVzZUludmVudG9yeVRyYW5zYWN0aW9uVHlwZSxcbiAgSXRlbVVzZU9uRW50aXR5SW52ZW50b3J5VHJhbnNhY3Rpb24sXG4gIExldmVsU291bmRFdmVudCxcbiAgTGV2ZWxTb3VuZEV2ZW50UGFja2V0LFxuICBQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCwgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciwgRW50aXR5SW50ZXJhY3RNZXRob2QsIEl0ZW1Vc2VNZXRob2QgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIFBsYXllckRyb3BJdGVtU2lnbmFsLFxuICBQbGF5ZXJQbGFjZUJsb2NrU2lnbmFsLFxuICBQbGF5ZXJVc2VJdGVtU2lnbmFsXG59IGZyb20gXCIuLi9ldmVudHNcIjtcbmltcG9ydCB7IEJsb2NrRW50cnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY2xhc3MgSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5JbnZlbnRvcnlUcmFuc2FjdGlvbjtcblxuICBwdWJsaWMgaGFuZGxlKFxuICAgIHBhY2tldDogSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQsXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaGFzIGEgdHJhbnNhY3Rpb25cbiAgICAvLyBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgdHJhbnNhY3Rpb24sIGJ1dCB3ZSBjYW4gbmV2ZXIgYmUgdG9vIHN1cmUuLi5cbiAgICBpZiAoIXBhY2tldC50cmFuc2FjdGlvbikgcmV0dXJuO1xuXG4gICAgLy8gU3dpdGNoIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAgc3dpdGNoIChwYWNrZXQudHJhbnNhY3Rpb24udHlwZSkge1xuICAgICAgLy8gTm9ybWFsIHRyYW5zYWN0aW9ucyBpbmNsdWRlIGRyb3BwaW5nIGl0ZW1zXG4gICAgICBjYXNlIENvbXBsZXhJbnZlbnRvcnlUcmFuc2FjdGlvbi5Ob3JtYWxUcmFuc2FjdGlvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlTm9ybWFsVHJhbnNhY3Rpb24ocGxheWVyLCBwYWNrZXQudHJhbnNhY3Rpb24uYWN0aW9ucyk7XG5cbiAgICAgIC8vIEl0ZW0gdXNlIHRyYW5zYWN0aW9ucyBpbmNsdWRlIHVzaW5nIGl0ZW1zLCBwbGFjaW5nIGJsb2NrcywgZXRjLlxuICAgICAgY2FzZSBDb21wbGV4SW52ZW50b3J5VHJhbnNhY3Rpb24uSXRlbVVzZVRyYW5zYWN0aW9uOiB7XG4gICAgICAgIC8vIEdldCB0aGUgaXRlbSB1c2UgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBwYWNrZXQudHJhbnNhY3Rpb24uaXRlbVVzZTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBhY3R1YWxseSBjb250YWlucyBhbiBpdGVtIHVzZSB0cmFuc2FjdGlvblxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZW1Vc2Ugb2JqZWN0IG1pc3NpbmcgZnJvbSBJdGVtVXNlVHJhbnNhY3Rpb25cIik7XG5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBpdGVtIHVzZSB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVJdGVtVXNlVHJhbnNhY3Rpb24ocGxheWVyLCB0cmFuc2FjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEl0ZW0gdXNlIG9uIGVudGl0eSB0cmFuc2FjdGlvbnMgaW5jbHVkZSB1c2luZyBpdGVtcyBvbiBlbnRpdGllc1xuICAgICAgY2FzZSBDb21wbGV4SW52ZW50b3J5VHJhbnNhY3Rpb24uSXRlbVVzZU9uRW50aXR5VHJhbnNhY3Rpb246IHtcbiAgICAgICAgLy8gR2V0IHRoZSBpdGVtIHVzZSBvbiBlbnRpdHkgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBwYWNrZXQudHJhbnNhY3Rpb24uaXRlbVVzZU9uRW50aXR5O1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGFjdHVhbGx5IGNvbnRhaW5zIGFuIGl0ZW0gdXNlIG9uIGVudGl0eSB0cmFuc2FjdGlvblxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiSXRlbVVzZU9uRW50aXR5IG9iamVjdCBtaXNzaW5nIGZyb20gSXRlbVVzZU9uRW50aXR5VHJhbnNhY3Rpb25cIlxuICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBpdGVtIHVzZSBvbiBlbnRpdHkgdHJhbnNhY3Rpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSXRlbVVzZU9uRW50aXR5VHJhbnNhY3Rpb24ocGxheWVyLCB0cmFuc2FjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29tcGxleEludmVudG9yeVRyYW5zYWN0aW9uLkl0ZW1SZWxlYXNlVHJhbnNhY3Rpb246IHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiVE9ETzogSW1wbGVtZW50IGl0ZW0gcmVsZWFzZSB0cmFuc2FjdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTm9ybWFsVHJhbnNhY3Rpb24oXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgYWN0aW9uczogQXJyYXk8SW52ZW50b3J5QWN0aW9uPlxuICApOiB2b2lkIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBhY3Rpb25cbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAvLyBTd2l0Y2ggdGhlIGFjdGlvbiBzb3VyY2UgdHlwZVxuICAgICAgc3dpdGNoIChhY3Rpb24uc291cmNlLnR5cGUpIHtcbiAgICAgICAgLy8gTG9nIHVuaW1wbGVtZW50ZWQgc291cmNlIHR5cGVzXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBEZWJ1ZyBsb2cgdGhlIHVuaW1wbGVtZW50ZWQgc291cmNlIHR5cGVcbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBJbnZlbnRvcnlUcmFuc2FjdGlvbkhhbmRsZXI6IFVuaW1wbGVtZW50ZWQgaW52ZW50b3J5IHNvdXJjZSB0eXBlOiAke0ludmVudG9yeVNvdXJjZVR5cGVbYWN0aW9uLnNvdXJjZS50eXBlXX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSW52ZW50b3J5U291cmNlVHlwZS5Db250YWluZXJJbnZlbnRvcnk6IHtcbiAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdmFsaWRhdGlvbiBmb3IgY29udGFpbmVyIGludmVudG9yeVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGRyb3BwaW5nIGl0ZW1zIGludG8gdGhlIHdvcmxkXG4gICAgICAgIGNhc2UgSW52ZW50b3J5U291cmNlVHlwZS5Xb3JsZEludGVyYWN0aW9uOiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzdGFjayBhbW91bnQgZnJvbSB0aGUgYWN0aW9uXG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gYWN0aW9uLm5ld0l0ZW0uc3RhY2tTaXplID8/IDE7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsYXllcidzIGludmVudG9yeSB0cmFpdFxuICAgICAgICAgIGNvbnN0IGludmVudG9yeSA9IHBsYXllci5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gc3RhY2sgZnJvbSB0aGUgcGxheWVyJ3MgaW52ZW50b3J5XG4gICAgICAgICAgY29uc3QgaXRlbVN0YWNrID0gaW52ZW50b3J5LmNvbnRhaW5lci5nZXRJdGVtKFxuICAgICAgICAgICAgYWN0aW9uLnNsb3RcbiAgICAgICAgICApIGFzIEl0ZW1TdGFjaztcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJEcm9wSXRlbVNpZ25hbFxuICAgICAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJEcm9wSXRlbVNpZ25hbChcbiAgICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICAgIGl0ZW1TdGFjayxcbiAgICAgICAgICAgIGFtb3VudFxuICAgICAgICAgICkuZW1pdCgpO1xuXG4gICAgICAgICAgLy8gSWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsZWQsIHdlIGRvbid0IHdhbnQgdG8gZHJvcCB0aGUgaXRlbVxuICAgICAgICAgIGlmICghc2lnbmFsKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGl0ZW0gc3RhY2sgaW4gdGhlIGludmVudG9yeVxuICAgICAgICAgICAgaXRlbVN0YWNrLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBmcm9tIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNYWtlIHRoZSBwbGF5ZXIgZHJvcCB0aGUgaXRlbVxuICAgICAgICAgIHBsYXllci5kcm9wSXRlbShpbnZlbnRvcnkuc2VsZWN0ZWRTbG90LCBhbW91bnQsIGludmVudG9yeS5jb250YWluZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUl0ZW1Vc2VUcmFuc2FjdGlvbihcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICB0cmFuc2FjdGlvbjogSXRlbVVzZUludmVudG9yeVRyYW5zYWN0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgZGltZW5zaW9uXG4gICAgY29uc3QgZGltZW5zaW9uID0gcGxheWVyLmRpbWVuc2lvbjtcblxuICAgIC8vIFN3aXRjaCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAodHJhbnNhY3Rpb24udHlwZSkge1xuICAgICAgLy8gSGFuZGxlcyBwbGFjaW5nIGl0ZW1zIGFzIGJsb2Nrc1xuICAgICAgY2FzZSBJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlLlBsYWNlOiB7XG4gICAgICAgIC8vIEdldCB0aGUgYmxvY2sgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgaW5pdGlhbGx5IGludGVyYWN0aW5nIHdpdGhcbiAgICAgICAgY29uc3QgaW50ZXJhY3RpbmcgPSBkaW1lbnNpb24uZ2V0QmxvY2sodHJhbnNhY3Rpb24uYmxvY2tQb3NpdGlvbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIHRoZSBpbml0aWFsIGFjdGlvblxuICAgICAgICAvLyBJZiBpdCBpc24ndCwgd2UgZG9uJ3Qgd2FudCB0byBwbGFjZSBhIGJsb2NrXG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24uaW5pdGlhbFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgLy8gSW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2sgYXQgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgcmV0dXJuIHZvaWQgaW50ZXJhY3RpbmcuaW50ZXJhY3QocGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBibG9jayBpcyBhaXIsIHdlIGNhbid0IHBsYWNlIGEgYmxvY2sgdGhlcmVcbiAgICAgICAgaWYgKGludGVyYWN0aW5nLmlzQWlyKCkpIHJldHVybjtcblxuICAgICAgICAvLyBNYWtlIHRoZSBwbGF5ZXIgaW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2tcbiAgICAgICAgaWYgKCFpbnRlcmFjdGluZy5pbnRlcmFjdChwbGF5ZXIpKSByZXR1cm47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGludGVyYWN0aW9uIG9wZW5lZCBhIGNvbnRhaW5lciBvciBpZiB0aGUgcGxheWVyIGlzbid0IHVzaW5nIGFuIGl0ZW1cbiAgICAgICAgLy8gSWYgc28sIHdlIHNraXAgdGhlIGJsb2NrIHBsYWNlbWVudFxuICAgICAgICBpZiAocGxheWVyLm9wZW5lZENvbnRhaW5lciB8fCAhcGxheWVyLml0ZW1UYXJnZXQpIHJldHVybjtcblxuICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gc3RhY2sgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgIGNvbnN0IHN0YWNrID0gcGxheWVyLml0ZW1UYXJnZXQgYXMgSXRlbVN0YWNrO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBpdGVtIHN0YWNrIG5ldHdvcmsgaWRzIG1hdGNoXG4gICAgICAgIGlmIChzdGFjay50eXBlLm5ldHdvcmsgIT09IHRyYW5zYWN0aW9uLml0ZW0ubmV0d29yaykgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgYmxvY2sgdHlwZSBpcyBwcmVzZW50IGZvciB0aGUgaXRlbSBzdGFja1xuICAgICAgICBjb25zdCBibG9ja1R5cGUgPSBzdGFjay50eXBlLmJsb2NrO1xuICAgICAgICBpZiAoIWJsb2NrVHlwZSB8fCBibG9ja1R5cGUuaWRlbnRpZmllciA9PT0gQmxvY2tJZGVudGlmaWVyLkFpcikgcmV0dXJuO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcmVzdWx0aW5nIGJsb2NrIHVzaW5nIHRoZSBmYWNlIHByb3ZpZGVkIGJ5IHRoZSB0cmFuc2FjdGlvblxuICAgICAgICBjb25zdCByZXN1bHQgPSBpbnRlcmFjdGluZy5mYWNlKHRyYW5zYWN0aW9uLmZhY2UpO1xuICAgICAgICBjb25zdCBvbGRQZXJtdXRhdGlvbiA9IHJlc3VsdC5nZXRQZXJtdXRhdGlvbigpO1xuXG4gICAgICAgIC8vIElmIHRoZSBpcydzIGFpciwgd2UgY2FuJ3QgcGxhY2UgYSBibG9jayB0aGVyZVxuICAgICAgICBpZiAoIXJlc3VsdC5pc0FpcigpKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiB0byBzZXQgdGhlIGJsb2NrIHN0YXRlXG4gICAgICAgIGNvbnN0IHBlcm11dGF0aW9uID1cbiAgICAgICAgICBibG9ja1R5cGUucGVybXV0YXRpb25zW3N0YWNrLmF1eGlsbGFyeV0gPz8gYmxvY2tUeXBlLmdldFBlcm11dGF0aW9uKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllclBsYWNlQmxvY2tTaWduYWxcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllclBsYWNlQmxvY2tTaWduYWwoXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICBwZXJtdXRhdGlvbixcbiAgICAgICAgICB0cmFuc2FjdGlvbi5mYWNlLFxuICAgICAgICAgIHRyYW5zYWN0aW9uLmNsaWNrUG9zaXRpb25cbiAgICAgICAgKS5lbWl0KCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gc3RhY2sgaGFzIGEgYmxvY2tfZGF0YSBjb21wb25lbnRcbiAgICAgICAgaWYgKHN0YWNrLmNvbXBvbmVudHMuaGFzKFwiYmxvY2tfZGF0YVwiKSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgZGF0YSBlbnRyeSBmcm9tIHRoZSBpdGVtIHN0YWNrXG4gICAgICAgICAgY29uc3QgZW50cnkgPSBzdGFjay5jb21wb25lbnRzLmdldChcImJsb2NrX2RhdGFcIikgYXMgQmxvY2tFbnRyeTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgYmxvY2sgZGF0YSBlbnRyeSB0byB0aGUgYmxvY2tcbiAgICAgICAgICByZXN1bHQubG9hZERhdGFFbnRyeShyZXN1bHQuZ2V0V29ybGQoKSwgZW50cnkpO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2sgd2l0aCB0aGUgYmxvY2sgZGF0YVxuICAgICAgICAgIHJlc3VsdC5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbiwgZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAgICAgcmVzdWx0LnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgdGhlIGJsb2NrIG9uUGxhY2UgdHJhaXQgbWV0aG9kc1xuICAgICAgICBsZXQgcGxhY2VDYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHJlc3VsdC50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGNsaWNrIHBvc2l0aW9uIGZyb20gdGhlIHRyYW5zYWN0aW9uXG4gICAgICAgICAgY29uc3QgY2xpY2tQb3NpdGlvbiA9IHRyYW5zYWN0aW9uLmNsaWNrUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgYnJlYWsgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdHJhaXQub25QbGFjZT8uKHBsYXllciwgY2xpY2tQb3NpdGlvbik7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgICAgICAvLyBBcyB0aGUgdHJhaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtZXRob2RcbiAgICAgICAgICBpZiAoc3VjY2VzcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgYnJlYWtcbiAgICAgICAgICBwbGFjZUNhbmNlbGVkID0gIXN1Y2Nlc3M7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHVzZSBtZXRob2Qgb2YgdGhlIGFjdGlvbiAmIHRhcmdldCBibG9ja1xuICAgICAgICBjb25zdCBtZXRob2QgPSBJdGVtVXNlTWV0aG9kLlBsYWNlO1xuICAgICAgICBjb25zdCB0YXJnZXRCbG9jayA9IHJlc3VsdDtcblxuICAgICAgICAvLyBDYWxsIHRoZSBvblVzZSBtZXRob2QgZm9yIHRoZSBpdGVtIHN0YWNrXG4gICAgICAgIGNvbnN0IHVzZVN1Y2Nlc3MgPVxuICAgICAgICAgIHN0YWNrLnVzZShwbGF5ZXIsIHsgbWV0aG9kLCB0YXJnZXRCbG9jayB9KSAmJlxuICAgICAgICAgIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsKHBsYXllciwgc3RhY2ssIG1ldGhvZCkuZW1pdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQgdG8gcGxheSB0aGUgYmxvY2sgcGxhY2Ugc291bmRcbiAgICAgICAgY29uc3Qgc291bmQgPSBuZXcgTGV2ZWxTb3VuZEV2ZW50UGFja2V0KCk7XG4gICAgICAgIHNvdW5kLmV2ZW50ID0gTGV2ZWxTb3VuZEV2ZW50LlBsYWNlO1xuICAgICAgICBzb3VuZC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZihyZXN1bHQucG9zaXRpb24pO1xuICAgICAgICBzb3VuZC5kYXRhID0gcmVzdWx0LnBlcm11dGF0aW9uLm5ldHdvcms7XG4gICAgICAgIHNvdW5kLmFjdG9ySWRlbnRpZmllciA9IFN0cmluZygpO1xuICAgICAgICBzb3VuZC5pc0JhYnlNb2IgPSBmYWxzZTtcbiAgICAgICAgc291bmQuaXNHbG9iYWwgPSBmYWxzZTtcblxuICAgICAgICAvLyBJZiB0aGUgYmxvY2sgcGxhY2VtZW50IHdhcyBjYW5jZWxlZCwgcmV2ZXJ0IHRoZSBibG9ja1xuICAgICAgICBpZiAocGxhY2VDYW5jZWxlZCB8fCAhc2lnbmFsKVxuICAgICAgICAgIHJldHVybiByZXN1bHQuc2V0UGVybXV0YXRpb24ob2xkUGVybXV0YXRpb24pO1xuICAgICAgICBlbHNlIHJlc3VsdC5kaW1lbnNpb24uYnJvYWRjYXN0KHNvdW5kKTtcblxuICAgICAgICAvLyBJZiB0aGUgaXRlbSB1c2Ugd2FzIGNhbmNlbGVkLCBpbmNyZW1lbnQgdGhlIHN0YWNrXG4gICAgICAgIC8vIElmIG5vdCwgZGVjcmVtZW50IHRoZSBzdGFja1xuICAgICAgICBpZiAoIXVzZVN1Y2Nlc3MpIHJldHVybiBzdGFjay5pbmNyZW1lbnQoKTtcbiAgICAgICAgZWxzZSBpZiAocGxheWVyLmdhbWVtb2RlID09PSBHYW1lbW9kZS5TdXJ2aXZhbClcbiAgICAgICAgICByZXR1cm4gc3RhY2suZGVjcmVtZW50KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGVzIHdoZW4gYW4gaXRlbSBpcyB1c2VkXG4gICAgICBjYXNlIEl0ZW1Vc2VJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUuVXNlOiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgdXNpbmcgYW4gaXRlbVxuICAgICAgICAvLyBJZiBzbywgdGhlIGl0ZW0gdXNlIGNsaWNrZWQgaW4gdGhlaXIgaGFuZFxuICAgICAgICBpZiAoIXBsYXllci5pdGVtVGFyZ2V0KSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGhlbGQgaXRlbSBzdGFja1xuICAgICAgICAgIGNvbnN0IHN0YWNrID0gcGxheWVyLmdldEhlbGRJdGVtKCkgYXMgSXRlbVN0YWNrO1xuXG4gICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGl0ZW0gc3RhY2sgbmV0d29yayBpZHMgbWF0Y2hcbiAgICAgICAgICBpZiAoc3RhY2sudHlwZS5uZXR3b3JrICE9PSB0cmFuc2FjdGlvbi5pdGVtLm5ldHdvcmspIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgdXNlIG1ldGhvZCBvZiB0aGUgYWN0aW9uXG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gSXRlbVVzZU1ldGhvZC5DbGljaztcblxuICAgICAgICAgIC8vIENhbGwgdGhlIG9uVXNlIG1ldGhvZCBmb3IgdGhlIGl0ZW0gc3RhY2tcbiAgICAgICAgICBzdGFjay51c2UocGxheWVyLCB7IG1ldGhvZCB9KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsXG4gICAgICAgICAgbmV3IFBsYXllclVzZUl0ZW1TaWduYWwocGxheWVyLCBzdGFjaywgbWV0aG9kKS5lbWl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBpdGVtIHN0YWNrIGZyb20gdGhlIHBsYXllclxuICAgICAgICAgIGNvbnN0IHN0YWNrID0gcGxheWVyLml0ZW1UYXJnZXQgYXMgSXRlbVN0YWNrO1xuXG4gICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGl0ZW0gc3RhY2sgbmV0d29yayBpZHMgbWF0Y2hcbiAgICAgICAgICBpZiAoc3RhY2sudHlwZS5uZXR3b3JrICE9PSB0cmFuc2FjdGlvbi5pdGVtLm5ldHdvcmspIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgdXNlIG1ldGhvZCBvZiB0aGUgYWN0aW9uXG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gSXRlbVVzZU1ldGhvZC5Vc2U7XG5cbiAgICAgICAgICAvLyBDYWxsIHRoZSBvblVzZSBtZXRob2QgZm9yIHRoZSBpdGVtIHN0YWNrXG4gICAgICAgICAgc3RhY2sudXNlKHBsYXllciwgeyBtZXRob2QgfSk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyVXNlSXRlbVNpZ25hbFxuICAgICAgICAgIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsKHBsYXllciwgc3RhY2ssIG1ldGhvZCkuZW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnJlYWsgZnJvbSB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlLkRlc3Ryb3k6IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJUT0RPOiBJbXBsZW1lbnQgZGVzdHJveSBpdGVtIHVzZSB0cmFuc2FjdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlSXRlbVVzZU9uRW50aXR5VHJhbnNhY3Rpb24oXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgdHJhbnNhY3Rpb246IEl0ZW1Vc2VPbkVudGl0eUludmVudG9yeVRyYW5zYWN0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGZyb20gdGhlIHBsYXllclxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHBsYXllci5kaW1lbnNpb247XG5cbiAgICAvLyBHZXQgdGhlIGVudGl0eSBmcm9tIHRoZSBkaW1lbnNpb24gdXNpbmcgdGhlIHJ1bnRpbWUgaWRcbiAgICBjb25zdCBlbnRpdHkgPSBkaW1lbnNpb24uZ2V0RW50aXR5KHRyYW5zYWN0aW9uLmFjdG9yUnVudGltZUlkLCB0cnVlKTtcblxuICAgIC8vIFJldHVybiBpZiB0aGUgZW50aXR5IGlzIG5vdCBmb3VuZFxuICAgIGlmICghZW50aXR5KSByZXR1cm47XG5cbiAgICAvLyBHZXQgdGhlIGVudGl0eSBpbnRlcmFjdCBtZXRob2RcbiAgICBjb25zdCBtZXRob2QgPSB0cmFuc2FjdGlvbi50eXBlIGFzIHVua25vd24gYXMgRW50aXR5SW50ZXJhY3RNZXRob2Q7XG5cbiAgICAvLyBDYWxsIHRoZSBvbkludGVyYWN0IG1ldGhvZCBmb3IgdGhlIGVudGl0eVxuICAgIGVudGl0eS5pbnRlcmFjdChwbGF5ZXIsIG1ldGhvZCk7XG5cbiAgICAvLyBDYWxsIHRoZSBvblVzZSBtZXRob2QgZm9yIHRoZSBpdGVtIHN0YWNrXG4gICAgaWYgKHBsYXllci5nZXRIZWxkSXRlbSgpKSB7XG4gICAgICAvLyBHZXQgdGhlIGl0ZW0gc3RhY2sgZnJvbSB0aGUgcGxheWVyXG4gICAgICBjb25zdCBzdGFjayA9IHBsYXllci5nZXRIZWxkSXRlbSgpIGFzIEl0ZW1TdGFjaztcblxuICAgICAgLy8gR2V0IHRoZSB1c2UgbWV0aG9kIG9mIHRoZSBhY3Rpb25cbiAgICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICAgIHRyYW5zYWN0aW9uLnR5cGUgPT09IDAgPyBJdGVtVXNlTWV0aG9kLlBsYWNlIDogSXRlbVVzZU1ldGhvZC5Vc2U7XG5cbiAgICAgIC8vIENhbGwgdGhlIG9uVXNlIG1ldGhvZCBmb3IgdGhlIGl0ZW0gc3RhY2tcbiAgICAgIHN0YWNrLnVzZShwbGF5ZXIsIHsgbWV0aG9kLCB0YXJnZXRFbnRpdHk6IGVudGl0eSB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllclVzZUl0ZW1TaWduYWxcbiAgICAgIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsKHBsYXllciwgc3RhY2ssIG1ldGhvZCkuZW1pdCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBJbnZlbnRvcnlUcmFuc2FjdGlvbkhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBFTlRJVFlfVFlQRVMgfSBmcm9tIFwiQHNlcmVuaXR5anMvZGF0YVwiO1xuXG5pbXBvcnQgeyBFbnRpdHlUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG5pbXBvcnQgdHlwZSB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuLy8gSXRlcmF0ZSBvdmVyIHRoZSBlbnRpdHkgdHlwZXMgYW5kIHJlZ2lzdGVyIHRoZW0uXG5mb3IgKGNvbnN0IHR5cGUgb2YgRU5USVRZX1RZUEVTKSB7XG4gIC8vIENyZWF0ZSBhIG5ldyBlbnRpdHkgdHlwZS5cbiAgY29uc3QgZW50aXR5VHlwZSA9IG5ldyBFbnRpdHlUeXBlKFxuICAgIHR5cGUuaWRlbnRpZmllciBhcyBFbnRpdHlJZGVudGlmaWVyLFxuICAgIHR5cGUuY29tcG9uZW50c1xuICApO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdHkgdHlwZS5cbiAgRW50aXR5VHlwZS50eXBlcy5zZXQodHlwZS5pZGVudGlmaWVyLCBlbnRpdHlUeXBlKTtcbn1cbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuaW1wb3J0IHR5cGUgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbnR5cGUgQ29tcG9uZW50UmVjb3JkPFQ+ID0gVCAmIHsgaWRlbnRpZmllcjogc3RyaW5nIH07XG5cbmNsYXNzIEVudGl0eVR5cGUge1xuICAvKipcbiAgICogQSBjb2xsZWN0aXZlIHJlZ2lzdHJ5IG9mIGFsbCBlbnRpdHkgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gbmV3IE1hcDxzdHJpbmcsIEVudGl0eVR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGlkZW50aWZpZXIgY291bnRlciBmb3IgZW50aXR5IHR5cGVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBuZXR3b3JrID0gMDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IEVudGl0eUlkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGlkIG9mIHRoZSBlbnRpdHkgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrOiBudW1iZXIgPSArK0VudGl0eVR5cGUubmV0d29yaztcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgY29tcG9uZW50cyBvZiB0aGUgZW50aXR5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50czogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSBjb21wb25lbnRzIFRoZSBkZWZhdWx0IGNvbXBvbmVudHMgb2YgdGhlIGVudGl0eSB0eXBlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGlkZW50aWZpZXI6IEVudGl0eUlkZW50aWZpZXIsIGNvbXBvbmVudHM/OiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IHRvIHRoZSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPFQ+KGNvbXBvbmVudDogQ29tcG9uZW50UmVjb3JkPFQ+KTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICBpZiAodGhpcy5jb21wb25lbnRzLmluY2x1ZGVzKGNvbXBvbmVudC5pZGVudGlmaWVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29tcG9uZW50ICR7Y29tcG9uZW50LmlkZW50aWZpZXJ9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBlbnRpdHkgdHlwZSAke3RoaXMuaWRlbnRpZmllcn1gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQuaWRlbnRpZmllcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYSBjb21wb25lbnQgZnJvbSB0aGUgZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXI8VD4oY29tcG9uZW50OiBDb21wb25lbnRSZWNvcmQ8VD4pOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWRcbiAgICBpZiAodGhpcy5jb21wb25lbnRzLmluY2x1ZGVzKGNvbXBvbmVudC5pZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy5jb21wb25lbnRzLnNwbGljZSh0aGlzLmNvbXBvbmVudHMuaW5kZXhPZihjb21wb25lbnQuaWRlbnRpZmllciksIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21wb25lbnQgJHtjb21wb25lbnQuaWRlbnRpZmllcn0gaXMgbm90IHJlZ2lzdGVyZWQgdG8gZW50aXR5IHR5cGUgJHt0aGlzLmlkZW50aWZpZXJ9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbnRpdHkgdHlwZSBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSB0eXBlLlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IHR5cGUsIGlmIGZvdW5kOyBvdGhlcndpc2UsIG51bGwuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldChpZGVudGlmaWVyOiBFbnRpdHlJZGVudGlmaWVyKTogRW50aXR5VHlwZSB8IG51bGwge1xuICAgIHJldHVybiBFbnRpdHlUeXBlLnR5cGVzLmdldChpZGVudGlmaWVyKSBhcyBFbnRpdHlUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW50aXR5IHR5cGVzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgZW50aXR5IHR5cGVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBbGwoKTogQXJyYXk8RW50aXR5VHlwZT4ge1xuICAgIHJldHVybiBbLi4uRW50aXR5VHlwZS50eXBlcy52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvTmJ0KHR5cGU6IEVudGl0eVR5cGUpOiBDb21wb3VuZFRhZyB7XG4gICAgLy8gQ3JlYXRlIGEgcm9vdCBjb21wb3VuZCB0YWcgZm9yIHRoZSBlbnRpdHkgdHlwZS5cbiAgICBjb25zdCByb290ID0gbmV3IENvbXBvdW5kVGFnKCk7XG5cbiAgICAvLyBDcmVhdGUgYSBjb21wb3VuZCB0YWcgZm9yIHRoZSBlbnRpdHkgZGF0YS5cbiAgICByb290LmNyZWF0ZVN0cmluZ1RhZyhcImJpZFwiLCBcIlwiKTtcbiAgICByb290LmNyZWF0ZUJ5dGVUYWcoXCJoYXNzcGF3bmVnZ1wiLCAxKTtcbiAgICByb290LmNyZWF0ZVN0cmluZ1RhZyhcImlkXCIsIHR5cGUuaWRlbnRpZmllcik7XG4gICAgcm9vdC5jcmVhdGVJbnRUYWcoXCJyaWRcIiwgdHlwZS5uZXR3b3JrKTtcbiAgICByb290LmNyZWF0ZUJ5dGVUYWcoXCJzdW1tb25hYmxlXCIsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByb290IGNvbXBvdW5kIHRhZy5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlUeXBlIH07XG4iLCAiaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG5jbGFzcyBDdXN0b21FbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5VHlwZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gY29tcG9uZW50cyBUaGUgZGVmYXVsdCBjb21wb25lbnRzIG9mIHRoZSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgc3VwZXIoaWRlbnRpZmllciBhcyBFbnRpdHlJZGVudGlmaWVyKTtcbiAgfVxufVxuXG5leHBvcnQgeyBDdXN0b21FbnRpdHlUeXBlIH07XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JEYW1hZ2VDYXVzZSxcbiAgQWN0b3JGbGFnLFxuICBDb250YWluZXJOYW1lLFxuICBFZmZlY3RUeXBlLFxuICBNb3ZlQWN0b3JEZWx0YVBhY2tldCxcbiAgTW92ZURlbHRhRmxhZ3MsXG4gIFJvdGF0aW9uLFxuICBTZXRBY3Rvck1vdGlvblBhY2tldCxcbiAgVmVjdG9yM2Zcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IERpbWVuc2lvbiwgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB7XG4gIENhcmRpbmFsRGlyZWN0aW9uLFxuICBFbnRpdHlJZGVudGlmaWVyLFxuICBFbnRpdHlJbnRlcmFjdE1ldGhvZFxufSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIENvbW1hbmRSZXNwb25zZSxcbiAgRW50aXR5RWZmZWN0T3B0aW9ucyxcbiAgRW50aXR5RW50cnksXG4gIEVudGl0eVByb3BlcnRpZXMsXG4gIEpTT05MaWtlVmFsdWVcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCIuLi9zZXJlbml0eVwiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vd29ybGQvY2h1bmtcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi9jb250YWluZXJcIjtcbmltcG9ydCB7IEl0ZW1CdW5kbGVUcmFpdCwgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IENvbW1hbmRFeGVjdXRpb25TdGF0ZSB9IGZyb20gXCIuLi9jb21tYW5kc1wiO1xuaW1wb3J0IHtcbiAgRW50aXR5RGVzcGF3bmVkU2lnbmFsLFxuICBFbnRpdHlEaWVTaWduYWwsXG4gIEVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbCxcbiAgRW50aXR5SGl0U2lnbmFsLFxuICBFbnRpdHlTcGF3bmVkU2lnbmFsLFxuICBQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHlTaWduYWxcbn0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuaW1wb3J0IHsgU2NvcmVib2FyZElkZW50aXR5IH0gZnJvbSBcIi4uL3dvcmxkL3Njb3JlYm9hcmRcIjtcblxuaW1wb3J0IHsgRW50aXR5VHlwZSB9IGZyb20gXCIuL2lkZW50aXR5XCI7XG5pbXBvcnQge1xuICBFbnRpdHlFZmZlY3RzVHJhaXQsXG4gIEVudGl0eUVxdWlwbWVudFRyYWl0LFxuICBFbnRpdHlIZWFsdGhUcmFpdCxcbiAgRW50aXR5SW52ZW50b3J5VHJhaXQsXG4gIEVudGl0eVRyYWl0XG59IGZyb20gXCIuL3RyYWl0c1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4vcGxheWVyXCI7XG5pbXBvcnQgeyBNZXRhZGF0YU1hcCwgQWN0b3JGbGFnTWFwLCBBdHRyaWJ1dGVNYXAgfSBmcm9tIFwiLi9tYXBzXCI7XG5cbmNsYXNzIEVudGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgcnVubmluZyB0b3RhbCBvZiBlbnRpdGllcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJ1bnRpbWVJZCA9IDBuO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlclxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudGl0eS4gKElkZW50aWZpZXIsIE5ldHdvcmtJZCwgZXRjKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEVudGl0eVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJ1bnRpbWUgaWQgb2YgdGhlIGVudGl0eS4gKEluY3JlbWVudGVkIGVhY2ggdGltZSBhbiBlbnRpdHkgaXMgY3JlYXRlZClcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBydW50aW1lSWQgPSArK0VudGl0eS5ydW50aW1lSWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGVudGl0eS4gKEdlbmVyYXRlZCBieSB0aGUgc2VydmVyLCBhbmQgZXhpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGVudGl0eSlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1bmlxdWVJZDogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9zaXRpb24gPSBuZXcgVmVjdG9yM2YoMCwgMCwgMCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZlbG9jaXR5IG9mIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZWxvY2l0eSA9IG5ldyBWZWN0b3IzZigwLCAwLCAwKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcm90YXRpb24gb2YgdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvdGF0aW9uID0gbmV3IFJvdGF0aW9uKDAsIDAsIDApO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhaXRzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHMgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5VHJhaXQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnRzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEpTT05MaWtlVmFsdWU+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRhZGF0YSB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHlcbiAgICogVGhlc2UgdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudHMgYW5kIHRyYWl0cyBvZiB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGFNYXAodGhpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBmbGFncyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGUgZW50aXR5XG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnRzIGFuZCB0cmFpdHMgb2YgdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZsYWdzID0gbmV3IEFjdG9yRmxhZ01hcCh0aGlzKTtcblxuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhlIGVudGl0eVxuICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50cyBhbmQgdHJhaXRzIG9mIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZU1hcCh0aGlzKTtcblxuICAvKipcbiAgICogVGhlIHRhZ3MgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogVGhlIHNjb3JlYm9hcmQgaWRlbnRpdHkgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBzY29yZWJvYXJkSWRlbnRpdHk6IFNjb3JlYm9hcmRJZGVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZGltZW5zaW9uIG9mIHRoZSBlbnRpdHkuXG4gICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBkeW5hbWljYWxseSBjaGFuZ2VkLCBidXQgaW5zdGVhZCB1c2UgdGhlIGB0ZWxlcG9ydGAgbWV0aG9kLlxuICAgKi9cbiAgcHVibGljIGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnRpdHkgaXMgYWxpdmUgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGlzQWxpdmUgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW50aXR5IGlzIG1vdmluZyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgaXNNb3ZpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW50aXR5IGlzIG9uIHRoZSBncm91bmQgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIG9uR3JvdW5kID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IHdpdGhpbiBhIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIGNyZWF0ZSB0aGUgZW50aXR5IGluXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGRpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIHR5cGU6IEVudGl0eVR5cGUgfCBFbnRpdHlJZGVudGlmaWVyLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEVudGl0eVByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIEFzc2lnbiB0aGUgc2VyZW5pdHkgaW5zdGFuY2UgdG8gdGhlIGVudGl0eVxuICAgIHRoaXMuc2VyZW5pdHkgPSBkaW1lbnNpb24ud29ybGQuc2VyZW5pdHk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIGRpbWVuc2lvbiBhbmQgdHlwZSB0byB0aGUgZW50aXR5XG4gICAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247XG5cbiAgICAvLyBBc3NpZ24gdGhlIHR5cGUgb2YgdGhlIGVudGl0eVxuICAgIGlmICh0eXBlIGluc3RhbmNlb2YgRW50aXR5VHlwZSkgdGhpcy50eXBlID0gdHlwZTtcbiAgICBlbHNlIHRoaXMudHlwZSA9IGRpbWVuc2lvbi53b3JsZC5lbnRpdHlQYWxldHRlLmdldFR5cGUodHlwZSkgYXMgRW50aXR5VHlwZTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgZW50aXR5XG4gICAgLy8gSWYgYSBwcm92aWRlZCB1bmlxdWUgaWQgaXMgbm90IGdpdmVuLCBnZW5lcmF0ZSBvbmVcbiAgICB0aGlzLnVuaXF1ZUlkID0gIXByb3BlcnRpZXM/LnVuaXF1ZUlkXG4gICAgICA/IEVudGl0eS5jcmVhdGVVbmlxdWVJZCh0aGlzLnR5cGUubmV0d29yaywgdGhpcy5ydW50aW1lSWQpXG4gICAgICA6IHByb3BlcnRpZXMudW5pcXVlSWQ7XG5cbiAgICAvLyBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLnBvc2l0aW9uLnNldChkaW1lbnNpb24uc3Bhd25Qb3NpdGlvbik7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHNjb3JlYm9hcmQgaWRlbnRpdHlcbiAgICB0aGlzLnNjb3JlYm9hcmRJZGVudGl0eSA9IG5ldyBTY29yZWJvYXJkSWRlbnRpdHkodGhpcyk7XG5cbiAgICAvLyBJZiB0aGUgZW50aXR5IGlzIG5vdCBhIHBsYXllclxuICAgIGlmICghdGhpcy5pc1BsYXllcigpKSB7XG4gICAgICAvLyBJZiB0aGUgZW50aXR5IHByb3BlcnRpZXMgY29udGFpbnMgYW4gZW50cnksIGxvYWQgaXRcbiAgICAgIGlmIChwcm9wZXJ0aWVzPy5lbnRyeSlcbiAgICAgICAgdGhpcy5sb2FkRGF0YUVudHJ5KHRoaXMuZGltZW5zaW9uLndvcmxkLCBwcm9wZXJ0aWVzLmVudHJ5KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZW50aXR5XG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHRyYWl0cyBmb3IgdGhlIGVudGl0eVxuICAgIGNvbnN0IHRyYWl0cyA9IHRoaXMuZGltZW5zaW9uLndvcmxkLmVudGl0eVBhbGV0dGUuZ2V0UmVnaXN0cnlGb3IoXG4gICAgICB0aGlzLnR5cGUuaWRlbnRpZmllclxuICAgICk7XG5cbiAgICAvLyBGZXRjaCB0aGUgY29tcG9uZW50IHR5cGUgYmFzZWQgdHJhaXRzXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy50eXBlLmNvbXBvbmVudHMpIHtcbiAgICAgIC8vIFByZXBhcmUgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjb21wb25lbnRcbiAgICAgIGxldCBpZGVudGlmaWVyID0gY29tcG9uZW50O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY29tcG9uZW50IHN0YXJ0cyB3aXRoIGEgbmFtZXNwYWNlXG4gICAgICBpZiAoY29tcG9uZW50LmluY2x1ZGVzKFwiOlwiKSkge1xuICAgICAgICBjb25zdCBzcGxpdCA9IGNvbXBvbmVudC5zcGxpdChcIjpcIik7XG4gICAgICAgIGlkZW50aWZpZXIgPSBzcGxpdFsxXSBhcyBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgdGhlIHRyYWl0IGZvciB0aGUgY29tcG9uZW50XG4gICAgICBjb25zdCB0cmFpdCA9IHRoaXMuZGltZW5zaW9uLndvcmxkLmVudGl0eVBhbGV0dGUuZ2V0VHJhaXQoaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHNcbiAgICAgIC8vIElmIHNvLCBhZGQgaXQgdG8gdGhlIGVudGl0eVxuICAgICAgaWYgKHRyYWl0KSB0cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIHRyYWl0cyB0byB0aGUgZW50aXR5XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0cmFpdHMpIGlmICghdGhpcy5oYXNUcmFpdCh0cmFpdCkpIHRoaXMuYWRkVHJhaXQodHJhaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZW50aXR5IGlzIGEgcGxheWVyLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGEgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIGlzUGxheWVyKCk6IHRoaXMgaXMgUGxheWVyIHtcbiAgICByZXR1cm4gdGhpcy50eXBlLmlkZW50aWZpZXIgPT09IEVudGl0eUlkZW50aWZpZXIuUGxheWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZW50aXR5IGlzIGFuIGl0ZW0uXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgYW4gaXRlbS5cbiAgICovXG4gIHB1YmxpYyBpc0l0ZW0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZS5pZGVudGlmaWVyID09PSBFbnRpdHlJZGVudGlmaWVyLkl0ZW07XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW50aXR5IGlzIHNuZWFraW5nIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTbmVha2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoQWN0b3JGbGFnLlNuZWFraW5nKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnRpdHkgaXMgc3ByaW50aW5nIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTcHJpbnRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3MuZ2V0KEFjdG9yRmxhZy5TcHJpbnRpbmcpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudGl0eSBpcyBzd2ltbWluZyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU3dpbW1pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3MuZ2V0KEFjdG9yRmxhZy5Td2ltbWluZykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWRkJ3MgYW4gZWZmZWN0IHRvIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSBlZmZlY3RUeXBlIFRoZSBlZmZlY3QgdHlwZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBzZWNvbmRzLlxuICAgKiBAcGFyYW0gYW1wbGlmaWVyIFRoZSBhbXBsaWZpZXIgb2YgdGhlIGVmZmVjdC5cbiAgICogQHBhcmFtIHNob3dQYXJ0aWNsZXMgV2V0aGVyIG9yIG5vdCB0aGUgZWZmZWN0IHdpbGwgc2hvdyBwYXJ0aWNsZXMuXG4gICAqIFRPRE86IFJlZmFjdG9yIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGFkZEVmZmVjdChcbiAgICBlZmZlY3RUeXBlOiBFZmZlY3RUeXBlLFxuICAgIGR1cmF0aW9uOiBudW1iZXIsXG4gICAgb3B0aW9ucz86IEVudGl0eUVmZmVjdE9wdGlvbnNcbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGVudGl0eSBkb2Vzbid0IGhhdmUgdGhlIGVmZmVjdHMgdHJhaXQsIGFkZCB0aGUgdHJhaXRcbiAgICBjb25zdCBlZmZlY3RUcmFpdCA9XG4gICAgICB0aGlzLmdldFRyYWl0KEVudGl0eUVmZmVjdHNUcmFpdCkgPz8gdGhpcy5hZGRUcmFpdChFbnRpdHlFZmZlY3RzVHJhaXQpO1xuXG4gICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGVudGl0eS5cbiAgICBlZmZlY3RUcmFpdC5hZGQoZWZmZWN0VHlwZSwgZHVyYXRpb24gKiA0MCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gZWZmZWN0VHlwZSBUaGUgZWZmZWN0IHR5cGUgdG8gcmVtb3ZlIGZyb20gdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVmZmVjdChlZmZlY3RUeXBlOiBFZmZlY3RUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgZWZmZWN0VHJhaXQgPSB0aGlzLmdldFRyYWl0KEVudGl0eUVmZmVjdHNUcmFpdCk7XG4gICAgaWYgKCFlZmZlY3RUcmFpdCB8fCAhZWZmZWN0VHJhaXQuaGFzKGVmZmVjdFR5cGUpKSByZXR1cm47XG5cbiAgICBlZmZlY3RUcmFpdC5yZW1vdmUoZWZmZWN0VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVudGl0eSBoYXMgdGhlIGVmZmVjdCBvciBub3QuXG4gICAqIEBwYXJhbSBlZmZlY3RUeXBlIFRoZSBlZmZlY3QgdHlwZSB0byBjaGVjayBpZiB0aGUgZW50aXR5IGhhcy5cbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgZW50aXR5IGhhcyB0aGUgZWZmZWN0IG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBoYXNFZmZlY3QoZWZmZWN0VHlwZTogRWZmZWN0VHlwZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVmZmVjdFRyYWl0ID0gdGhpcy5nZXRUcmFpdChFbnRpdHlFZmZlY3RzVHJhaXQpO1xuICAgIHJldHVybiBlZmZlY3RUcmFpdD8uaGFzKGVmZmVjdFR5cGUpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudGl0eSBoYXMgdGhlIHNwZWNpZmllZCB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBjaGVjayBmb3JcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZW50aXR5IGhhcyB0aGUgdHJhaXRcbiAgICovXG4gIHB1YmxpYyBoYXNUcmFpdCh0cmFpdDogc3RyaW5nIHwgdHlwZW9mIEVudGl0eVRyYWl0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmhhcyhcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHZpZXcgZGlyZWN0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGUgY3VycmVudCBwaXRjaCBhbmQgeWF3IHJvdGF0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgQSBWZWN0b3IzZiByZXByZXNlbnRpbmcgdGhlIGRpcmVjdGlvbiB0aGUgdmlldyBpcyBwb2ludGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRWaWV3RGlyZWN0aW9uKCk6IFZlY3RvcjNmIHtcbiAgICAvLyBDb252ZXJ0IHBpdGNoIGFuZCB5YXcgYW5nbGVzIGZyb20gZGVncmVlcyB0byByYWRpYW5zXG4gICAgY29uc3QgcGl0Y2hSYWRpYW5zID0gdGhpcy5yb3RhdGlvbi5waXRjaCAqIChNYXRoLlBJIC8gMTgwKTtcbiAgICBjb25zdCB5YXdSYWRpYW5zID0gLXRoaXMucm90YXRpb24uaGVhZFlhdyAqIChNYXRoLlBJIC8gMTgwKTsgLy8gSW52ZXJ0IHlhdyBmb3IgY29ycmVjdCBvcmllbnRhdGlvblxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXJlY3Rpb24gdmVjdG9yIGNvbXBvbmVudHNcbiAgICByZXR1cm4gbmV3IFZlY3RvcjNmKFxuICAgICAgTWF0aC5zaW4oeWF3UmFkaWFucykgKiBNYXRoLmNvcyhwaXRjaFJhZGlhbnMpLCAvLyBYIGNvbXBvbmVudCBvZiB0aGUgdmlldyB2ZWN0b3JcbiAgICAgIC1NYXRoLnNpbihwaXRjaFJhZGlhbnMpLCAvLyBZIGNvbXBvbmVudCBvZiB0aGUgdmlldyB2ZWN0b3IgKG5lZ2F0aXZlIGZvciBjb3JyZWN0IG9yaWVudGF0aW9uKVxuICAgICAgTWF0aC5jb3MoeWF3UmFkaWFucykgKiBNYXRoLmNvcyhwaXRjaFJhZGlhbnMpIC8vIFogY29tcG9uZW50IG9mIHRoZSB2aWV3IHZlY3RvclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgZW50aXR5XG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQ8VCBleHRlbmRzIHR5cGVvZiBFbnRpdHlUcmFpdD4odHJhaXQ6IFQpOiBJbnN0YW5jZVR5cGU8VD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gZ2V0IGZyb20gdGhlIGVudGl0eVxuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0KHRyYWl0OiBzdHJpbmcpOiBFbnRpdHlUcmFpdCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gZ2V0IGZyb20gdGhlIGVudGl0eVxuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgRW50aXR5VHJhaXQpOiBFbnRpdHlUcmFpdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyYWl0cy5nZXQoXG4gICAgICB0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXJcbiAgICApIGFzIEVudGl0eVRyYWl0IHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgdHJhaXQgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgRW50aXR5VHJhaXQpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHRyYWl0IGZyb20gdGhlIGVudGl0eVxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50cmFpdHMuZ2V0KFxuICAgICAgdHlwZW9mIHRyYWl0ID09PSBcInN0cmluZ1wiID8gdHJhaXQgOiB0cmFpdC5pZGVudGlmaWVyXG4gICAgKTtcblxuICAgIC8vIENhbGwgdGhlIG9uUmVtb3ZlIHRyYWl0IGV2ZW50XG4gICAgaW5zdGFuY2U/Lm9uUmVtb3ZlPy4oKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgZW50aXR5XG4gICAgdGhpcy50cmFpdHMuZGVsZXRlKHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRyYWl0IHRvIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gYWRkXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgKi9cbiAgcHVibGljIGFkZFRyYWl0PFQgZXh0ZW5kcyB0eXBlb2YgRW50aXR5VHJhaXQ+KFxuICAgIHRyYWl0OiBUIHwgRW50aXR5VHJhaXRcbiAgKTogSW5zdGFuY2VUeXBlPFQ+IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAodGhpcy50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhaXQodHJhaXQuaWRlbnRpZmllcikgYXMgSW5zdGFuY2VUeXBlPFQ+O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGlzIGluIHRoZSBwYWxldHRlXG4gICAgaWYgKCF0aGlzLmdldFdvcmxkKCkuZW50aXR5UGFsZXR0ZS50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKVxuICAgICAgdGhpcy5nZXRXb3JsZCgpLmxvZ2dlci53YXJuKFxuICAgICAgICBgVHJhaXQgXCLCp2Mke3RyYWl0LmlkZW50aWZpZXJ9wqdyXCIgd2FzIGFkZGVkIHRvIGVudGl0eSBcIsKnZCR7dGhpcy50eXBlLmlkZW50aWZpZXJ9wqdyOsKnZCR7dGhpcy51bmlxdWVJZH3Cp3JcIiBpbiBkaW1lbnNpb24gXCLCp2Eke3RoaXMuZGltZW5zaW9uLmlkZW50aWZpZXJ9wqdyXCIgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlLiBUaGlzIG1heSByZXN1bHQgaW4gYSBkZXNlcmlsaXphdGlvbiBlcnJvci5gXG4gICAgICApO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBhZGQgdGhlIHRyYWl0IHRvIHRoZSBlbnRpdHlcbiAgICB0cnkge1xuICAgICAgaWYgKHRyYWl0IGluc3RhbmNlb2YgRW50aXR5VHJhaXQpIHtcbiAgICAgICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCB0cmFpdCk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgb25BZGQgdHJhaXQgZXZlbnRcbiAgICAgICAgdHJhaXQub25BZGQ/LigpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICAgICAgcmV0dXJuIHRyYWl0IGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhaXRcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgdHJhaXQodGhpcykgYXMgSW5zdGFuY2VUeXBlPFQ+O1xuXG4gICAgICAgIC8vIEFkZCB0aGUgdHJhaXQgdG8gdGhlIGVudGl0eVxuICAgICAgICB0aGlzLnRyYWl0cy5zZXQodHJhaXQuaWRlbnRpZmllciwgaW5zdGFuY2UpO1xuXG4gICAgICAgIC8vIENhbGwgdGhlIG9uQWRkIHRyYWl0IGV2ZW50XG4gICAgICAgIGluc3RhbmNlLm9uQWRkPy4oKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHRyYWl0IHRoYXQgd2FzIGFkZGVkXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGFkZCB0cmFpdCBcIiR7dHJhaXQuaWRlbnRpZmllcn1cIiB0byBlbnRpdHkgXCIke3RoaXMudHlwZS5pZGVudGlmaWVyfToke3RoaXMudW5pcXVlSWR9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmRpbWVuc2lvbi5pZGVudGlmaWVyfVwiYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gbnVsbCBhcyB0aGUgdHJhaXQgd2FzIG5vdCBhZGRlZFxuICAgICAgcmV0dXJuIG51bGwgYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB3b3JsZCB0aGUgZW50aXR5IGlzIGN1cnJlbnRseSBpbi5cbiAgICogQHJldHVybnMgVGhlIHdvcmxkIHRoZSBlbnRpdHkgaXMgaW5cbiAgICovXG4gIHB1YmxpYyBnZXRXb3JsZCgpOiBXb3JsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLndvcmxkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNodW5rIHRoZSBlbnRpdHkgaXMgY3VycmVudGx5IGluLlxuICAgKiBAcmV0dXJucyBUaGUgY2h1bmsgdGhlIGVudGl0eSBpcyBpblxuICAgKi9cbiAgcHVibGljIGdldENodW5rKCk6IENodW5rIHtcbiAgICAvLyBDb252ZXJ0IHRoZSBwb3NpdGlvbiB0byBhIGNodW5rIHBvc2l0aW9uXG4gICAgY29uc3QgY3ggPSB0aGlzLnBvc2l0aW9uLnggPj4gNDtcbiAgICBjb25zdCBjeiA9IHRoaXMucG9zaXRpb24ueiA+PiA0O1xuXG4gICAgLy8gR2V0IHRoZSBjaHVuayBmcm9tIHRoZSBkaW1lbnNpb25cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0Q2h1bmsoY3gsIGN6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpdGVtIHRoZSBlbnRpdHkgaXMgY3VycmVudGx5IGhvbGRpbmcuXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIHRoZSBlbnRpdHkgaXMgaG9sZGluZ1xuICAgKi9cbiAgcHVibGljIGdldEhlbGRJdGVtKCk6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSB0cmFpdFxuICAgIGlmICghdGhpcy5oYXNUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gR2V0IHRoZSBpbnZlbnRvcnkgdHJhaXRcbiAgICBjb25zdCBpbnZlbnRvcnkgPSB0aGlzLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgIC8vIFJldHVybiB0aGUgaGVsZCBpdGVtXG4gICAgcmV0dXJuIGludmVudG9yeS5nZXRIZWxkSXRlbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNhcmRpbmFsIGRpcmVjdGlvbiBvZiB0aGUgZW50aXR5LlxuICAgKiBAcmV0dXJucyBUaGUgY2FyZGluYWwgZGlyZWN0aW9uIG9mIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FyZGluYWxEaXJlY3Rpb24oKTogQ2FyZGluYWxEaXJlY3Rpb24ge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgY2FyZGluYWwgZGlyZWN0aW9uIG9mIHRoZSBlbnRpdHlcbiAgICAvLyBFbnRpdHkgeWF3IGlzIC0xODAgdG8gMTgwXG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJvdGF0aW9uIG9mIHRoZSBlbnRpdHlcbiAgICBjb25zdCByb3RhdGlvbiA9IChNYXRoLmZsb29yKHRoaXMucm90YXRpb24ueWF3KSArIDM2MCkgJSAzNjA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNhcmRpbmFsIGRpcmVjdGlvblxuICAgIGlmIChyb3RhdGlvbiA+PSAzMTUgfHwgcm90YXRpb24gPCA0NSkgcmV0dXJuIENhcmRpbmFsRGlyZWN0aW9uLlNvdXRoO1xuICAgIGlmIChyb3RhdGlvbiA+PSA0NSAmJiByb3RhdGlvbiA8IDEzNSkgcmV0dXJuIENhcmRpbmFsRGlyZWN0aW9uLldlc3Q7XG4gICAgaWYgKHJvdGF0aW9uID49IDEzNSAmJiByb3RhdGlvbiA8IDIyNSkgcmV0dXJuIENhcmRpbmFsRGlyZWN0aW9uLk5vcnRoO1xuICAgIGlmIChyb3RhdGlvbiA+PSAyMjUgJiYgcm90YXRpb24gPCAzMTUpIHJldHVybiBDYXJkaW5hbERpcmVjdGlvbi5FYXN0O1xuXG4gICAgcmV0dXJuIENhcmRpbmFsRGlyZWN0aW9uLlNvdXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyB0aGUgZW50aXR5IGludG8gdGhlIGRpbWVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyBzcGF3bigpOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRW50aXR5U3Bhd25lZFNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFbnRpdHlTcGF3bmVkU2lnbmFsKHRoaXMsIHRoaXMuZGltZW5zaW9uKS5lbWl0KCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxsZWRcbiAgICBpZiAoIXNpZ25hbCkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBBZGQgdGhlIGVudGl0eSB0byB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5kaW1lbnNpb24uZW50aXRpZXMuc2V0KHRoaXMudW5pcXVlSWQsIHRoaXMpO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgYXMgYWxpdmVcbiAgICB0aGlzLmlzQWxpdmUgPSB0cnVlO1xuXG4gICAgLy8gVHJpZ2dlciB0aGUgZW50aXR5IG9uU3Bhd24gdHJhaXQgZXZlbnRcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRoaXMudHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIHRyaWdnZXIgdGhlIG9uU3Bhd24gdHJhaXQgZXZlbnRcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhbGwgdGhlIG9uU3Bhd24gdHJhaXQgZXZlbnRcbiAgICAgICAgdHJhaXQub25TcGF3bj8uKCk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHRyaWdnZXIgb25TcGF3biB0cmFpdCBldmVudCBmb3IgZW50aXR5IFwiJHt0aGlzLnR5cGUuaWRlbnRpZmllcn06JHt0aGlzLnVuaXF1ZUlkfVwiIGluIGRpbWVuc2lvbiBcIiR7dGhpcy5kaW1lbnNpb24uaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZW50aXR5IGFjdG9yIGRhdGEgJiBhdHRyaWJ1dGVzXG4gICAgdGhpcy5tZXRhZGF0YS51cGRhdGUoKTtcbiAgICB0aGlzLmF0dHJpYnV0ZXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGVudGl0eVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Bhd25zIHRoZSBlbnRpdHkgZnJvbSB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIGRlc3Bhd24oKTogdGhpcyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEVudGl0eURlc3Bhd25lZFNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFbnRpdHlEZXNwYXduZWRTaWduYWwodGhpcywgdGhpcy5kaW1lbnNpb24pLmVtaXQoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZFxuICAgIGlmICghc2lnbmFsKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IGFzIG5vdCBhbGl2ZVxuICAgIHRoaXMuaXNBbGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBlbnRpdHkgZnJvbSB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5kaW1lbnNpb24uZW50aXRpZXMuZGVsZXRlKHRoaXMudW5pcXVlSWQpO1xuXG4gICAgLy8gVHJpZ2dlciB0aGUgZW50aXR5IG9uRGVzcGF3biB0cmFpdCBldmVudFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gdHJpZ2dlciB0aGUgb25EZXNwYXduIHRyYWl0IGV2ZW50XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYWxsIHRoZSBvbkRlc3Bhd24gdHJhaXQgZXZlbnRcbiAgICAgICAgdHJhaXQub25EZXNwYXduPy4oKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdHJpZ2dlciBvbkRlc3Bhd24gdHJhaXQgZXZlbnQgZm9yIGVudGl0eSBcIiR7dGhpcy50eXBlLmlkZW50aWZpZXJ9OiR7dGhpcy51bmlxdWVJZH1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuZGltZW5zaW9uLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMudHJhaXRzLmRlbGV0ZSh0cmFpdC5pZGVudGlmaWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGVudGl0eVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMga2lsbChkYW1hZ2luZ0VudGl0eT86IEVudGl0eSwgZGFtYWdlQ2F1c2U/OiBBY3RvckRhbWFnZUNhdXNlKTogdm9pZCB7XG4gICAgbmV3IEVudGl0eURpZVNpZ25hbCh0aGlzLCBkYW1hZ2luZ0VudGl0eSwgZGFtYWdlQ2F1c2UpLmVtaXQoKTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IGFzIG5vdCBhbGl2ZVxuICAgIHRoaXMuaXNBbGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYW4gaW52ZW50b3J5IHRyYWl0XG4gICAgaWYgKHRoaXMuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKSB7XG4gICAgICAvLyBHZXQgdGhlIGludmVudG9yeSB0cmFpdFxuICAgICAgY29uc3QgeyBjb250YWluZXIsIGludmVudG9yeVNpemUgfSA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGludmVudG9yeSBzbG90c1xuICAgICAgZm9yIChsZXQgc2xvdCA9IDA7IHNsb3QgPCBpbnZlbnRvcnlTaXplOyBzbG90KyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBpdGVtIGZyb20gdGhlIHNsb3RcbiAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRhaW5lci5nZXRJdGVtKHNsb3QpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIHZhbGlkXG4gICAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgICAgLy8gU3Bhd24gdGhlIGl0ZW0gaW4gdGhlIGRpbWVuc2lvblxuICAgICAgICB0aGlzLmRpbWVuc2lvbi5zcGF3bkl0ZW0oaXRlbSwgdGhpcy5wb3NpdGlvbik7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHNsb3RcbiAgICAgICAgY29udGFpbmVyLmNsZWFyU2xvdChzbG90KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIGhlYWx0aCB0cmFpdFxuICAgIGlmICh0aGlzLmhhc1RyYWl0KEVudGl0eUhlYWx0aFRyYWl0KSkge1xuICAgICAgLy8gR2V0IHRoZSBoZWFsdGggdHJhaXRcbiAgICAgIGNvbnN0IGhlYWx0aCA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgICAvLyBTZXQgdGhlIGhlYWx0aCB0byBtaW5pbXVtIHZhbHVlXG4gICAgICBoZWFsdGguY3VycmVudFZhbHVlID0gaGVhbHRoLmVmZmVjdGl2ZU1pbjtcbiAgICB9XG5cbiAgICAvLyBTY2hlZHVsZSB0aGUgZW50aXR5IHRvIGRlc3Bhd25cbiAgICB0aGlzLmRpbWVuc2lvbi5zY2hlZHVsZSg1MCkub24oKCkgPT4ge1xuICAgICAgLy8gSWYgdGhlIGVudGl0eSBpcyBub3QgYSBwbGF5ZXIsIGRlc3Bhd24gdGhlIGVudGl0eVxuICAgICAgaWYgKCF0aGlzLmlzUGxheWVyKCkpIHRoaXMuZGVzcGF3bigpO1xuICAgICAgLy8gTWFudWFsbHkgdHJpZ2dlciB0aGUgb25EZXNwYXduIHRyYWl0IGV2ZW50IGZvciBwbGF5ZXJzXG4gICAgICAvLyBXZSBkb2VzIHRoaXMgYmVjYXVzZSB0aGUgcGxheWVyIGhhcyB0aGUgb3B0aW9uIHRvIGRpc2Nvbm5lY3QgYXQgdGhlIHJlc3Bhd24gc2NyZWVuXG4gICAgICBlbHNlIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHRyYWl0Lm9uRGVzcGF3bj8uKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2F1c2VzIGEgcGxheWVyIHRvIGludGVyYWN0IHdpdGggdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIGludGVyYWN0KHBsYXllcjogUGxheWVyLCBtZXRob2Q6IEVudGl0eUludGVyYWN0TWV0aG9kKTogdm9pZCB7XG4gICAgaWYgKG1ldGhvZCA9PT0gRW50aXR5SW50ZXJhY3RNZXRob2QuSW50ZXJhY3QpIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHlTaWduYWwoXG4gICAgICAgIHBsYXllcixcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcGxheWVyLmdldEhlbGRJdGVtKCksXG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gICAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eUhpdFNpZ25hbChwbGF5ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIHRoZSBlbnRpdHkgb25JbnRlcmFjdCB0cmFpdCBldmVudFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gdHJpZ2dlciB0aGUgb25JbnRlcmFjdCB0cmFpdCBldmVudFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2FsbCB0aGUgb25JbnRlcmFjdCB0cmFpdCBldmVudFxuICAgICAgICB0cmFpdC5vbkludGVyYWN0Py4ocGxheWVyLCBtZXRob2QpO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byB0cmlnZ2VyIG9uSW50ZXJhY3QgdHJhaXQgZXZlbnQgZm9yIGVudGl0eSBcIiR7dGhpcy50eXBlLmlkZW50aWZpZXJ9OiR7dGhpcy51bmlxdWVJZH1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuZGltZW5zaW9uLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMudHJhaXRzLmRlbGV0ZSh0cmFpdC5pZGVudGlmaWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY29udGFpbmVyIGZyb20gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyBnZXRDb250YWluZXIoXG4gICAgbmFtZTogQ29udGFpbmVyTmFtZSxcbiAgICBkeW5hbWljSWQ/OiBudW1iZXJcbiAgKTogQ29udGFpbmVyIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgYSBkeW5hbWljIGlkIHdhcyBwcm92aWRlZFxuICAgIGlmIChkeW5hbWljSWQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSB0cmFpdFxuICAgICAgaWYgKCF0aGlzLmhhc1RyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IHRyYWl0XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaXRlbXMgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbnRhaW5lci5zdG9yYWdlKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIHZhbGlkXG4gICAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaGFzIGEgSXRlbUJ1bmRsZVRyYWl0XG4gICAgICAgIGlmIChpdGVtLmhhc1RyYWl0KEl0ZW1CdW5kbGVUcmFpdCkpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGJ1bmRsZSB0cmFpdFxuICAgICAgICAgIGNvbnN0IGJ1bmRsZSA9IGl0ZW0uZ2V0VHJhaXQoSXRlbUJ1bmRsZVRyYWl0KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBidW5kbGUgaGFzIHRoZSBkeW5hbWljIGlkXG4gICAgICAgICAgaWYgKGJ1bmRsZS5keW5hbWljSWQgPT09IGR5bmFtaWNJZCkgcmV0dXJuIGJ1bmRsZS5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTd2l0Y2ggbmFtZSBvZiB0aGUgY29udGFpbmVyXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFJldHVybiBudWxsIGlmIHRoZSBjb250YWluZXIgbmFtZSBpcyBub3QgdmFsaWRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGNhc2UgQ29udGFpbmVyTmFtZS5Bcm1vcjoge1xuICAgICAgLy8gICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhbiBpbnZlbnRvcnkgY29tcG9uZW50XG4gICAgICAvLyAgIGlmICghdGhpcy5oYXNDb21wb25lbnQoXCJtaW5lY3JhZnQ6aW52ZW50b3J5XCIpKVxuICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBlbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBpbnZlbnRvcnkgY29tcG9uZW50LlwiKTtcblxuICAgICAgLy8gICAvLyBHZXQgdGhlIGludmVudG9yeSBjb21wb25lbnRcbiAgICAgIC8vICAgY29uc3QgaW52ZW50b3J5ID0gdGhpcy5nZXRDb21wb25lbnQoXCJtaW5lY3JhZnQ6aW52ZW50b3J5XCIpO1xuXG4gICAgICAvLyAgIC8vIFJldHVybiB0aGUgYXJtb3IgY29udGFpbmVyXG4gICAgICAvLyAgIHJldHVybiBpbnZlbnRvcnkuY29udGFpbmVyO1xuICAgICAgLy8gfVxuXG4gICAgICBjYXNlIENvbnRhaW5lck5hbWUuQXJtb3I6IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1RyYWl0KEVudGl0eUVxdWlwbWVudFRyYWl0KSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGxheWVyIGRvZXMgbm90IGhhdmUgYW4gZXF1aXBtZW50IHRyYWl0LlwiKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGVxdWlwbWVudCB0cmFpdFxuICAgICAgICBjb25zdCBlcXVpcG1lbnQgPSB0aGlzLmdldFRyYWl0KEVudGl0eUVxdWlwbWVudFRyYWl0KTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGVxdWlwbWVudCBjb250YWluZXJcbiAgICAgICAgcmV0dXJuIGVxdWlwbWVudC5jb250YWluZXI7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udGFpbmVyTmFtZS5Ib3RiYXI6XG4gICAgICBjYXNlIENvbnRhaW5lck5hbWUuSW52ZW50b3J5OlxuICAgICAgY2FzZSBDb250YWluZXJOYW1lLkhvdGJhckFuZEludmVudG9yeToge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhbiBpbnZlbnRvcnkgdHJhaXRcbiAgICAgICAgaWYgKCF0aGlzLmhhc1RyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZW50aXR5IGRvZXMgbm90IGhhdmUgYW4gaW52ZW50b3J5IHRyYWl0LlwiKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGludmVudG9yeSB0cmFpdFxuICAgICAgICBjb25zdCBpbnZlbnRvcnkgPSB0aGlzLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGludmVudG9yeSBjb250YWluZXJcbiAgICAgICAgcmV0dXJuIGludmVudG9yeS5jb250YWluZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB2ZWN0b3IgVGhlIHBvc2l0aW9uIHRvIHNldC5cbiAgICovXG4gIHB1YmxpYyBzZXRNb3Rpb24odmVjdG9yPzogVmVjdG9yM2YpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZlbG9jaXR5IG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLnZlbG9jaXR5LnggPSB2ZWN0b3I/LnggPz8gdGhpcy52ZWxvY2l0eS54O1xuICAgIHRoaXMudmVsb2NpdHkueSA9IHZlY3Rvcj8ueSA/PyB0aGlzLnZlbG9jaXR5Lnk7XG4gICAgdGhpcy52ZWxvY2l0eS56ID0gdmVjdG9yPy56ID8/IHRoaXMudmVsb2NpdHkuejtcblxuICAgIHRoaXMucG9zaXRpb24ueCArPSB0aGlzLnZlbG9jaXR5Lng7XG4gICAgdGhpcy5wb3NpdGlvbi55ICs9IHRoaXMudmVsb2NpdHkueTtcbiAgICB0aGlzLnBvc2l0aW9uLnogKz0gdGhpcy52ZWxvY2l0eS56O1xuXG4gICAgLy8gU2V0IHRoZSBvbkdyb3VuZCBwcm9wZXJ0eSBvZiB0aGUgZW50aXR5XG4gICAgdGhpcy5vbkdyb3VuZCA9IGZhbHNlO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IFNldEFjdG9yTW90aW9uUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFNldEFjdG9yTW90aW9uUGFja2V0KCk7XG5cbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhY2tldFxuICAgIHBhY2tldC5ydW50aW1lSWQgPSB0aGlzLnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQubW90aW9uID0gdGhpcy52ZWxvY2l0eTtcbiAgICBwYWNrZXQuaW5wdXRUaWNrID0gdGhpcy5pc1BsYXllcigpXG4gICAgICA/IHRoaXMuaW5wdXRUaWNrXG4gICAgICA6IHRoaXMuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgIHRoaXMuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbW90aW9uIHRvIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB2ZWN0b3IgVGhlIG1vdGlvbiB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgYWRkTW90aW9uKHZlY3RvcjogVmVjdG9yM2YpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZlbG9jaXR5IG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLnZlbG9jaXR5LnggKz0gdmVjdG9yLng7XG4gICAgdGhpcy52ZWxvY2l0eS55ICs9IHZlY3Rvci55O1xuICAgIHRoaXMudmVsb2NpdHkueiArPSB2ZWN0b3IuejtcblxuICAgIC8vIFNldCB0aGUgbW90aW9uIG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLnNldE1vdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgbW90aW9uIG9mIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJNb3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy52ZWxvY2l0eS54ID0gMDtcbiAgICB0aGlzLnZlbG9jaXR5LnkgPSAwO1xuICAgIHRoaXMudmVsb2NpdHkueiA9IDA7XG5cbiAgICAvLyBTZXQgdGhlIG1vdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgdGhpcy5zZXRNb3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFuIGltcHVsc2UgdG8gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHZlY3RvciBUaGUgaW1wdWxzZSB0byBhcHBseS5cbiAgICovXG4gIHB1YmxpYyBhcHBseUltcHVsc2UodmVjdG9yOiBWZWN0b3IzZik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGVudGl0eVxuICAgIHRoaXMudmVsb2NpdHkueCArPSB2ZWN0b3IueDtcbiAgICB0aGlzLnZlbG9jaXR5LnkgKz0gdmVjdG9yLnk7XG4gICAgdGhpcy52ZWxvY2l0eS56ICs9IHZlY3Rvci56O1xuXG4gICAgLy8gU2V0IHRoZSBtb3Rpb24gb2YgdGhlIGVudGl0eVxuICAgIHRoaXMuc2V0TW90aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgdGVsZXBvcnQocG9zaXRpb246IFZlY3RvcjNmLCBkaW1lbnNpb24/OiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLnBvc2l0aW9uLnggPSBwb3NpdGlvbi54O1xuICAgIHRoaXMucG9zaXRpb24ueSA9IHBvc2l0aW9uLnk7XG4gICAgdGhpcy5wb3NpdGlvbi56ID0gcG9zaXRpb24uejtcblxuICAgIC8vIENoZWNrIGlmIGEgZGltZW5zaW9uIHdhcyBwcm92aWRlZFxuICAgIGlmIChkaW1lbnNpb24pIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFbnRpdHlEaW1lbnNpb25DaGFuZ2VTaWduYWwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMuZGltZW5zaW9uLFxuICAgICAgICBkaW1lbnNpb25cbiAgICAgICk7XG5cbiAgICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuXG4gICAgICAvLyBEZXNwYXduIHRoZSBlbnRpdHkgZnJvbSB0aGUgY3VycmVudCBkaW1lbnNpb25cbiAgICAgIHRoaXMuZGVzcGF3bigpO1xuXG4gICAgICAvLyBTZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgZW50aXR5XG4gICAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcblxuICAgICAgLy8gU3Bhd24gdGhlIGVudGl0eSBpbiB0aGUgbmV3IGRpbWVuc2lvblxuICAgICAgdGhpcy5zcGF3bigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgTW92ZUFjdG9yRGVsdGFQYWNrZXRcbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBNb3ZlQWN0b3JEZWx0YVBhY2tldCgpO1xuXG4gICAgICAvLyBBc3NpZ24gdGhlIHBhY2tldCBwcm9wZXJ0aWVzXG4gICAgICBwYWNrZXQucnVudGltZUlkID0gdGhpcy5ydW50aW1lSWQ7XG4gICAgICBwYWNrZXQuZmxhZ3MgPSBNb3ZlRGVsdGFGbGFncy5BbGw7XG4gICAgICBwYWNrZXQueCA9IHRoaXMucG9zaXRpb24ueDtcbiAgICAgIHBhY2tldC55ID0gdGhpcy5wb3NpdGlvbi55O1xuICAgICAgcGFja2V0LnogPSB0aGlzLnBvc2l0aW9uLno7XG4gICAgICBwYWNrZXQueWF3ID0gdGhpcy5yb3RhdGlvbi55YXc7XG4gICAgICBwYWNrZXQuaGVhZFlhdyA9IHRoaXMucm90YXRpb24uaGVhZFlhdztcbiAgICAgIHBhY2tldC5waXRjaCA9IHRoaXMucm90YXRpb24ucGl0Y2g7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgb24gdGhlIGdyb3VuZFxuICAgICAgaWYgKHRoaXMub25Hcm91bmQpIHBhY2tldC5mbGFncyB8PSBNb3ZlRGVsdGFGbGFncy5Pbkdyb3VuZDtcblxuICAgICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgICAgdGhpcy5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNlbGVjdGVkIGludmVudG9yeSBzbG90IG9mIHRoZSBlbnRpdHkuXG4gICAqIEByZXR1cm5zIFRoZSBzZWxlY3RlZCBob3RiYXIgaW5kZXggb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFNsb3QoKTogbnVtYmVyIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhbiBpbnZlbnRvcnkgdHJhaXRcbiAgICBpZiAoIXRoaXMuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGFuIGludmVudG9yeSB0cmFpdC5cIik7XG5cbiAgICAvLyBHZXQgdGhlIGludmVudG9yeSB0cmFpdFxuICAgIGNvbnN0IGludmVudG9yeSA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBzZWxlY3RlZCBzbG90XG4gICAgcmV0dXJuIGludmVudG9yeS5zZWxlY3RlZFNsb3Q7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2VzIHRoZSBlbnRpdHkgdG8gZHJvcCBhbiBpdGVtIGZyb20gaXRzIGludmVudG9yeS5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gZHJvcCB0aGUgaXRlbSBmcm9tLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgb2YgaXRlbXMgdG8gZHJvcC5cbiAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRvIGRyb3AgdGhlIGl0ZW0gZnJvbS5cbiAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGl0ZW0gd2FzIGRyb3BwZWQuXG4gICAqL1xuICBwdWJsaWMgZHJvcEl0ZW0oc2xvdDogbnVtYmVyLCBhbW91bnQ6IG51bWJlciwgY29udGFpbmVyOiBDb250YWluZXIpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhbiBpbnZlbnRvcnkgdHJhaXRcbiAgICBpZiAoIXRoaXMuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBHZXQgdGhlIGl0ZW0gZnJvbSB0aGUgc2xvdFxuICAgIGNvbnN0IGl0ZW0gPSBjb250YWluZXIudGFrZUl0ZW0oc2xvdCwgYW1vdW50KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIHZhbGlkXG4gICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBHZXQgdGhlIGVudGl0eSdzIHBvc2l0aW9uIGFuZCByb3RhdGlvblxuICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdGhpcy5wb3NpdGlvbjtcbiAgICBjb25zdCB7IGhlYWRZYXcsIHBpdGNoIH0gPSB0aGlzLnJvdGF0aW9uO1xuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwaXRjaCAmIGhlYWRZYXcsIHNvIHRoZSBlbnRpdHkgd2lsbCBiZSBzcGF3bmVkIGluIHRoZSBjb3JyZWN0IGRpcmVjdGlvblxuICAgIGNvbnN0IGhlYWRZYXdSYWQgPSAoaGVhZFlhdyAqIE1hdGguUEkpIC8gMTgwO1xuICAgIGNvbnN0IHBpdGNoUmFkID0gKHBpdGNoICogTWF0aC5QSSkgLyAxODA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHZlbG9jaXR5IG9mIHRoZSBlbnRpdHkgYmFzZWQgb24gdGhlIGVudGl0eSdzIHJvdGF0aW9uXG4gICAgY29uc3QgdmVsb2NpdHkgPSBuZXcgVmVjdG9yM2YoXG4gICAgICAoLU1hdGguc2luKGhlYWRZYXdSYWQpICogTWF0aC5jb3MocGl0Y2hSYWQpKSAvIDMgLyAwLjUsXG4gICAgICAoLU1hdGguc2luKHBpdGNoUmFkKSAvIDIpICogMC43NSxcbiAgICAgIChNYXRoLmNvcyhoZWFkWWF3UmFkKSAqIE1hdGguY29zKHBpdGNoUmFkKSkgLyAzIC8gMC41XG4gICAgKTtcblxuICAgIC8vIFNwYXduIHRoZSBlbnRpdHlcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmRpbWVuc2lvbi5zcGF3bkl0ZW0oaXRlbSwgbmV3IFZlY3RvcjNmKHgsIHkgLSAwLjI1LCB6KSk7XG5cbiAgICAvLyBTZXQgdGhlIHZlbG9jaXR5IG9mIHRoZSBlbnRpdHlcbiAgICBlbnRpdHkuYWRkTW90aW9uKHZlbG9jaXR5KTtcblxuICAgIC8vIFJldHVybiB0cnVlIGFzIHRoZSBpdGVtIHdhcyBkcm9wcGVkXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBoYXMgYSB0YWcuXG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBoYXMgdGhlIHRhZy5cbiAgICovXG4gIHB1YmxpYyBoYXNUYWcodGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmhhcyh0YWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRhZ3Mgb2YgdGhlIGVudGl0eS5cbiAgICogQHJldHVybnMgVGhlIHRhZ3Mgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBnZXRUYWdzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBbLi4udGhpcy50YWdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGFnIHRvIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBhZGQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSB0YWcgd2FzIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGFkZFRhZyh0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0YWcgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAodGhpcy50YWdzLmhhcyh0YWcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBUYWdzIGFyZSByZWFkLW9ubHlcbiAgICB0aGlzLnRhZ3MuYWRkKHRhZyk7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBhcyB0aGUgdGFnIHdhcyBhZGRlZFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSB0YWcgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgdGFnIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRhZyh0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0YWcgZXhpc3RzXG4gICAgaWYgKCF0aGlzLnRhZ3MuaGFzKHRhZykpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGFnIGZyb20gdGhlIGVudGl0eVxuICAgIHRoaXMudGFncy5kZWxldGUodGFnKTtcblxuICAgIC8vIFJldHVybiB0cnVlIGFzIHRoZSB0YWcgd2FzIHJlbW92ZWRcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGNvbW1hbmQgYXMgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIGV4ZWN1dGVDb21tYW5kPFQgPSB1bmtub3duPihjb21tYW5kOiBzdHJpbmcpOiBDb21tYW5kUmVzcG9uc2U8VD4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIHN0YXJ0cyB3aXRoIGEgc2xhc2gsIHJlbW92ZSBpdCBpZiBpdCBkb2VzIG5vdFxuICAgIGlmIChjb21tYW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSBjb21tYW5kID0gY29tbWFuZC5zbGljZSgxKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb21tYW5kIGV4ZWN1dGUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBDb21tYW5kRXhlY3V0aW9uU3RhdGUoXG4gICAgICB0aGlzLmdldFdvcmxkKCkuY29tbWFuZHMuZ2V0QWxsKCksXG4gICAgICBjb21tYW5kLFxuICAgICAgdGhpc1xuICAgICk7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kIHN0YXRlXG4gICAgcmV0dXJuIHN0YXRlLmV4ZWN1dGUoKSBhcyBDb21tYW5kUmVzcG9uc2U8VD47XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZW50aXR5J3MgZGF0YSBhcyBhIGRhdGFiYXNlIGVudHJ5LlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IGVudHJ5IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXREYXRhRW50cnkoKTogRW50aXR5RW50cnkge1xuICAgIC8vIENyZWF0ZSB0aGUgZW50aXR5IGVudHJ5IHRvIHNhdmVcbiAgICBjb25zdCBlbnRyeTogRW50aXR5RW50cnkgPSB7XG4gICAgICB1bmlxdWVJZDogdGhpcy51bmlxdWVJZCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMudHlwZS5pZGVudGlmaWVyLFxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcbiAgICAgIGNvbXBvbmVudHM6IFsuLi50aGlzLmNvbXBvbmVudHMuZW50cmllcygpXSxcbiAgICAgIHRyYWl0czogWy4uLnRoaXMudHJhaXRzLmtleXMoKV0sXG4gICAgICBtZXRhZGF0YTogWy4uLnRoaXMubWV0YWRhdGEuZW50cmllcygpXSxcbiAgICAgIGZsYWdzOiBbLi4udGhpcy5mbGFncy5lbnRyaWVzKCldLFxuICAgICAgYXR0cmlidXRlczogWy4uLnRoaXMuYXR0cmlidXRlcy5lbnRyaWVzKCldLFxuICAgICAgc2NvcmVib2FyZElkZW50aXR5OiB0aGlzLnNjb3JlYm9hcmRJZGVudGl0eS5pZGVudGlmaWVyXG4gICAgfTtcblxuICAgIC8vIFJldHVybiB0aGUgZW50aXR5IGVudHJ5XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBlbnRpdHkgZnJvbSB0aGUgcHJvdmlkZWQgZW50aXR5IGVudHJ5LlxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRvIHRoZSBlbnRpdHkgZGF0YSBpcyBjb21pbmcgZnJvbVxuICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudGl0eSBlbnRyeSB0byBsb2FkXG4gICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciB0byBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgZW50aXR5IGRhdGE7IGRlZmF1bHQgaXMgdHJ1ZVxuICAgKi9cbiAgcHVibGljIGxvYWREYXRhRW50cnkoXG4gICAgd29ybGQ6IFdvcmxkLFxuICAgIGVudHJ5OiBFbnRpdHlFbnRyeSxcbiAgICBvdmVyd3JpdGUgPSB0cnVlXG4gICk6IHZvaWQge1xuICAgIC8vIENoZWNrIHRoYXQgdGhlIHVuaXF1ZSBpZCBtYXRjaGVzIHRoZSBlbnRpdHkncyB1bmlxdWUgaWRcbiAgICBpZiAoZW50cnkudW5pcXVlSWQgIT09IHRoaXMudW5pcXVlSWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgZW50aXR5IGVudHJ5IGFzIHRoZSB1bmlxdWUgaWQgZG9lcyBub3QgbWF0Y2ggdGhlIGVudGl0eSdzIHVuaXF1ZSBpZCFcIlxuICAgICAgKTtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgZW50aXR5J3MgaWRlbnRpZmllclxuICAgIGlmIChlbnRyeS5pZGVudGlmaWVyICE9PSB0aGlzLnR5cGUuaWRlbnRpZmllcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBlbnRpdHkgZW50cnkgYXMgdGhlIGlkZW50aWZpZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGVudGl0eSdzIGlkZW50aWZpZXIhXCJcbiAgICAgICk7XG5cbiAgICAvLyBTZXQgdGhlIGVudGl0eSdzIHBvc2l0aW9uIGFuZCByb3RhdGlvblxuICAgIHRoaXMucG9zaXRpb24uc2V0KGVudHJ5LnBvc2l0aW9uKTtcbiAgICB0aGlzLnJvdGF0aW9uLnNldChlbnRyeS5yb3RhdGlvbik7XG5cbiAgICAvLyBTZXQgdGhlIGVudGl0eSdzIHNjb3JlYm9hcmQgaWRlbnRpdHlcbiAgICB0aGlzLnNjb3JlYm9hcmRJZGVudGl0eSA9IG5ldyBTY29yZWJvYXJkSWRlbnRpdHkoXG4gICAgICB0aGlzLFxuICAgICAgZW50cnkuc2NvcmVib2FyZElkZW50aXR5XG4gICAgKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgc2hvdWxkIG92ZXJ3cml0ZSB0aGUgY3VycmVudCBkYXRhXG4gICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgdGhpcy5jb21wb25lbnRzLmNsZWFyKCk7XG4gICAgICB0aGlzLnRyYWl0cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgY29tcG9uZW50cyB0byB0aGUgZW50aXR5LCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cnkuY29tcG9uZW50cykge1xuICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudHMuaGFzKGtleSkpIHRoaXMuY29tcG9uZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSB0cmFpdHMgdG8gdGhlIGVudGl0eSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgZW50cnkudHJhaXRzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFsZXR0ZSBoYXMgdGhlIHRyYWl0XG4gICAgICBjb25zdCB0cmFpdFR5cGUgPSB3b3JsZC5lbnRpdHlQYWxldHRlLnRyYWl0cy5nZXQodHJhaXQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzIGluIHRoZSBwYWxldHRlXG4gICAgICBpZiAoIXRyYWl0VHlwZSkge1xuICAgICAgICB3b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHRyYWl0IFwiJHt0cmFpdH1cIiBmb3IgZW50aXR5IFwiJHt0aGlzLnR5cGUuaWRlbnRpZmllcn06JHt0aGlzLnVuaXF1ZUlkfVwiIGFzIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlYFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIGFkZCB0aGUgdHJhaXQgdG8gdGhlIGVudGl0eVxuICAgICAgdGhpcy5hZGRUcmFpdCh0cmFpdFR5cGUgYXMgdHlwZW9mIEVudGl0eVRyYWl0KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIG1ldGFkYXRhIHRvIHRoZSBlbnRpdHksIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeS5tZXRhZGF0YSkge1xuICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhLmhhcyhrZXkpKSB0aGlzLm1ldGFkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGZsYWdzIHRvIHRoZSBlbnRpdHksIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeS5mbGFncykge1xuICAgICAgaWYgKCF0aGlzLmZsYWdzLmhhcyhrZXkpKSB0aGlzLmZsYWdzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGVudGl0eSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICghdGhpcy5hdHRyaWJ1dGVzLmhhcyhrZXkpKSB0aGlzLmF0dHJpYnV0ZXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSBpZCBmb3IgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIG5ldHdvcmsgVGhlIG5ldHdvcmsgaWQgb2YgdGhlIGVudGl0eSB0eXBlXG4gICAqIEBwYXJhbSBydW50aW1lSWQgVGhlIGN1cnJlbnQgcnVudGltZSBpZCBvZiB0aGUgZW50aXR5XG4gICAqIEByZXR1cm5zIEEgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBmb3IgdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVVbmlxdWVJZChuZXR3b3JrOiBudW1iZXIsIHJ1bnRpbWVJZDogYmlnaW50KTogYmlnaW50IHtcbiAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpZCBmb3IgdGhlIGVudGl0eVxuICAgIGNvbnN0IHVuaXF1ZSA9IEJpZ0ludChNYXRoLmFicyhEYXRlLm5vdygpID4+IDQpICYgMHgxX2ZmKTtcblxuICAgIHJldHVybiBCaWdJbnQobmV0d29yayA8PCAxOSkgfCAodW5pcXVlIDw8IDEwbikgfCBydW50aW1lSWQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5IH07XG4iLCAiaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuaW1wb3J0IHtcbiAgQ1JFQVRJVkVfQ09OVEVOVCxcbiAgSVRFTV9UWVBFUyxcbiAgSVRFTURBVEEsXG4gIFRPT0xfVFlQRVNcbn0gZnJvbSBcIkBzZXJlbml0eWpzL2RhdGFcIjtcbmltcG9ydCB7IENyZWF0aXZlSXRlbXMsIEl0ZW1EYXRhIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEl0ZW1Ub29sVGllciwgdHlwZSBJdGVtSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4uLy4uL2Jsb2NrXCI7XG5cbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuaW1wb3J0IHsgQ3JlYXRpdmVJdGVtIH0gZnJvbSBcIi4vY3JlYXRpdmVcIjtcblxuaW1wb3J0IHR5cGUgeyBDb21wb3VuZFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuLy8gQ3JlYXRlIGEgbmV3IHN0cmVhbSBmcm9tIHRoZSBpdGVtIGRhdGEuXG5jb25zdCBkYXRhU3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShJVEVNREFUQSk7XG5cbi8vIFJlYWQgdGhlIGl0ZW0gZGF0YSBmcm9tIHRoZSBzdHJlYW0uXG5jb25zdCBkYXRhID0gSXRlbURhdGEucmVhZChkYXRhU3RyZWFtKTtcblxuLy8gSXRlcmF0ZSBvdmVyIHRoZSBpdGVtIGRhdGEuXG5mb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSkge1xuICAvLyBHZXQgdGhlIG1ldGFkYXRhIGZvciB0aGUgaXRlbS5cbiAgY29uc3QgbWV0YSA9IElURU1fVFlQRVMuZmluZCgodHlwZSkgPT4gdHlwZS5pZGVudGlmaWVyID09PSBpdGVtLm5hbWUpO1xuXG4gIC8vIEdldCB0aGUgdG9vbCB0eXBlIGZvciB0aGUgaXRlbS5cbiAgY29uc3QgdG9vbCA9IFRPT0xfVFlQRVMuZmluZCgodG9vbCkgPT4gdG9vbC50eXBlcy5pbmNsdWRlcyhpdGVtLm5hbWUpKTtcbiAgY29uc3QgaW5kZXggPSB0b29sPy50eXBlcy5pbmRleE9mKGl0ZW0ubmFtZSk7XG4gIGNvbnN0IGxldmVsID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IEl0ZW1Ub29sVGllci5Ob25lIDogaW5kZXggKyAxO1xuICBjb25zdCBibG9ja1R5cGUgPSBCbG9ja1R5cGUudHlwZXMuZ2V0KGl0ZW0ubmFtZSkgPz8gbnVsbDtcblxuICAvLyBDcmVhdGUgdGhlIGl0ZW0gdHlwZS5cbiAgY29uc3QgdHlwZSA9IG5ldyBJdGVtVHlwZShpdGVtLm5hbWUgYXMgSXRlbUlkZW50aWZpZXIsIGl0ZW0ubmV0d29ya0lkLCB7XG4gICAgc3RhY2thYmxlOiBtZXRhPy5zdGFja2FibGUsXG4gICAgbWF4QW1vdW50OiBtZXRhPy5tYXhBbW91bnQsXG4gICAgdG9vbDogdG9vbD8ubmV0d29yayxcbiAgICB0aWVyOiBsZXZlbCxcbiAgICB0YWdzOiBtZXRhPy50YWdzLFxuICAgIGJsb2NrOiBibG9ja1R5cGVcbiAgfSk7XG5cbiAgLy8gQWRkIHRoZSBpdGVtIHR5cGUgdG8gdGhlIG1hcC5cbiAgSXRlbVR5cGUudHlwZXMuc2V0KHR5cGUuaWRlbnRpZmllciwgdHlwZSk7XG59XG5cbi8vIENyZWF0ZSBhIG5ldyBzdHJlYW0gZnJvbSB0aGUgY3JlYXRpdmUgY29udGVudC5cbmNvbnN0IGNyZWF0aXZlU3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShDUkVBVElWRV9DT05URU5UKTtcblxuLy8gUmVhZCB0aGUgY3JlYXRpdmUgY29udGVudCBmcm9tIHRoZSBzdHJlYW0uXG5jb25zdCBjcmVhdGl2ZSA9IENyZWF0aXZlSXRlbXMucmVhZChjcmVhdGl2ZVN0cmVhbSk7XG5cbi8vIEl0ZXJhdGUgb3ZlciB0aGUgY3JlYXRpdmUgY29udGVudC5cbmZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBjcmVhdGl2ZS5lbnRyaWVzKCkpIHtcbiAgLy8gR2V0IHRoZSBpdGVtIHR5cGUgZnJvbSB0aGUgbWFwLlxuICBjb25zdCB0eXBlID0gWy4uLkl0ZW1UeXBlLnR5cGVzLnZhbHVlcygpXS5maW5kKFxuICAgICh0eXBlKSA9PiB0eXBlLm5ldHdvcmsgPT09IGl0ZW0ubmV0d29ya1xuICApO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBpdGVtIHR5cGUgaXMgdmFsaWQuXG4gIC8vIElmIG5vdCwgdGhlbiBjb250aW51ZSB0byB0aGUgbmV4dCBpdGVtLlxuICBpZiAoIXR5cGUpIGNvbnRpbnVlO1xuXG4gIC8vIERvIHRvIHNvbWUgcmVhc29uLCBzb21lIGl0ZW1zIGhhdmUgYW4gaW5jb3JyZWN0IG1ldGFkYXRhIHZhbHVlLFxuICAvLyBTbyB3ZSB3aWxsIGdlbmVyYXRlIG91ciBvd24uXG4gIGNvbnN0IG1ldGFkYXRhID0gaXRlbS5tZXRhZGF0YSA/PyAwO1xuICAvLyBpbmRleCAtIGNyZWF0aXZlLmZpbmRJbmRleCgoaW5kZXhfKSA9PiBpbmRleF8ubmV0d29yayA9PT0gaXRlbS5uZXR3b3JrKTtcblxuICBjb25zdCBuYnQgPSBpdGVtLmV4dHJhcz8ubmJ0IGFzIENvbXBvdW5kVGFnO1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBpdGVtIGluc3RhbmNlIGRlc2NyaXB0b3IuXG4gIGl0ZW0ubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgLy8gaXRlbS5uZXR3b3JrQmxvY2tJZCA9IHR5cGUuYmxvY2s/LnBlcm11dGF0aW9uc1ttZXRhZGF0YV0/Lm5ldHdvcmsgPz8gMDtcblxuICAvLyBTZXQgdGhlIGl0ZW0gaW4gdGhlIHJlZ2lzdHJ5LlxuICBDcmVhdGl2ZUl0ZW0uaXRlbXMuc2V0KGluZGV4LCBuZXcgQ3JlYXRpdmVJdGVtKHR5cGUsIG1ldGFkYXRhLCBuYnQpKTtcbn1cbiIsICJpbXBvcnQge1xuICBCTE9DS19UWVBFUyxcbiAgQkxPQ0tfUEVSTVVUQVRJT05TLFxuICBCTE9DS19EUk9QUyxcbiAgQkxPQ0tfTUVUQURBVEFcbn0gZnJvbSBcIkBzZXJlbml0eWpzL2RhdGFcIjtcblxuaW1wb3J0IHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuaW1wb3J0IHsgQmxvY2tQZXJtdXRhdGlvbiB9IGZyb20gXCIuL3Blcm11dGF0aW9uXCI7XG5pbXBvcnQgeyBJdGVtRHJvcCB9IGZyb20gXCIuL2Ryb3BzXCI7XG5cbmltcG9ydCB0eXBlIHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbi8vIEl0ZXJhdGUgb3ZlciB0aGUgYmxvY2sgdHlwZXMgYW5kIHJlZ2lzdGVyIHRoZW0uXG5mb3IgKGNvbnN0IHR5cGUgb2YgQkxPQ0tfVFlQRVMpIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICBpZiAoQmxvY2tUeXBlLnR5cGVzLmhhcyh0eXBlLmlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQmxvY2sgdHlwZSAke3R5cGUuaWRlbnRpZmllcn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBibG9jayBkcm9wcyBmb3IgdGhlIGJsb2NrIHR5cGUuXG4gIGNvbnN0IGRyb3AgPSBCTE9DS19EUk9QUy5maW5kKChkcm9wKSA9PiBkcm9wLmlkZW50aWZpZXIgPT09IHR5cGUuaWRlbnRpZmllcik7XG5cbiAgLy8gRmluZCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBibG9jayB0eXBlLlxuICBjb25zdCBtZXRhZGF0YSA9IEJMT0NLX01FVEFEQVRBLmZpbmQoXG4gICAgKG1ldGEpID0+IG1ldGEuaWRlbnRpZmllciA9PT0gdHlwZS5pZGVudGlmaWVyXG4gICkgPz8geyBoYXJkbmVzczogMCwgZnJpY3Rpb246IDAsIG1hcENvbG9yOiBcIlwiIH07XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrIHR5cGUuXG4gIGNvbnN0IGluc3RhbmNlID0gbmV3IEJsb2NrVHlwZSh0eXBlLmlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyLCB7XG4gICAgbG9nZ2FibGU6IHR5cGUubG9nZ2FibGUsXG4gICAgYWlyOiB0eXBlLmFpcixcbiAgICBsaXF1aWQ6IHR5cGUubGlxdWlkLFxuICAgIHNvbGlkOiB0eXBlLnNvbGlkLFxuICAgIGhhcmRuZXNzOiBtZXRhZGF0YS5oYXJkbmVzcyxcbiAgICBmcmljdGlvbjogbWV0YWRhdGEuZnJpY3Rpb24sXG4gICAgY29sb3I6IG1ldGFkYXRhLm1hcENvbG9yLFxuICAgIGNvbXBvbmVudHM6IHR5cGUuY29tcG9uZW50cyxcbiAgICB0YWdzOiB0eXBlLnRhZ3NcbiAgfSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgaGFzIGRyb3BzLlxuICBpZiAoZHJvcCkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZHJvcD8uZHJvcHMgPz8gW10pIHtcbiAgICAgIC8vIFNlcGFyYXRlIHRoZSBkcm9wIGluZm9ybWF0aW9uLlxuICAgICAgY29uc3QgeyBpZGVudGlmaWVyLCBtaW4sIG1heCwgY2hhbmNlIH0gPSBlbnRyeTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0gZHJvcC5cbiAgICAgIGNvbnN0IGl0ZW1Ecm9wID0gbmV3IEl0ZW1Ecm9wKGlkZW50aWZpZXIsIG1pbiwgbWF4LCBjaGFuY2UpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbSBkcm9wIHRvIHRoZSBibG9jayB0eXBlLlxuICAgICAgaW5zdGFuY2UuZHJvcHMucHVzaChpdGVtRHJvcCk7XG4gICAgfVxuICB9XG4gIC8vIFJlZ2lzdGVyIHRoZSBkZWZhdWx0IGRyb3AgZm9yIHRoZSBibG9jayB0eXBlLlxuICBlbHNlIGluc3RhbmNlLmRyb3BzLnB1c2gobmV3IEl0ZW1Ecm9wKHR5cGUuaWRlbnRpZmllciwgMSwgMSwgMSkpO1xuXG4gIC8vIFNldCB0aGUgYmxvY2sgdHlwZSBpbiB0aGUgcmVnaXN0cnkuXG4gIEJsb2NrVHlwZS50eXBlcy5zZXQodHlwZS5pZGVudGlmaWVyIGFzIEJsb2NrSWRlbnRpZmllciwgaW5zdGFuY2UpO1xufVxuXG4vLyBJdGVyYXRlIG92ZXIgdGhlIGJsb2NrIHBlcm11dGF0aW9ucyBhbmQgcmVnaXN0ZXIgdGhlbS5cbmZvciAoY29uc3QgcGVybXV0YXRpb24gb2YgQkxPQ0tfUEVSTVVUQVRJT05TKSB7XG4gIC8vIEdldCB0aGUgYmxvY2sgdHlwZSBmcm9tIHRoZSByZWdpc3RyeS5cbiAgY29uc3QgdHlwZSA9IEJsb2NrVHlwZS50eXBlcy5nZXQocGVybXV0YXRpb24uaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXIpO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBibG9jayB0eXBlIGV4aXN0cy5cbiAgaWYgKCF0eXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCbG9jayB0eXBlICR7cGVybXV0YXRpb24uaWRlbnRpZmllcn0gZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIG5ldyBibG9jayBwZXJtdXRhdGlvbi5cbiAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQmxvY2tQZXJtdXRhdGlvbihcbiAgICBwZXJtdXRhdGlvbi5oYXNoLFxuICAgIHBlcm11dGF0aW9uLnN0YXRlIGFzIG5ldmVyLFxuICAgIHR5cGVcbiAgKTtcblxuICAvLyBSZWdpc3RlciB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gIHR5cGUucGVybXV0YXRpb25zLnB1c2goaW5zdGFuY2UpO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSBibG9jayBwZXJtdXRhdGlvbiBpbiB0aGUgcmVnaXN0cnkuXG4gIEJsb2NrUGVybXV0YXRpb24ucGVybXV0YXRpb25zLnNldChwZXJtdXRhdGlvbi5oYXNoLCBpbnN0YW5jZSk7XG59XG4iLCAiaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja1N0YXRlLCBCbG9ja1R5cGVQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEl0ZW1Ecm9wIH0gZnJvbSBcIi4vZHJvcHNcIjtcblxuaW1wb3J0IHR5cGUgeyBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4vcGVybXV0YXRpb25cIjtcblxuY29uc3QgRGVmYXVsdEJsb2NrVHlwZVByb3BlcnRpZXM6IEJsb2NrVHlwZVByb3BlcnRpZXMgPSB7XG4gIGxvZ2dhYmxlOiBmYWxzZSxcbiAgYWlyOiBmYWxzZSxcbiAgbGlxdWlkOiBmYWxzZSxcbiAgc29saWQ6IGZhbHNlLFxuICBoYXJkbmVzczogMCxcbiAgZnJpY3Rpb246IDAsXG4gIGNvbG9yOiBcIlwiLFxuICBjb21wb25lbnRzOiBbXSxcbiAgdGFnczogW10sXG4gIGRyb3BzOiBbXSxcbiAgcGVybXV0YXRpb25zOiBbXVxufTtcblxuLyoqXG4gKiBCbG9ja1R5cGUgcmVwcmVzZW50cyBhIGJsb2NrIHR5cGUgaW4gdGhlIGdhbWUsIHdoaWNoIGhvbGQgYWxsIHBvc3NpYmxlIHBlcm11dGF0aW9ucyB0aGUgYmxvY2sgY2FuIGhhdmUuXG4gKiBcbiAqICoqRXhhbXBsZSBVc2FnZSoqXG4gKiBgYGB0eXBlc2NyaXB0XG5cdGltcG9ydCB7IEJsb2NrVHlwZSwgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2Jsb2NrXCJcblxuXHQvLyBHZXQgdGhlIGJsb2NrIHR5cGUgZm9yIGRpcnRcblx0Y29uc3QgZGlydFR5cGUgPSBCbG9ja1R5cGUuZ2V0KEJsb2NrSWRlbnRpZmllci5EaXJ0KVxuXG5cdC8vIEdldCB0aGUgaWRlbnRpZmllciBvZiB0aGUgdHlwZVxuXHRkaXJ0VHlwZS5pZGVudGlmaWVyIC8vIEV4cGVjdGVkIHRvIGJlIFwibWluZWNyYWZ0OmRpcnRcIlxuICogYGBgXG4gKi9cbmNsYXNzIEJsb2NrVHlwZTxUIGV4dGVuZHMga2V5b2YgQmxvY2tTdGF0ZSA9IGtleW9mIEJsb2NrU3RhdGU+IHtcbiAgLyoqXG4gICAqIEEgY29sbGVjdGl2ZSByZWdpc3RyeSBvZiBhbGwgYmxvY2sgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gbmV3IE1hcDxzdHJpbmcsIEJsb2NrVHlwZT4oKTtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogVDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYmxvY2sgdHlwZSBpcyBjdXN0b20uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBibG9jayB0eXBlIGlzIGxvZ2dhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dhYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBibG9jayB0eXBlIGlzIGFpci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhaXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJsb2NrIHR5cGUgaXMgbGlxdWlkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxpcXVpZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYmxvY2sgdHlwZSBpcyBzb2xpZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb2xpZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGhhcmRuZXNzIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhcmRuZXNzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmljdGlvbiBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmcmljdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFwIGNvbG9yIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNvbXBvbmVudHMgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB0YWdzIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3M6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXRlbSBkcm9wcyBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkcm9wczogQXJyYXk8SXRlbURyb3A+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHBlcm11dGF0aW9ucyBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZXJtdXRhdGlvbnM6IEFycmF5PEJsb2NrUGVybXV0YXRpb24+ID0gW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoaWRlbnRpZmllcjogVCwgcHJvcGVydGllcz86IFBhcnRpYWw8QmxvY2tUeXBlUHJvcGVydGllcz4pIHtcbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMuY3VzdG9tID0gZmFsc2U7XG5cbiAgICAvLyBTcHJlYWQgdGhlIHByb3BlcnRpZXMgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgIGNvbnN0IHByb3BzID0geyAuLi5EZWZhdWx0QmxvY2tUeXBlUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBibG9jayB0eXBlLlxuICAgIHRoaXMubG9nZ2FibGUgPSBwcm9wcy5sb2dnYWJsZTtcbiAgICB0aGlzLmFpciA9IHByb3BzLmFpcjtcbiAgICB0aGlzLmxpcXVpZCA9IHByb3BzLmxpcXVpZDtcbiAgICB0aGlzLnNvbGlkID0gcHJvcHMuc29saWQ7XG4gICAgdGhpcy5oYXJkbmVzcyA9IHByb3BzLmhhcmRuZXNzO1xuICAgIHRoaXMuZnJpY3Rpb24gPSBwcm9wcy5mcmljdGlvbjtcbiAgICB0aGlzLmNvbG9yID0gcHJvcHMuY29sb3I7XG4gICAgdGhpcy5jb21wb25lbnRzID0gWy4uLnByb3BzLmNvbXBvbmVudHMsIC4uLnRoaXMuY29tcG9uZW50c107XG4gICAgdGhpcy50YWdzID0gWy4uLnByb3BzLnRhZ3MsIC4uLnRoaXMudGFnc107XG4gICAgdGhpcy5kcm9wcyA9IFsuLi5wcm9wcy5kcm9wcywgLi4udGhpcy5kcm9wc107XG4gICAgdGhpcy5wZXJtdXRhdGlvbnMgPSBbLi4ucHJvcHMucGVybXV0YXRpb25zLCAuLi50aGlzLnBlcm11dGF0aW9uc107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXRQZXJtdXRhdGlvbihzdGF0ZT86IEJsb2NrU3RhdGVbVF0pOiBCbG9ja1Blcm11dGF0aW9uPFQ+IHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHBlcm11dGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IHBlcm11dGF0aW9uIG9mIHRoaXMucGVybXV0YXRpb25zKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGVybXV0YXRpb24gbWF0Y2hlcyB0aGUgc3RhdGUuXG4gICAgICBpZiAoIXN0YXRlIHx8IHBlcm11dGF0aW9uLm1hdGNoZXMoc3RhdGUgYXMgQmxvY2tTdGF0ZVtUXSkpIHtcbiAgICAgICAgcmV0dXJuIHBlcm11dGF0aW9uIGFzIEJsb2NrUGVybXV0YXRpb248VD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IHBlcm11dGF0aW9uIGlmIHRoZSBzdGF0ZSBpcyBub3QgZm91bmQuXG4gICAgcmV0dXJuIHRoaXMucGVybXV0YXRpb25zWzBdIGFzIEJsb2NrUGVybXV0YXRpb248VD47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBibG9jayB0eXBlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQ8VCBleHRlbmRzIGtleW9mIEJsb2NrU3RhdGU+KGlkZW50aWZpZXI6IFQpOiBCbG9ja1R5cGU8VD4ge1xuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZSBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICBjb25zdCB0eXBlID0gQmxvY2tUeXBlLnR5cGVzLmdldChpZGVudGlmaWVyIGFzIEJsb2NrSWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgdHlwZSBleGlzdHMuXG4gICAgaWYgKCF0eXBlKSByZXR1cm4gdGhpcy5nZXQoQmxvY2tJZGVudGlmaWVyLkFpcikgYXMgQmxvY2tUeXBlPFQ+O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBibG9jayB0eXBlLlxuICAgIHJldHVybiB0eXBlIGFzIEJsb2NrVHlwZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGJsb2NrIHR5cGVzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBbGwoKTogQXJyYXk8QmxvY2tUeXBlPiB7XG4gICAgcmV0dXJuIFsuLi5CbG9ja1R5cGUudHlwZXMudmFsdWVzKCldO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrVHlwZSB9O1xuIiwgImltcG9ydCB7IEJ5dGVUYWcsIENvbXBvdW5kVGFnLCBJbnRUYWcsIFN0cmluZ1RhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuaW1wb3J0IHsgQmxvY2tTdGF0ZSB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJsb2NrVHlwZSB9IGZyb20gXCIuL3R5cGVcIjtcbmltcG9ydCB7IGhhc2ggfSBmcm9tIFwiLi9oYXNoXCI7XG5cbmNsYXNzIEJsb2NrUGVybXV0YXRpb248VCBleHRlbmRzIGtleW9mIEJsb2NrU3RhdGUgPSBrZXlvZiBCbG9ja1N0YXRlPiB7XG4gIC8qKlxuICAgKiBBIGNvbGxlY3RpdmUgcmVnaXN0cnkgb2YgYWxsIGJsb2NrIHBlcm11dGF0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGVybXV0YXRpb25zID0gbmV3IE1hcDxudW1iZXIsIEJsb2NrUGVybXV0YXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIGhhc2ggb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IHZhbHVlIG9mIHRoZSBibG9jayBwZXJtdXRhdGlvbiBpbiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlOiBCbG9ja1N0YXRlW1RdO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgdHlwZSBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogQmxvY2tUeXBlPFQ+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqIEBwYXJhbSBuZXR3b3JrIFRoZSBuZXR3b3JrIGhhc2ggb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIG9mIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGJsb2NrIHR5cGUgb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG5ldHdvcms6IG51bWJlcixcbiAgICBzdGF0ZTogQmxvY2tTdGF0ZVtUXSxcbiAgICB0eXBlOiBCbG9ja1R5cGU8VD5cbiAgKSB7XG4gICAgdGhpcy5uZXR3b3JrID0gbmV0d29yaztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmluZGV4ID0gdHlwZS5wZXJtdXRhdGlvbnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBibG9jayBwZXJtdXRhdGlvbiBtYXRjaGVzIHRoZSBpZGVudGlmaWVyIGFuZCBzdGF0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGJsb2NrIGlkZW50aWZpZXIgdG8gbWF0Y2guXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgYmxvY2sgc3RhdGUgdG8gbWF0Y2guXG4gICAqL1xuICBwdWJsaWMgbWF0Y2hlcyhzdGF0ZTogQmxvY2tTdGF0ZVtUXSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBzdGF0ZSBtYXRjaGVzLlxuICAgIGZvciAoY29uc3Qga2V5IGluIHN0YXRlKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZVtrZXldICE9PSBzdGF0ZVtrZXldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgcGVybXV0YXRpb24gbWF0Y2hlcy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgYmxvY2sgcGVybXV0YXRpb24gZnJvbSB0aGUgYmxvY2sgaWRlbnRpZmllciBhbmQgc3RhdGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBibG9jayBpZGVudGlmaWVyIHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgYmxvY2sgc3RhdGUgdG8gcmVzb2x2ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzb2x2ZTxUIGV4dGVuZHMga2V5b2YgQmxvY2tTdGF0ZT4oXG4gICAgaWRlbnRpZmllcjogVCxcbiAgICBzdGF0ZT86IEJsb2NrU3RhdGVbVF1cbiAgKTogQmxvY2tQZXJtdXRhdGlvbjxUPiB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgIGNvbnN0IHR5cGUgPSBCbG9ja1R5cGUudHlwZXMuZ2V0KGlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayB0eXBlIGV4aXN0cy5cbiAgICBpZiAoIXR5cGUpIHJldHVybiB0aGlzLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkFpcikgYXMgQmxvY2tQZXJtdXRhdGlvbjxUPjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBub3QgcHJvdmlkZWQuXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSB0eXBlLnBlcm11dGF0aW9ucy5maW5kKChwZXJtdXRhdGlvbikgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdGUpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgYmxvY2sgc3RhdGUuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHBlcm11dGF0aW9uLnN0YXRlIGFzIG5ldmVyKVtrZXldO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAgICAgICAgY29uc3QgYm9vbCA9IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdGF0ZSB0byBhIGJvb2xlYW4gaWYgaXQgaXMgYSBib29sZWFuLlxuICAgICAgICBjb25zdCBxdWVyeSA9XG4gICAgICAgICAgYm9vbCAmJiAoc3RhdGVba2V5XSA9PT0gMCB8fCBzdGF0ZVtrZXldID09PSAxKVxuICAgICAgICAgICAgPyBzdGF0ZVtrZXldID09PSAxXG4gICAgICAgICAgICA6IHN0YXRlW2tleV07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHN0YXRlIG1hdGNoZXNcbiAgICAgICAgaWYgKHZhbHVlICE9PSBxdWVyeSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgcGVybXV0YXRpb24gbWF0Y2hlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHBlcm11dGF0aW9uIGRvZXMgbm90IGV4aXN0LlxuICAgIGlmICghcGVybXV0YXRpb24pIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZGVmYXVsdCBwZXJtdXRhdGlvbiBpZiB0aGUgc3RhdGUgaXMgbm90IGZvdW5kLlxuICAgICAgcmV0dXJuIHR5cGUucGVybXV0YXRpb25zWzBdIGFzIEJsb2NrUGVybXV0YXRpb248VD47XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICByZXR1cm4gcGVybXV0YXRpb24gYXMgQmxvY2tQZXJtdXRhdGlvbjxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqIFByaW1hcmlseSB1c2VkIGZvciBjdXN0b20gYmxvY2sgdHlwZXMuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBibG9jayB0eXBlIG9mIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShcbiAgICB0eXBlOiBCbG9ja1R5cGUsXG4gICAgc3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPlxuICApOiBCbG9ja1Blcm11dGF0aW9uIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldHdvcmsgaGFzaCBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAgY29uc3QgbmV0d29yayA9IGhhc2godHlwZS5pZGVudGlmaWVyLCBzdGF0ZSA/PyB7fSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgYmxvY2sgcGVybXV0YXRpb24uXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBuZXcgQmxvY2tQZXJtdXRhdGlvbihuZXR3b3JrLCBzdGF0ZSA/PyB7fSwgdHlwZSk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAgQmxvY2tQZXJtdXRhdGlvbi5wZXJtdXRhdGlvbnMuc2V0KHBlcm11dGF0aW9uLm5ldHdvcmssIHBlcm11dGF0aW9uKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBwZXJtdXRhdGlvbiBpbiB0aGUgYmxvY2sgdHlwZS5cbiAgICB0eXBlLnBlcm11dGF0aW9ucy5wdXNoKHBlcm11dGF0aW9uKTtcblxuICAgIC8vIFJldHVybiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAgcmV0dXJuIHBlcm11dGF0aW9uO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b05idChwZXJtdXRhdGlvbjogQmxvY2tQZXJtdXRhdGlvbik6IENvbXBvdW5kVGFnPHVua25vd24+IHtcbiAgICBjb25zdCBuYnQgPSBuZXcgQ29tcG91bmRUYWcoXCJcIiwge30pO1xuXG4gICAgY29uc3QgbmFtZSA9IG5ldyBTdHJpbmdUYWcoXCJuYW1lXCIsIHBlcm11dGF0aW9uLnR5cGUuaWRlbnRpZmllcik7XG5cbiAgICBjb25zdCBzdGF0ZXMgPSBuZXcgQ29tcG91bmRUYWcoXCJzdGF0ZXNcIiwge30pO1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBlcm11dGF0aW9uLnN0YXRlKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHBlcm11dGF0aW9uLnN0YXRlKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpbmRleF07XG5cbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICAgIHN0YXRlcy5hZGRUYWcobmV3IEludFRhZyhrZXksIHZhbHVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHtcbiAgICAgICAgICBzdGF0ZXMuYWRkVGFnKG5ldyBTdHJpbmdUYWcoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjoge1xuICAgICAgICAgIHN0YXRlcy5hZGRUYWcobmV3IEJ5dGVUYWcoa2V5LCB2YWx1ZSA/IDEgOiAwKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBuYnQuYWRkVGFnKG5hbWUpO1xuICAgIG5idC5hZGRUYWcoc3RhdGVzKTtcblxuICAgIHJldHVybiBuYnQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21OYnQobmJ0OiBDb21wb3VuZFRhZzx1bmtub3duPik6IEJsb2NrUGVybXV0YXRpb24ge1xuICAgIGNvbnN0IG5hbWUgPSBuYnQuZ2V0VGFnKFwibmFtZVwiKSBhcyBTdHJpbmdUYWc7XG4gICAgY29uc3Qgc3RhdGVzID0gbmJ0LmdldFRhZyhcInN0YXRlc1wiKSBhcyBDb21wb3VuZFRhZzx1bmtub3duPjtcblxuICAgIGNvbnN0IHN0YXRlID0gc3RhdGVzLnZhbHVlT2YoKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuICAgIHJldHVybiBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUobmFtZS52YWx1ZSBhcyBCbG9ja0lkZW50aWZpZXIsIHN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja1Blcm11dGF0aW9uIH07XG4iLCAiaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuaW1wb3J0IHsgQnl0ZVRhZywgQ29tcG91bmRUYWcsIEludFRhZywgU3RyaW5nVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuXG5jb25zdCBIQVNIX09GRlNFVCA9IDB4ODFfMWNfOWRfYzU7XG5cbmZ1bmN0aW9uIGhhc2goXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+XG4pOiBudW1iZXIge1xuICAvLyBTZXBhcmF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBzdGF0ZSBvYmplY3QuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdGF0ZSk7XG4gIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUpO1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBjb21wb3VuZCB0YWcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaWRlbnRpZmllci5cbiAgY29uc3Qgcm9vdCA9IG5ldyBDb21wb3VuZFRhZyhcIlwiLCB7fSk7XG4gIHJvb3QuYWRkVGFnKG5ldyBTdHJpbmdUYWcoXCJuYW1lXCIsIGlkZW50aWZpZXIpKTtcblxuICAvLyBDcmVhdGUgYSBuZXcgY29tcG91bmQgdGFnIHdpdGggdGhlIG5hbWUgb2YgXCJzdGF0ZXNcIi5cbiAgY29uc3Qgc3RhdGVzID0gbmV3IENvbXBvdW5kVGFnKFwic3RhdGVzXCIsIHt9KTtcblxuICAvLyBMb29wIHRocm91Z2ggZWFjaCBrZXkgYW5kIHZhbHVlIGluIHRoZSBzdGF0ZSBvYmplY3QuXG4gIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xuXG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICBzdGF0ZXMuYWRkVGFnKG5ldyBJbnRUYWcoa2V5LCB2YWx1ZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInN0cmluZ1wiOiB7XG4gICAgICAgIHN0YXRlcy5hZGRUYWcobmV3IFN0cmluZ1RhZyhrZXksIHZhbHVlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiYm9vbGVhblwiOiB7XG4gICAgICAgIHN0YXRlcy5hZGRUYWcobmV3IEJ5dGVUYWcoa2V5LCB2YWx1ZSA/IDEgOiAwKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB0aGUgc3RhdGVzIHRhZyB0byB0aGUgcm9vdCB0YWcuXG4gIHJvb3QuYWRkVGFnKHN0YXRlcyk7XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW0gYW5kIHdyaXRlIHRoZSByb290IHRhZyB0byBpdC5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICBDb21wb3VuZFRhZy53cml0ZShzdHJlYW0sIHJvb3QpO1xuXG4gIC8vIEFzc2lnbiB0aGUgaGFzaCB0byB0aGUgb2Zmc2V0LlxuICBsZXQgaGFzaCA9IEhBU0hfT0ZGU0VUO1xuXG4gIC8vIExvb3AgdGhyb3VnaCBlYWNoIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlci5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHN0cmVhbS5nZXRCdWZmZXIoKSkge1xuICAgIC8vIFNldCB0aGUgaGFzaCB0byB0aGUgWE9SIG9mIHRoZSBoYXNoIGFuZCB0aGUgZWxlbWVudC5cbiAgICBoYXNoIF49IGVsZW1lbnQgJiAweGZmO1xuXG4gICAgLy8gQXBwbHkgdGhlIGhhc2ggYWxnb3JpdGhtLlxuICAgIGhhc2ggKz1cbiAgICAgIChoYXNoIDw8IDEpICsgKGhhc2ggPDwgNCkgKyAoaGFzaCA8PCA3KSArIChoYXNoIDw8IDgpICsgKGhhc2ggPDwgMjQpO1xuXG4gICAgLy8gQ29udmVydCB0aGUgaGFzaCB0byBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlci5cblxuICAgIGhhc2ggPSBoYXNoIHwgMDtcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgaGFzaC5cbiAgcmV0dXJuIGhhc2g7XG59XG5cbmV4cG9ydCB7IGhhc2ggfTtcbiIsICIvKipcbiAqIFJlcHJlc2VudHMgYSBibG9jayBkcm9wLlxuICovXG5jbGFzcyBJdGVtRHJvcCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgYmxvY2sgZHJvcC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aGUgYmxvY2sgZHJvcC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtaW46IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRoZSBibG9jayBkcm9wLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvYmFiaWxpdHkgb2YgdGhlIGJsb2NrIGRyb3AuIDAuMCAtIDEuMFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb2JhYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYmxvY2sgZHJvcC5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGJsb2NrIGRyb3AuXG4gICAqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gYW1vdW50IG9mIHRoZSBibG9jayBkcm9wLlxuICAgKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aGUgYmxvY2sgZHJvcC5cbiAgICogQHBhcmFtIHByb2JhYmlsaXR5IFRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgYmxvY2sgZHJvcC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgbWluOiBudW1iZXIsXG4gICAgbWF4OiBudW1iZXIsXG4gICAgcHJvYmFiaWxpdHk6IG51bWJlclxuICApIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICAgIHRoaXMucHJvYmFiaWxpdHkgPSBwcm9iYWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsIHRoZSBibG9jayBkcm9wIGFuZCByZXR1cm4gdGhlIGFtb3VudCBvZiB0aGUgZHJvcC5cbiAgICogQHJldHVybnMgVGhlIGFtb3VudCBvZiB0aGUgZHJvcC5cbiAgICovXG4gIHB1YmxpYyByb2xsKCk6IG51bWJlciB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgZHJvcC5cbiAgICBpZiAoTWF0aC5yYW5kb20oKSA+IHRoaXMucHJvYmFiaWxpdHkpIHJldHVybiAwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgdGhlIGRyb3AuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICh0aGlzLm1heCAtIHRoaXMubWluICsgMSkpICsgdGhpcy5taW47XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbURyb3AgfTtcbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcbmltcG9ydCB7IEJsb2NrUHJvcGVydHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQmxvY2tUeXBlUHJvcGVydGllcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyLCBJdGVtQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG5jbGFzcyBDdXN0b21CbG9ja1R5cGUgZXh0ZW5kcyBCbG9ja1R5cGUge1xuICBwcm90ZWN0ZWQgc3RhdGljIG5ldHdvcmtJZCA9IDEwMDAwOyAvLyBTdGFydCBhdCAxMDAwMCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB2YW5pbGxhIGJsb2NrIHR5cGVzLlxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgYmxvY2sgdHlwZSBpcyBjdXN0b20uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgSUQgb2YgdGhlIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcmtJZCA9ICsrQ3VzdG9tQmxvY2tUeXBlLm5ldHdvcmtJZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxCbG9ja1R5cGVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICBzdXBlcihpZGVudGlmaWVyIGFzIEJsb2NrSWRlbnRpZmllciwgcHJvcGVydGllcyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvTmJ0KHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IENvbXBvdW5kVGFnIHtcbiAgICAvLyBDcmVhdGUgYSByb290IGNvbXBvdW5kIHRhZyBmb3IgdGhlIGJsb2NrIHR5cGUuXG4gICAgY29uc3Qgcm9vdCA9IG5ldyBDb21wb3VuZFRhZygpO1xuXG4gICAgLy8gQ3JlYXRlIGEgY29tcG91bmQgdGFnIGZvciB0aGUgYmxvY2sgZGF0YS5cbiAgICBjb25zdCB2YW5pbGxhQmxvY2tEYXRhID0gcm9vdC5jcmVhdGVDb21wb3VuZFRhZyhcInZhbmlsbGFfYmxvY2tfZGF0YVwiKTtcbiAgICB2YW5pbGxhQmxvY2tEYXRhLmNyZWF0ZUludFRhZyhcImJsb2NrX2lkXCIsIHR5cGUubmV0d29ya0lkKTsgLy8gVGhlIGJsb2NrIG5ldHdvcmsgSUQsIHRoaXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBtYXRjaGluZyBpdGVtIHR5cGUuXG5cbiAgICAvLyBDcmVhdGUgYSBjb21wb3VuZCB0YWcgZm9yIGNyZWF0aXZlIGludmVudG9yeSBkYXRhLlxuICAgIGNvbnN0IG1lbnVDYXRlZ29yeURhdGEgPSByb290LmNyZWF0ZUNvbXBvdW5kVGFnKFwibWVudV9jYXRlZ29yeVwiKTtcbiAgICBtZW51Q2F0ZWdvcnlEYXRhLmNyZWF0ZVN0cmluZ1RhZyhcImNhdGVnb3J5XCIsIEl0ZW1DYXRlZ29yeS5OYXR1cmUpOyAvLyBUT0RPOiBBZGQgYSBwcm9wZXJ0eSBmb3IgdGhlIGNyZWF0aXZlIGludmVudG9yeSBjYXRlZ29yeS5cbiAgICAvLyBtZW51Q2F0ZWdvcnlEYXRhLmNyZWF0ZVN0cmluZ1RhZyhcImdyb3VwXCIsIEl0ZW1Hcm91cC4pOyAvLyBUaGUgY3JlYXRpdmUgaW52ZW50b3J5IGdyb3VwLlxuXG4gICAgLy8gQ3JlYXRlIGEgY29tcG91bmQgdGFnIGZvciB0aGUgTW9sYW5nIGRhdGEuXG4gICAgcm9vdC5jcmVhdGVJbnRUYWcoXCJtb2xhbmdWZXJzaW9uXCIsIDApOyAvLyBUaGUgdmVyc2lvbiBvZiB0aGUgTW9sYW5nIGRhdGEsIG5vdCBzdXJlIHdoYXQgdGhpcyBpbmRpY2F0ZXMgb24gdGhlIGNsaWVudCBlbmQuXG5cbiAgICAvLyBSZXR1cm4gdGhlIHJvb3QgY29tcG91bmQgdGFnLlxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIGEgYmxvY2sgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRvQmxvY2tQcm9wZXJ0eSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiBCbG9ja1Byb3BlcnR5IHtcbiAgICByZXR1cm4gbmV3IEJsb2NrUHJvcGVydHkodHlwZS5pZGVudGlmaWVyLCBDdXN0b21CbG9ja1R5cGUudG9OYnQodHlwZSkpO1xuICB9XG59XG5cbmV4cG9ydCB7IEN1c3RvbUJsb2NrVHlwZSB9O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL3RyYWl0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnZlbnRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dlaXJkby1kaXJlY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Vwc2lkZS1kb3duLWJpdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3Blbi1iaXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VwcGVyLWJsb2NrLWJpdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmVydGljYWwtaGFsZlwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY2FyZGluYWxfZGlyZWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kaXJlY3Rpb25cIjtcbiIsICJjbGFzcyBUcmFpdCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJhaXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgaWRlbnRpZmllcnMgdGhhdCB0aGlzIHRyYWl0IGlzIGNvbXBhdGlibGUgd2l0aCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlczogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRyYWl0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVHJhaXQpLmlkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRyYWl0LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB0cmFpdCBpcyBhZGRlZCB0byBhbiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25BZGQ/KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB0cmFpdCBpcyByZW1vdmVkIGZyb20gYW4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uUmVtb3ZlPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhaXQgaXMgdGlja2VkIGJ5IHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBkZWx0YVRpY2sgVGhlIGRlbHRhIHRpY2sgb2YgdGhlIHRyYWl0LlxuICAgKi9cbiAgcHVibGljIG9uVGljaz8oZGVsdGFUaWNrOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDbG9uZXMgdGhlIHRyYWl0IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50cyB0byBjbG9uZSB0aGUgdHJhaXQgd2l0aC5cbiAgICovXG4gIHB1YmxpYyBjbG9uZSguLi5fYXJndW1lbnRzOiBBcnJheTx1bmtub3duPik6IFRyYWl0IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS5jbG9uZSgpIGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG59XG5cbmV4cG9ydCB7IFRyYWl0IH07XG4iLCAiaW1wb3J0IHsgVmVjdG9yM2YgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBUcmFpdCB9IGZyb20gXCIuLi8uLi90cmFpdFwiO1xuaW1wb3J0IHsgQmxvY2sgfSBmcm9tIFwiLi4vYmxvY2tcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9jb250YWluZXJcIjtcblxuY2xhc3MgQmxvY2tUcmFpdCBleHRlbmRzIFRyYWl0IHtcbiAgLyoqXG4gICAqIFRoZSBibG9jayB0eXBlIGlkZW50aWZpZXJzIHRoYXQgdGhpcyB0cmFpdCBpcyBjb21wYXRpYmxlIHdpdGggYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEJsb2NrSWRlbnRpZmllcj4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHRoYXQgdGhpcyB0cmFpdCBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBibG9jazogQmxvY2s7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrIHRoYXQgdGhpcyB0cmFpdCB3aWxsIGJlIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJsb2NrOiBCbG9jaykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuXG4gICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgYmxvY2suXG4gICAgYmxvY2suYWRkVHJhaXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIHVwZGF0ZWQgaW4gdGhlIHdvcmxkLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHVwZGF0ZSwgaWYgYW55LlxuICAgKi9cbiAgcHVibGljIG9uVXBkYXRlPyhzb3VyY2U/OiBCbG9jayk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBibG9jayBpcyBwbGFjZWQgaW4gdGhlIHdvcmxkLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBwbGFjZWQgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gY2xpY2tQb3NpdGlvbiBUaGUgcG9zaXRpb24gd2hlcmUgdGhlIGFmZmVjdGVkIGJsb2NrIHdhcyBjbGlja2VkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBibG9jayBwbGFjZW1lbnQgd2FzIHN1Y2Nlc3NmdWw7IGRlZmF1bHQgaXMgdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBvblBsYWNlPyhwbGF5ZXI6IFBsYXllciwgY2xpY2tQb3NpdGlvbjogVmVjdG9yM2YpOiBib29sZWFuIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGJyb2tlbiBpbiB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSBwbGF5ZXIgV2hldGhlciB0aGUgcGxheWVyIGJyb2tlIHRoZSBibG9jazsgbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGRlZmluZWQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGJsb2NrIGJyZWFrIHdhcyBzdWNjZXNzZnVsOyBkZWZhdWx0IGlzIHRydWUuXG4gICAqL1xuICBwdWJsaWMgb25CcmVhaz8ocGxheWVyPzogUGxheWVyKTogYm9vbGVhbiB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBibG9jayBpcyBzdGFydGVkIHRvIGJlIGJyb2tlbiBpbiB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHN0YXJ0ZWQgdG8gYnJlYWsgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRCcmVhaz8ocGxheWVyOiBQbGF5ZXIpOiBib29sZWFuIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIHN0b3BwZWQgdG8gYmUgYnJva2VuIGluIHRoZSB3b3JsZC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgc3RvcHBlZCBicmVha2luZyB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgb25TdG9wQnJlYWs/KHBsYXllcjogUGxheWVyKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGludGVyYWN0ZWQgd2l0aCBieSBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW50ZXJhY3RlZCB3aXRoIHRoZSBibG9jay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaW50ZXJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWw7IGRlZmF1bHQgaXMgdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBvbkludGVyYWN0PyhwbGF5ZXI6IFBsYXllcik6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHBsYXllciBwaWNrIGJsb2NrcyB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHBpY2tlZCB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSB3aXRoRGF0YSBXaGV0aGVyIHRoZSBwbGF5ZXIgcGlja2VkIHRoZSBibG9jayB3aXRoIGEgZGF0YSByZXF1ZXN0LlxuICAgKi9cbiAgcHVibGljIG9uUGljaz8ocGxheWVyOiBQbGF5ZXIsIHdpdGhEYXRhOiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBjb250YWluZXIgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgYmxvY2sgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgb25Db250YWluZXJVcGRhdGU/KGNvbnRhaW5lcjogQ29udGFpbmVyKTogdm9pZDtcbn1cblxuZXhwb3J0IHsgQmxvY2tUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFiaWxpdHlJbmRleCxcbiAgQmxvY2tFdmVudFBhY2tldCxcbiAgQmxvY2tFdmVudFR5cGUsXG4gIEJsb2NrUG9zaXRpb24sXG4gIENvbnRhaW5lcklkLFxuICBDb250YWluZXJUeXBlLFxuICBMZXZlbFNvdW5kRXZlbnQsXG4gIExldmVsU291bmRFdmVudFBhY2tldCxcbiAgVmVjdG9yM2Zcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQmxvY2tDb250YWluZXIgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi4vLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2tFbnRyeSwgSlNPTkxpa2VPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi8uLi9pdGVtXCI7XG5cbmltcG9ydCB7IEJsb2NrVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5pbnRlcmZhY2UgSW52ZW50b3J5Q29tcG9uZW50IGV4dGVuZHMgSlNPTkxpa2VPYmplY3Qge1xuICBzaXplOiBudW1iZXI7XG4gIGl0ZW1zOiBBcnJheTxbbnVtYmVyLCBJdGVtU3RhY2tFbnRyeV0+O1xufVxuXG5jbGFzcyBCbG9ja0ludmVudG9yeVRyYWl0IGV4dGVuZHMgQmxvY2tUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiaW52ZW50b3J5XCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtCbG9ja0lkZW50aWZpZXIuQ2hlc3RdO1xuXG4gIHByb3RlY3RlZCBvcGVuZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyOiBCbG9ja0NvbnRhaW5lcjtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVySWQ6IENvbnRhaW5lcklkO1xuXG4gIHB1YmxpYyByZWFkb25seSBpbnZlbnRvcnlTaXplOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJsb2NrOiBCbG9jaykge1xuICAgIHN1cGVyKGJsb2NrKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyIGZvciB0aGUgYmxvY2sgYmFzZWQgb24gdGhlIGJsb2NrIHR5cGVcbiAgICBzd2l0Y2ggKGJsb2NrLmdldFR5cGUoKS5pZGVudGlmaWVyKSB7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFNldCB0aGUgY29udGFpbmVyIHR5cGUgYW5kIGlkXG4gICAgICAgIHRoaXMuY29udGFpbmVyVHlwZSA9IENvbnRhaW5lclR5cGUuQ29udGFpbmVyO1xuICAgICAgICB0aGlzLmNvbnRhaW5lcklkID0gQ29udGFpbmVySWQuTm9uZTtcbiAgICAgICAgdGhpcy5pbnZlbnRvcnlTaXplID0gMjc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyIGZvciB0aGUgdHJhaXRcbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBCbG9ja0NvbnRhaW5lcihcbiAgICAgIGJsb2NrLFxuICAgICAgdGhpcy5jb250YWluZXJUeXBlLFxuICAgICAgdGhpcy5jb250YWluZXJJZCxcbiAgICAgIHRoaXMuaW52ZW50b3J5U2l6ZVxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaGFzIGFuIGludmVudG9yeSBjb21wb25lbnRcbiAgICBpZiAoYmxvY2suY29tcG9uZW50cy5oYXMoXCJpbnZlbnRvcnlcIikpIHtcbiAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IGNvbXBvbmVudCBmcm9tIHRoZSBibG9ja1xuICAgICAgY29uc3QgaW52ZW50b3J5ID0gYmxvY2suY29tcG9uZW50cy5nZXQoXCJpbnZlbnRvcnlcIikgYXMgSW52ZW50b3J5Q29tcG9uZW50O1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBpdGVtIGluIHRoZSBpbnZlbnRvcnlcbiAgICAgIGZvciAoY29uc3QgW3Nsb3QsIGVudHJ5XSBvZiBpbnZlbnRvcnkuaXRlbXMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0gc3RhY2tcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgSXRlbVN0YWNrKGVudHJ5LmlkZW50aWZpZXIsIHtcbiAgICAgICAgICBhbW91bnQ6IGVudHJ5LmFtb3VudCxcbiAgICAgICAgICBhdXhpbGxhcnk6IGVudHJ5LmF1eGlsbGFyeSxcbiAgICAgICAgICB3b3JsZDogYmxvY2suZGltZW5zaW9uLndvcmxkLFxuICAgICAgICAgIGVudHJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgaXRlbSBzdGFjayB0byB0aGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNldEl0ZW0oc2xvdCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkludGVyYWN0KHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBzbmVha2luZ1xuICAgIGlmIChwbGF5ZXIuaXNTbmVha2luZyB8fCAhcGxheWVyLmFiaWxpdGllcy5nZXQoQWJpbGl0eUluZGV4Lk9wZW5Db250YWluZXJzKSlcbiAgICAgIHJldHVybjtcblxuICAgIC8vIFNob3cgdGhlIGNvbnRhaW5lciB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5jb250YWluZXIuc2hvdyhwbGF5ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uQnJlYWsoKTogdm9pZCB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUgY29udGFpbmVyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuY29udGFpbmVyLnN0b3JhZ2UpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIHZhbGlkXG4gICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTcGF3biB0aGUgaXRlbSBpbiB0aGUgd29ybGRcbiAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdGhpcy5ibG9jay5wb3NpdGlvbjtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuYmxvY2suZGltZW5zaW9uLnNwYXduSXRlbShcbiAgICAgICAgaXRlbSxcbiAgICAgICAgbmV3IFZlY3RvcjNmKHggKyAwLjUsIHkgKyAwLjUsIHogKyAwLjUpXG4gICAgICApO1xuXG4gICAgICAvLyBBZGQgc29tZSB1cHdhcmRzIHZlbG9jaXR5IHRvIHRoZSBpdGVtLlxuICAgICAgZW50aXR5LnNldE1vdGlvbihuZXcgVmVjdG9yM2YoMCwgMC4xLCAwKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ29udGFpbmVyVXBkYXRlKGNvbnRhaW5lcjogQ29udGFpbmVyKTogdm9pZCB7XG4gICAgLy8gVmVyaWZ5IHRoZSBjb250YWluZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGJsb2NrIGNvbnRhaW5lclxuICAgIGlmIChjb250YWluZXIgIT09IHRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaW52ZW50b3J5IGNvbXBvbmVudFxuICAgIGNvbnN0IGludmVudG9yeTogSW52ZW50b3J5Q29tcG9uZW50ID0ge1xuICAgICAgc2l6ZTogdGhpcy5pbnZlbnRvcnlTaXplLFxuICAgICAgaXRlbXM6IFtdXG4gICAgfTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIGNvbnRhaW5lclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnZlbnRvcnlTaXplOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgaXRlbSBzdGFjayBhdCB0aGUgaW5kZXhcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNvbnRhaW5lci5nZXRJdGVtKGkpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBudWxsXG4gICAgICBpZiAoaXRlbSA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIC8vIEdldCB0aGUgZGF0YSBlbnRyeSBvZiB0aGUgaXRlbSBzdGFja1xuICAgICAgY29uc3QgZW50cnkgPSBpdGVtLmdldERhdGFFbnRyeSgpO1xuXG4gICAgICAvLyBQdXNoIHRoZSBpdGVtIHN0YWNrIGVudHJ5IHRvIHRoZSBpbnZlbnRvcnkgaXRlbXNcbiAgICAgIGludmVudG9yeS5pdGVtcy5wdXNoKFtpLCBlbnRyeV0pO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgaW52ZW50b3J5IGNvbXBvbmVudCB0byB0aGUgYmxvY2tcbiAgICB0aGlzLmJsb2NrLmNvbXBvbmVudHMuc2V0KFwiaW52ZW50b3J5XCIsIGludmVudG9yeSk7XG4gIH1cblxuICBwdWJsaWMgb25UaWNrKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaGFzIG9jY3VwYW50cyBhbmQgdGhlIGJsb2NrIGlzIG5vdCBvcGVuZWRcbiAgICBpZiAodGhpcy5jb250YWluZXIub2NjdXBhbnRzLnNpemUgPiAwICYmICF0aGlzLm9wZW5lZCkge1xuICAgICAgLy8gU2V0IHRoZSBibG9jayBzdGF0ZSB0byBvcGVuXG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBCbG9ja0V2ZW50UGFja2V0XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBCbG9ja0V2ZW50UGFja2V0KCk7XG4gICAgICBldmVudC5wb3NpdGlvbiA9IHRoaXMuYmxvY2sucG9zaXRpb247XG4gICAgICBldmVudC50eXBlID0gQmxvY2tFdmVudFR5cGUuQ2hhbmdlU3RhdGU7XG4gICAgICBldmVudC5kYXRhID0gMTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IExldmVsU291bmRFdmVudFBhY2tldFxuICAgICAgY29uc3Qgc291bmQgPSBuZXcgTGV2ZWxTb3VuZEV2ZW50UGFja2V0KCk7XG4gICAgICBzb3VuZC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZih0aGlzLmJsb2NrLnBvc2l0aW9uKTtcbiAgICAgIHNvdW5kLmRhdGEgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLm5ldHdvcms7XG4gICAgICBzb3VuZC5hY3RvcklkZW50aWZpZXIgPSBTdHJpbmcoKTtcbiAgICAgIHNvdW5kLmlzQmFieU1vYiA9IGZhbHNlO1xuICAgICAgc291bmQuaXNHbG9iYWwgPSBmYWxzZTtcblxuICAgICAgLy8gU2V0IHRoZSBzb3VuZCBldmVudCBiYXNlZCBvbiB0aGUgYmxvY2sgdHlwZVxuICAgICAgc3dpdGNoICh0aGlzLmJsb2NrLmdldFR5cGUoKS5pZGVudGlmaWVyKSB7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBzb3VuZC5ldmVudCA9IC0xIGFzIExldmVsU291bmRFdmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQmxvY2tJZGVudGlmaWVyLkNoZXN0OlxuICAgICAgICBjYXNlIEJsb2NrSWRlbnRpZmllci5UcmFwcGVkQ2hlc3Q6IHtcbiAgICAgICAgICBzb3VuZC5ldmVudCA9IExldmVsU291bmRFdmVudC5DaGVzdE9wZW47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQnJvYWRjYXN0IHRoZSBibG9jayBldmVudCBwYWNrZXRcbiAgICAgIHRoaXMuYmxvY2suZGltZW5zaW9uLmJyb2FkY2FzdChldmVudCwgc291bmQpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaGFzIG5vIG9jY3VwYW50c1xuICAgIGlmICh0aGlzLmNvbnRhaW5lci5vY2N1cGFudHMuc2l6ZSA9PT0gMCAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgLy8gU2V0IHRoZSBibG9jayBzdGF0ZSB0byBjbG9zZWRcbiAgICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBibG9jayBldmVudCBwYWNrZXRcbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBCbG9ja0V2ZW50UGFja2V0KCk7XG4gICAgICBwYWNrZXQucG9zaXRpb24gPSB0aGlzLmJsb2NrLnBvc2l0aW9uO1xuICAgICAgcGFja2V0LnR5cGUgPSBCbG9ja0V2ZW50VHlwZS5DaGFuZ2VTdGF0ZTtcbiAgICAgIHBhY2tldC5kYXRhID0gMDtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxldmVsIHNvdW5kIGV2ZW50IHBhY2tldFxuICAgICAgY29uc3Qgc291bmQgPSBuZXcgTGV2ZWxTb3VuZEV2ZW50UGFja2V0KCk7XG4gICAgICBzb3VuZC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZih0aGlzLmJsb2NrLnBvc2l0aW9uKTtcbiAgICAgIHNvdW5kLmRhdGEgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLm5ldHdvcms7XG4gICAgICBzb3VuZC5hY3RvcklkZW50aWZpZXIgPSBTdHJpbmcoKTtcbiAgICAgIHNvdW5kLmlzQmFieU1vYiA9IGZhbHNlO1xuICAgICAgc291bmQuaXNHbG9iYWwgPSBmYWxzZTtcblxuICAgICAgLy8gU2V0IHRoZSBzb3VuZCBldmVudCBiYXNlZCBvbiB0aGUgYmxvY2sgdHlwZVxuICAgICAgc3dpdGNoICh0aGlzLmJsb2NrLmdldFR5cGUoKS5pZGVudGlmaWVyKSB7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBzb3VuZC5ldmVudCA9IC0xIGFzIExldmVsU291bmRFdmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQmxvY2tJZGVudGlmaWVyLkNoZXN0OlxuICAgICAgICBjYXNlIEJsb2NrSWRlbnRpZmllci5UcmFwcGVkQ2hlc3Q6IHtcbiAgICAgICAgICBzb3VuZC5ldmVudCA9IExldmVsU291bmRFdmVudC5DaGVzdENsb3NlZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcm9hZGNhc3QgdGhlIGJsb2NrIGV2ZW50IHBhY2tldFxuICAgICAgdGhpcy5ibG9jay5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCwgc291bmQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja0ludmVudG9yeVRyYWl0IH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQ2FyZGluYWxEaXJlY3Rpb24gfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEJsb2NrV2VpcmRvRGlyZWN0aW9uVHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJ3ZWlyZG9fZGlyZWN0aW9uXCI7XG5cbiAgcHVibGljIG9uUGxhY2UocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGNhcmRpbmFsIGRpcmVjdGlvblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHBsYXllci5nZXRDYXJkaW5hbERpcmVjdGlvbigpO1xuXG4gICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrXG4gICAgdGhpcy5zZXREaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldERpcmVjdGlvbihkaXJlY3Rpb246IENhcmRpbmFsRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuYmxvY2suZ2V0VHlwZSgpO1xuXG4gICAgLy8gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24uc3RhdGU7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICB3ZWlyZG9fZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHR5cGUuZ2V0UGVybXV0YXRpb24obmV3U3RhdGUpO1xuXG4gICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2tcbiAgICBpZiAocGVybXV0YXRpb24pIHRoaXMuYmxvY2suc2V0UGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrV2VpcmRvRGlyZWN0aW9uVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBWZWN0b3IzZiB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEJsb2NrVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBCbG9ja1Vwc2lkZURvd25CaXRUcmFpdCBleHRlbmRzIEJsb2NrVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInVwc2lkZV9kb3duX2JpdFwiO1xuXG4gIHB1YmxpYyBvblBsYWNlKF86IFBsYXllciwgY2xpY2tQb3NpdGlvbjogVmVjdG9yM2YpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgcG9zaXRpb24gaXMgb24gdGhlIHRvcCBmYWNlIG9mIHRoZSBibG9ja1xuICAgIGlmIChjbGlja1Bvc2l0aW9uLnkgPT09IDEpIHJldHVybiB0aGlzLnNldFVwc2lkZURvd24oZmFsc2UpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIHBvc2l0aW9uIGlzIG9uIHRoZSBib3R0b20gZmFjZSBvZlxuICAgIGlmIChjbGlja1Bvc2l0aW9uLnkgPT09IDApIHJldHVybiB0aGlzLnNldFVwc2lkZURvd24odHJ1ZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgbmVlZHMgdG8gYmUgdXBzaWRlIGRvd25cbiAgICBjb25zdCB1cHNpZGVEb3duID0gY2xpY2tQb3NpdGlvbi55ID4gMC41O1xuXG4gICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrXG4gICAgcmV0dXJuIHRoaXMuc2V0VXBzaWRlRG93bih1cHNpZGVEb3duKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldFVwc2lkZURvd24odXBzaWRlRG93bjogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmJsb2NrLmdldFR5cGUoKTtcblxuICAgIC8vIEdldCB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLnN0YXRlO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgdXBzaWRlX2Rvd25fYml0OiB1cHNpZGVEb3duXG4gICAgfTtcblxuICAgIC8vIFNldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdHlwZS5nZXRQZXJtdXRhdGlvbihuZXdTdGF0ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGlmIChwZXJtdXRhdGlvbikgdGhpcy5ibG9jay5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tVcHNpZGVEb3duQml0VHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBBYmlsaXR5SW5kZXgsXG4gIEJsb2NrUG9zaXRpb24sXG4gIExldmVsU291bmRFdmVudCxcbiAgTGV2ZWxTb3VuZEV2ZW50UGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBCbG9jayB9IGZyb20gXCIuLi9ibG9ja1wiO1xuXG5pbXBvcnQgeyBCbG9ja1RyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgQmxvY2tPcGVuQml0VHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJvcGVuX2JpdFwiO1xuXG4gIHB1YmxpYyBvbkludGVyYWN0KHBsYXllcjogUGxheWVyKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBjYW4gb3BlbiBkb29yc1xuICAgIGlmICghcGxheWVyLmFiaWxpdGllcy5nZXQoQWJpbGl0eUluZGV4LkRvb3JzQW5kU3dpdGNoZXMpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9jay5wZXJtdXRhdGlvbi5zdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIEdldCB0aGUgb3BlbiBiaXQgb2YgdGhlIGJsb2NrXG4gICAgY29uc3Qgb3BlbkJpdCA9IHN0YXRlLm9wZW5fYml0IGFzIGJvb2xlYW47XG5cbiAgICAvLyBTZXQgdGhlIGJpdCBvZiB0aGUgYmxvY2tcbiAgICB0aGlzLnNldEJpdCghb3BlbkJpdCk7XG5cbiAgICAvLyBJZiB0aGUgcGxheWVyIGlzIHNuZWFraW5nLCB3ZSBzaG91bGQgcGxhY2UgdGhlIGJsb2NrIGFuZCBpbnRlcmFjdCB3aXRoIGl0IGRvb3IuXG4gICAgLy8gSWYgdGhlIHBsYXllciBpcyBub3Qgc25lYWtpbmcsIHdlIHNob3VsZCBqdXN0IGludGVyYWN0IHdpdGggdGhlIGRvb3IuXG4gICAgcmV0dXJuIHBsYXllci5pc1NuZWFraW5nOyAvLyBUaGUgc25lYWtpbmcgc3RhdGUgb2YgdGhlIHBsYXllciB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24uXG4gIH1cblxuICBwdWJsaWMgc2V0Qml0KG9wZW46IGJvb2xlYW4sIHNpbGVudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuYmxvY2suZ2V0VHlwZSgpO1xuXG4gICAgLy8gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24uc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaXMgYSBkb29yXG4gICAgaWYgKHR5cGVvZiBzdGF0ZVtcInVwcGVyX2Jsb2NrX2JpdFwiXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIC8vIEdldCB0aGUgdXBwZXIgYmxvY2sgYml0IG9mIHRoZSBibG9ja1xuICAgICAgY29uc3QgdXBwZXJCbG9ja0JpdCA9IHN0YXRlW1widXBwZXJfYmxvY2tfYml0XCJdIGFzIGJvb2xlYW47XG5cbiAgICAgIC8vIEdldCB0aGUgYWJvdmUgYW5kIGJlbG93IGJsb2Nrc1xuICAgICAgLy8gR2V0IHRoZSBhYm92ZSBhbmQgYmVsb3cgYmxvY2tzXG4gICAgICBjb25zdCBhYm92ZTogQmxvY2sgPSB1cHBlckJsb2NrQml0ID8gdGhpcy5ibG9jayA6IHRoaXMuYmxvY2suYWJvdmUoKTtcbiAgICAgIGNvbnN0IGJlbG93OiBCbG9jayA9IHVwcGVyQmxvY2tCaXQgPyB0aGlzLmJsb2NrLmJlbG93KCkgOiB0aGlzLmJsb2NrO1xuXG4gICAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBhYm92ZSBibG9ja1xuICAgICAgY29uc3QgYWJvdmVTdGF0ZSA9IGFib3ZlLnBlcm11dGF0aW9uLnN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBhYm92ZSBibG9ja1xuICAgICAgY29uc3QgYWJvdmVOZXdTdGF0ZSA9IHtcbiAgICAgICAgLi4uYWJvdmVTdGF0ZSxcbiAgICAgICAgb3Blbl9iaXQ6IG9wZW5cbiAgICAgIH07XG5cbiAgICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGFib3ZlIGJsb2NrXG4gICAgICBjb25zdCBhYm92ZVBlcm11dGF0aW9uID0gdHlwZS5nZXRQZXJtdXRhdGlvbihhYm92ZU5ld1N0YXRlKTtcblxuICAgICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYWJvdmUgYmxvY2tcbiAgICAgIGlmIChhYm92ZVBlcm11dGF0aW9uKSBhYm92ZS5zZXRQZXJtdXRhdGlvbihhYm92ZVBlcm11dGF0aW9uKTtcblxuICAgICAgLy8gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYmVsb3cgYmxvY2tcbiAgICAgIGNvbnN0IGJlbG93U3RhdGUgPSBiZWxvdy5wZXJtdXRhdGlvbi5zdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYmVsb3cgYmxvY2tcbiAgICAgIGNvbnN0IGJlbG93TmV3U3RhdGUgPSB7XG4gICAgICAgIC4uLmJlbG93U3RhdGUsXG4gICAgICAgIG9wZW5fYml0OiBvcGVuXG4gICAgICB9O1xuXG4gICAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBiZWxvdyBibG9ja1xuICAgICAgY29uc3QgYmVsb3dQZXJtdXRhdGlvbiA9IHR5cGUuZ2V0UGVybXV0YXRpb24oYmVsb3dOZXdTdGF0ZSk7XG5cbiAgICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJlbG93IGJsb2NrXG4gICAgICBpZiAoYmVsb3dQZXJtdXRhdGlvbikgYmVsb3cuc2V0UGVybXV0YXRpb24oYmVsb3dQZXJtdXRhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIG9wZW5fYml0OiBvcGVuXG4gICAgICB9O1xuXG4gICAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgY29uc3QgcGVybXV0YXRpb24gPSB0eXBlLmdldFBlcm11dGF0aW9uKG5ld1N0YXRlKTtcblxuICAgICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2tcbiAgICAgIGlmIChwZXJtdXRhdGlvbikgdGhpcy5ibG9jay5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIHNpbGVudFxuICAgIGlmIChzaWxlbnQpIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGJsb2NrIGFuZCB0aGUgaWRlbnRpZmllclxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmJsb2NrLmdldFR5cGUoKS5pZGVudGlmaWVyO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBsZXZlbCBzb3VuZCBldmVudCBwYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxTb3VuZEV2ZW50UGFja2V0KCk7XG4gICAgcGFja2V0LmRhdGEgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLm5ldHdvcms7XG4gICAgcGFja2V0LmV2ZW50ID0gb3BlbiA/IExldmVsU291bmRFdmVudC5Eb29yT3BlbiA6IExldmVsU291bmRFdmVudC5Eb29yQ2xvc2U7XG4gICAgcGFja2V0LnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKHRoaXMuYmxvY2sucG9zaXRpb24pO1xuICAgIHBhY2tldC5hY3RvcklkZW50aWZpZXIgPSBTdHJpbmcoKTtcbiAgICBwYWNrZXQuaXNCYWJ5TW9iID0gZmFsc2U7XG4gICAgcGFja2V0LmlzR2xvYmFsID0gdHJ1ZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBhIHRyYXBkb29yXG4gICAgaWYgKGlkZW50aWZpZXIuaW5jbHVkZXMoXCJ0cmFwZG9vclwiKSkge1xuICAgICAgcGFja2V0LmV2ZW50ID0gb3BlblxuICAgICAgICA/IExldmVsU291bmRFdmVudC5UcmFwZG9vck9wZW5cbiAgICAgICAgOiBMZXZlbFNvdW5kRXZlbnQuVHJhcGRvb3JDbG9zZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaXMgYSBmZW5jZSBnYXRlXG4gICAgaWYgKGlkZW50aWZpZXIuaW5jbHVkZXMoXCJmZW5jZV9nYXRlXCIpKSB7XG4gICAgICBwYWNrZXQuZXZlbnQgPSBvcGVuXG4gICAgICAgID8gTGV2ZWxTb3VuZEV2ZW50LkZlbmNlR2F0ZU9wZW5cbiAgICAgICAgOiBMZXZlbFNvdW5kRXZlbnQuRmVuY2VHYXRlQ2xvc2U7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmJsb2NrLmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja09wZW5CaXRUcmFpdCB9O1xuIiwgImltcG9ydCB7IEJsb2NrVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBCbG9ja1VwcGVyQml0VHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJ1cHBlcl9ibG9ja19iaXRcIjtcblxuICBwdWJsaWMgb25QbGFjZSgpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGFib3ZlIGJsb2NrXG4gICAgY29uc3QgYWJvdmUgPSB0aGlzLmJsb2NrLmFib3ZlKCk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24uc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgdXBwZXJfYmxvY2tfYml0OiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdGhpcy5ibG9jay5nZXRUeXBlKCkuZ2V0UGVybXV0YXRpb24obmV3U3RhdGUpO1xuXG4gICAgYWJvdmUuc2V0UGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrVXBwZXJCaXRUcmFpdCB9O1xuIiwgImltcG9ydCB7IFZlY3RvcjNmIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIFZlcnRpY2FsSGFsZlRyYWl0IGV4dGVuZHMgQmxvY2tUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwibWluZWNyYWZ0OnZlcnRpY2FsX2hhbGZcIjtcblxuICBwdWJsaWMgb25QbGFjZShfcGxheWVyOiBQbGF5ZXIsIGNsaWNrUG9zaXRpb246IFZlY3RvcjNmKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIHBvc2l0aW9uIGlzIGFib3ZlIHRoZSBjZW50ZXIgb2YgdGhlIGJsb2NrXG4gICAgaWYgKGNsaWNrUG9zaXRpb24ueSA+IDAuNSAmJiBjbGlja1Bvc2l0aW9uLnkgPCAwLjk5KVxuICAgICAgdGhpcy5zZXRWZXJ0aWNhbEhhbGYodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcmFjdChwbGF5ZXI6IFBsYXllcik6IGJvb2xlYW4ge1xuICAgIC8vIEdldCB0aGUgcGxheWVycyBoZWxkIGl0ZW1cbiAgICBjb25zdCBpdGVtU3RhY2sgPSBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFjayBoYXMgYSBibG9jayB0eXBlXG4gICAgaWYgKCFpdGVtU3RhY2sgfHwgIWl0ZW1TdGFjay50eXBlLmJsb2NrKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZSBvZiB0aGUgaXRlbVxuICAgIGNvbnN0IGJsb2NrVHlwZSA9IGl0ZW1TdGFjay50eXBlLmJsb2NrO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgaXMgZXF1YWwgdG8gdGhlIGludGVyYWN0aW5nIGJsb2NrXG4gICAgaWYgKGJsb2NrVHlwZSAhPT0gdGhpcy5ibG9jay5nZXRUeXBlKCkpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNldFZlcnRpY2FsSGFsZih0b3BCaXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGJsb2NrIHR5cGVcbiAgICBjb25zdCB0eXBlID0gdGhpcy5ibG9jay5nZXRUeXBlKCk7XG5cbiAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9jay5wZXJtdXRhdGlvbi5zdGF0ZTtcblxuICAgIC8vIENyZWF0ZSB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIFwibWluZWNyYWZ0OnZlcnRpY2FsX2hhbGZcIjogdG9wQml0ID8gXCJ0b3BcIiA6IFwiYm90dG9tXCJcbiAgICB9O1xuXG4gICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSB0eXBlLmdldFBlcm11dGF0aW9uKG5ld1N0YXRlKTtcblxuICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgaWYgKHBlcm11dGF0aW9uKSB0aGlzLmJsb2NrLnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgfVxufVxuXG5leHBvcnQgeyBWZXJ0aWNhbEhhbGZUcmFpdCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IENhcmRpbmFsRGlyZWN0aW9uIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJsb2NrVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBCbG9ja0NhcmRpbmFsRGlyZWN0aW9uVHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJtaW5lY3JhZnQ6Y2FyZGluYWxfZGlyZWN0aW9uXCI7XG5cbiAgcHVibGljIG9uUGxhY2UocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGNhcmRpbmFsIGRpcmVjdGlvblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHBsYXllci5nZXRDYXJkaW5hbERpcmVjdGlvbigpO1xuXG4gICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIHRvIHRoZSBvcHBvc2l0ZSBvZiB0aGUgcGxheWVyJ3MgZGlyZWN0aW9uXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgQ2FyZGluYWxEaXJlY3Rpb24uTm9ydGg6XG4gICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uKENhcmRpbmFsRGlyZWN0aW9uLlNvdXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhcmRpbmFsRGlyZWN0aW9uLlNvdXRoOlxuICAgICAgICB0aGlzLnNldERpcmVjdGlvbihDYXJkaW5hbERpcmVjdGlvbi5Ob3J0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYXJkaW5hbERpcmVjdGlvbi5FYXN0OlxuICAgICAgICB0aGlzLnNldERpcmVjdGlvbihDYXJkaW5hbERpcmVjdGlvbi5XZXN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhcmRpbmFsRGlyZWN0aW9uLldlc3Q6XG4gICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uKENhcmRpbmFsRGlyZWN0aW9uLkVhc3QpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIHNldC5cbiAgICovXG4gIHB1YmxpYyBzZXREaXJlY3Rpb24oZGlyZWN0aW9uOiBDYXJkaW5hbERpcmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmJsb2NrLmdldFR5cGUoKTtcblxuICAgIC8vIEdldCB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLnN0YXRlO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgXCJtaW5lY3JhZnQ6Y2FyZGluYWxfZGlyZWN0aW9uXCI6IENhcmRpbmFsRGlyZWN0aW9uW2RpcmVjdGlvbl0udG9Mb3dlckNhc2UoKVxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdHlwZS5nZXRQZXJtdXRhdGlvbihuZXdTdGF0ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGlmIChwZXJtdXRhdGlvbikgdGhpcy5ibG9jay5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tDYXJkaW5hbERpcmVjdGlvblRyYWl0IH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQ2FyZGluYWxEaXJlY3Rpb24gfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEJsb2NrRGlyZWN0aW9uVHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJkaXJlY3Rpb25cIjtcblxuICBwdWJsaWMgb25QbGFjZShwbGF5ZXI6IFBsYXllcik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgY2FyZGluYWwgZGlyZWN0aW9uXG4gICAgY29uc3QgZGlyZWN0aW9uID0gcGxheWVyLmdldENhcmRpbmFsRGlyZWN0aW9uKCk7XG5cbiAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgdG8gdGhlIG9wcG9zaXRlIG9mIHRoZSBwbGF5ZXIncyBkaXJlY3Rpb25cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSBDYXJkaW5hbERpcmVjdGlvbi5Ob3J0aDpcbiAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oQ2FyZGluYWxEaXJlY3Rpb24uU291dGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FyZGluYWxEaXJlY3Rpb24uU291dGg6XG4gICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uKENhcmRpbmFsRGlyZWN0aW9uLk5vcnRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhcmRpbmFsRGlyZWN0aW9uLkVhc3Q6XG4gICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uKENhcmRpbmFsRGlyZWN0aW9uLldlc3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FyZGluYWxEaXJlY3Rpb24uV2VzdDpcbiAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oQ2FyZGluYWxEaXJlY3Rpb24uRWFzdCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldERpcmVjdGlvbihkaXJlY3Rpb246IENhcmRpbmFsRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuYmxvY2suZ2V0VHlwZSgpO1xuXG4gICAgLy8gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24uc3RhdGU7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdHlwZS5nZXRQZXJtdXRhdGlvbihuZXdTdGF0ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGlmIChwZXJtdXRhdGlvbikgdGhpcy5ibG9jay5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tEaXJlY3Rpb25UcmFpdCB9O1xuIiwgImltcG9ydCB7IEJsb2NrSWRlbnRpZmllciB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgQmxvY2tTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQmxvY2tFbnVtIH0gZnJvbSBcIi4uXCI7XG5cbmltcG9ydCB7IEJsb2NrUGVybXV0YXRpb24sIEJsb2NrVHlwZSwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIi4vaWRlbnRpdHlcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdHMgfSBmcm9tIFwiLlwiO1xuXG5pbXBvcnQgdHlwZSB7IEJsb2NrVHJhaXQgfSBmcm9tIFwiLi90cmFpdHNcIjtcblxuY2xhc3MgQmxvY2tQYWxldHRlIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGJsb2NrIHR5cGVzIGZvciB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlcyA9IEJsb2NrVHlwZS50eXBlcztcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgYmxvY2sgcGVybXV0YXRpb25zIGZvciB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZXJtdXRhdGlvbnMgPSBCbG9ja1Blcm11dGF0aW9uLnBlcm11dGF0aW9ucztcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgYmxvY2sgdHJhaXRzIGZvciB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHMgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIEJsb2NrVHJhaXQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RyeSBmb3IgdGhlIGJsb2NrIHRyYWl0cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RyeSA9IG5ldyBNYXA8XG4gICAgQmxvY2tJZGVudGlmaWVyLFxuICAgIEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PlxuICA+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFJlZ2lzdGVyIGFsbCBibG9jayB0cmFpdHMuXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBCbG9ja1RyYWl0cykgdGhpcy5yZWdpc3RlclRyYWl0KHRyYWl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBibG9jayB0eXBlcyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcmV0dXJucyBBbGwgYmxvY2sgdHlwZXMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxCbG9ja1R5cGU+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMudHlwZXMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGN1c3RvbSBibG9jayB0eXBlcyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcmV0dXJucyBBbGwgY3VzdG9tIGJsb2NrIHR5cGVzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsQ3VzdG9tVHlwZXMoKTogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsVHlwZXMoKS5maWx0ZXIoKHR5cGUpID0+IHR5cGUgaW5zdGFuY2VvZiBDdXN0b21CbG9ja1R5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGJsb2NrIHBlcm11dGF0aW9ucyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcmV0dXJucyBBbGwgYmxvY2sgcGVybXV0YXRpb25zIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsUGVybXV0YXRpb25zKCk6IEFycmF5PEJsb2NrUGVybXV0YXRpb24+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMucGVybXV0YXRpb25zLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgYmxvY2sgdHlwZSBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgYmxvY2sgaWRlbnRpZmllciB0byBnZXQuXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayB0eXBlIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZVR5cGUoaWRlbnRpZmllcjogQmxvY2tJZGVudGlmaWVyKTogQmxvY2tUeXBlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcy5nZXQoaWRlbnRpZmllcikgYXMgQmxvY2tUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgYmxvY2sgcGVybXV0YXRpb24gZnJvbSB0aGUgYmxvY2sgaWRlbnRpZmllciBhbmQgc3RhdGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBibG9jayBpZGVudGlmaWVyIHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgYmxvY2sgc3RhdGUgdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIGJsb2NrIHBlcm11dGF0aW9uIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZVBlcm11dGF0aW9uPFQgZXh0ZW5kcyBrZXlvZiBCbG9ja1N0YXRlPihcbiAgICBpZGVudGlmaWVyOiBULFxuICAgIHN0YXRlPzogQmxvY2tTdGF0ZVtUXVxuICApOiBCbG9ja1Blcm11dGF0aW9uPFQ+IHtcbiAgICAvLyBHZXQgdGhlIGJsb2NrIHR5cGUgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucmVzb2x2ZVR5cGUoaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgZXhpc3RzLlxuICAgIGlmICghdHlwZSlcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVQZXJtdXRhdGlvbihcbiAgICAgICAgQmxvY2tJZGVudGlmaWVyLkFpclxuICAgICAgKSBhcyBCbG9ja1Blcm11dGF0aW9uPFQ+O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXRlIGlzIG5vdCBwcm92aWRlZC5cbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHR5cGUucGVybXV0YXRpb25zLmZpbmQoKHBlcm11dGF0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdGF0ZSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBibG9jayBzdGF0ZS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAocGVybXV0YXRpb24uc3RhdGUgYXMgbmV2ZXIpW2tleV07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgYm9vbGVhblxuICAgICAgICBjb25zdCBib29sID0gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0YXRlIHRvIGEgYm9vbGVhbiBpZiBpdCBpcyBhIGJvb2xlYW4uXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID1cbiAgICAgICAgICBib29sICYmIChzdGF0ZVtrZXldID09PSAwIHx8IHN0YXRlW2tleV0gPT09IDEpXG4gICAgICAgICAgICA/IHN0YXRlW2tleV0gPT09IDFcbiAgICAgICAgICAgIDogc3RhdGVba2V5XTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgc3RhdGUgbWF0Y2hlc1xuICAgICAgICBpZiAodmFsdWUgIT09IHF1ZXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayBwZXJtdXRhdGlvbiBtYXRjaGVzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgcGVybXV0YXRpb24gZG9lcyBub3QgZXhpc3QuXG4gICAgaWYgKCFwZXJtdXRhdGlvbikge1xuICAgICAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IHBlcm11dGF0aW9uIGlmIHRoZSBzdGF0ZSBpcyBub3QgZm91bmQuXG4gICAgICByZXR1cm4gdHlwZS5wZXJtdXRhdGlvbnNbMF0gYXMgQmxvY2tQZXJtdXRhdGlvbjxUPjtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgIHJldHVybiBwZXJtdXRhdGlvbiBhcyBCbG9ja1Blcm11dGF0aW9uPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgYmxvY2sgdHlwZSB0byB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGJsb2NrIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGJsb2NrIHR5cGUgd2FzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKHR5cGU6IEJsb2NrVHlwZSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayB0eXBlIGFscmVhZHkgZXhpc3RzLlxuICAgIGlmICh0aGlzLnR5cGVzLmhhcyh0eXBlLmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2sgdHlwZS5cbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmlkZW50aWZpZXIsIHR5cGUpO1xuXG4gICAgLy8gQWRkIHRoZSBibG9jayB0eXBlIHRvIHRoZSBibG9jayBlbnVtLlxuICAgIEJsb2NrRW51bS5vcHRpb25zLnB1c2godHlwZS5pZGVudGlmaWVyKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBwZXJtdXRhdGlvbnMgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAgZm9yIChjb25zdCBwZXJtdXRhdGlvbiBvZiB0eXBlLnBlcm11dGF0aW9ucykge1xuICAgICAgdGhpcy5yZWdpc3RlclBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgdHlwZSB3YXMgcmVnaXN0ZXJlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGJsb2NrIHBlcm11dGF0aW9uIHRvIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gcGVybXV0YXRpb24gVGhlIGJsb2NrIHBlcm11dGF0aW9uIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBibG9jayBwZXJtdXRhdGlvbiB3YXMgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclBlcm11dGF0aW9uKHBlcm11dGF0aW9uOiBCbG9ja1Blcm11dGF0aW9uKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHBlcm11dGF0aW9uIGFscmVhZHkgZXhpc3RzLlxuICAgIGlmICh0aGlzLnBlcm11dGF0aW9ucy5oYXMocGVybXV0YXRpb24ubmV0d29yaykpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICB0aGlzLnBlcm11dGF0aW9ucy5zZXQocGVybXV0YXRpb24ubmV0d29yaywgcGVybXV0YXRpb24pO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIHBlcm11dGF0aW9uIHdhcyByZWdpc3RlcmVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgYmxvY2sgaWRlbnRpZmllciB0byBnZXQgdGhlIHJlZ2lzdHJ5IGZvci5cbiAgICogQHJldHVybnMgVGhlIHJlZ2lzdHJ5IGZvciB0aGUgYmxvY2sgaWRlbnRpZmllci5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpc3RyeSh0eXBlOiBCbG9ja0lkZW50aWZpZXIpOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4ge1xuICAgIC8vIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQodHlwZSkgfHwgW107XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlZ2lzdHJ5LlxuICAgIHJldHVybiByZWdpc3RyeSBhcyBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSB0cmFpdCB0byB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHJhaXQgd2FzIHJlZ2lzdGVyZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayB0cmFpdCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAgaWYgKHRoaXMudHJhaXRzLmhhcyh0cmFpdC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrIHRyYWl0LlxuICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCB0cmFpdCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHR5cGVzIG9mIHRoZSB0cmFpdC5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHJhaXQudHlwZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBoYXMgdGhlIGJsb2NrIGlkZW50aWZpZXIuXG4gICAgICBpZiAoIXRoaXMucmVnaXN0cnkuaGFzKHR5cGUpKVxuICAgICAgICAvLyBTZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgYmxvY2sgaWRlbnRpZmllci5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQodHlwZSwgW10pO1xuXG4gICAgICAvLyBHZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgYmxvY2sgaWRlbnRpZmllci5cbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQodHlwZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBleGlzdHMuXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICByZWdpc3RyeS5wdXNoKHRyYWl0KTtcblxuICAgICAgICAvLyBTZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgYmxvY2sgaWRlbnRpZmllci5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQodHlwZSwgcmVnaXN0cnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayB0cmFpdCB3YXMgcmVnaXN0ZXJlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJhaXQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHRyYWl0IHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhaXQoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGV4aXN0cy5cbiAgICBpZiAoIXRoaXMudHJhaXRzLmhhcyhpZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gR2V0IHRoZSB0cmFpdC5cbiAgICBjb25zdCB0cmFpdCA9IHRoaXMudHJhaXRzLmdldChpZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMuXG4gICAgaWYgKCF0cmFpdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0eXBlcyBvZiB0aGUgdHJhaXQuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHRyYWl0LnR5cGVzKSB7XG4gICAgICAvLyBHZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgYmxvY2sgaWRlbnRpZmllci5cbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQodHlwZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBleGlzdHMuXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZWdpc3RyeS5maWx0ZXIoKHRyYWl0KSA9PiB0cmFpdC5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICB0aGlzLnRyYWl0cy5kZWxldGUoaWRlbnRpZmllcik7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhaXQgd2FzIHJlbW92ZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgdHJhaXRzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCB0aGUgdHJhaXRzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsVHJhaXRzKCk6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRyYWl0cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRyYWl0LlxuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdChpZGVudGlmaWVyOiBzdHJpbmcpOiB0eXBlb2YgQmxvY2tUcmFpdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyYWl0cy5nZXQoaWRlbnRpZmllcikgPz8gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja1BhbGV0dGUgfTtcbiIsICJpbXBvcnQge1xuICBCbG9ja0ZhY2UsXG4gIEJsb2NrUG9zaXRpb24sXG4gIEdhbWVtb2RlLFxuICBMZXZlbEV2ZW50LFxuICBMZXZlbEV2ZW50UGFja2V0LFxuICBVcGRhdGVCbG9ja0ZsYWdzVHlwZSxcbiAgVXBkYXRlQmxvY2tMYXllclR5cGUsXG4gIFVwZGF0ZUJsb2NrUGFja2V0LFxuICBWZWN0b3IzZlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRGltZW5zaW9uLCBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHtcbiAgQmxvY2tFbnRyeSxcbiAgQmxvY2tQcm9wZXJ0aWVzLFxuICBJdGVtU3RhY2tQcm9wZXJ0aWVzLFxuICBKU09OTGlrZU9iamVjdCxcbiAgSlNPTkxpa2VWYWx1ZVxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IENodW5rIH0gZnJvbSBcIi4uL3dvcmxkL2NodW5rXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2ssIEl0ZW1UeXBlIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciwgQmxvY2tUb29sVHlwZSwgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0c1wiO1xuaW1wb3J0IHsgTmJ0TWFwIH0gZnJvbSBcIi4vbWFwc1wiO1xuXG5pbXBvcnQgeyBCbG9ja1Blcm11dGF0aW9uLCBCbG9ja1R5cGUgfSBmcm9tIFwiLlwiO1xuXG5jbGFzcyBCbG9jayB7XG4gIHByb3RlY3RlZCBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIHB1YmxpYyByZWFkb25seSBwb3NpdGlvbjogQmxvY2tQb3NpdGlvbjtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBKU09OTGlrZVZhbHVlPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHMgPSBuZXcgTWFwPHN0cmluZywgQmxvY2tUcmFpdD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbmJ0ID0gbmV3IE5idE1hcCh0aGlzKTtcblxuICBwdWJsaWMgcGVybXV0YXRpb246IEJsb2NrUGVybXV0YXRpb247XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGRpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIHBvc2l0aW9uOiBCbG9ja1Bvc2l0aW9uLFxuICAgIHBlcm11dGF0aW9uOiBCbG9ja1Blcm11dGF0aW9uLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEJsb2NrUHJvcGVydGllcz5cbiAgKSB7XG4gICAgdGhpcy5zZXJlbml0eSA9IGRpbWVuc2lvbi53b3JsZC5zZXJlbml0eTtcbiAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcbiAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgdGhpcy5wZXJtdXRhdGlvbiA9IHBlcm11dGF0aW9uO1xuXG4gICAgaWYgKHByb3BlcnRpZXM/LmVudHJ5KVxuICAgICAgdGhpcy5sb2FkRGF0YUVudHJ5KHRoaXMuZGltZW5zaW9uLndvcmxkLCBwcm9wZXJ0aWVzLmVudHJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYmxvY2sgaXMgYWlyLlxuICAgKi9cbiAgcHVibGljIGlzQWlyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBlcm11dGF0aW9uLnR5cGUuYWlyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBibG9jayBpcyBsaXF1aWQuXG4gICAqL1xuICBwdWJsaWMgaXNMaXF1aWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybXV0YXRpb24udHlwZS5saXF1aWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGJsb2NrIGlzIHNvbGlkLlxuICAgKi9cbiAgcHVibGljIGlzU29saWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybXV0YXRpb24udHlwZS5zb2xpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjaHVuayB0aGUgYmxvY2sgaXMgaW4uXG4gICAqIEByZXR1cm5zIFRoZSBjaHVuayB0aGUgYmxvY2sgaXMgaW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2h1bmsoKTogQ2h1bmsge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgY2h1bmsgY29vcmRpbmF0ZXMuXG4gICAgY29uc3QgY3ggPSB0aGlzLnBvc2l0aW9uLnggPj4gNDtcbiAgICBjb25zdCBjeiA9IHRoaXMucG9zaXRpb24ueiA+PiA0O1xuXG4gICAgLy8gR2V0IHRoZSBjaHVuayBmcm9tIHRoZSBkaW1lbnNpb24uXG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmdldENodW5rKGN4LCBjeik7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGVybXV0YXRpb24oKTogQmxvY2tQZXJtdXRhdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybXV0YXRpb247XG4gIH1cblxuICBwdWJsaWMgc2V0UGVybXV0YXRpb24oXG4gICAgcGVybXV0YXRpb246IEJsb2NrUGVybXV0YXRpb24sXG4gICAgZW50cnk/OiBCbG9ja0VudHJ5XG4gICk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIG9mIHRoZSBwZXJtdXRhdGlvbiBoYXMgY2hhbmdlZC5cbiAgICBpZiAodGhpcy5wZXJtdXRhdGlvbi50eXBlICE9PSBwZXJtdXRhdGlvbi50eXBlKSB7XG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhbmQgdHJhaXRzIGlmIHRoZSB0eXBlIGhhcyBjaGFuZ2VkLlxuICAgICAgdGhpcy50cmFpdHMuY2xlYXIoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBhaXIuXG4gICAgaWYgKHBlcm11dGF0aW9uLnR5cGUuYWlyKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGJsb2NrIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIGFpci5cbiAgICAgIHRoaXMuZGltZW5zaW9uLmJsb2Nrcy5kZWxldGUoQmxvY2tQb3NpdGlvbi5oYXNoKHRoaXMucG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGNodW5rIHRoZSBibG9jayBpcyBpbi5cbiAgICBjb25zdCBjaHVuayA9IHRoaXMuZ2V0Q2h1bmsoKTtcblxuICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrLlxuICAgIGNodW5rLnNldFBlcm11dGF0aW9uKHRoaXMucG9zaXRpb24sIHBlcm11dGF0aW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyeSBpcyBwcm92aWRlZC5cbiAgICBpZiAoZW50cnkpIHRoaXMubG9hZERhdGFFbnRyeSh0aGlzLmdldFdvcmxkKCksIGVudHJ5KTtcblxuICAgIC8vIEdldCB0aGUgdHJhaXRzIGZyb20gdGhlIGJsb2NrIHBhbGV0dGVcbiAgICBjb25zdCB0cmFpdHMgPSB0aGlzLmdldFdvcmxkKCkuYmxvY2tQYWxldHRlLmdldFJlZ2lzdHJ5KFxuICAgICAgcGVybXV0YXRpb24udHlwZS5pZGVudGlmaWVyXG4gICAgKTtcblxuICAgIC8vIEZldGNoIGFueSB0cmFpdHMgdGhhdCBhcHBseSB0byB0aGUgYmFzZSB0eXBlIGNvbXBvbmVudHNcbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgcGVybXV0YXRpb24udHlwZS5jb21wb25lbnRzKSB7XG4gICAgICAvLyBHZXQgdGhlIHRyYWl0IGZyb20gdGhlIGJsb2NrIHBhbGV0dGUgdXNpbmcgdGhlIGlkZW50aWZpZXJcbiAgICAgIGNvbnN0IHRyYWl0ID0gdGhpcy5nZXRXb3JsZCgpLmJsb2NrUGFsZXR0ZS5nZXRUcmFpdChpZGVudGlmaWVyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGV4aXN0c1xuICAgICAgaWYgKHRyYWl0KSB0cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggYW55IHRyYWl0cyB0aGF0IGFyZSBibG9jayBzdGF0ZSBzcGVjaWZpY1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBlcm11dGF0aW9uLnN0YXRlKSkge1xuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0cmFpdCBpbiB0aGUgcmVnaXN0cnkuXG4gICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRoaXMuZ2V0V29ybGQoKS5ibG9ja1BhbGV0dGUuZ2V0QWxsVHJhaXRzKCkpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUga2V5XG4gICAgICAgIGlmICh0cmFpdC5pZGVudGlmaWVyID09PSBrZXkpIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgbGlzdFxuICAgICAgICAgIHRyYWl0cy5wdXNoKHRyYWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHRyYWl0cyBhbmQgYXBwbHkgdGhlbSB0byB0aGUgYmxvY2tcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRyYWl0cykgdGhpcy5hZGRUcmFpdCh0cmFpdCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQgdG8gYnJvYWRjYXN0IHRoZSBjaGFuZ2UuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFVwZGF0ZUJsb2NrUGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIGJsb2NrIHBvc2l0aW9uIGFuZCBwZXJtdXRhdGlvbiB0byB0aGUgcGFja2V0LlxuICAgIHBhY2tldC5uZXR3b3JrQmxvY2tJZCA9IHBlcm11dGF0aW9uLm5ldHdvcms7XG4gICAgcGFja2V0LnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICBwYWNrZXQuZmxhZ3MgPSBVcGRhdGVCbG9ja0ZsYWdzVHlwZS5OZXR3b3JrO1xuICAgIHBhY2tldC5sYXllciA9IFVwZGF0ZUJsb2NrTGF5ZXJUeXBlLk5vcm1hbDtcblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb24uXG4gICAgdGhpcy5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9jay5cbiAgICB0aGlzLnBlcm11dGF0aW9uID0gcGVybXV0YXRpb247XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgc2hvdWxkIGJlIGNhY2hlZC5cbiAgICBpZiAoKHRoaXMuY29tcG9uZW50cy5zaXplID4gMCB8fCB0aGlzLnRyYWl0cy5zaXplID4gMCkgJiYgIXRoaXMuaXNBaXIoKSkge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBibG9jayBoYXNoIHVzaW5nIHRoZSBwb3NpdGlvblxuICAgICAgY29uc3QgaGFzaCA9IEJsb2NrUG9zaXRpb24uaGFzaCh0aGlzLnBvc2l0aW9uKTtcblxuICAgICAgLy8gU2V0IHRoZSBibG9jayBpbiB0aGUgY2FjaGUuXG4gICAgICB0aGlzLmRpbWVuc2lvbi5ibG9ja3Muc2V0KGhhc2gsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlKHR5cGU6IEJsb2NrVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0UGVybXV0YXRpb24odHlwZS5nZXRQZXJtdXRhdGlvbigpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKCk6IEJsb2NrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGVybXV0YXRpb24udHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRXb3JsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24ud29ybGQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYmxvY2sgaGFzIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50LlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBjaGVjayBmb3IuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGJsb2NrIGhhcyB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGhhc0NvbXBvbmVudChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBmcm9tIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBjb21wb25lbnQgdG8gZ2V0IGZyb20gdGhlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBUaGUgY29tcG9uZW50IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50PFQgZXh0ZW5kcyBKU09OTGlrZU9iamVjdD4oa2V5OiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cy5nZXQoa2V5KSBhcyBUIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGZyb20gdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRzLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29tcG9uZW50KGtleTogc3RyaW5nLCBjb21wb25lbnQ6IEpTT05MaWtlT2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRzLnNldChrZXksIGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB0byB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIHNldC5cbiAgICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIHNldC5cbiAgICovXG4gIHB1YmxpYyBzZXRDb21wb25lbnQoa2V5OiBzdHJpbmcsIGNvbXBvbmVudDogSlNPTkxpa2VPYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudHMuc2V0KGtleSwgY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBibG9jayBoYXMgdGhlIHNwZWNpZmllZCB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBjaGVjayBmb3JcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgYmxvY2sgaGFzIHRoZSB0cmFpdFxuICAgKi9cbiAgcHVibGljIGhhc1RyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgQmxvY2tUcmFpdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRyYWl0cy5oYXMoXG4gICAgICB0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgYmxvY2tcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdDxUIGV4dGVuZHMgdHlwZW9mIEJsb2NrVHJhaXQ+KHRyYWl0OiBUKTogSW5zdGFuY2VUeXBlPFQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgdHJhaXQgZnJvbSB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gZ2V0IGZyb20gdGhlIGJsb2NrXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQodHJhaXQ6IHN0cmluZyk6IEJsb2NrVHJhaXQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgdHJhaXQgZnJvbSB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gZ2V0IGZyb20gdGhlIGJsb2NrXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQodHJhaXQ6IHN0cmluZyB8IHR5cGVvZiBCbG9ja1RyYWl0KTogQmxvY2tUcmFpdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyYWl0cy5nZXQoXG4gICAgICB0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXJcbiAgICApIGFzIEJsb2NrVHJhaXQgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVUcmFpdCh0cmFpdDogc3RyaW5nIHwgdHlwZW9mIEJsb2NrVHJhaXQpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHRyYWl0IGZyb20gdGhlIGJsb2NrXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnRyYWl0cy5nZXQoXG4gICAgICB0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXJcbiAgICApO1xuXG4gICAgLy8gQ2FsbCB0aGUgb25SZW1vdmUgbWV0aG9kIG9mIHRoZSB0cmFpdFxuICAgIGluc3RhbmNlPy5vblJlbW92ZT8uKCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIGJsb2NrXG4gICAgdGhpcy50cmFpdHMuZGVsZXRlKHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRyYWl0IHRvIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBhZGRcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IHRoYXQgd2FzIGFkZGVkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhaXQ8VCBleHRlbmRzIHR5cGVvZiBCbG9ja1RyYWl0PihcbiAgICB0cmFpdDogVCB8IEJsb2NrVHJhaXRcbiAgKTogSW5zdGFuY2VUeXBlPFQ+IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAodGhpcy50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKVxuICAgICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldCh0cmFpdC5pZGVudGlmaWVyKSBhcyBJbnN0YW5jZVR5cGU8VD47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaXMgaW4gdGhlIHBhbGV0dGVcbiAgICBpZiAoIXRoaXMuZ2V0V29ybGQoKS5ibG9ja1BhbGV0dGUudHJhaXRzLmhhcyh0cmFpdC5pZGVudGlmaWVyKSlcbiAgICAgIHRoaXMuZ2V0V29ybGQoKS5sb2dnZXIud2FybihcbiAgICAgICAgYFRyYWl0IFwiwqdjJHt0cmFpdC5pZGVudGlmaWVyfcKnclwiIHdhcyBhZGRlZCB0byBibG9jayBcIsKnZCR7dGhpcy5nZXRUeXBlKCkuaWRlbnRpZmllcn3Cp3I6wqdkJHtKU09OLnN0cmluZ2lmeSh0aGlzLnBvc2l0aW9uKX3Cp3JcIiBpbiBkaW1lbnNpb24gXCLCp2Eke3RoaXMuZGltZW5zaW9uLmlkZW50aWZpZXJ9wqdyXCIgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlLiBUaGlzIG1heSByZXN1bHQgaW4gYSBkZXNlcmlsaXphdGlvbiBlcnJvci5gXG4gICAgICApO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBhZGQgdGhlIHRyYWl0IHRvIHRoZSBibG9ja1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaXMgYSBibG9jayB0cmFpdFxuICAgICAgaWYgKHRyYWl0IGluc3RhbmNlb2YgQmxvY2tUcmFpdCkge1xuICAgICAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSBibG9ja1xuICAgICAgICB0aGlzLnRyYWl0cy5zZXQodHJhaXQuaWRlbnRpZmllciwgdHJhaXQpO1xuXG4gICAgICAgIC8vIENhbGwgdGhlIG9uQWRkIG1ldGhvZCBvZiB0aGUgdHJhaXRcbiAgICAgICAgdHJhaXQub25BZGQ/LigpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICAgICAgcmV0dXJuIHRyYWl0IGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhaXRcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgdHJhaXQodGhpcykgYXMgSW5zdGFuY2VUeXBlPFQ+O1xuXG4gICAgICAgIC8vIEFkZCB0aGUgdHJhaXQgdG8gdGhlIGJsb2NrXG4gICAgICAgIHRoaXMudHJhaXRzLnNldChpbnN0YW5jZS5pZGVudGlmaWVyLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgb25BZGQgbWV0aG9kIG9mIHRoZSB0cmFpdFxuICAgICAgICBpbnN0YW5jZS5vbkFkZD8uKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBhZGQgdHJhaXQgXCIke3RyYWl0LmlkZW50aWZpZXJ9XCIgdG8gYmxvY2sgXCIke3RoaXMuZ2V0VHlwZSgpLmlkZW50aWZpZXJ9OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5wb3NpdGlvbil9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmRpbWVuc2lvbi5pZGVudGlmaWVyfVwiYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gbnVsbCBhcyB0aGUgdHJhaXQgY291bGQgbm90IGJlIGFkZGVkXG4gICAgICByZXR1cm4gbnVsbCBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvb2wgdHlwZSByZXF1aXJlZCB0byBicmVhayB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0VG9vbFR5cGUoKTogQmxvY2tUb29sVHlwZSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHRvb2wgdHlwZSBjaGVja2luZy5cblxuICAgIHJldHVybiBCbG9ja1Rvb2xUeXBlLk5vbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdG9vbCByZXF1aXJlZCB0byBicmVhayB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSB0b29sIHJlcXVpcmVkIHRvIGJyZWFrIHRoZSBibG9jay5cbiAgICovXG4gIHB1YmxpYyBpc1Rvb2xDb21wYXRpYmxlKF9pdGVtU3RhY2s6IEl0ZW1TdGFjayk6IGJvb2xlYW4ge1xuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZS5cbiAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmdldFR5cGUoKTtcblxuICAgIC8vIElmIHRoZSBoYXJkbmVzcyBpcyBsZXNzIHRoYW4gMCwgbm8gdG9vbCBpcyBjb21wYXRpYmxlLlxuICAgIGlmIChibG9ja1R5cGUuaGFyZG5lc3MgPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdG9vbCB0eXBlIGlzIG5vbmUuXG4gICAgaWYgKHRoaXMuZ2V0VG9vbFR5cGUoKSA9PT0gQmxvY2tUb29sVHlwZS5Ob25lKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSBpdCB0YWtlcyB0byBicmVhayB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBpdGVtU3RhY2sgVGhlIGl0ZW0gc3RhY2sgdXNlZCB0byBicmVhayB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSB0aW1lIGl0IHRha2VzIHRvIGJyZWFrIHRoZSBibG9jay5cbiAgICovXG4gIHB1YmxpYyBnZXRCcmVha1RpbWUoaXRlbVN0YWNrPzogSXRlbVN0YWNrIHwgbnVsbCk6IG51bWJlciB7XG4gICAgLy8gR2V0IHRoZSB0eXBlIG9mIHRoZSBibG9jay5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlKCk7XG5cbiAgICAvLyBHZXQgdGhlIGhhcmRuZXNzIG9mIHRoZSBibG9jay5cbiAgICBsZXQgaGFyZG5lc3MgPSB0eXBlLmhhcmRuZXNzO1xuXG4gICAgaWYgKCFpdGVtU3RhY2sgJiYgdGhpcy5nZXRUb29sVHlwZSgpID09PSBCbG9ja1Rvb2xUeXBlLk5vbmUpIHtcbiAgICAgIGhhcmRuZXNzICo9IDEuNTtcbiAgICB9IGVsc2UgaWYgKGl0ZW1TdGFjayAmJiB0aGlzLmlzVG9vbENvbXBhdGlibGUoaXRlbVN0YWNrKSkge1xuICAgICAgaGFyZG5lc3MgKj0gMS41O1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXJkbmVzcyAqPSA1O1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmNlaWwoaGFyZG5lc3MgKiAyMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaXRlbSBzdGFjayBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYXBwbHkgdG8gdGhlIGl0ZW0gc3RhY2suXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIHN0YWNrIG9mIHRoZSBibG9jay5cbiAgICovXG4gIHB1YmxpYyBnZXRJdGVtU3RhY2socHJvcGVydGllcz86IFBhcnRpYWw8SXRlbVN0YWNrUHJvcGVydGllcz4pOiBJdGVtU3RhY2sge1xuICAgIC8vIEdldCB0aGUgaXRlbVBhbGV0dGUgZnJvbSB0aGUgd29ybGQuXG4gICAgY29uc3QgcGFsZXR0ZSA9IHRoaXMuZ2V0V29ybGQoKS5pdGVtUGFsZXR0ZTtcblxuICAgIC8vIEdldCB0aGUgaXRlbSB0eXBlIG9mIHRoZSBibG9jay5cbiAgICBjb25zdCB0eXBlID0gcGFsZXR0ZS5yZXNvbHZlVHlwZSh0aGlzLmdldFR5cGUoKSkgYXMgSXRlbVR5cGU7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbSBzdGFjayB3aXRoIHRoZSB0eXBlLlxuICAgIGNvbnN0IGl0ZW1TdGFjayA9IG5ldyBJdGVtU3RhY2sodHlwZSwgcHJvcGVydGllcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGl0ZW0gc3RhY2suXG4gICAgcmV0dXJuIGl0ZW1TdGFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBibG9jayBhYm92ZSB0aGlzIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gc3RlcHMgVGhlIGFtb3VudCBvZiBzdGVwcyB0byBnbyB1cC5cbiAgICovXG4gIHB1YmxpYyBhYm92ZShzdGVwcz86IG51bWJlcik6IEJsb2NrIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgLi4udGhpcy5wb3NpdGlvbixcbiAgICAgIHk6IHRoaXMucG9zaXRpb24ueSArIChzdGVwcyA/PyAxKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIGJlbG93IHRoaXMgYmxvY2suXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwcyBUaGUgYW1vdW50IG9mIHN0ZXBzIHRvIGdvIGRvd24uXG4gICAqL1xuICBwdWJsaWMgYmVsb3coc3RlcHM/OiBudW1iZXIpOiBCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgIC4uLnRoaXMucG9zaXRpb24sXG4gICAgICB5OiB0aGlzLnBvc2l0aW9uLnkgLSAoc3RlcHMgPz8gMSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBibG9jayB0byB0aGUgbm9ydGggb2YgdGhpcyBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXBzIFRoZSBhbW91bnQgb2Ygc3RlcHMgdG8gZ28gbm9ydGguXG4gICAqL1xuICBwdWJsaWMgbm9ydGgoc3RlcHM/OiBudW1iZXIpOiBCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgIC4uLnRoaXMucG9zaXRpb24sXG4gICAgICB6OiB0aGlzLnBvc2l0aW9uLnogLSAoc3RlcHMgPz8gMSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBibG9jayB0byB0aGUgc291dGggb2YgdGhpcyBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXBzIFRoZSBhbW91bnQgb2Ygc3RlcHMgdG8gZ28gc291dGguXG4gICAqL1xuICBwdWJsaWMgc291dGgoc3RlcHM/OiBudW1iZXIpOiBCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgIC4uLnRoaXMucG9zaXRpb24sXG4gICAgICB6OiB0aGlzLnBvc2l0aW9uLnogKyAoc3RlcHMgPz8gMSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBibG9jayB0byB0aGUgZWFzdCBvZiB0aGlzIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gc3RlcHMgVGhlIGFtb3VudCBvZiBzdGVwcyB0byBnbyBlYXN0LlxuICAgKi9cbiAgcHVibGljIGVhc3Qoc3RlcHM/OiBudW1iZXIpOiBCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgIC4uLnRoaXMucG9zaXRpb24sXG4gICAgICB4OiB0aGlzLnBvc2l0aW9uLnggKyAoc3RlcHMgPz8gMSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBibG9jayB0byB0aGUgd2VzdCBvZiB0aGlzIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gc3RlcHMgVGhlIGFtb3VudCBvZiBzdGVwcyB0byBnbyB3ZXN0LlxuICAgKi9cbiAgcHVibGljIHdlc3Qoc3RlcHM/OiBudW1iZXIpOiBCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgIC4uLnRoaXMucG9zaXRpb24sXG4gICAgICB4OiB0aGlzLnBvc2l0aW9uLnggLSAoc3RlcHMgPz8gMSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIG5leHQgdG8gYSBnaXZlbiBibG9jayBmYWNlIG9mIHRoZSBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIGZhY2UgVGhlIGZhY2Ugb2YgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIGZhY2UoZmFjZTogQmxvY2tGYWNlKTogQmxvY2sge1xuICAgIHN3aXRjaCAoZmFjZSkge1xuICAgICAgY2FzZSBCbG9ja0ZhY2UuVG9wOiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFib3ZlKCk7XG4gICAgICB9XG4gICAgICBjYXNlIEJsb2NrRmFjZS5Cb3R0b206IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVsb3coKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgQmxvY2tGYWNlLk5vcnRoOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vcnRoKCk7XG4gICAgICB9XG4gICAgICBjYXNlIEJsb2NrRmFjZS5Tb3V0aDoge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3V0aCgpO1xuICAgICAgfVxuICAgICAgY2FzZSBCbG9ja0ZhY2UuRWFzdDoge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXN0KCk7XG4gICAgICB9XG4gICAgICBjYXNlIEJsb2NrRmFjZS5XZXN0OiB7XG4gICAgICAgIHJldHVybiB0aGlzLndlc3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yY2VzIGEgcGxheWVyIHRvIGludGVyYWN0IHdpdGggdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgaW50ZXJhY3QocGxheWVyOiBQbGF5ZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVySW50ZXJhY3RXaXRoQmxvY2tTaWduYWwoXG4gICAgICBwbGF5ZXIsXG4gICAgICB0aGlzLFxuICAgICAgcGxheWVyLmdldEhlbGRJdGVtKCksXG4gICAgICBudWxsXG4gICAgKTtcblxuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2FsbCB0aGUgYmxvY2sgb25JbnRlcmFjdCB0cmFpdCBtZXRob2RzXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgLy8gQ2FsbCB0aGUgb25JbnRlcmFjdCBtZXRob2Qgb2YgdGhlIHRyYWl0XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFpdC5vbkludGVyYWN0Py4ocGxheWVyKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSByZXN1bHQgaXMgZmFsc2VcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIHdhcyBpbnRlcmFjdGVkIHdpdGhcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBwbGF5ZXIgV2hldGhlciB0aGUgYmxvY2sgd2FzIGRlc3Ryb3llZCBieSBhIHBsYXllci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgYmxvY2sgd2FzIGRlc3Ryb3llZCBzdWNjZXNzZnVsbHk7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZGVzdHJveShwbGF5ZXI/OiBQbGF5ZXIpOiBib29sZWFuIHtcbiAgICAvLyBDYWxsIHRoZSBibG9jayBvbkJyZWFrIHRyYWl0IG1ldGhvZHNcbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRoaXMudHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgYnJlYWsgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0cmFpdC5vbkJyZWFrPy4ocGxheWVyKTtcblxuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQsIGNvbnRpbnVlXG4gICAgICAvLyBBcyB0aGUgdHJhaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtZXRob2RcbiAgICAgIGlmIChzdWNjZXNzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGZhbHNlLCBjYW5jZWwgdGhlIGJyZWFrXG4gICAgICBjYW5jZWxlZCA9ICFzdWNjZXNzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgYmxvY2sgYnJlYWsgd2FzIGNhbmNlbGVkXG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGRlc3Ryb3llZCB0aGUgYmxvY2suXG4gICAgaWYgKHBsYXllcikge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBpbiBzdXJ2aXZhbCBtb2RlLlxuICAgICAgLy8gSWYgc28sIHRoZSBibG9jayBzaG91bGQgZHJvcCBhbiBpdGVtLlxuICAgICAgaWYgKHBsYXllci5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuU3Vydml2YWwpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2suXG4gICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdGhpcy5wb3NpdGlvbjtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRyb3BzIG9mIHRoZSBibG9jay5cbiAgICAgICAgZm9yIChjb25zdCBkcm9wIG9mIHRoaXMuZ2V0VHlwZSgpLmRyb3BzKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRyb3AgaXMgYWlyLCBpZiBzbyB3ZSB3aWxsIHNraXAgaXQuXG4gICAgICAgICAgaWYgKGRyb3AudHlwZSA9PT0gQmxvY2tJZGVudGlmaWVyLkFpcikgY29udGludWU7XG5cbiAgICAgICAgICAvLyBSb2xsIHRoZSBkcm9wIGFtb3VudC5cbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBkcm9wLnJvbGwoKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhbW91bnQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAuXG4gICAgICAgICAgaWYgKGFtb3VudCA8PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBJdGVtU3RhY2suXG4gICAgICAgICAgY29uc3QgaXRlbVN0YWNrID0gbmV3IEl0ZW1TdGFjayhkcm9wLnR5cGUgYXMgSXRlbUlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIHdvcmxkOiB0aGlzLmRpbWVuc2lvbi53b3JsZFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEl0ZW1FbnRpdHkuXG4gICAgICAgICAgY29uc3QgaXRlbUVudGl0eSA9IHRoaXMuZGltZW5zaW9uLnNwYXduSXRlbShcbiAgICAgICAgICAgIGl0ZW1TdGFjayxcbiAgICAgICAgICAgIG5ldyBWZWN0b3IzZih4ICsgMC41LCB5ICsgMC41LCB6ICsgMC41KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBZGQgcmFuZG9tIHggJiB6IHZlbG9jaXR5IHRvIHRoZSBpdGVtIGVudGl0eS5cbiAgICAgICAgICBjb25zdCB2ZWxvY2l0eSA9IG5ldyBWZWN0b3IzZihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAwLjEgLSAwLjA1LFxuICAgICAgICAgICAgaXRlbUVudGl0eS52ZWxvY2l0eS55LFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIDAuMSAtIDAuMDVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB2ZWxvY2l0eSB0byB0aGUgaXRlbSBlbnRpdHkuXG4gICAgICAgICAgaXRlbUVudGl0eS5hZGRNb3Rpb24odmVsb2NpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBMZXZlbEV2ZW50UGFja2V0IHRvIGJyb2FkY2FzdCB0aGUgYmxvY2sgYnJlYWsuXG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxFdmVudFBhY2tldCgpO1xuICAgICAgcGFja2V0LmV2ZW50ID0gTGV2ZWxFdmVudC5QYXJ0aWNsZXNEZXN0cm95QmxvY2s7XG4gICAgICBwYWNrZXQucG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLnRvVmVjdG9yM2YodGhpcy5wb3NpdGlvbik7XG4gICAgICBwYWNrZXQuZGF0YSA9IHRoaXMucGVybXV0YXRpb24ubmV0d29yaztcblxuICAgICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvbi5cbiAgICAgIHRoaXMuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgYWlyIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgIGNvbnN0IGFpciA9IEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuQWlyKTtcblxuICAgIC8vIFNldCB0aGUgYmxvY2sgcGVybXV0YXRpb24gdG8gYWlyLlxuICAgIHRoaXMuc2V0UGVybXV0YXRpb24oYWlyKTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayB3YXMgZGVzdHJveWVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrJ3MgZGF0YSBhcyBhIGRhdGFiYXNlIGVudHJ5LlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgZW50cnkgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGdldERhdGFFbnRyeSgpOiBCbG9ja0VudHJ5IHtcbiAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jay5cbiAgICBjb25zdCB7IHgsIHksIHogfSA9IHRoaXMucG9zaXRpb247XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJsb2NrIGVudHJ5IG9iamVjdC5cbiAgICBjb25zdCBlbnRyeTogQmxvY2tFbnRyeSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2V0VHlwZSgpLmlkZW50aWZpZXIsXG4gICAgICBwZXJtdXRhdGlvbjogdGhpcy5wZXJtdXRhdGlvbi5uZXR3b3JrLFxuICAgICAgcG9zaXRpb246IFt4LCB5LCB6XSxcbiAgICAgIHRyYWl0czogWy4uLnRoaXMudHJhaXRzLmtleXMoKV0sXG4gICAgICBjb21wb25lbnRzOiBbLi4udGhpcy5jb21wb25lbnRzLmVudHJpZXMoKV1cbiAgICB9O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBibG9jayBlbnRyeSBvYmplY3QuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHVibGljIGxvYWREYXRhRW50cnkoXG4gICAgd29ybGQ6IFdvcmxkLFxuICAgIGVudHJ5OiBCbG9ja0VudHJ5LFxuICAgIG92ZXJ3cml0ZSA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHNob3VsZCBiZSBvdmVyd3JpdHRlbi5cbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICB0aGlzLnRyYWl0cy5jbGVhcigpO1xuICAgICAgdGhpcy5jb21wb25lbnRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnRzIHRvIHRoZSBibG9jaywgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeS5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50cy5oYXMoa2V5KSkgdGhpcy5jb21wb25lbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHRyYWl0cyB0byB0aGUgYmxvY2ssIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGVudHJ5LnRyYWl0cykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhbGV0dGUgaGFzIHRoZSB0cmFpdFxuICAgICAgY29uc3QgdHJhaXRUeXBlID0gd29ybGQuYmxvY2tQYWxldHRlLnRyYWl0cy5nZXQodHJhaXQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzIGluIHRoZSBwYWxldHRlXG4gICAgICBpZiAoIXRyYWl0VHlwZSkge1xuICAgICAgICB3b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHRyYWl0IFwiJHt0cmFpdH1cIiBmb3IgYmxvY2sgXCIke3RoaXMuZ2V0VHlwZSgpLmlkZW50aWZpZXJ9OiR7dGhpcy5wb3NpdGlvbi54fSwke3RoaXMucG9zaXRpb24ueX0sJHt0aGlzLnBvc2l0aW9uLnp9XCIgYXMgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGVgXG4gICAgICAgICk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gYWRkIHRoZSB0cmFpdCB0byB0aGUgYmxvY2tcbiAgICAgIHRoaXMuYWRkVHJhaXQodHJhaXRUeXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2sgfTtcbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZywgTkJUVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuaW1wb3J0IHsgQmxvY2tBY3RvckRhdGFQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQmxvY2sgfSBmcm9tIFwiLi4vYmxvY2tcIjtcblxuY2xhc3MgTmJ0TWFwIGV4dGVuZHMgTWFwPHN0cmluZywgTkJUVGFnPiB7XG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgaW4gd2hpY2ggdGhlIE5CVCBkYXRhIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJsb2NrOiBCbG9jaztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IE5CVCBtYXAgZm9yIGEgYmxvY2suXG4gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgaW4gd2hpY2ggdGhlIE5CVCBkYXRhIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJsb2NrOiBCbG9jaykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICB9XG5cbiAgcHVibGljIGFkZCh2YWx1ZTogTkJUVGFnKTogdGhpcyB7XG4gICAgLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kXG4gICAgc3VwZXIuc2V0KHZhbHVlLm5hbWUsIHZhbHVlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgd2l0aCB0aGUgbmV3IE5CVCBkYXRhXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgaW5zdGFuY2VcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBOQlRUYWcpOiB0aGlzIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2RcbiAgICBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIHdpdGggdGhlIG5ldyBOQlQgZGF0YVxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGluc3RhbmNlXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVsZXRlKGtleSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIHdpdGggdGhlIG5ldyBOQlQgZGF0YVxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kXG4gICAgc3VwZXIuY2xlYXIoKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgd2l0aCB0aGUgbmV3IE5CVCBkYXRhXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJsb2NrQWN0b3JEYXRhIHBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBCbG9ja0FjdG9yRGF0YVBhY2tldCgpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwYWNrZXQgdmFsdWVzXG4gICAgcGFja2V0LnBvc2l0aW9uID0gdGhpcy5ibG9jay5wb3NpdGlvbjtcbiAgICBwYWNrZXQubmJ0ID0gbmV3IENvbXBvdW5kVGFnKCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIE5CVCBkYXRhXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcykgcGFja2V0Lm5idC5zZXRUYWcoa2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5ibG9jay5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTmJ0TWFwIH07XG4iLCAiaW1wb3J0IHtcbiAgQ29udGFpbmVySWQsXG4gIENvbnRhaW5lck9wZW5QYWNrZXQsXG4gIENvbnRhaW5lclR5cGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi9jb250YWluZXJcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXJPcGVuZWRDb250YWluZXJTaWduYWwgfSBmcm9tIFwiLi4vZXZlbnRzXCI7XG5cbmltcG9ydCB7IEJsb2NrIH0gZnJvbSBcIi4vYmxvY2tcIjtcblxuY2xhc3MgQmxvY2tDb250YWluZXIgZXh0ZW5kcyBDb250YWluZXIge1xuICAvKipcbiAgICogVGhlIGJsb2NrIHRoYXQgdGhpcyBjb250YWluZXIgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2s6IEJsb2NrO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBibG9jazogQmxvY2ssXG4gICAgdHlwZTogQ29udGFpbmVyVHlwZSxcbiAgICBpZGVudGlmaWVyOiBDb250YWluZXJJZCxcbiAgICBzaXplOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIodHlwZSwgaWRlbnRpZmllciwgc2l6ZSk7XG4gICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICB9XG5cbiAgcHVibGljIHNldEl0ZW0oc2xvdDogbnVtYmVyLCBpdGVtU3RhY2s6IEl0ZW1TdGFjayk6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldEl0ZW0gbWV0aG9kXG4gICAgc3VwZXIuc2V0SXRlbShzbG90LCBpdGVtU3RhY2spO1xuXG4gICAgLy8gU2V0IHRoZSB3b3JsZCBpbiB0aGUgaXRlbSBzdGFjayBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFpdGVtU3RhY2sud29ybGQpIGl0ZW1TdGFjay53b3JsZCA9IHRoaXMuYmxvY2suZ2V0V29ybGQoKTtcbiAgICBpdGVtU3RhY2suaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZShwbGF5ZXI/OiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCB1cGRhdGUgbWV0aG9kXG4gICAgc3VwZXIudXBkYXRlKHBsYXllcik7XG5cbiAgICAvLyBDYWxsIHRoZSBvbkNvbnRhaW5lclVwZGF0ZSBtZXRob2QgZm9yIHRoZSBibG9jayB0cmFpdHNcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRoaXMuYmxvY2sudHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYWxsIHRoZSB0cmFpdCBtZXRob2RcbiAgICAgICAgdHJhaXQub25Db250YWluZXJVcGRhdGU/Lih0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdGhpcy5ibG9jay5wb3NpdGlvbjtcblxuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHRoaXMuYmxvY2tcbiAgICAgICAgICAuZ2V0V29ybGQoKVxuICAgICAgICAgIC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHRyaWdnZXIgb25Db250YWluZXJVcGRhdGUgdHJhaXQgZXZlbnQgZm9yIGJsb2NrIFwiJHt0aGlzLmJsb2NrLmdldFR5cGUoKS5pZGVudGlmaWVyfToke3h9LCR7eX0sJHt6fVwiIGluIGRpbWVuc2lvbiBcIiR7dGhpcy5ibG9jay5kaW1lbnNpb24uaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgICByZWFzb25cbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgYmxvY2tcbiAgICAgICAgdGhpcy5ibG9jay50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93KHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJPcGVuZWRDb250YWluZXJTaWduYWwocGxheWVyLCB0aGlzKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZFxuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuXG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2hvdyBtZXRob2RcbiAgICBzdXBlci5zaG93KHBsYXllcik7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQ29udGFpbmVyT3BlblBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBDb250YWluZXJPcGVuUGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXNcbiAgICBwYWNrZXQuaWRlbnRpZmllciA9IHRoaXMuaWRlbnRpZmllcjtcbiAgICBwYWNrZXQudHlwZSA9IHRoaXMudHlwZTtcbiAgICBwYWNrZXQucG9zaXRpb24gPSB0aGlzLmJsb2NrLnBvc2l0aW9uO1xuICAgIHBhY2tldC51bmlxdWVJZCA9XG4gICAgICB0aGlzLnR5cGUgPT09IENvbnRhaW5lclR5cGUuQ29udGFpbmVyID8gLTFuIDogcGxheWVyLnVuaXF1ZUlkO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICBwbGF5ZXIuc2VuZChwYWNrZXQpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXJcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrQ29udGFpbmVyIH07XG4iLCAiaW1wb3J0IHtcbiAgQ29udGFpbmVyQ2xvc2VQYWNrZXQsXG4gIENvbnRhaW5lcklkLFxuICBDb250YWluZXJUeXBlLFxuICBGdWxsQ29udGFpbmVyTmFtZSxcbiAgSW52ZW50b3J5Q29udGVudFBhY2tldCxcbiAgSW52ZW50b3J5U2xvdFBhY2tldCxcbiAgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3Jcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuL2l0ZW1cIjtcblxuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tIFwiLi9lbnRpdHlcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29udGFpbmVyLlxuICovXG5jbGFzcyBDb250YWluZXIge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBDb250YWluZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IENvbnRhaW5lcklkO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0b3JhZ2Ugb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdG9yYWdlOiBBcnJheTxJdGVtU3RhY2sgfCBudWxsPjtcblxuICAvKipcbiAgICogVGhlIG9jY3VwYW50cyBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9jY3VwYW50cyA9IG5ldyBTZXQ8UGxheWVyPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIGVtcHR5IHNsb3RzIGluIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgZW1wdHlTbG90c0NvdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgdHlwZSBvZiB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGU6IENvbnRhaW5lclR5cGUsXG4gICAgaWRlbnRpZmllcjogQ29udGFpbmVySWQsXG4gICAgc2l6ZTogbnVtYmVyXG4gICkge1xuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllc1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIHRoaXMuc3RvcmFnZSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHNpemUgfSwgKCkgPT4gbnVsbCk7XG4gICAgdGhpcy5lbXB0eVNsb3RzQ291bnQgPSBzaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiBlbXB0eSBzbG90cyBpbiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZUVtcHR5U2xvdENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT09IG51bGwpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGl0ZW0gZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCB0byBnZXQgdGhlIGl0ZW0gZnJvbS5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gaW4gdGhlIHNsb3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0SXRlbShzbG90OiBudW1iZXIpOiBJdGVtU3RhY2sgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlW3Nsb3RdID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhbiBpdGVtIGluIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBzbG90IHRvIHNldCB0aGUgaXRlbSBpbi5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldEl0ZW0oc2xvdDogbnVtYmVyLCBpdGVtOiBJdGVtU3RhY2spOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIGl0ZW0gaW4gdGhlIHNsb3RcbiAgICB0aGlzLnN0b3JhZ2Vbc2xvdF0gPSBpdGVtO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gYW1vdW50IGlzIDBcbiAgICAvLyBJZiBzbywgc2V0IHRoZSBzbG90IHRvIG51bGwgYXMgdGhlcmUgaXMgbm8gaXRlbVxuICAgIGlmIChpdGVtLmFtb3VudCA9PT0gMCkgdGhpcy5jbGVhclNsb3Qoc2xvdCk7XG5cbiAgICAvLyBTZXQgdGhlIGNvbnRhaW5lciBvZiB0aGUgaXRlbVxuICAgIGl0ZW0uY29udGFpbmVyID0gdGhpcztcblxuICAgIC8vIFVwZGF0ZSB0aGUgZW1wdHkgc2xvdHMgY291bnRcbiAgICB0aGlzLmVtcHR5U2xvdHNDb3VudCA9IHRoaXMuY2FsY3VsYXRlRW1wdHlTbG90Q291bnQoKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIGZvciBhbGwgb2NjdXBhbnRzXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYWRkZWQgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBhZGRJdGVtKGl0ZW06IEl0ZW1TdGFjayk6IHZvaWQge1xuICAgIC8vIEZpbmQgYSBzbG90IHRoYXQgaGFzIHRoZSBzYW1lIGl0ZW0gdHlwZSBhbmQgaXNuJ3QgZnVsbCAoeDY0KVxuICAgIC8vIElmIHRoZXJlIGlzIG5vIHNsb3QsIGZpbmQgdGhlIG5leHQgZW1wdHkgc2xvdC5cbiAgICBjb25zdCBzbG90ID0gdGhpcy5zdG9yYWdlLmZpbmRJbmRleCgoc2xvdCkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNsb3QgaXMgbnVsbC5cbiAgICAgIGlmICghc2xvdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBjYW4gYmUgc3RhY2tlZC5cbiAgICAgIGlmIChzbG90LmFtb3VudCA+PSBpdGVtLm1heEFtb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBlcXVhbCB0byB0aGUgc2xvdC5cbiAgICAgIHJldHVybiBpdGVtLmVxdWFscyhzbG90KTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIG1heGVkLlxuICAgIGNvbnN0IG1heGVkID0gaXRlbS5hbW91bnQgPj0gaXRlbS5tYXhBbW91bnQ7XG5cbiAgICAvLyBDaGVjayBpZiBleGlzdHMgYW4gYXZhaWxhYmxlIHNsb3RcbiAgICBpZiAoc2xvdCA+IC0xICYmICFtYXhlZCAmJiBpdGVtLnN0YWNrYWJsZSkge1xuICAgICAgLy8gR2V0IHRoZSBpdGVtIGlmIHNsb3QgYXZhaWxhYmxlXG4gICAgICBjb25zdCBleGlzdGluZ0l0ZW0gPSB0aGlzLnN0b3JhZ2Vbc2xvdF0gYXMgSXRlbVN0YWNrO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBpdGVtcyB0byBhZGQuXG4gICAgICBjb25zdCBhbW91bnQgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbS5tYXhBbW91bnQgLSBleGlzdGluZ0l0ZW0uYW1vdW50LFxuICAgICAgICBpdGVtLmFtb3VudFxuICAgICAgKTtcblxuICAgICAgLy8gQWRkIHRoZSBhbW91bnQgdG8gdGhlIGV4aXN0aW5nIGl0ZW0uXG4gICAgICBleGlzdGluZ0l0ZW0uaW5jcmVtZW50KGFtb3VudCk7XG5cbiAgICAgIC8vIFN1YnRyYWN0IHRoZSBhbW91bnQgZnJvbSB0aGUgaXRlbS5cbiAgICAgIGl0ZW0uZGVjcmVtZW50KGFtb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgdGhlIG5leHQgZW1wdHkgc2xvdC5cbiAgICAgIGNvbnN0IGVtcHR5U2xvdCA9IHRoaXMuc3RvcmFnZS5pbmRleE9mKG51bGwpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBlbXB0eSBzbG90LlxuICAgICAgaWYgKGVtcHR5U2xvdCA9PT0gLTEpIHJldHVybjtcbiAgICAgIGlmIChpdGVtLmFtb3VudCA+IGl0ZW0ubWF4QW1vdW50KSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGZ1bGwgc3RhY2sgaXRlbSBmb3IgdGhlIGVtcHR5IHNsb3RcbiAgICAgICAgY29uc3QgbmV3SXRlbSA9IG5ldyBJdGVtU3RhY2soaXRlbS50eXBlLCB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBhbW91bnQ6IGl0ZW0ubWF4QW1vdW50XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IEl0ZW0gYW5kIGRlY3JlYXNlIGl0XG4gICAgICAgIHRoaXMuc2V0SXRlbShlbXB0eVNsb3QsIG5ld0l0ZW0pO1xuICAgICAgICBpdGVtLmRlY3JlbWVudChpdGVtLm1heEFtb3VudCk7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBpdCBpcyBncmVhdGVyIHRoYW4gNjQgY2FsbCB0aGUgZnVuY3Rpb24gdG8gYWRkIHRoZSByZW1haW5pbmcgaXRlbXNcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpdGVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBpdGVtIGluIHRoZSBlbXB0eSBzbG90LlxuICAgICAgdGhpcy5zZXRJdGVtKGVtcHR5U2xvdCwgaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBzbG90IHRvIHJlbW92ZSB0aGUgaXRlbSBmcm9tLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUl0ZW0oc2xvdDogbnVtYmVyLCBhbW91bnQ6IG51bWJlcik6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIC8vIEdldCB0aGUgaXRlbSBmcm9tIHRoZSBzbG90LlxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oc2xvdCk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGl0ZW1zIHRvIHJlbW92ZS5cbiAgICBjb25zdCByZW1vdmVkID0gTWF0aC5taW4oYW1vdW50LCBpdGVtLmFtb3VudCk7XG5cbiAgICAvLyBTdWJ0cmFjdCB0aGUgYW1vdW50IGZyb20gdGhlIGl0ZW0uXG4gICAgaXRlbS5kZWNyZW1lbnQocmVtb3ZlZCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBhbW91bnQgaXMgMC5cbiAgICBpZiAoaXRlbS5hbW91bnQgPT09IDApIHRoaXMuc3RvcmFnZVtzbG90XSA9IG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBlbXB0eSBzbG90cyBpbiB0aGUgY29udGFpbmVyLlxuICAgIHRoaXMuZW1wdHlTbG90c0NvdW50ID0gdGhpcy5jYWxjdWxhdGVFbXB0eVNsb3RDb3VudCgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW0uXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYW4gaXRlbSBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBzbG90IHRvIHRha2UgdGhlIGl0ZW0gZnJvbS5cbiAgICogQHBhcmFtIGFtb3VudCBUaGUgYW1vdW50IG9mIHRoZSBpdGVtIHRvIHRha2UuXG4gICAqIEByZXR1cm5zIFRoZSB0YWtlbiBpdGVtLlxuICAgKi9cbiAgcHVibGljIHRha2VJdGVtKHNsb3Q6IG51bWJlciwgYW1vdW50OiBudW1iZXIpOiBJdGVtU3RhY2sgfCBudWxsIHtcbiAgICAvLyBHZXQgdGhlIGl0ZW0gaW4gdGhlIHNsb3QuXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShzbG90KTtcbiAgICBpZiAoaXRlbSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBpdGVtcyB0byByZW1vdmUuXG4gICAgY29uc3QgcmVtb3ZlZCA9IE1hdGgubWluKGFtb3VudCwgaXRlbS5hbW91bnQpO1xuICAgIGl0ZW0uZGVjcmVtZW50KHJlbW92ZWQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gYW1vdW50IGlzIDAuXG4gICAgaWYgKGl0ZW0uYW1vdW50ID09PSAwKSB0aGlzLmNsZWFyU2xvdChzbG90KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGVtcHR5IHNsb3RzIGluIHRoZSBjb250YWluZXIuXG4gICAgdGhpcy5lbXB0eVNsb3RzQ291bnQgPSB0aGlzLmNhbGN1bGF0ZUVtcHR5U2xvdENvdW50KCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbSB3aXRoIHRoZSByZW1vdmVkIGFtb3VudC5cbiAgICBjb25zdCBuZXdJdGVtID0gbmV3IEl0ZW1TdGFjayhpdGVtLnR5cGUsIHsgLi4uaXRlbSwgYW1vdW50OiByZW1vdmVkIH0pO1xuXG4gICAgLy8gQ2xvbmUgdGhlIGNvbXBvbmVudHMgb2YgdGhlIGl0ZW0gdG8gdGhlIG5ldyBpdGVtLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGl0ZW0uY29tcG9uZW50cylcbiAgICAgIG5ld0l0ZW0uY29tcG9uZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBDbG9uZSB0aGUgdHJhaXRzIG9mIHRoZSBpdGVtIHRvIHRoZSBuZXcgaXRlbS5cbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGl0ZW0udHJhaXRzLnZhbHVlcygpKSB0cmFpdC5jbG9uZShuZXdJdGVtKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIGZvciBhbGwgb2NjdXBhbnRzLlxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBDbG9uZSB0aGUgTkJUIHRhZ3Mgb2YgdGhlIGl0ZW0uXG4gICAgZm9yIChjb25zdCB0YWcgb2YgaXRlbS5uYnQudmFsdWVzKCkpIHtcbiAgICAgIG5ld0l0ZW0ubmJ0LmFkZCh0YWcpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgbmV3IGl0ZW0uXG4gICAgcmV0dXJuIG5ld0l0ZW07XG4gIH1cblxuICAvKipcbiAgICogU3dhcHMgaXRlbXMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gc3dhcCB0aGUgaXRlbSBmcm9tLlxuICAgKiBAcGFyYW0gb3RoZXJTbG90IFRoZSBzbG90IHRvIHN3YXAgdGhlIGl0ZW0gdG8uXG4gICAqIEBwYXJhbSBvdGhlckNvbnRhaW5lciBUaGUgb3RoZXIgY29udGFpbmVyIHRvIHN3YXAgdGhlIGl0ZW0gdG8uXG4gICAqL1xuICBwdWJsaWMgc3dhcEl0ZW1zKFxuICAgIHNsb3Q6IG51bWJlcixcbiAgICBvdGhlclNsb3Q6IG51bWJlcixcbiAgICBvdGhlckNvbnRhaW5lcj86IENvbnRhaW5lclxuICApOiB2b2lkIHtcbiAgICAvLyBBc3NpZ24gdGhlIHRhcmdldCBjb250YWluZXJcbiAgICBjb25zdCB0YXJnZXRDb250YWluZXIgPSBvdGhlckNvbnRhaW5lciA/PyB0aGlzO1xuXG4gICAgLy8gR2V0IHRoZSBpdGVtcyBpbiB0aGUgc2xvdHNcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKHNsb3QpO1xuICAgIGNvbnN0IG90aGVySXRlbSA9IHRhcmdldENvbnRhaW5lci5nZXRJdGVtKG90aGVyU2xvdCk7XG5cbiAgICAvLyBDbGVhciB0aGUgc2xvdHNcbiAgICB0aGlzLmNsZWFyU2xvdChzbG90KTtcbiAgICB0YXJnZXRDb250YWluZXIuY2xlYXJTbG90KG90aGVyU2xvdCk7XG5cbiAgICBpZiAoaXRlbSkgdGFyZ2V0Q29udGFpbmVyLnNldEl0ZW0ob3RoZXJTbG90LCBpdGVtKTtcbiAgICBpZiAob3RoZXJJdGVtKSB0aGlzLnNldEl0ZW0oc2xvdCwgb3RoZXJJdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYSBzbG90IGluIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBzbG90IHRvIGNsZWFyLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU2xvdChzbG90OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIHNsb3QgdG8gbnVsbC5cbiAgICB0aGlzLnN0b3JhZ2Vbc2xvdF0gPSBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgZW1wdHkgc2xvdHMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICB0aGlzLmVtcHR5U2xvdHNDb3VudCA9IHRoaXMuY2FsY3VsYXRlRW1wdHlTbG90Q291bnQoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIsIGlmIHNvLCByZXR1cm4uXG4gICAgaWYgKHRoaXMub2NjdXBhbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBJbnZlbnRvcnlTbG90UGFja2V0LlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBJbnZlbnRvcnlTbG90UGFja2V0KCk7XG5cbiAgICAvLyBTZXQgcHJvcGVydGllcyBvZiB0aGUgcGFja2V0LlxuICAgIHBhY2tldC5jb250YWluZXJJZCA9IHRoaXMuaWRlbnRpZmllcjtcbiAgICBwYWNrZXQuc2xvdCA9IHNsb3Q7XG4gICAgcGFja2V0Lml0ZW0gPSBuZXcgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IoMCk7XG4gICAgcGFja2V0LmZ1bGxDb250YWluZXJOYW1lID0gbmV3IEZ1bGxDb250YWluZXJOYW1lKDAsIDApO1xuICAgIHBhY2tldC5zdG9yYWdlSXRlbSA9IG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcigwKTsgLy8gQnVuZGxlcyA/XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIG9jY3VwYW50cy5cbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLm9jY3VwYW50cykgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHNsb3RzIGluIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgYWxsIHNsb3RzIGluIHRoZSBjb250YWluZXIuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7IGkrKykgdGhpcy5jbGVhclNsb3QoaSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUocGxheWVyPzogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQoKTtcblxuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGFja2V0LlxuICAgIHBhY2tldC5jb250YWluZXJJZCA9IHRoaXMuaWRlbnRpZmllcjtcbiAgICBwYWNrZXQuZnVsbENvbnRhaW5lck5hbWUgPSBuZXcgRnVsbENvbnRhaW5lck5hbWUoMCwgMCk7XG4gICAgcGFja2V0LnN0b3JhZ2VJdGVtID0gbmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yKDApOyAvLyBCdW5kbGVzID9cblxuICAgIC8vIE1hcCB0aGUgaXRlbXMgaW4gdGhlIHN0b3JhZ2UgdG8gbmV0d29yayBpdGVtIHN0YWNrIGRlc2NyaXB0b3JzLlxuICAgIHBhY2tldC5pdGVtcyA9IHRoaXMuc3RvcmFnZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIC8vIElmIHRoZSBpdGVtIGlzIG51bGwsIHJldHVybiBhIG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvci5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBzbG90IGlzIGVtcHR5LlxuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gbmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yKDApO1xuXG4gICAgICAvLyBDb252ZXJ0IHRoZSBpdGVtIHN0YWNrIHRvIGEgbmV0d29yayBpdGVtIHN0YWNrIGRlc2NyaXB0b3JcbiAgICAgIHJldHVybiBJdGVtU3RhY2sudG9OZXR3b3JrU3RhY2soaXRlbSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIHByb3ZpZGVkLlxuICAgIGlmIChwbGF5ZXIpIHtcbiAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyLlxuICAgICAgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBvY2N1cGFudHMuXG4gICAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLm9jY3VwYW50cykgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdGhlIGNvbnRhaW5lciB0byBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRvIHNob3cgdGhlIGNvbnRhaW5lciB0by5cbiAgICovXG4gIHB1YmxpYyBzaG93KHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IHZpZXdpbmcgYSBjb250YWluZXIuXG4gICAgLy8gSWYgc28sIGNsb3NlIHRoZSBjb250YWluZXIuXG4gICAgaWYgKHBsYXllci5vcGVuZWRDb250YWluZXIpIHBsYXllci5vcGVuZWRDb250YWluZXIuY2xvc2UocGxheWVyKTtcblxuICAgIC8vIEFkZCB0aGUgcGxheWVyIHRvIHRoZSBvY2N1cGFudHMuXG4gICAgdGhpcy5vY2N1cGFudHMuYWRkKHBsYXllcik7XG5cbiAgICAvLyBTZXQgdGhlIG9wZW5lZCBjb250YWluZXIgb2YgdGhlIHBsYXllci5cbiAgICBwbGF5ZXIub3BlbmVkQ29udGFpbmVyID0gdGhpcztcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc3RvcmFnZSwgYW5kIGNhbGwgdGhlIG9uQ29udGFpbmVyT3BlbiBtZXRob2Qgb2YgdGhlIGl0ZW0uXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc3RvcmFnZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgbnVsbC5cbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdHJhaXRzIG9mIHRoZSBpdGVtIGFuZCBjYWxsIHRoZSBvbkNvbnRhaW5lck9wZW4gbWV0aG9kLlxuICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBpdGVtLnRyYWl0cy52YWx1ZXMoKSkgdHJhaXQub25Db250YWluZXJPcGVuPy4ocGxheWVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNvbnRhaW5lciBmb3IgYSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0byBjbG9zZSB0aGUgY29udGFpbmVyIGZvci5cbiAgICovXG4gIHB1YmxpYyBjbG9zZShwbGF5ZXI6IFBsYXllcik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgbm90IHZpZXdpbmcgdGhlIGNvbnRhaW5lci5cbiAgICBpZiAoIXRoaXMub2NjdXBhbnRzLmhhcyhwbGF5ZXIpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxheWVyIGlzIG5vdCB2aWV3aW5nIHRoZSBjb250YWluZXIuXCIpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IENvbnRhaW5lckNsb3NlUGFja2V0LlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBDb250YWluZXJDbG9zZVBhY2tldCgpO1xuICAgIHBhY2tldC5pZGVudGlmaWVyID0gdGhpcy5pZGVudGlmaWVyO1xuICAgIHBhY2tldC50eXBlID0gQ29udGFpbmVyVHlwZS5Ob25lO1xuICAgIHBhY2tldC5zZXJ2ZXJJbml0aWF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyLlxuICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAvLyBTZXQgdGhlIG9wZW5lZCBjb250YWluZXIgb2YgdGhlIHBsYXllciB0byBudWxsLlxuICAgIHBsYXllci5vcGVuZWRDb250YWluZXIgPSBudWxsO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbGF5ZXIgZnJvbSB0aGUgb2NjdXBhbnRzLlxuICAgIHRoaXMub2NjdXBhbnRzLmRlbGV0ZShwbGF5ZXIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzdG9yYWdlLCBhbmQgY2FsbCB0aGUgb25Db250YWluZXJDbG9zZSBtZXRob2Qgb2YgdGhlIGl0ZW0uXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuc3RvcmFnZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgbnVsbC5cbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdHJhaXRzIG9mIHRoZSBpdGVtIGFuZCBjYWxsIHRoZSBvbkNvbnRhaW5lckNsb3NlIG1ldGhvZC5cbiAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgaXRlbS50cmFpdHMudmFsdWVzKCkpXG4gICAgICAgIHRyYWl0Lm9uQ29udGFpbmVyQ2xvc2U/LihwbGF5ZXIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBDb250YWluZXIgfTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJhaXRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYWxldHRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ibG9ja1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udGFpbmVyXCI7XG5cbmltcG9ydCAqIGFzIFRyYWl0cyBmcm9tIFwiLi90cmFpdHNcIjtcblxuLyoqXG4gKiBBIGxpc3Qgb2YgYWxsIGJsb2NrIHRyYWl0c1xuICovXG5jb25zdCBCbG9ja1RyYWl0cyA9IEFycmF5PHR5cGVvZiBUcmFpdHMuQmxvY2tUcmFpdD4oKTtcblxuLy8gSXRlcmF0ZSBvdmVyIGVhY2ggdHJhaXRcbmZvciAoY29uc3Qga2V5IGluIFRyYWl0cykge1xuICAvLyBHZXQgdGhlIGJsb2NrIHRyYWl0XG4gIGNvbnN0IHRyYWl0ID0gVHJhaXRzW2tleSBhcyBrZXlvZiB0eXBlb2YgVHJhaXRzXTtcblxuICAvLyBQdXNoIHRoZSBibG9jayB0cmFpdCB0byB0aGUgbGlzdFxuICBCbG9ja1RyYWl0cy5wdXNoKHRyYWl0KTtcbn1cblxuZXhwb3J0IHsgQmxvY2tUcmFpdHMgfTtcbiIsICJpbXBvcnQgeyBJdGVtcywgSXRlbVR5cGVQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJdGVtVG9vbFRpZXIsIEl0ZW1Ub29sVHlwZSB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4uLy4uL2Jsb2NrXCI7XG5cbmNvbnN0IERlZmF1bHRJdGVtVHlwZVByb3BlcnRpZXM6IEl0ZW1UeXBlUHJvcGVydGllcyA9IHtcbiAgc3RhY2thYmxlOiB0cnVlLFxuICBtYXhBbW91bnQ6IDY0LFxuICB0b29sOiBJdGVtVG9vbFR5cGUuTm9uZSxcbiAgdGllcjogSXRlbVRvb2xUaWVyLk5vbmUsXG4gIHRhZ3M6IFtdLFxuICBibG9jazogbnVsbFxufTtcblxuaW1wb3J0IHR5cGUge1xuICBJdGVtRGF0YSxcbiAgTmV0d29ya0l0ZW1JbnN0YW5jZURlc2NyaXB0b3Jcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmNsYXNzIEl0ZW1UeXBlPFQgZXh0ZW5kcyBrZXlvZiBJdGVtcyA9IGtleW9mIEl0ZW1zPiB7XG4gIC8qKlxuICAgKiBBIGNvbGxlY3RpdmUgcmVnaXN0cnkgb2YgYWxsIGl0ZW0gdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gbmV3IE1hcDxzdHJpbmcsIEl0ZW1UeXBlPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFQ7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIG9mIHRoZSBpdGVtIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpdGVtIHR5cGUgaXMgc3RhY2thYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWNrYWJsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc3RhY2sgc2l6ZSBvZiB0aGUgaXRlbSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heEFtb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbCB0eXBlIG9mIHRoZSBpdGVtIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbDogSXRlbVRvb2xUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbCB0aWVyIG9mIHRoZSBpdGVtIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGllcjogSXRlbVRvb2xUaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFncyBvZiB0aGUgaXRlbSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3M6IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBibG9jayBvZiB0aGUgaXRlbSB0eXBlLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrOiBJdGVtc1tUXTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIG5ldHdvcmsgVGhlIG5ldHdvcmsgb2YgdGhlIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIGl0ZW0gdHlwZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBULFxuICAgIG5ldHdvcms6IG51bWJlcixcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxJdGVtVHlwZVByb3BlcnRpZXM+XG4gICkge1xuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy5uZXR3b3JrID0gbmV0d29yaztcblxuICAgIGNvbnN0IHByb3BzID0geyAuLi5EZWZhdWx0SXRlbVR5cGVQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICB0aGlzLnN0YWNrYWJsZSA9IHByb3BzLnN0YWNrYWJsZTtcbiAgICB0aGlzLm1heEFtb3VudCA9IHByb3BzLm1heEFtb3VudDtcbiAgICB0aGlzLnRvb2wgPSBwcm9wcy50b29sO1xuICAgIHRoaXMudGllciA9IHByb3BzLnRpZXI7XG4gICAgdGhpcy50YWdzID0gcHJvcHMudGFncztcbiAgICB0aGlzLmJsb2NrID0gcHJvcHMuYmxvY2sgYXMgSXRlbXNbVF07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoZSBpdGVtIHR5cGUgaXMgYSB0b29sLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBpdGVtIHR5cGUgaXMgYSB0b29sLlxuICAgKi9cbiAgcHVibGljIGlzVG9vbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b29sICE9PSBJdGVtVG9vbFR5cGUuTm9uZSAmJiB0aGlzLnRpZXIgIT09IEl0ZW1Ub29sVGllci5Ob25lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaXRlbSB0eXBlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQ8VCBleHRlbmRzIGtleW9mIEl0ZW1zPihpZGVudGlmaWVyOiBUKTogSXRlbVR5cGU8VD4gfCBudWxsIHtcbiAgICByZXR1cm4gSXRlbVR5cGUudHlwZXMuZ2V0KGlkZW50aWZpZXIpIGFzIEl0ZW1UeXBlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaXRlbSB0eXBlIGZyb20gdGhlIG5ldHdvcmsuXG4gICAqIEBwYXJhbSBuZXR3b3JrIFRoZSBuZXR3b3JrIHRvIGdldCB0aGUgaXRlbSB0eXBlIGZyb20uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEJ5TmV0d29yayhuZXR3b3JrOiBudW1iZXIpOiBJdGVtVHlwZSB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICBbLi4uSXRlbVR5cGUudHlwZXMudmFsdWVzKCldLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmV0d29yayA9PT0gbmV0d29yaykgPz9cbiAgICAgIG51bGxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgaXRlbSB0eXBlcyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWxsKCk6IEFycmF5PEl0ZW1UeXBlPiB7XG4gICAgcmV0dXJuIFsuLi5JdGVtVHlwZS50eXBlcy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgaXRlbSB0eXBlIGZyb20gdGhlIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBibG9jayB0eXBlIHRvIHJlc29sdmUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc29sdmUodHlwZTogQmxvY2tUeXBlKTogSXRlbVR5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgWy4uLkl0ZW1UeXBlLnR5cGVzLnZhbHVlcygpXS5maW5kKChpdGVtKSA9PiBpdGVtLmJsb2NrID09PSB0eXBlKSA/PyBudWxsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBpdGVtIHR5cGUgdG8gaXRlbSBkYXRhLCB0aGlzIGlzIHVzZWQgZm9yIHRoZSBwcm90b2NvbC5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGl0ZW0gdHlwZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0b0l0ZW1EYXRhKHR5cGU6IEl0ZW1UeXBlKTogSXRlbURhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0eXBlLmlkZW50aWZpZXIsXG4gICAgICBuZXR3b3JrSWQ6IHR5cGUubmV0d29yayxcbiAgICAgIGNvbXBvbmVudEJhc2VkOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvTmV0d29ya0luc3RhbmNlKFxuICAgIHR5cGU6IEl0ZW1UeXBlLFxuICAgIHN0YWNrU2l6ZTogbnVtYmVyID0gMVxuICApOiBOZXR3b3JrSXRlbUluc3RhbmNlRGVzY3JpcHRvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldHdvcms6IHR5cGUubmV0d29yayxcbiAgICAgIG1ldGFkYXRhOiAwLFxuICAgICAgbmV0d29ya0Jsb2NrSWQ6IHR5cGUuYmxvY2s/LmdldFBlcm11dGF0aW9uKCkubmV0d29yayA/PyAwLFxuICAgICAgc3RhY2tTaXplLFxuICAgICAgZXh0cmFzOiB7XG4gICAgICAgIGNhbkRlc3Ryb3k6IFtdLFxuICAgICAgICBjYW5QbGFjZU9uOiBbXSxcbiAgICAgICAgbmJ0OiBudWxsXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgeyBJdGVtVHlwZSB9O1xuIiwgImltcG9ydCB7IENvbXBvdW5kVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuXG5pbXBvcnQgdHlwZSB7IEl0ZW1UeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG5jbGFzcyBDcmVhdGl2ZUl0ZW0ge1xuICAvKipcbiAgICogQSBjb2xsZWN0aXZlIG1hcCBvZiBjcmVhdGl2ZSBpdGVtcyByZWdpc3RlcmVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpdGVtcyA9IG5ldyBNYXA8bnVtYmVyLCBDcmVhdGl2ZUl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBjcmVhdGl2ZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEl0ZW1UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgb2YgdGhlIGNyZWF0aXZlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIE5CVCBvZiB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYnQ6IENvbXBvdW5kVGFnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY3JlYXRpdmUgaXRlbS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGNyZWF0aXZlIGl0ZW0uXG4gICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWV0YWRhdGEgb2YgdGhlIGNyZWF0aXZlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogSXRlbVR5cGUsIG1ldGFkYXRhOiBudW1iZXIsIG5idD86IENvbXBvdW5kVGFnKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgdGhpcy5uYnQgPSBuYnQgPz8gbmV3IENvbXBvdW5kVGFnKFwiXCIsIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5ldyBjcmVhdGl2ZSBpdGVtLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIodHlwZTogSXRlbVR5cGUsIG1ldGFkYXRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGluZGV4IGZvciB0aGUgaXRlbS5cbiAgICBjb25zdCBpbmRleCA9IENyZWF0aXZlSXRlbS5pdGVtcy5zaXplO1xuXG4gICAgLy8gU2V0IHRoZSBpdGVtIGluIHRoZSByZWdpc3RyeS5cbiAgICBDcmVhdGl2ZUl0ZW0uaXRlbXMuc2V0KGluZGV4LCBuZXcgQ3JlYXRpdmVJdGVtKHR5cGUsIG1ldGFkYXRhKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ3JlYXRpdmVJdGVtIH07XG4iLCAiaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1UeXBlUHJvcGVydGllcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ3JlYXRpdmVJdGVtIH0gZnJvbSBcIi4uLy4uXCI7XG5cbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG5jbGFzcyBDdXN0b21JdGVtVHlwZSBleHRlbmRzIEl0ZW1UeXBlIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBuZXR3b3JrSWQgPSAyMDAwMDsgLy8gU3RhcnQgYXQgMjAwMDAgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdmFuaWxsYSBpdGVtIHR5cGVzLlxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgaXRlbSB0eXBlIGlzIGN1c3RvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b20gPSB0cnVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8SXRlbVR5cGVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICBzdXBlcihpZGVudGlmaWVyIGFzIEl0ZW1JZGVudGlmaWVyLCArK0N1c3RvbUl0ZW1UeXBlLm5ldHdvcmtJZCwgcHJvcGVydGllcyk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB0aGUgY3JlYXRpdmUgaW52ZW50b3J5LlxuICAgIENyZWF0aXZlSXRlbS5yZWdpc3Rlcih0aGlzLCAwKTtcbiAgfVxufVxuXG5leHBvcnQgeyBDdXN0b21JdGVtVHlwZSB9O1xuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZEFyZ3VtZW50UG9pbnRlciB9IGZyb20gXCIuLi9leGVjdXRpb24tc3RhdGVcIjtcblxuY2xhc3MgRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZW51bXMgPSBuZXcgTWFwPHN0cmluZywgRW51bT4oKTtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IG51bWJlcjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN5bWJvbDogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdCA9IG5ldyBFbnVtKCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudW0gdmFsdWUgaXMgb3B0aW9uYWwuXG4gICAqL1xuICBwdWJsaWMgb3B0aW9uYWwgPSB0cnVlO1xuXG4gIHB1YmxpYyByZXN1bHQ6IHVua25vd247XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKC4uLl9hcmd1bWVudHM6IEFycmF5PHVua25vd24+KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZW51bSB2YWx1ZSBpcyBhcHBsaWNhYmxlLlxuICAgKiBAcGFyYW0gZXJyb3IgV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgYXBwbGljYWJsZS5cbiAgICogQHJldHVybnMgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudW0gdmFsdWUgaXMgYXBwbGljYWJsZSwgb3IgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGUoX2Vycm9yID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IuXG4gICAgaWYgKF9lcnJvcikgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdmFsdWUgYWZ0ZXIgcHJldmlvdXMgYXJndW1lbnQuXCIpO1xuXG4gICAgLy8gUmV0dXJuIGZhbHNlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgKiBAcGFyYW0gcG9pbnRlciBUaGUgcG9pbnRlciB0byByZWFkIGZyb20uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4dHJhY3QoX3BvaW50ZXI6IENvbW1hbmRBcmd1bWVudFBvaW50ZXIpOiBFbnVtIHwgbnVsbCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRW51bS5leHRyYWN0KCkgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlwiKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnVtIH07XG4iLCAiaW1wb3J0IHsgRW51bSB9IGZyb20gXCIuLi9lbnVtXCI7XG5cbmNsYXNzIFZhbGlkRW51bSBleHRlbmRzIEVudW0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAweDEwO1xufVxuXG5leHBvcnQgeyBWYWxpZEVudW0gfTtcbiIsICJpbXBvcnQgeyBWYWxpZEVudW0gfSBmcm9tIFwiLi92YWxpZFwiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRBcmd1bWVudFBvaW50ZXIgfSBmcm9tIFwiLi4vLi4vZXhlY3V0aW9uLXN0YXRlXCI7XG5cbmNsYXNzIFN0cmluZ0VudW0gZXh0ZW5kcyBWYWxpZEVudW0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInN0cmluZ1wiO1xuXG4gIC8qKlxuICAgKiBUaGUgc3ltYm9sIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBzeW1ib2wgPSAodGhpcy50eXBlIDw8IDE2KSB8IDB4Mzg7XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudW0gaXMgc3RyaWN0IHRvIGl0cyBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdHJpY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogc3RyaW5nIHwgbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocmVzdWx0OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShfZXJyb3I/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKHRoaXMucmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IuXG4gICAgICBpZiAoX2Vycm9yKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgYWZ0ZXIgcHJldmlvdXMgYXJndW1lbnQuJyk7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChwb2ludGVyOiBDb21tYW5kQXJndW1lbnRQb2ludGVyKTogU3RyaW5nRW51bSB8IG51bGwge1xuICAgIC8vIFBlZWsgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBsZXQgcGVlayA9IHBvaW50ZXIucGVlaygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBlZWsgdmFsdWUgaXMgbnVsbC5cbiAgICBpZiAoIXBlZWspIHJldHVybiBuZXcgU3RyaW5nRW51bShudWxsKTtcblxuICAgIC8vIFJlYWQgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBwZWVrID0gcG9pbnRlci5uZXh0KCkgYXMgc3RyaW5nO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIG51bWJlciBvciBhIGZsb2F0LlxuICAgIGlmICgrcGVlayA+PSAwIHx8ICtwZWVrIDw9IDApIHJldHVybiBuZXcgU3RyaW5nRW51bShudWxsKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLlxuICAgIGlmIChwZWVrID09PSBcInRydWVcIiB8fCBwZWVrID09PSBcImZhbHNlXCIpIHJldHVybiBuZXcgU3RyaW5nRW51bShudWxsKTtcblxuICAgIC8vIFJldHVybiB0aGUgdmFsdWUgYXMgYSBzdHJpbmdcbiAgICByZXR1cm4gbmV3IFN0cmluZ0VudW0ocGVlayk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyaW5nRW51bSB9O1xuIiwgImltcG9ydCB7IFZhbGlkRW51bSB9IGZyb20gXCIuL3ZhbGlkXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZEFyZ3VtZW50UG9pbnRlciB9IGZyb20gXCIuLi8uLi9leGVjdXRpb24tc3RhdGVcIjtcblxuY2xhc3MgSW50ZWdlckVudW0gZXh0ZW5kcyBWYWxpZEVudW0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImludGVnZXJcIjtcblxuICAvKipcbiAgICogVGhlIHN5bWJvbCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ltYm9sID0gKHRoaXMudHlwZSA8PCAxNikgfCAweDAxO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogbnVtYmVyIHwgbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocmVzdWx0OiBudW1iZXIgfCBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShfZXJyb3I/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKHRoaXMucmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IuXG4gICAgICBpZiAoX2Vycm9yKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0eXBlIFwiaW50ZWdlclwiIGFmdGVyIHByZXZpb3VzIGFyZ3VtZW50LicpO1xuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3QocG9pbnRlcjogQ29tbWFuZEFyZ3VtZW50UG9pbnRlcik6IEludGVnZXJFbnVtIHwgbnVsbCB7XG4gICAgLy8gUGVlayB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIGxldCBwZWVrID0gcG9pbnRlci5wZWVrKCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGVlayB2YWx1ZSBpcyBudWxsLlxuICAgIGlmICghcGVlaykgcmV0dXJuIG5ldyBJbnRlZ2VyRW51bShudWxsKTtcblxuICAgIC8vIFJlYWQgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBwZWVrID0gcG9pbnRlci5uZXh0KCkgYXMgc3RyaW5nO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4uXG4gICAgaWYgKHBlZWsgPT09IFwidHJ1ZVwiKVxuICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyRW51bSgxKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLlxuICAgIGlmIChwZWVrID09PSBcImZhbHNlXCIpXG4gICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFzIGFuIGludGVnZXIuXG4gICAgICByZXR1cm4gbmV3IEludGVnZXJFbnVtKDApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIG51bWJlciBvciBhIGZsb2F0LlxuICAgIGlmICgrcGVlayA+PSAwIHx8ICtwZWVrIDw9IDApIHJldHVybiBuZXcgSW50ZWdlckVudW0oKyhwZWVrIGFzIHN0cmluZykpO1xuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBhIG51bWJlci5cbiAgICByZXR1cm4gbmV3IEludGVnZXJFbnVtKG51bGwpO1xuICB9XG59XG5cbmV4cG9ydCB7IEludGVnZXJFbnVtIH07XG4iLCAiaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlOYW1lVGFnVHJhaXQsIFBsYXllciB9IGZyb20gXCIuLi8uLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgVmFsaWRFbnVtIH0gZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vLi4vLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgQ29tbWFuZEFyZ3VtZW50UG9pbnRlciB9IGZyb20gXCIuLi8uLi9leGVjdXRpb24tc3RhdGVcIjtcblxuY2xhc3MgVGFyZ2V0RW51bSBleHRlbmRzIFZhbGlkRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwidGFyZ2V0XCI7XG5cbiAgLyoqXG4gICAqIFRoZSBzeW1ib2wgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN5bWJvbCA9ICh0aGlzLnR5cGUgPDwgMTYpIHwgMHgwYTtcblxuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN1bHQ6IEFycmF5PEVudGl0eT4gfCBudWxsO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihyZXN1bHQ6IEFycmF5PEVudGl0eT4gfCBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShlcnJvciA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbnVsbC5cbiAgICBpZiAoZXJyb3IgJiYgIXRoaXMucmVzdWx0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzdWx0IGlzIG51bGwuXG4gICAgaWYgKCF0aGlzLnJlc3VsdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBhbiBhcnJheS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChwb2ludGVyOiBDb21tYW5kQXJndW1lbnRQb2ludGVyKTogVGFyZ2V0RW51bSB8IG51bGwge1xuICAgIC8vIFBlZWsgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBjb25zdCB0YXJnZXQgPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIG51bGwuXG4gICAgaWYgKCF0YXJnZXQpIHJldHVybiBuZXcgVGFyZ2V0RW51bShudWxsKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgY2FuIGJlIGEgbnVtYmVyIG9yIGEgZmxvYXQuXG4gICAgaWYgKCt0YXJnZXQgPj0gMCB8fCArdGFyZ2V0IDw9IDApIHJldHVybiBuZXcgVGFyZ2V0RW51bShudWxsKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgY2FuIGJlIGEgYm9vbGVhbi5cbiAgICBpZiAodGFyZ2V0ID09PSBcInRydWVcIiB8fCB0YXJnZXQgPT09IFwiZmFsc2VcIikgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKG51bGwpO1xuXG4gICAgLy8gR2V0IHRoZSBvcmlnaW4gb2YgdGhlIGNvbW1hbmQuXG4gICAgY29uc3Qgb3JpZ2luID1cbiAgICAgIHBvaW50ZXIuc3RhdGUub3JpZ2luIGluc3RhbmNlb2YgRW50aXR5XG4gICAgICAgID8gcG9pbnRlci5zdGF0ZS5vcmlnaW4uZGltZW5zaW9uXG4gICAgICAgIDogKHBvaW50ZXIuc3RhdGUub3JpZ2luIGFzIERpbWVuc2lvbik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGEgcGxheWVyIG9yIHN0YXJ0cyB3aXRoIEAuXG4gICAgaWYgKFxuICAgICAgIXRhcmdldC5zdGFydHNXaXRoKFwiQFwiKSAmJlxuICAgICAgIW9yaWdpbi5nZXRQbGF5ZXJzKCkuc29tZSgoeCkgPT4geC51c2VybmFtZSA9PT0gdGFyZ2V0KVxuICAgIClcbiAgICAgIHJldHVybiBuZXcgVGFyZ2V0RW51bShudWxsKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgc3RhcnRzIHdpdGggQC5cbiAgICAvLyBUaGlzIG1lYW5zIHdlIGFyZSBxdWVyeWluZyBmb3IgYSB0YXJnZXQuXG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgLy8gR2V0IHRoZSBxdWVyeSBzeW1ib2wuIChlLmcuIGEsIGUsIHAsIHIsIHMpXG4gICAgICBjb25zdCBzeW1ib2wgPSB0YXJnZXQuc2xpY2UoMSlbMF07XG4gICAgICBjb25zdCBxdWVyeSA9IHRhcmdldC5zbGljZSgyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIHZhbGlkLlxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDAgJiYgKCFxdWVyeS5zdGFydHNXaXRoKFwiW1wiKSB8fCAhcXVlcnkuZW5kc1dpdGgoXCJdXCIpKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBxdWVyeS5cIik7IC8vIFRPRE86IG1vcmUgc3BlY2lmaWMgZXJyb3JcblxuICAgICAgLy8gUGFyc2UgdGhlIHF1ZXJ5LlxuICAgICAgY29uc3QgcXVlcmllcyA9XG4gICAgICAgIHF1ZXJ5Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHF1ZXJ5XG4gICAgICAgICAgICAgIC5zbGljZSgxLCAtMSlcbiAgICAgICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgICAuZmxhdE1hcCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGRhdGEuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleSwgdmFsdWUgfTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3ltYm9sIGlzIGEgdmFsaWQgcXVlcnkuXG4gICAgICBzd2l0Y2ggKHN5bWJvbCkge1xuICAgICAgICAvLyBHZXQgYWxsIHBsYXllcnMuXG4gICAgICAgIGNhc2UgXCJhXCI6IHtcbiAgICAgICAgICBjb25zdCBwbGF5ZXJzID0gb3JpZ2luLmdldFBsYXllcnMoKS5maWx0ZXIoKHBsYXllcikgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBxdWVyaWVzLlxuICAgICAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgcXVlcmllcykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgbmFtZSBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgcXVlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHZhbHVlIGFzIHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIG5lZ2F0ZWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBuZWdhdGUgPSBuYW1lLnN0YXJ0c1dpdGgoXCIhXCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgbmFtZSA9IG5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgbmFtZSBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbmVnYXRlID8gcGxheWVyLnVzZXJuYW1lID09PSBuYW1lIDogcGxheWVyLnVzZXJuYW1lICE9PSBuYW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgdGFnIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGNhc2UgXCJ0YWdcIjoge1xuICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0YWcgcXVlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgdGFnID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgbmVnYXRlZC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0ZSA9IHRhZy5zdGFydHNXaXRoKFwiIVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUpIHRhZyA9IHRhZy5zbGljZSgxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIHRhZy5cbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUgPyBwbGF5ZXIuaGFzVGFnKHRhZykgOiAhcGxheWVyLmhhc1RhZyh0YWcpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHF1ZXJ5IGtleSBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKHBsYXllcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFsbCBlbnRpdGllcy5cbiAgICAgICAgY2FzZSBcImVcIjoge1xuICAgICAgICAgIC8vIEZpbHRlciBlbnRpdGllcyBieSBxdWVyeS5cbiAgICAgICAgICBjb25zdCBlbnRpdGllcyA9IG9yaWdpbi5nZXRFbnRpdGllcygpLmZpbHRlcigoZW50aXR5KSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHF1ZXJpZXMuXG4gICAgICAgICAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBxdWVyaWVzKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBuYW1lIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGNhc2UgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHkuaGFzVHJhaXQoRW50aXR5TmFtZVRhZ1RyYWl0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgZnJvbSB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0ZSA9IG5hbWUuc3RhcnRzV2l0aChcIiFcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUpIG5hbWUgPSBuYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmFtZXRhZyB0cmFpdC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5TmFtZVRhZ1RyYWl0KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbmFtZXRhZyBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0cmFpdC5nZXROYW1lVGFnKCkgPT09IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHJhaXQuZ2V0TmFtZVRhZygpICE9PSBuYW1lXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IHR5cGUgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgY2FzZSBcInR5cGVcIjoge1xuICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0eXBlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB2YWx1ZSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBxdWVyeSBpcyBuZWdhdGVkLlxuICAgICAgICAgICAgICAgICAgY29uc3QgbmVnYXRlID0gdHlwZS5zdGFydHNXaXRoKFwiIVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUpIHR5cGUgPSB0eXBlLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgZW50aXR5IHR5cGUuXG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSB0eXBlLmluY2x1ZGVzKFwiOlwiKVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogYG1pbmVjcmFmdDoke3ZhbHVlfWA7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgdHlwZSBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbmVnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgPyBlbnRpdHkudHlwZS5pZGVudGlmaWVyID09PSBwYXJzZWRcbiAgICAgICAgICAgICAgICAgICAgICA6IGVudGl0eS50eXBlLmlkZW50aWZpZXIgIT09IHBhcnNlZFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IHRhZyBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICBjYXNlIFwidGFnXCI6IHtcbiAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdGFnIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAgbGV0IHRhZyA9IHZhbHVlIGFzIHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIG5lZ2F0ZWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBuZWdhdGUgPSB0YWcuc3RhcnRzV2l0aChcIiFcIik7XG4gICAgICAgICAgICAgICAgICBpZiAobmVnYXRlKSB0YWcgPSB0YWcuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSB0YWcuXG4gICAgICAgICAgICAgICAgICBpZiAobmVnYXRlID8gZW50aXR5Lmhhc1RhZyh0YWcpIDogIWVudGl0eS5oYXNUYWcodGFnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBxdWVyeSBrZXkgXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBuZXcgVGFyZ2V0RW51bShlbnRpdGllcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIG5lYXJlc3QgcGxheWVyLlxuICAgICAgICBjYXNlIFwicFwiOiB7XG4gICAgICAgICAgaWYgKHBvaW50ZXIuc3RhdGUub3JpZ2luIGluc3RhbmNlb2YgUGxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhcmdldEVudW0oW3BvaW50ZXIuc3RhdGUub3JpZ2luXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIFwiTmVhcmVzdCBwbGF5ZXIgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGEgcmFuZG9tIHBsYXllci5cbiAgICAgICAgY2FzZSBcInJcIjoge1xuICAgICAgICAgIC8vIEdldCBhbGwgcGxheWVycyB0aGF0IG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgICAgICBjb25zdCBwbGF5ZXJzID0gb3JpZ2luLmdldFBsYXllcnMoKS5maWx0ZXIoKHBsYXllcikgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBxdWVyaWVzLlxuICAgICAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgcXVlcmllcykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgbmFtZSBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgcXVlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHZhbHVlIGFzIHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIG5lZ2F0ZWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBuZWdhdGUgPSBuYW1lLnN0YXJ0c1dpdGgoXCIhXCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgbmFtZSA9IG5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgbmFtZSBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbmVnYXRlID8gcGxheWVyLnVzZXJuYW1lID09PSBuYW1lIDogcGxheWVyLnVzZXJuYW1lICE9PSBuYW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgdGFnIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGNhc2UgXCJ0YWdcIjoge1xuICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0YWcgcXVlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgdGFnID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgbmVnYXRlZC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0ZSA9IHRhZy5zdGFydHNXaXRoKFwiIVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUpIHRhZyA9IHRhZy5zbGljZSgxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIHRhZy5cbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUgPyBwbGF5ZXIuaGFzVGFnKHRhZykgOiAhcGxheWVyLmhhc1RhZyh0YWcpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHF1ZXJ5IGtleSBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gR2V0IGEgcmFuZG9tIHBsYXllciBmcm9tIHRoZSBsaXN0LlxuICAgICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllcnNbXG4gICAgICAgICAgICBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwbGF5ZXJzLmxlbmd0aClcbiAgICAgICAgICBdIGFzIFBsYXllcjtcblxuICAgICAgICAgIC8vIFJldHVybiB0aGUgcmFuZG9tIHBsYXllci5cbiAgICAgICAgICByZXR1cm4gbmV3IFRhcmdldEVudW0oW3BsYXllcl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgcGxheWVyLlxuICAgICAgICBjYXNlIFwic1wiOiB7XG4gICAgICAgICAgaWYgKHBvaW50ZXIuc3RhdGUub3JpZ2luIGluc3RhbmNlb2YgRW50aXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhcmdldEVudW0oW3BvaW50ZXIuc3RhdGUub3JpZ2luXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIFwiU291cmNlIHBsYXllciBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmlsdGVyIHBsYXllcnMgYnkgdXNlcm5hbWUuXG4gICAgICBjb25zdCBwbGF5ZXJzID0gb3JpZ2luXG4gICAgICAgIC5nZXRQbGF5ZXJzKClcbiAgICAgICAgLmZpbHRlcigocGxheWVyKSA9PiBwbGF5ZXIudXNlcm5hbWUgPT09IHRhcmdldCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgd2FzIGZvdW5kLlxuICAgICAgaWYgKHBsYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGxheWVyIFwiJHt0YXJnZXR9XCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaW1lbnNpb24uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gdGhlIHBsYXllci5cbiAgICAgIHJldHVybiBuZXcgVGFyZ2V0RW51bShwbGF5ZXJzKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiBubyB0YXJnZXQgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKG51bGwpO1xuICB9XG59XG5cbmV4cG9ydCB7IFRhcmdldEVudW0gfTtcbiIsICJpbXBvcnQgeyBWZWN0b3IzZiB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBDb21tYW5kQXJndW1lbnRQb2ludGVyIH0gZnJvbSBcIi4uLy4uL2V4ZWN1dGlvbi1zdGF0ZVwiO1xuXG5pbXBvcnQgeyBWYWxpZEVudW0gfSBmcm9tIFwiLlwiO1xuXG5jbGFzcyBQb3NpdGlvbkVudW0gZXh0ZW5kcyBWYWxpZEVudW0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5hbWUgPSBcInBvc2l0aW9uXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBzeW1ib2wgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN5bWJvbCA9ICh0aGlzLnR5cGUgPDwgMTYpIHwgMHg0MDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzdWx0OiBWZWN0b3IzZiB8IG51bGw7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlc3VsdDogVmVjdG9yM2YgfCBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShlcnJvcj86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzdWx0IGlzIGEgdmFsaWQgb3B0aW9uLlxuICAgIGlmICghdGhpcy5yZXN1bHQgJiYgZXJyb3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVeHBlY3RlZCBpbnB1dCB0byBiZSBmb3JtYXR0ZWQgYXMgYSBwb3NpdGlvbi5cIik7XG5cbiAgICBpZiAoIXRoaXMucmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChwb2ludGVyOiBDb21tYW5kQXJndW1lbnRQb2ludGVyKTogUG9zaXRpb25FbnVtIHwgbnVsbCB7XG4gICAgLy8gUGVlayB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIGNvbnN0IHggPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgeCB2YWx1ZSBpcyBudWxsLlxuICAgIGlmICgheCkgcmV0dXJuIG5ldyBQb3NpdGlvbkVudW0obnVsbCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgeCB2YWx1ZSBpcyBudW1iZXIgb3Igc3RhcnRzIHdpdGggfi5cbiAgICAvLyBJZiBpdCBpcyBub3QsIHJldHVybiBudWxsLlxuICAgIGlmIChOdW1iZXIuaXNOYU4oK3gpICYmICF4LnN0YXJ0c1dpdGgoXCJ+XCIpKSByZXR1cm4gbmV3IFBvc2l0aW9uRW51bShudWxsKTtcblxuICAgIC8vIFBlZWsgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBjb25zdCB5ID0gcG9pbnRlci5uZXh0KCkgYXMgc3RyaW5nO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHkgdmFsdWUgaXMgbnVsbC5cbiAgICBpZiAoIXkpIHJldHVybiBuZXcgUG9zaXRpb25FbnVtKG51bGwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHkgdmFsdWUgaXMgbnVtYmVyIG9yIHN0YXJ0cyB3aXRoIH4uXG4gICAgLy8gSWYgaXQgaXMgbm90LCByZXR1cm4gbnVsbC5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKCt5KSAmJiAheS5zdGFydHNXaXRoKFwiflwiKSkgcmV0dXJuIG5ldyBQb3NpdGlvbkVudW0obnVsbCk7XG5cbiAgICAvLyBQZWVrIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgY29uc3QgeiA9IHBvaW50ZXIubmV4dCgpIGFzIHN0cmluZztcblxuICAgIC8vIENoZWNrIGlmIHRoZSB6IHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKCF6KSByZXR1cm4gbmV3IFBvc2l0aW9uRW51bShudWxsKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB6IHZhbHVlIGlzIG51bWJlciBvciBzdGFydHMgd2l0aCB+LlxuICAgIC8vIElmIGl0IGlzIG5vdCwgcmV0dXJuIG51bGwuXG4gICAgaWYgKE51bWJlci5pc05hTigreikgJiYgIXouc3RhcnRzV2l0aChcIn5cIikpIHJldHVybiBuZXcgUG9zaXRpb25FbnVtKG51bGwpO1xuXG4gICAgLy8gR2V0IHRoZSBzdGVwcyBmb3IgZWFjaCBkaXJlY3Rpb24uXG4gICAgY29uc3QgeHN0ZXBzID0geC5zdGFydHNXaXRoKFwiflwiKSA/ICt4LnNsaWNlKDEpIDogMDtcbiAgICBjb25zdCB5c3RlcHMgPSB5LnN0YXJ0c1dpdGgoXCJ+XCIpID8gK3kuc2xpY2UoMSkgOiAwO1xuICAgIGNvbnN0IHpzdGVwcyA9IHouc3RhcnRzV2l0aChcIn5cIikgPyArei5zbGljZSgxKSA6IDA7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgb3JpZ2luIGlzIGFuIGVudGl0eSBvciBhIGRpbWVuc2lvbi5cbiAgICBpZiAocG9pbnRlci5zdGF0ZS5vcmlnaW4gaW5zdGFuY2VvZiBFbnRpdHkpIHtcbiAgICAgIC8vIEdldCB0aGUgZW50aXR5IGZyb20gdGhlIHBvaW50ZXIuXG4gICAgICBjb25zdCBlbnRpdHkgPSBwb2ludGVyLnN0YXRlLm9yaWdpbjtcblxuICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZW50aXR5IGFuZCBjcmVhdGUgYSBuZXcgcG9zaXRpb24gd2l0aCB0aGUgc3RlcHMuXG4gICAgICBjb25zdCB7IHg6IGV4LCB5OiBleSwgejogZXogfSA9IGVudGl0eS5wb3NpdGlvbjtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBvc2l0aW9uIHdpdGggdGhlIHN0ZXBzLlxuICAgICAgY29uc3QgbnggPSB4ID09PSBcIn5cIiA/IGV4IDogeC5zdGFydHNXaXRoKFwiflwiKSA/IGV4ICsgeHN0ZXBzIDogK3g7XG4gICAgICBjb25zdCBueSA9IHkgPT09IFwiflwiID8gZXkgOiB5LnN0YXJ0c1dpdGgoXCJ+XCIpID8gZXkgKyB5c3RlcHMgOiAreTtcbiAgICAgIGNvbnN0IG56ID0geiA9PT0gXCJ+XCIgPyBleiA6IHouc3RhcnRzV2l0aChcIn5cIikgPyBleiArIHpzdGVwcyA6ICt6O1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcG9zaXRpb24uXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzZihueCwgbnksIG56KTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgcG9zaXRpb24gZW51bS5cbiAgICAgIHJldHVybiBuZXcgUG9zaXRpb25FbnVtKHBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBvc2l0aW9uIHdpdGggdGhlIHN0ZXBzLlxuICAgICAgY29uc3QgbnggPSB4ID09PSBcIn5cIiA/IDAgOiB4LnN0YXJ0c1dpdGgoXCJ+XCIpID8geHN0ZXBzIDogK3g7XG4gICAgICBjb25zdCBueSA9IHkgPT09IFwiflwiID8gMCA6IHkuc3RhcnRzV2l0aChcIn5cIikgPyB5c3RlcHMgOiAreTtcbiAgICAgIGNvbnN0IG56ID0geiA9PT0gXCJ+XCIgPyAwIDogei5zdGFydHNXaXRoKFwiflwiKSA/IHpzdGVwcyA6ICt6O1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcG9zaXRpb24uXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzZihueCwgbnksIG56KTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgcG9zaXRpb24gZW51bS5cbiAgICAgIHJldHVybiBuZXcgUG9zaXRpb25FbnVtKHBvc2l0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUG9zaXRpb25FbnVtIH07XG4iLCAiaW1wb3J0IHsgRW51bSB9IGZyb20gXCIuLi9lbnVtXCI7XG5cbmNsYXNzIFNvZnRFbnVtIGV4dGVuZHMgRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9IDB4NF8xMDtcbn1cblxuZXhwb3J0IHsgU29mdEVudW0gfTtcbiIsICJpbXBvcnQgeyBTb2Z0RW51bSB9IGZyb20gXCIuL3NvZnRcIjtcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kQXJndW1lbnRQb2ludGVyIH0gZnJvbSBcIi4uLy4uL2V4ZWN1dGlvbi1zdGF0ZVwiO1xuXG5jbGFzcyBDdXN0b21FbnVtIGV4dGVuZHMgU29mdEVudW0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN5bWJvbCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ltYm9sID0gKHRoaXMudHlwZSA8PCAxNikgfCAweDM4O1xuXG4gIC8qKlxuICAgKiBUaGUgb3B0aW9ucyBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnVtIGlzIHN0cmljdCB0byBpdHMgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaWN0OiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwZWN0ZWQgb3B0aW9ucyBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBlbnVtLlxuICAgKiBAcGFyYW0gcmVzdWx0IFRoZSByZXN1bHQgb2YgdGhlIGVudW0uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBleHBlY3RlZCBvcHRpb25zIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlc3VsdDogc3RyaW5nIHwgbnVsbCwgb3B0aW9uczogQXJyYXk8c3RyaW5nPikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIHJlc3VsdCBpcyBhIHZhbGlkIG9wdGlvbi5cbiAgICogQHBhcmFtIGVycm9yIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJlc3VsdCBpcyBub3QgYSB2YWxpZCBvcHRpb24uXG4gICAqIEByZXR1cm5zIFJldHVybnMgYHRydWVgIGlmIHRoZSByZXN1bHQgaXMgYSB2YWxpZCBvcHRpb24sIG9yIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGVycm9yID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgJiYgdGhpcy5yZXN1bHQgPT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgb25lIG9mIFwiJHt0aGlzLm9wdGlvbnMuam9pbihcIiwgXCIpfVwiIGFmdGVyIHByZXZpb3VzIGFyZ3VtZW50LmBcbiAgICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzdWx0IGlzIG51bGwuXG4gICAgaWYgKHRoaXMucmVzdWx0ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzdWx0IGlzIGEgdmFsaWQgb3B0aW9uLlxuICAgIGlmICghdGhpcy5vcHRpb25zLmluY2x1ZGVzKHRoaXMucmVzdWx0KSAmJiBlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkIG9uZSBvZiBcIiR7dGhpcy5vcHRpb25zLmpvaW4oXCIsIFwiKX1cIiBhZnRlciBwcmV2aW91cyBhcmd1bWVudC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSByZXN1bHQgaXMgYSB2YWxpZCBvcHRpb24uXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmNsdWRlcyh0aGlzLnJlc3VsdCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3QocG9pbnRlcjogQ29tbWFuZEFyZ3VtZW50UG9pbnRlcik6IEN1c3RvbUVudW0gfCBudWxsIHtcbiAgICAvLyBQZWVrIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgbGV0IHBlZWsgPSBwb2ludGVyLnBlZWsoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwZWVrIHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKCFwZWVrKSByZXR1cm4gbmV3IHRoaXMobnVsbCwgdGhpcy5vcHRpb25zKTtcblxuICAgIC8vIFJlYWQgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBwZWVrID0gcG9pbnRlci5uZXh0KCkgYXMgc3RyaW5nO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIG51bWJlciBvciBhIGZsb2F0LlxuICAgIGlmICgrcGVlayA+PSAwIHx8ICtwZWVrIDw9IDApIHJldHVybiBuZXcgdGhpcyhudWxsLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4uXG4gICAgaWYgKHBlZWsgPT09IFwidHJ1ZVwiIHx8IHBlZWsgPT09IFwiZmFsc2VcIilcbiAgICAgIHJldHVybiBuZXcgdGhpcyhudWxsLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgIHJldHVybiBuZXcgdGhpcyhwZWVrLCB0aGlzLm9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7IEN1c3RvbUVudW0gfTtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIi4vY3VzdG9tXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZEFyZ3VtZW50UG9pbnRlciB9IGZyb20gXCIuLi8uLi9leGVjdXRpb24tc3RhdGVcIjtcblxuY2xhc3MgQm9vbGVhbkVudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJib29sZWFuXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zID0gW1widHJ1ZVwiLCBcImZhbHNlXCJdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnVtIGlzIHN0cmljdCB0byBpdHMgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaWN0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN1bHQ6IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGJvb2xlYW4gZW51bS5cbiAgICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0IG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlc3VsdDogYm9vbGVhbiB8IG51bGwpIHtcbiAgICBzdXBlcihyZXN1bHQ/LnRvU3RyaW5nKCkgPz8gXCJmYWxzZVwiLCBCb29sZWFuRW51bS5vcHRpb25zKTtcbiAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGVudW0gdmFsdWUgaXMgYXBwbGljYWJsZS5cbiAgICogQHBhcmFtIGVycm9yIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGVudW0gdmFsdWUgaXMgbm90IGFwcGxpY2FibGUuXG4gICAqIEByZXR1cm5zIFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnVtIHZhbHVlIGlzIGFwcGxpY2FibGUsIG9yIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGVycm9yPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgZWl0aGVyIHRydWUgb3IgZmFsc2UuXG4gICAgaWYgKHRoaXMucmVzdWx0ID09PSB0cnVlIHx8IHRoaXMucmVzdWx0ID09PSBmYWxzZSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhIHZhbGlkIGJvb2xlYW4uXG4gICAgaWYgKGVycm9yKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgb25lIG9mOiAke0Jvb2xlYW5FbnVtLm9wdGlvbnMuam9pbihcIiwgXCIpfWApO1xuXG4gICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSByZXN1bHQgaXMgbm90IGEgdmFsaWQgYm9vbGVhbi5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3QocG9pbnRlcjogQ29tbWFuZEFyZ3VtZW50UG9pbnRlcik6IEJvb2xlYW5FbnVtIHwgbnVsbCB7XG4gICAgLy8gUGVlayB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIGxldCBwZWVrID0gcG9pbnRlci5wZWVrKCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGVlayB2YWx1ZSBpcyBudWxsLlxuICAgIGlmICghcGVlaykgcmV0dXJuIG5ldyBCb29sZWFuRW51bShudWxsKTtcblxuICAgIC8vIFJlYWQgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlclxuICAgIHBlZWsgPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbi5cbiAgICBpZiAocGVlayA9PT0gXCJ0cnVlXCIpXG4gICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi5cbiAgICAgIHJldHVybiBuZXcgQm9vbGVhbkVudW0odHJ1ZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbi5cbiAgICBpZiAocGVlayA9PT0gXCJmYWxzZVwiKVxuICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uXG4gICAgICByZXR1cm4gbmV3IEJvb2xlYW5FbnVtKGZhbHNlKTtcblxuICAgIC8vIFJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBib29sZWFuLlxuICAgIHJldHVybiBuZXcgQm9vbGVhbkVudW0obnVsbCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQm9vbGVhbkVudW0gfTtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIi4vY3VzdG9tXCI7XG5cbmNsYXNzIEdhbWVtb2RlRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImdhbWVtb2RlXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9ucyA9IFtcbiAgICBcInNcIixcbiAgICBcImNcIixcbiAgICBcImFcIixcbiAgICBcInNwXCIsXG4gICAgXCJzdXJ2aXZhbFwiLFxuICAgIFwiY3JlYXRpdmVcIixcbiAgICBcImFkdmVudHVyZVwiLFxuICAgIFwic3BlY3RhdG9yXCJcbiAgXTtcbn1cblxuZXhwb3J0IHsgR2FtZW1vZGVFbnVtIH07XG4iLCAiaW1wb3J0IHsgQWJpbGl0eUluZGV4IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLlwiO1xuXG5jb25zdCBpZGVudGlmaWVycyA9IE9iamVjdC52YWx1ZXMoQWJpbGl0eUluZGV4KS5maWx0ZXIoXG4gIChpZCkgPT4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiXG4pIGFzIEFycmF5PHN0cmluZz47XG5cbmNsYXNzIEFiaWxpdHlFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbmFtZSA9IFwiYWJpbGl0eVwiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnMgPSBpZGVudGlmaWVycztcbn1cblxuZXhwb3J0IHsgQWJpbGl0eUVudW0gfTtcbiIsICJpbXBvcnQgeyBCbG9ja1R5cGUgfSBmcm9tIFwiLi4vLi4vLi4vYmxvY2tcIjtcblxuaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IGlkZW50aWZpZXJzID0gQmxvY2tUeXBlLmdldEFsbCgpLm1hcCgoYmxvY2spID0+XG4gIGJsb2NrLmlkZW50aWZpZXIuc3RhcnRzV2l0aChcIm1pbmVjcmFmdDpcIilcbiAgICA/IGJsb2NrLmlkZW50aWZpZXIuc2xpY2UoMTApXG4gICAgOiBibG9jay5pZGVudGlmaWVyXG4pO1xuXG5jbGFzcyBCbG9ja0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJibG9ja3NcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zID0gaWRlbnRpZmllcnM7XG59XG5cbmV4cG9ydCB7IEJsb2NrRW51bSB9O1xuIiwgImltcG9ydCB7IEVudGl0eVR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLlwiO1xuXG5jb25zdCBpZGVudGlmaWVycyA9IEVudGl0eVR5cGUuZ2V0QWxsKCkubWFwKChlbnRpdHkpID0+XG4gIGVudGl0eS5pZGVudGlmaWVyLnN0YXJ0c1dpdGgoXCJtaW5lY3JhZnQ6XCIpXG4gICAgPyBlbnRpdHkuaWRlbnRpZmllci5zbGljZSgxMClcbiAgICA6IGVudGl0eS5pZGVudGlmaWVyXG4pO1xuXG5jbGFzcyBFbnRpdHlFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZW50aXRpZXNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zID0gaWRlbnRpZmllcnM7XG59XG5cbmV4cG9ydCB7IEVudGl0eUVudW0gfTtcbiIsICJpbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gXCIuLi8uLi8uLi9pdGVtXCI7XG5cbmltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLlwiO1xuXG5jb25zdCBpZGVudGlmaWVycyA9IEl0ZW1UeXBlLmdldEFsbCgpLm1hcCgoaXRlbSkgPT5cbiAgaXRlbS5pZGVudGlmaWVyLnN0YXJ0c1dpdGgoXCJtaW5lY3JhZnQ6XCIpXG4gICAgPyBpdGVtLmlkZW50aWZpZXIuc2xpY2UoMTApXG4gICAgOiBpdGVtLmlkZW50aWZpZXJcbik7XG5cbmNsYXNzIEl0ZW1FbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiaXRlbXNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zID0gaWRlbnRpZmllcnM7XG59XG5cbmV4cG9ydCB7IEl0ZW1FbnVtIH07XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCIuXCI7XG5cbmNsYXNzIFRhZ0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJ0YWdfb3BlcmF0aW9uXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9ucyA9IFtcImFkZFwiLCBcInJlbW92ZVwiLCBcImxpc3RcIl07XG59XG5cbmV4cG9ydCB7IFRhZ0VudW0gfTtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIi5cIjtcblxuY2xhc3MgV29ybGRFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwid29ybGRzXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5leHBvcnQgeyBXb3JsZEVudW0gfTtcbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmRSZWdpc3RyeSB9IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRDYWxsYmFjayB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jbGFzcyBDb21tYW5kPFQgPSB1bmtub3duPiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0cnkgb2YgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVnaXN0cnk6IENvbW1hbmRSZWdpc3RyeTtcblxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbGxiYWNrOiBDb21tYW5kQ2FsbGJhY2s8VD47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2YgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgcmVnaXN0cnk6IENvbW1hbmRSZWdpc3RyeSxcbiAgICBjYWxsYmFjazogQ29tbWFuZENhbGxiYWNrPFQ+XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29tbWFuZCB9O1xuIiwgImltcG9ydCB7IEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBDb21tYW5kUmVnaXN0cnkgfSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgU29mdEVudW0gfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kQ2FsbGJhY2ssXG4gIENvbW1hbmRDb250ZXh0LFxuICBDb21tYW5kUmVnaXN0cnlDYWxsYmFja1xufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY2xhc3MgQ29tbWFuZHMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmRzIG9mIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kcyA9IG5ldyBNYXA8c3RyaW5nLCBDb21tYW5kPigpO1xuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgY29tbWFuZHMgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcmV0dXJucyBBbGwgdGhlIGNvbW1hbmRzIGluIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGwoKTogQXJyYXk8Q29tbWFuZD4ge1xuICAgIHJldHVybiBbLi4udGhpcy5jb21tYW5kcy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvbW1hbmQgYnkgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCBvciB1bmRlZmluZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZyk6IENvbW1hbmQgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIGEgc2xhc2guXG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc2xhc2ggZnJvbSB0aGUgbmFtZS5cbiAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbmFtZS5cbiAgICBuYW1lID0gbmFtZS5zcGxpdChcIiBcIilbMF0gYXMgc3RyaW5nO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb21tYW5kIGJ5IHRoZSBuYW1lLlxuICAgIHJldHVybiB0aGlzLmNvbW1hbmRzLmdldChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgY29tbWFuZCBpbiB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCB0aGF0IHdhcyByZWdpc3RlcmVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPEsgPSBOb25OdWxsYWJsZTx1bmtub3duPiwgVCA9IENvbW1hbmRDb250ZXh0PEs+PihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBjYWxsYmFjazogQ29tbWFuZENhbGxiYWNrPFQ+XG4gICk6IENvbW1hbmQ8VD47XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBjb21tYW5kIGluIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gcmVnaXN0cnkgVGhlIHJlZ2lzdHJ5IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCB0aGF0IHdhcyByZWdpc3RlcmVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPEsgPSBOb25OdWxsYWJsZTx1bmtub3duPiwgVCA9IENvbW1hbmRDb250ZXh0PEs+PihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICByZWdpc3RyeTogQ29tbWFuZFJlZ2lzdHJ5Q2FsbGJhY2ssXG4gICAgY2FsbGJhY2s6IENvbW1hbmRDYWxsYmFjazxUPlxuICApOiBDb21tYW5kPFQ+O1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgY29tbWFuZCBpbiB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gcmVnaXN0cnkgVGhlIHJlZ2lzdHJ5IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCB0aGF0IHdhcyByZWdpc3RlcmVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyPEsgPSBOb25OdWxsYWJsZTx1bmtub3duPiwgVCA9IENvbW1hbmRDb250ZXh0PEs+PihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICByZWdpc3RyeTogQ29tbWFuZFJlZ2lzdHJ5Q2FsbGJhY2sgfCBDb21tYW5kQ2FsbGJhY2s8VD4sXG4gICAgY2FsbGJhY2s/OiBDb21tYW5kQ2FsbGJhY2s8VD5cbiAgKTogQ29tbWFuZDxUPiB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHJlZ2lzdHJ5IGluc3RhbmNlXG4gICAgY29uc3QgcmVnSW5zdGFuY2UgPSBuZXcgQ29tbWFuZFJlZ2lzdHJ5KCk7XG5cbiAgICAvLyBHZXQgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGFyZ3VtZW50c1xuICAgIGNvbnN0IGV4ZWNDYWxsYmFjayA9IGNhbGxiYWNrID8/IChyZWdpc3RyeSBhcyBDb21tYW5kQ2FsbGJhY2s8VD4pO1xuXG4gICAgY29uc3QgcmVnQ2FsbGJhY2sgPSBjYWxsYmFja1xuICAgICAgPyAocmVnaXN0cnkgYXMgQ29tbWFuZFJlZ2lzdHJ5Q2FsbGJhY2spXG4gICAgICA6ICgpID0+IHt9O1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgcmVnaXN0cnkgY2FsbGJhY2tcbiAgICByZWdDYWxsYmFjayhyZWdJbnN0YW5jZSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29tbWFuZCBpbnN0YW5jZVxuICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZDxUPihcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHJlZ0luc3RhbmNlLFxuICAgICAgZXhlY0NhbGxiYWNrXG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgY29tbWFuZCBpbiB0aGUgY29tbWFuZHMgbWFwXG4gICAgdGhpcy5jb21tYW5kcy5zZXQobmFtZSwgY29tbWFuZCBhcyBDb21tYW5kPHVua25vd24+KTtcblxuICAgIC8vIFJldHVybiB0aGUgY29tbWFuZFxuICAgIHJldHVybiBjb21tYW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY29tbWFuZCBmcm9tIHRoZSByZWdpc3RyeSBieSBpdHMgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0byBiZSB1bnJlZ2lzdGVyZWQuXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBJZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcmVnaXN0cnksIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZSgpOiBBdmFpbGFibGVDb21tYW5kc1BhY2tldCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGF2YWlsYWJsZSBjb21tYW5kcyBwYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQoKTtcblxuICAgIC8vIEhvbGRzIGFsbCBjdXN0b20gZW51bXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWFuZHNcbiAgICBwYWNrZXQuZHluYW1pY0VudW1zID0gW107XG5cbiAgICAvLyBNYXAgdGhlIGNvbW1hbmRzIHRvIHRoZSBwYWNrZXQgcHJvcGVydHlcbiAgICBwYWNrZXQuY29tbWFuZHMgPSB0aGlzLmdldEFsbCgpLm1hcCgoY29tbWFuZCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY29tbWFuZC5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogY29tbWFuZC5kZXNjcmlwdGlvbixcbiAgICAgICAgcGVybWlzc2lvbkxldmVsOiBjb21tYW5kLnJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCxcbiAgICAgICAgc3ViY29tbWFuZHM6IFtdLFxuICAgICAgICBmbGFnczogY29tbWFuZC5yZWdpc3RyeS5kZWJ1ZyA/IDEgOiAwLFxuICAgICAgICBhbGlhczogLTEsXG4gICAgICAgIG92ZXJsb2FkczogWy4uLmNvbW1hbmQucmVnaXN0cnkub3ZlcmxvYWRzLmtleXMoKV0ubWFwKChvdmVybG9hZCkgPT4ge1xuICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUga2V5cyBvZiB0aGUgb3ZlcmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBhcmFtZXRlcnMuXG4gICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKG92ZXJsb2FkKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyIGNvbnN0cnVjdG9yIGJ5IGNoZWNraW5nIGlmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheS5cbiAgICAgICAgICAgIGNvbnN0IGVubSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgICBjb25zdCBzeW1ib2wgPVxuICAgICAgICAgICAgICBlbm0udHlwZSA9PT0gU29mdEVudW0udHlwZVxuICAgICAgICAgICAgICAgID8gKGVubSBhcyB0eXBlb2YgQ3VzdG9tRW51bSkub3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICA/ICgweDRfMTAgPDwgMTYpIHxcbiAgICAgICAgICAgICAgICAgICAgKHBhY2tldC5keW5hbWljRW51bXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW5tLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAoZW5tIGFzIHR5cGVvZiBDdXN0b21FbnVtKS5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIH0pIC1cbiAgICAgICAgICAgICAgICAgICAgICAxKVxuICAgICAgICAgICAgICAgICAgOiBlbm0uc3ltYm9sXG4gICAgICAgICAgICAgICAgOiBlbm0uc3ltYm9sO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLlxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzFdIDogZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVlc3Rpb24gbWFyayB0byB0aGUgbmFtZSBpZiB0aGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLlxuICAgICAgICAgICAgbmFtZSA9IG9wdGlvbmFsID8gbmFtZSArIFwiP1wiIDogbmFtZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3ltYm9sLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgICAgb3B0aW9uczogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFpbmluZzogZmFsc2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHJlbWFpbmluZyBwcm9wZXJ0aWVzIHRvIHRoZSBwYWNrZXRcbiAgICBwYWNrZXQuY2hhaW5lZFN1YmNvbW1hbmRWYWx1ZXMgPSBbXTtcbiAgICBwYWNrZXQuc3ViY29tbWFuZHMgPSBbXTtcbiAgICBwYWNrZXQuZW51bUNvbnN0cmFpbnRzID0gW107XG4gICAgcGFja2V0LmVudW1WYWx1ZXMgPSBbXTtcbiAgICBwYWNrZXQuZW51bXMgPSBbXTtcbiAgICBwYWNrZXQucG9zdEZpeGVzID0gW107XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBhY2tldFxuICAgIHJldHVybiBwYWNrZXQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29tbWFuZHMgfTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzICovXG5pbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tbWFuZEFyZ3VtZW50cyxcbiAgQ29tbWFuZENhbGxiYWNrLFxuICBDb21tYW5kT3ZlcmxvYWRcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNsYXNzIENvbW1hbmRSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgb3ZlcmxvYWRzIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG92ZXJsb2FkcyA9IG5ldyBNYXA8Q29tbWFuZE92ZXJsb2FkLCBDb21tYW5kQ2FsbGJhY2s+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB3aWxsIG1ha2UgdGhlIGNvbW1hbmQgYXBwZWFyIHdpdGggYSBgZGVidWdgIGZsYWcgaW4gdGhlIGF2YWlsYWJsZSBjb21tYW5kcyBsaXN0LlxuICAgKi9cbiAgcHVibGljIGRlYnVnID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9uIGxldmVsIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgcGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5Ob3JtYWw7XG5cbiAgLyoqXG4gICAqIE92ZXJsb2FkcyB0aGUgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvZiB0aGUgb3ZlcmxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcmxvYWQ8VCBleHRlbmRzIENvbW1hbmRPdmVybG9hZD4ob3B0aW9uczogVCk6IHRoaXM7XG5cbiAgLyoqXG4gICAqIE92ZXJsb2FkcyB0aGUgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zIGFuZCBjYWxsYmFjay5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIG92ZXJsb2FkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9mIHRoZSBvdmVybG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVybG9hZDxUIGV4dGVuZHMgQ29tbWFuZE92ZXJsb2FkPihcbiAgICBvcHRpb25zOiBULFxuICAgIGNhbGxiYWNrOiBDb21tYW5kQ2FsbGJhY2s8Q29tbWFuZEFyZ3VtZW50czxUPj5cbiAgKTogdGhpcztcblxuICAvKipcbiAgICogT3ZlcmxvYWRzIHRoZSBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMgYW5kIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvZiB0aGUgb3ZlcmxvYWQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2YgdGhlIG92ZXJsb2FkXG4gICAqL1xuICBwdWJsaWMgb3ZlcmxvYWQ8VCBleHRlbmRzIENvbW1hbmRPdmVybG9hZD4oXG4gICAgb3B0aW9uczogVCxcbiAgICBjYWxsYmFjaz86IENvbW1hbmRDYWxsYmFjazxDb21tYW5kQXJndW1lbnRzPFQ+PlxuICApOiB0aGlzIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMub3ZlcmxvYWRzLnNldChvcHRpb25zLCBjYWxsYmFjayBhcyBDb21tYW5kQ2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm92ZXJsb2Fkcy5zZXQob3B0aW9ucywgKCkgPT4ge30pO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcmVnaXN0cnkuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29tbWFuZFJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEVudW0gfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiLi9jb21tYW5kXCI7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRDb250ZXh0LCBDb21tYW5kUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudFBvaW50ZXIge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFyZ3VtZW50czogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIHN0YXRlIG9mIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZTogQ29tbWFuZEV4ZWN1dGlvblN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBhcmd1bWVudHMuXG4gICAqL1xuICBwdWJsaWMgb2Zmc2V0ID0gMDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kIGFyZ3VtZW50IHBvaW50ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgb2YgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzdGF0ZTogQ29tbWFuZEV4ZWN1dGlvblN0YXRlLCBhcmd1bWVudHNfOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuYXJndW1lbnRzID0gYXJndW1lbnRzXztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZWVrcyB0aGUgbmV4dCBhcmd1bWVudC5cbiAgICogQHJldHVybnMgVGhlIG5leHQgYXJndW1lbnQgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmd1bWVudHMuXG4gICAqL1xuICBwdWJsaWMgcGVlaygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hcmd1bWVudHNbdGhpcy5vZmZzZXRdIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmV4dCBhcmd1bWVudC5cbiAgICogQHJldHVybnMgVGhlIG5leHQgYXJndW1lbnQgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmd1bWVudHMuXG4gICAqL1xuICBwdWJsaWMgbmV4dCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hcmd1bWVudHNbdGhpcy5vZmZzZXQrK10gfHwgbnVsbDtcbiAgfVxufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uU3RhdGUge1xuICAvKipcbiAgICogVGhlIHNwbGl0IGFyZ3VtZW50cyBvZiB0aGUgY29tbWFuZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzcGxpdDogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbiBvZiB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luOiBEaW1lbnNpb24gfCBFbnRpdHk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGNvbW1hbmRzOiBBcnJheTxDb21tYW5kPixcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBvcmlnaW46IERpbWVuc2lvbiB8IEVudGl0eVxuICApIHtcbiAgICB0aGlzLnNwbGl0ID0gdGhpcy5wYXJzZShzb3VyY2UpO1xuXG4gICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZyb20gdGhlIHNwbGl0IGFycmF5LlxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnNwbGl0LnNoaWZ0KCk7XG5cbiAgICAvLyBGaW5kIHRoZSBjb21tYW5kIGZyb20gdGhlIGNvbW1hbmRzXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZHMuZmluZCgoY29tbWFuZCkgPT4gY29tbWFuZC5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLm9yaWdpbiA9IG9yaWdpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBleGVjdXRlIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGV4ZWN1dGUoKTogQ29tbWFuZFJlc3BvbnNlIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY29tbWFuZCBpcyB1bmRlZmluZWQuXG4gICAgLy8gSWYgaXQgaXMsIHdlIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgaWYgKCF0aGlzLmNvbW1hbmQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBVbmtub3duIGNvbW1hbmQgZXhlY3V0ZWQuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIGNvbW1hbmQgZXhpc3RzLCBhbmQgdGhhdCB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIHVzZSBpdC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGdsb2JhbCBjb250ZXh0IG9iamVjdCB3aXRoIHRoZSBvcmlnaW4uXG4gICAgY29uc3QgZ2xvYmFsQ29udGV4dCA9IHsgb3JpZ2luOiB0aGlzLm9yaWdpbiB9IGFzIENvbW1hbmRDb250ZXh0PFxuICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA+O1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBvdmVybG9hZHMgYW5kIGV4dHJhY3QgdGhlIGFyZ3VtZW50cy5cbiAgICBmb3IgKGNvbnN0IFtvdmVybG9hZCwgY2FsbGJhY2tdIG9mIHRoaXMuY29tbWFuZC5yZWdpc3RyeS5vdmVybG9hZHMpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb250ZXh0IG9iamVjdCB3aXRoIHRoZSBvcmlnaW4uXG4gICAgICBjb25zdCBjb250ZXh0ID0geyBvcmlnaW46IHRoaXMub3JpZ2luIH0gYXMgQ29tbWFuZENvbnRleHQ8XG4gICAgICAgIFJlY29yZDxzdHJpbmcsIEVudW0+XG4gICAgICA+O1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgc3RhdGUgb2JqZWN0IHdpdGggdGhlIHNwbGl0IGFycmF5LlxuICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgQ29tbWFuZEFyZ3VtZW50UG9pbnRlcih0aGlzLCB0aGlzLnNwbGl0KTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBvdmVybG9hZCBrZXlzIGFuZCBleHRyYWN0IHRoZSBhcmd1bWVudHMuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvdmVybG9hZCkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvdmVybG9hZFtrZXldO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCwgaWYgaXQgaXMgdGhlbiB3ZSB3aWxsIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG92ZXJsb2FkXG4gICAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSwgaWYgaXQgaXMgdGhlbiB3ZSB3aWxsIGNoZWNrIGlmIHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZC5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBlbnVtIGFuZCBvcHRpb25hbCBmbGFnIGZyb20gdGhlIHZhbHVlLlxuICAgICAgICAgIGNvbnN0IFt0eXBlLCBvcHRpb25hbF0gPSB2YWx1ZTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgaWYgdGhlcmUgYXJlIGFueSBhcmd1bWVudHMgbGVmdC5cbiAgICAgICAgICBpZiAoIW9wdGlvbmFsICYmIHN0YXRlLm9mZnNldCA+PSBzdGF0ZS5hcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBcmd1bWVudCAke2tleX0gaXMgcmVxdWlyZWQuYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgYXJndW1lbnQgZnJvbSB0aGUgc3BsaXQgYXJyYXkuXG4gICAgICAgICAgLy8gV2Ugd2lsbCBwYXNzIHRoZSBleGVjdXRpb24gc3RhdGUgdG8gdGhlIGV4dHJhY3QgbWV0aG9kLlxuICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGN1c3RvbXMgZW51bXMgdG8gZXh0cmFjdCB0aGUgYXJndW1lbnQgaW4gdmFyaW91cyB3YXlzLlxuICAgICAgICAgIGNvbnN0IHZhbHVlXyA9IHR5cGUuZXh0cmFjdChzdGF0ZSBhcyBDb21tYW5kQXJndW1lbnRQb2ludGVyKTtcblxuICAgICAgICAgIC8vIERlY2xhcmUgaWYgdGhlIHZhbHVlIGlzIG9wdGlvbmFsLlxuICAgICAgICAgIGlmICh2YWx1ZV8pIHZhbHVlXy5vcHRpb25hbCA9IG9wdGlvbmFsO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB2YWx1ZSB0byB0aGUgY29udGV4dCBvYmplY3QuXG4gICAgICAgICAgY29udGV4dFtrZXldID0gdmFsdWVfID8/IHR5cGUuZGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBhcmd1bWVudCBmcm9tIHRoZSBzcGxpdCBhcnJheS5cbiAgICAgICAgICAvLyBXZSB3aWxsIHBhc3MgdGhlIGV4ZWN1dGlvbiBzdGF0ZSB0byB0aGUgZXh0cmFjdCBtZXRob2QuXG4gICAgICAgICAgLy8gVGhpcyBhbGxvd3MgY3VzdG9tcyBlbnVtcyB0byBleHRyYWN0IHRoZSBhcmd1bWVudCBpbiB2YXJpb3VzIHdheXMuXG4gICAgICAgICAgY29uc3QgdmFsdWVfID0gdmFsdWUuZXh0cmFjdChzdGF0ZSBhcyBDb21tYW5kQXJndW1lbnRQb2ludGVyKTtcblxuICAgICAgICAgIC8vIERlY2xhcmUgdGhhdCB0aGUgZW51bSB2YWx1ZSBpcyBub3Qgb3B0aW9uYWwuXG4gICAgICAgICAgaWYgKHZhbHVlXykgdmFsdWVfLm9wdGlvbmFsID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHZhbHVlIHRvIHRoZSBjb250ZXh0IG9iamVjdC5cbiAgICAgICAgICBjb250ZXh0W2tleV0gPSB2YWx1ZV8gPz8gdmFsdWUuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdGhlIGNvbnRleHQgb2JqZWN0IHRvIHRoZSBnbG9iYWwgY29udGV4dCBvYmplY3QuXG4gICAgICBPYmplY3QuYXNzaWduKGdsb2JhbENvbnRleHQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGFyZ3VtZW50cyBsZWZ0IGluIHRoZSBzcGxpdCBhcnJheS5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSwgd2Ugd2lsbCBjb250aW51ZSB0byB0aGUgbmV4dCBvdmVybG9hZC5cbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPCBzdGF0ZS5hcmd1bWVudHMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0IG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgb3ZlcmxvYWQgb2JqZWN0LlxuICAgICAgLy8gV2UgbmVlZCB0byBhZGQgMSB0byBjb21wZW5zYXRlIGZvciB0aGUgb3JpZ2luIHByb3BlcnR5LlxuICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbnRleHQpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob3ZlcmxvYWQpLmxlbmd0aCArIDEpXG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGNvbnRleHQgb25qZWN0IGFuZCB0cnkgdG8gdmFsaWRhdGUgdGhlIGFyZ3VtZW50cy5cbiAgICAgIGZvciAoY29uc3QgW18sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb250ZXh0KSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRW51bS5cbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBFbnVtKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgdmFsdWUuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlLnJlc3VsdDtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzIG5vdCB2YWxpZC5cbiAgICAgICAgaWYgKHZhbHVlLm9wdGlvbmFsICYmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpKVxuICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSB2YWx1ZS5cbiAgICAgICAgdmFsdWUudmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FsbGJhY2suXG4gICAgICByZXR1cm4gY2FsbGJhY2soY29udGV4dCkgPz8ge307XG4gICAgfVxuXG4gICAgLy8gQ2FsbCB0aGUgZ2xvYmFsIGNhbGxiYWNrIHdpdGggdGhlIGdsb2JhbCBjb250ZXh0IG9iamVjdC5cbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLmNhbGxiYWNrKGdsb2JhbENvbnRleHQpID8/IHt9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlKHNvdXJjZTogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHJlZ2V4IG9iamVjdCB0byBtYXRjaFxuICAgIGNvbnN0IHJlZ2V4ID0gL1wiKFteXCJdKylcInwoXFxTKykvZztcbiAgICBjb25zdCBhcmd1bWVudHNfID0gW107XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHNvdXJjZSBzdHJpbmcgYW5kIGV4dHJhY3QgdGhlIGFyZ3VtZW50c1xuICAgIGxldCBtYXRjaCA9IG51bGw7XG4gICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoc291cmNlKSkpIHtcbiAgICAgIGFyZ3VtZW50c18ucHVzaChtYXRjaFsxXSB8fCBtYXRjaFsyXSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBhcmd1bWVudHMgYXJyYXkuXG4gICAgcmV0dXJuIGFyZ3VtZW50c18gYXMgQXJyYXk8c3RyaW5nPjtcbiAgfVxufVxuXG5leHBvcnQgeyBDb21tYW5kRXhlY3V0aW9uU3RhdGUgfTtcbiIsICJpbXBvcnQgeyBHYW1lbW9kZSwgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBHYW1lbW9kZUVudW0sIFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIGFib3V0IGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJnYW1lbW9kZVwiLFxuICAgIFwiU2V0cyBhIHBsYXllcidzIGdhbWVtb2RlXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBnYW1lbW9kZTogR2FtZW1vZGVFbnVtLFxuICAgICAgICAgIHRhcmdldDogW1RhcmdldEVudW0sIHRydWVdXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQudmFsaWRhdGUoKVxuICAgICAgICAgICAgPyBjb250ZXh0LnRhcmdldC5yZXN1bHRcbiAgICAgICAgICAgIDogW2NvbnRleHQub3JpZ2luIGluc3RhbmNlb2YgUGxheWVyID8gY29udGV4dC5vcmlnaW4gOiBudWxsXTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBubyB0YXJnZXRzXG4gICAgICAgICAgaWYgKCF0YXJnZXRzIHx8IHRhcmdldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGdhbWVtb2RlIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBnYW1lbW9kZSA9IGNvbnRleHQuZ2FtZW1vZGUucmVzdWx0IGFzIHN0cmluZztcblxuICAgICAgICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBob2xkIHRoZSBsb2cgbWVzc2FnZXNcbiAgICAgICAgICBjb25zdCBsb2dzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBub3QgYSBwbGF5ZXJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0IHx8ICEodGFyZ2V0IGluc3RhbmNlb2YgUGxheWVyKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZ2FtZW1vZGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInN1cnZpdmFsXCI6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZ2FtZW1vZGUgPSBHYW1lbW9kZS5TdXJ2aXZhbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJjcmVhdGl2ZVwiOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmdhbWVtb2RlID0gR2FtZW1vZGUuQ3JlYXRpdmU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiYWR2ZW50dXJlXCI6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZ2FtZW1vZGUgPSBHYW1lbW9kZS5BZHZlbnR1cmU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlIFwic3BcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNwZWN0YXRvclwiOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmdhbWVtb2RlID0gR2FtZW1vZGUuU3BlY3RhdG9yO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGdhbWVtb2RlIHNwZWNpZmllZCFcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBsb2cgbWVzc2FnZVxuICAgICAgICAgICAgbG9ncy5wdXNoKFxuICAgICAgICAgICAgICBgwqdhU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgwqcyJHt0YXJnZXQudXNlcm5hbWV9J3PCp2EgZ2FtZW1vZGUhwqdyYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGxvZ3Muam9pbihcIlxcblwiKSB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEFiaWxpdHlJbmRleCwgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBCb29sZWFuRW51bSwgVGFyZ2V0RW51bSwgQWJpbGl0eUVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICAvLyBSZWdpc3RlciB0aGUga2lsbCBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwiYWJpbGl0eVwiLFxuICAgIFwiVXBkYXRlIGFuIGFiaWxpdHkgZm9yIGEgc3BlY2lmaWVkIHBsYXllci5cIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICBhYmlsaXR5OiBBYmlsaXR5RW51bSxcbiAgICAgICAgICBlbmFibGVkOiBCb29sZWFuRW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gR2V0IGFiaWxpdHkgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29udGV4dC5hYmlsaXR5LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgY29uc3QgYWJpbGl0eSA9IEFiaWxpdHlJbmRleFtpbmRleCBhcyBrZXlvZiB0eXBlb2YgQWJpbGl0eUluZGV4XTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZW5hYmxlZCBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgZW5hYmxlZCA9IGNvbnRleHQuZW5hYmxlZC5yZXN1bHQgYXMgYm9vbGVhbjtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllclxuICAgICAgICAgICAgaWYgKCFlbnRpdHkuaXNQbGF5ZXIoKSkge1xuICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtZXNzYWdlIHRvIHRoZSBhcnJheVxuICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKnN0VudGl0eSDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzcgaXMgbm90IGEgcGxheWVyLmApO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgdGhlIGVudGl0eVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZW50aXR5XG4gICAgICAgICAgICBlbnRpdHkuYWJpbGl0aWVzLnNldChhYmlsaXR5LCBlbmFibGVkKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgYXJyYXlcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgYMKnN1VwZGF0ZWQgYWJpbGl0eSDCp2Eke2luZGV4fcKnNyB0byDCp2Mke2VuYWJsZWR9wqc3IGZvciDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSW50ZWdlckVudW0sIEl0ZW1FbnVtLCBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCwgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBjbGVhciBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwiY2xlYXJcIixcbiAgICBcIkNsZWFycyBpdGVtcyBmcm9tIHBsYXllciBpbnZlbnRvcnkuXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgaXRlbTogW0l0ZW1FbnVtLCB0cnVlXSxcbiAgICAgICAgICBtZXRhZGF0YTogW0ludGVnZXJFbnVtLCB0cnVlXSxcbiAgICAgICAgICBhbW91bnQ6IFtJbnRlZ2VyRW51bSwgdHJ1ZV1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBpdGVtLCBhbW91bnQsIGFuZCBtZXRhZGF0YVxuICAgICAgICAgIGNvbnN0IGl0ZW1SZXN1bHQgPSBjb250ZXh0Lml0ZW0/LnJlc3VsdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaXRlbUlkZW50aWZpZXIgPSBpdGVtUmVzdWx0XG4gICAgICAgICAgICA/IGAke2l0ZW1SZXN1bHQuaW5jbHVkZXMoXCI6XCIpID8gXCJcIiA6IFwibWluZWNyYWZ0OlwifSR7aXRlbVJlc3VsdH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBpdGVtTWV0YWRhdGEgPSBjb250ZXh0Lm1ldGFkYXRhPy5yZXN1bHQgPz8gMDtcbiAgICAgICAgICBjb25zdCBpdGVtQW1vdW50ID0gY29udGV4dC5hbW91bnQ/LnJlc3VsdDtcbiAgICAgICAgICBsZXQgaXRlbUNvdW50ID0gMDtcblxuICAgICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogXCJObyB0YXJnZXRzIG1hdGNoZWQgc2VsZWN0b3JcIiB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc1RyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGFyZ2V0LmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAgICAgaWYgKCFpdGVtUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBbc2xvdCwgaXRlbVN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhjb250YWluZXIuc3RvcmFnZSkpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFpdGVtU3RhY2sgfHxcbiAgICAgICAgICAgICAgICAoaXRlbVN0YWNrLnR5cGUuaWRlbnRpZmllciAhPT0gaXRlbUlkZW50aWZpZXIgJiZcbiAgICAgICAgICAgICAgICAgIGl0ZW1TdGFjay5hdXhpbGxhcnkgIT09IGl0ZW1NZXRhZGF0YSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBzdGFja0Ftb3VudCA9IGl0ZW1TdGFjay5hbW91bnQ7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHN0YWNrQW1vdW50IC0gKGl0ZW1BbW91bnQgPz8gMSk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuY2xlYXJTbG90KE51bWJlci5wYXJzZUludChzbG90KSk7XG4gICAgICAgICAgICAgICAgaXRlbUNvdW50ICs9IHN0YWNrQW1vdW50O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1TdGFjay5zZXRBbW91bnQoTWF0aC5tYXgocmVtYWluaW5nLCAwKSk7XG4gICAgICAgICAgICAgICAgaXRlbUNvdW50ICs9IE1hdGgubWluKGl0ZW1BbW91bnQgPz8gMSwgc3RhY2tBbW91bnQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGl0ZW1Db3VudCA+PSAoaXRlbUFtb3VudCA/PyAxKSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDbGVhcmVkIHRoZSBpbnZlbnRvcnkgb2YgJHt0YXJnZXRzLmxlbmd0aH0gZW50aXRpZXNgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsLCB0eXBlIFZlY3RvcjNmIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEJsb2NrRW51bSwgUG9zaXRpb25FbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJmaWxsXCIsXG4gICAgXCJGaWxsIGEgcmVnaW9uIHdpdGggYSBzcGVjaWZpYyBibG9ja1wiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBvdmVybG9hZCBmb3IgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogUG9zaXRpb25FbnVtLFxuICAgICAgICAgIHRvOiBQb3NpdGlvbkVudW0sXG4gICAgICAgICAgYmxvY2s6IEJsb2NrRW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBibG9jaywgcG9zaXRpb24sIGFuZCBtb2RlXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5ibG9jay5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSByZXN1bHQuaW5jbHVkZXMoXCI6XCIpXG4gICAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgICAgOiBgbWluZWNyYWZ0OiR7cmVzdWx0fWA7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGZyb20gcG9zaXRpb24gZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IGZyb20gPSBjb250ZXh0LmZyb20ucmVzdWx0Py5mbG9vcigpIGFzIFZlY3RvcjNmO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB0byBwb3NpdGlvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdG8gPSBjb250ZXh0LnRvLnJlc3VsdD8uZmxvb3IoKSBhcyBWZWN0b3IzZjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGJhc2VkIG9uIHRoZSBvcmlnaW5cbiAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPVxuICAgICAgICAgICAgY29udGV4dC5vcmlnaW4gaW5zdGFuY2VvZiBFbnRpdHlcbiAgICAgICAgICAgICAgPyBjb250ZXh0Lm9yaWdpbi5kaW1lbnNpb25cbiAgICAgICAgICAgICAgOiBjb250ZXh0Lm9yaWdpbjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZSBmcm9tIHRoZSBpZGVudGlmaWVyXG4gICAgICAgICAgY29uc3QgdHlwZSA9IHdvcmxkLmJsb2NrUGFsZXR0ZS5yZXNvbHZlVHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEZpbGwgdGhlIHJlZ2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYmxvY2tcbiAgICAgICAgICBkaW1lbnNpb24uZmlsbChmcm9tLCB0bywgdHlwZS5nZXRQZXJtdXRhdGlvbigpKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEludGVnZXJFbnVtLCBJdGVtRW51bSwgVGFyZ2V0RW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgRW50aXR5SW52ZW50b3J5VHJhaXQsIHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uLy4uL2l0ZW1cIjtcbmltcG9ydCB7IEl0ZW1JZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXRibG9jayBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwiZ2l2ZVwiLFxuICAgIFwiR2l2ZXMgYW4gaXRlbSB0byBhIHBsYXllclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBvdmVybG9hZCBmb3IgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0OiBUYXJnZXRFbnVtLFxuICAgICAgICAgIGl0ZW06IEl0ZW1FbnVtLFxuICAgICAgICAgIGFtb3VudDogW0ludGVnZXJFbnVtLCB0cnVlXSxcbiAgICAgICAgICBtZXRhZGF0YTogW0ludGVnZXJFbnVtLCB0cnVlXVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIGl0ZW0sIGFtb3VudCwgYW5kIG1ldGFkYXRhXG4gICAgICAgICAgY29uc3QgaXRlbVJlc3VsdCA9IGNvbnRleHQuaXRlbS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZGVudGlmaWVyID0gaXRlbVJlc3VsdC5pbmNsdWRlcyhcIjpcIilcbiAgICAgICAgICAgID8gaXRlbVJlc3VsdFxuICAgICAgICAgICAgOiBgbWluZWNyYWZ0OiR7aXRlbVJlc3VsdH1gO1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IGNvbnRleHQuYW1vdW50Py5yZXN1bHQgPz8gMTtcbiAgICAgICAgICBjb25zdCBhdXhpbGxhcnkgPSBjb250ZXh0Lm1ldGFkYXRhPy5yZXN1bHQgPz8gMDtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdGFyZ2V0c1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgYW4gZW50aXR5XG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc1BsYXllcigpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBpdGVtIHN0YWNrXG4gICAgICAgICAgICBjb25zdCBpdGVtU3RhY2sgPSBuZXcgSXRlbVN0YWNrKGl0ZW1JZGVudGlmaWVyIGFzIEl0ZW1JZGVudGlmaWVyLCB7XG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgICAgYXV4aWxsYXJ5LFxuICAgICAgICAgICAgICB3b3JsZDogdGFyZ2V0LmdldFdvcmxkKClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBsYXllcidzIGludmVudG9yeVxuICAgICAgICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRhcmdldC5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgaXRlbSB0byB0aGUgcGxheWVyJ3MgaW52ZW50b3J5XG4gICAgICAgICAgICBjb250YWluZXIuYWRkSXRlbShpdGVtU3RhY2spO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgU3VjY2Vzc2Z1bGx5IGdhdmUgeCR7YW1vdW50fSAke2l0ZW1JZGVudGlmaWVyfSB0byAke3RhcmdldHMubGVuZ3RofSBwbGF5ZXJzLmBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IERpc2Nvbm5lY3RSZWFzb24sIENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgU3RyaW5nRW51bSwgVGFyZ2V0RW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwia2lja1wiLFxuICAgIFwiS2lja3MgYSBwbGF5ZXIgZnJvbSB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgcmVhc29uOiBbU3RyaW5nRW51bSwgdHJ1ZV1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIEdldCB0aGUga2ljayByZWFzb24gZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGNvbnRleHQucmVhc29uPy5yZXN1bHQgPz8gXCJLaWNrZWQgYnkgYW4gb3BlcmF0b3IuXCI7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgbm8gdGFyZ2V0c1xuICAgICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldHMgbWF0Y2hlZCB0aGUgc2VsZWN0b3IuXCIpO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdGFyZ2V0c1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgbm90IGEgcGxheWVyXG4gICAgICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBQbGF5ZXIpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gS2ljayB0aGUgcGxheWVyXG4gICAgICAgICAgICB0YXJnZXQuZGlzY29ubmVjdChyZWFzb24sIERpc2Nvbm5lY3RSZWFzb24uS2lja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCwgdHlwZSBWZWN0b3IzZiB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBCbG9ja0VudW0sIFBvc2l0aW9uRW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXRibG9jayBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwic2V0YmxvY2tcIixcbiAgICBcIlNldHMgYSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBwb3NpdGlvbjogUG9zaXRpb25FbnVtLFxuICAgICAgICAgIGJsb2NrOiBCbG9ja0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgYmxvY2ssIHBvc2l0aW9uLCBhbmQgbW9kZVxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuYmxvY2sucmVzdWx0IGFzIHN0cmluZztcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcmVzdWx0LmluY2x1ZGVzKFwiOlwiKVxuICAgICAgICAgICAgPyByZXN1bHRcbiAgICAgICAgICAgIDogYG1pbmVjcmFmdDoke3Jlc3VsdH1gO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjb250ZXh0LnBvc2l0aW9uLnJlc3VsdD8uZmxvb3IoKSBhcyBWZWN0b3IzZjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGJhc2VkIG9uIHRoZSBvcmlnaW5cbiAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPVxuICAgICAgICAgICAgY29udGV4dC5vcmlnaW4gaW5zdGFuY2VvZiBFbnRpdHlcbiAgICAgICAgICAgICAgPyBjb250ZXh0Lm9yaWdpbi5kaW1lbnNpb25cbiAgICAgICAgICAgICAgOiBjb250ZXh0Lm9yaWdpbjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvblxuICAgICAgICAgIGNvbnN0IGJsb2NrID0gZGltZW5zaW9uLmdldEJsb2NrKHBvc2l0aW9uKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZSBmcm9tIHRoZSBpZGVudGlmaWVyXG4gICAgICAgICAgY29uc3QgdHlwZSA9IHdvcmxkLmJsb2NrUGFsZXR0ZS5yZXNvbHZlVHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvblxuICAgICAgICAgIGJsb2NrLnNldFR5cGUodHlwZSk7XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1lc3NhZ2VcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBzZXQgYmxvY2sgYXQgwqcyJHtwb3NpdGlvbi54fcKnYSwgwqcyJHtwb3NpdGlvbi55fcKnYSwgwqcyJHtwb3NpdGlvbi56fcKnYSB0byDCpzIke3R5cGUuaWRlbnRpZmllcn3Cp2EuwqdyYFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBTdHJpbmdFbnVtLCBUYWdFbnVtLCBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIGtpbGwgY29tbWFuZFxuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInRhZ1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgdGFncyBvZiBhIHNwZWNpZmllZCBlbnRpdHkuXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgb3BlcmF0aW9uOiBUYWdFbnVtLFxuICAgICAgICAgIHRhZzogW1N0cmluZ0VudW0sIHRydWVdXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gY29udGV4dC5vcGVyYXRpb24ucmVzdWx0IGFzIHN0cmluZztcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gU3dpdGNoIHRoZSBvcGVyYXRpb25cbiAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdGFnIGZyb20gdGhlIHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBjb250ZXh0LnRhZy5yZXN1bHQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSB0YWcgdG8gdGhlIGVudGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gZW50aXR5LmFkZFRhZyh0YWcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYMKnN0FkZGVkIHRhZyDCp2Eke3RhZ33CpzcgdG8gwqdjJHtlbnRpdHkudW5pcXVlSWR9wqc3YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgwqc3VGFnIMKnYSR7dGFnfcKnNyBhbHJlYWR5IGV4aXN0cyBvbiDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzdgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdGFnIGZyb20gdGhlIHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBjb250ZXh0LnRhZy5yZXN1bHQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0YWcgZnJvbSB0aGUgZW50aXR5XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGVudGl0eS5yZW1vdmVUYWcodGFnKTtcblxuICAgICAgICAgICAgICAgIC8vIFB1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYMKnN1JlbW92ZWQgdGFnIMKnYSR7dGFnfcKnNyBmcm9tIMKnYyR7ZW50aXR5LnVuaXF1ZUlkfcKnN2BcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYMKnN1RhZyDCp2Eke3RhZ33CpzcgZG9lcyBub3QgZXhpc3Qgb24gwqdjJHtlbnRpdHkudW5pcXVlSWR9wqc3YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHRhZ3Mgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBlbnRpdHkuZ2V0VGFncygpO1xuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqdjJHtlbnRpdHkudW5pcXVlSWR9wqc3IGhhcyBubyB0YWdzLmApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzcgaGFzIHRoZSBmb2xsb3dpbmcgdGFnczogwqdhJHt0YWdzLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgXCLCpzcsIMKnYVwiXG4gICAgICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwsIHR5cGUgVmVjdG9yM2YgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUG9zaXRpb25FbnVtLCBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBEaW1lbnNpb24sIHR5cGUgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICAvLyBSZWdpc3RlciB0aGUgc2V0YmxvY2sgY29tbWFuZFxuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInRwXCIsXG4gICAgXCJUZWxlcG9ydHMgYW4gZW50aXR5IHRvIGEgc3BlY2lmaWVkIGxvY2F0aW9uXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBwb3NpdGlvbjogUG9zaXRpb25FbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBvcmlnaW4gZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGNvbnRleHQub3JpZ2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9yaWdpbiBpcyBhIGRpbWVuc2lvblxuICAgICAgICAgIGlmIChvcmlnaW4gaW5zdGFuY2VvZiBEaW1lbnNpb24pXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgY29tbWFuZCBjYW4gb25seSBiZSBleGVjdXRlZCBieSBlbnRpdGllc1wiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjb250ZXh0LnBvc2l0aW9uLnJlc3VsdCBhcyBWZWN0b3IzZjtcblxuICAgICAgICAgIC8vIFRlbGVwb3J0IHRoZSBlbnRpdHkgdG8gdGhlIG5ldyBsb2NhdGlvblxuICAgICAgICAgIG9yaWdpbi50ZWxlcG9ydChwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0OiBUYXJnZXRFbnVtLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBUYXJnZXRFbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGNvbnRleHQuZGVzdGluYXRpb24ucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gaXMgYSBkaW1lbnNpb25cbiAgICAgICAgICBpZiAoZGVzdGluYXRpb24ubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlc3RpbmF0aW9uIG11c3QgYmUgYSBzaW5nbGUgZW50aXR5XCIpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBkZXN0aW5hdGlvblxuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gKGRlc3RpbmF0aW9uWzBdIGFzIEVudGl0eSkucG9zaXRpb247XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gVGVsZXBvcnQgdGhlIGVudGl0eSB0byB0aGUgbmV3IGxvY2F0aW9uXG4gICAgICAgICAgICB0YXJnZXQudGVsZXBvcnQocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgcG9zaXRpb246IFBvc2l0aW9uRW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjb250ZXh0LnBvc2l0aW9uLnJlc3VsdCBhcyBWZWN0b3IzZjtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBUZWxlcG9ydCB0aGUgZW50aXR5IHRvIHRoZSBuZXcgbG9jYXRpb25cbiAgICAgICAgICAgIHRhcmdldC50ZWxlcG9ydChwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHtcbiAgRGF0YVBhY2tldCxcbiAgRGltZW5zaW9uVHlwZSxcbiAgU2V0VGltZVBhY2tldCxcbiAgVGV4dFBhY2tldCxcbiAgVGV4dFBhY2tldFR5cGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgRW1pdHRlciBmcm9tIFwiQHNlcmVuaXR5anMvZW1pdHRlclwiO1xuXG5pbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCIuLi9zZXJlbml0eVwiO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uUHJvcGVydGllcyxcbiAgV29ybGRFdmVudFNpZ25hbHMsXG4gIFdvcmxkUHJvcGVydGllc1xufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVudGl0eSwgRW50aXR5UGFsZXR0ZSwgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVBhbGV0dGUgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgQmxvY2tQYWxldHRlIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5pbXBvcnQgeyBBZG1pbkNvbW1hbmRzLCBDb21tYW5kcywgQ29tbW9uQ29tbWFuZHMgfSBmcm9tIFwiLi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFdvcmxkVGlja1NpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcbmltcG9ydCB7IEVmZmVjdFBhbGxldGUgfSBmcm9tIFwiLi4vZWZmZWN0XCI7XG5cbmltcG9ydCB7IFdvcmxkUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiO1xuaW1wb3J0IHsgRGVmYXVsdERpbWVuc2lvblByb3BlcnRpZXMsIERpbWVuc2lvbiB9IGZyb20gXCIuL2RpbWVuc2lvblwiO1xuaW1wb3J0IHsgVGlja1NjaGVkdWxlIH0gZnJvbSBcIi4vc2NoZWR1bGVcIjtcbmltcG9ydCB7IFNjb3JlYm9hcmQgfSBmcm9tIFwiLi9zY29yZWJvYXJkXCI7XG5cbmNvbnN0IERlZmF1bHRXb3JsZFByb3BlcnRpZXM6IFdvcmxkUHJvcGVydGllcyA9IHtcbiAgaWRlbnRpZmllcjogXCJkZWZhdWx0XCIsXG4gIHNlZWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIgKiogMzIpLFxuICBzYXZlSW50ZXJ2YWw6IDUsXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7XG4gICAgICBpZGVudGlmaWVyOiBcIm92ZXJ3b3JsZFwiLFxuICAgICAgdHlwZTogRGltZW5zaW9uVHlwZS5PdmVyd29ybGQsXG4gICAgICBnZW5lcmF0b3I6IFwic3VwZXJmbGF0XCIsXG4gICAgICB2aWV3RGlzdGFuY2U6IDIwLFxuICAgICAgc2ltdWxhdGlvbkRpc3RhbmNlOiAxMCxcbiAgICAgIHNwYXduUG9zaXRpb246IFswLCAzMjc2NywgMF1cbiAgICB9XG4gIF1cbn07XG5cbmNsYXNzIFdvcmxkIGV4dGVuZHMgRW1pdHRlcjxXb3JsZEV2ZW50U2lnbmFscz4ge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIHRoYXQgdGhlIHdvcmxkIGJlbG9uZ3MgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydGllczogV29ybGRQcm9wZXJ0aWVzID0gRGVmYXVsdFdvcmxkUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm92aWRlcjogV29ybGRQcm92aWRlcjtcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbnMgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbnMgPSBuZXcgTWFwPHN0cmluZywgRGltZW5zaW9uPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSBwYWxldHRlIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHlQYWxldHRlID0gbmV3IEVudGl0eVBhbGV0dGUoKTtcblxuICAvKipcbiAgICogVGhlIGVmZmVjdCBwYWxldHRlIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlZmZlY3RQYWxldHRlID0gbmV3IEVmZmVjdFBhbGxldGUoKTtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHBhbGV0dGUgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrUGFsZXR0ZSA9IG5ldyBCbG9ja1BhbGV0dGUoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcGFsZXR0ZSBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbVBhbGV0dGUgPSBuZXcgSXRlbVBhbGV0dGUoKTtcblxuICAvKipcbiAgICogVGhlIGNvbW1hbmRzIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kcyA9IG5ldyBDb21tYW5kcygpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVuZGluZyBzY2hlZHVsZXMgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlcyA9IG5ldyBTZXQ8VGlja1NjaGVkdWxlPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NvcmVib2FyZCBmb3IgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNjb3JlYm9hcmQgPSBuZXcgU2NvcmVib2FyZCh0aGlzKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGljayBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgY3VycmVudFRpY2sgPSAwbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGltZSBvZiBkYXkgZm9yIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyBkYXlUaW1lID0gMDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3ZpZGVyOiBXb3JsZFByb3ZpZGVyLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFdvcmxkUHJvcGVydGllcz5cbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgc2VyZW5pdHkgYW5kIHByb3ZpZGVyIHRvIHRoZSB3b3JsZFxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcbiAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXMgdG8gdGhlIHdvcmxkIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFdvcmxkUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gQXNzaWduIHRoZSBpZGVudGlmaWVyIHRvIHRoZSB3b3JsZFxuICAgIHRoaXMuaWRlbnRpZmllciA9IHRoaXMucHJvcGVydGllcy5pZGVudGlmaWVyO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGxvZ2dlciBmb3IgdGhlIHdvcmxkXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMuaWRlbnRpZmllciwgTG9nZ2VyQ29sb3JzLkdyZWVuQnJpZ2h0KTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBhZG1pbiBjb21tYW5kc1xuICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBbLi4uQWRtaW5Db21tYW5kcywgLi4uQ29tbW9uQ29tbWFuZHNdKSBjb21tYW5kKHRoaXMpO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGRpbWVuc2lvbnMgZnJvbSB0aGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5wcm9wZXJ0aWVzLmRpbWVuc2lvbnMpIHRoaXMuY3JlYXRlRGltZW5zaW9uKGVudHJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaWNrcyB0aGUgd29ybGQgd2l0aCBhIGdpdmVuIGRlbHRhIHRpY2suXG4gICAqIEBwYXJhbSBkZWx0YVRpY2sgVGhlIGRlbHRhIHRpY2sgdG8gdGljayB0aGUgd29ybGQgd2l0aC5cbiAgICovXG4gIHB1YmxpYyBvblRpY2soZGVsdGFUaWNrOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBSZXR1cm4gaWYgdGhlcmUgYXJlIG5vIHBsYXllcnMgaW4gdGhlIHdvcmxkXG4gICAgaWYgKHRoaXMuZ2V0UGxheWVycygpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IFdvcmxkVGlja1NpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JsZFRpY2tTaWduYWwoXG4gICAgICB0aGlzLmN1cnJlbnRUaWNrLFxuICAgICAgQmlnSW50KGRlbHRhVGljayksXG4gICAgICB0aGlzXG4gICAgKS5lbWl0KCk7XG5cbiAgICAvLyBSZXR1cm4gaWYgdGhlIHNpZ25hbCB3YXMgbm90IGVtaXR0ZWRcbiAgICBpZiAoIXNpZ25hbCkgcmV0dXJuO1xuXG4gICAgLy8gSW5jcmVtZW50IHRoZSBjdXJyZW50IHRpY2tcbiAgICArK3RoaXMuY3VycmVudFRpY2s7XG5cbiAgICAvLyBJbmNyZW1lbnQgdGhlIGRheSB0aW1lOyBkYXkgdGltZSBpcyAyNDAwMCB0aWNrcyBsb25nXG4gICAgdGhpcy5kYXlUaW1lID0gKHRoaXMuZGF5VGltZSArIDEpICUgMjRfMDAwO1xuXG4gICAgLy8gQXR0ZW1wdCB0byB0aWNrIGVhY2ggZGltZW5zaW9uXG4gICAgZm9yIChjb25zdCBkaW1lbnNpb24gb2YgdGhpcy5kaW1lbnNpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaWNrIHRoZSBkaW1lbnNpb24gd2l0aCB0aGUgZGVsdGEgdGlja1xuICAgICAgICBkaW1lbnNpb24ub25UaWNrKGRlbHRhVGljayk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoYXQgdGhlIGRpbWVuc2lvbiBmYWlsZWQgdG8gdGlja1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHRpY2sgZGltZW5zaW9uICR7ZGltZW5zaW9uLmlkZW50aWZpZXJ9YCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0aWNrIGlzIGRpdmlzaWJsZSBieSA1MDAgKDI1IHNlY29uZHMpXG4gICAgLy8gV2hlbiB3YW50IHRvIHN5bmMgdGhlIGRheVRpbWUgd2l0aCB0aGUgY2xpZW50LCBhcyBzdHJlc3MgY291bGQgY2F1c2UgZGUtc3luY1xuICAgIGlmICh0aGlzLmN1cnJlbnRUaWNrICUgNTAwbiA9PT0gMG4pIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBTZXRUaW1lUGFja2V0XG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0VGltZVBhY2tldCgpO1xuICAgICAgcGFja2V0LnRpbWUgPSB0aGlzLmRheVRpbWU7XG5cbiAgICAgIC8vIEJyb2FkY2FzdCB0aGUgdGltZSBwYWNrZXQgdG8gYWxsIHBsYXllcnNcbiAgICAgIHRoaXMuYnJvYWRjYXN0KHBhY2tldCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2hlZHVsZXMgdG8gZXhlY3V0ZVxuICAgIGlmICh0aGlzLnNjaGVkdWxlcy5zaXplID4gMCkge1xuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzY2hlZHVsZXNcbiAgICAgIGZvciAoY29uc3Qgc2NoZWR1bGUgb2YgdGhpcy5zY2hlZHVsZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNjaGVkdWxlIGlzIGNvbXBsZXRlXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRUaWNrID49IHNjaGVkdWxlLmNvbXBsZXRlVGljaykge1xuICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHNjaGVkdWxlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNjaGVkdWxlLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHNjaGVkdWxlIGZhaWxlZCB0byBleGVjdXRlXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIHNjaGVkdWxlIGZvciBkaW1lbnNpb24gYXQgdGljayAke3NjaGVkdWxlLmNvbXBsZXRlVGlja31gLFxuICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSBzY2hlZHVsZVxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVzLmRlbGV0ZShzY2hlZHVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0aWNrIGlzIGRpdmlzaWJsZSBieSB0aGUgc2F2ZSBpbnRlcnZhbCAoaW4gbWludXRlcylcbiAgICBpZiAoXG4gICAgICB0aGlzLmN1cnJlbnRUaWNrICUgKEJpZ0ludCh0aGlzLnByb3BlcnRpZXMuc2F2ZUludGVydmFsKSAqIDEyMDBuKSA9PT1cbiAgICAgIDBuXG4gICAgKSB7XG4gICAgICAvLyBTYXZlIHRoZSB3b3JsZCB2aWEgdGhlIHByb3ZpZGVyXG4gICAgICB0aGlzLnByb3ZpZGVyLm9uU2F2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGRpbWVuc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZ2VuZXJhdG9yIGFuZCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gZ2VuZXJhdG9yIFRoZSBnZW5lcmF0b3IgdG8gdXNlIGZvciB0aGUgZGltZW5zaW9uXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgdGhlIGRpbWVuc2lvblxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBkaW1lbnNpb24sIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSwgZmFsc2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEaW1lbnNpb24oXG4gICAgcHJvcGVydGllczogUGFydGlhbDxEaW1lbnNpb25Qcm9wZXJ0aWVzPlxuICApOiBEaW1lbnNpb24gfCBmYWxzZSB7XG4gICAgLy8gQ3JlYXRlIHRoZSBkaW1lbnNpb24gcHJvcGVydGllc1xuICAgIGNvbnN0IGRpbWVuc2lvblByb3BlcnRpZXMgPSB7XG4gICAgICAuLi5EZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcyxcbiAgICAgIC4uLnByb3BlcnRpZXNcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRpbWVuc2lvbiBhbHJlYWR5IGV4aXN0c1xuICAgIGlmICh0aGlzLmRpbWVuc2lvbnMuaGFzKGRpbWVuc2lvblByb3BlcnRpZXMuaWRlbnRpZmllcikpIHtcbiAgICAgIC8vIExvZyB0aGF0IHRoZSBkaW1lbnNpb24gYWxyZWFkeSBleGlzdHNcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBkaW1lbnNpb24gd2l0aCBpZGVudGlmaWVyICR7ZGltZW5zaW9uUHJvcGVydGllcy5pZGVudGlmaWVyfSBhcyBpdCBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgZGltZW5zaW9uIGFscmVhZHkgZXhpc3RzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRpbWVuc2lvblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24odGhpcywgZGltZW5zaW9uUHJvcGVydGllcyk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5kaW1lbnNpb25zLnNldChkaW1lbnNpb24uaWRlbnRpZmllciwgZGltZW5zaW9uKTtcblxuICAgIC8vIExvZyB0aGF0IHRoZSBkaW1lbnNpb24gaGFzIGJlZW4gY3JlYXRlZFxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkIGRpbWVuc2lvbjogJHtkaW1lbnNpb24uaWRlbnRpZmllcn1gKTtcblxuICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCBkaW1lbnNpb25cbiAgICByZXR1cm4gZGltZW5zaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyb2FkY2FzdHMgYSBtZXNzYWdlIHRvIGFsbCBwbGF5ZXJzIGluIHRoZSB3b3JsZC5cbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYnJvYWRjYXN0LlxuICAgKi9cbiAgcHVibGljIHNlbmRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENvbnN0cnVjdCB0aGUgdGV4dCBwYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFRleHRQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcGFja2V0IGRhdGEuXG4gICAgcGFja2V0LnR5cGUgPSBUZXh0UGFja2V0VHlwZS5SYXc7XG4gICAgcGFja2V0Lm5lZWRzVHJhbnNsYXRpb24gPSBmYWxzZTtcbiAgICBwYWNrZXQuc291cmNlID0gbnVsbDtcbiAgICBwYWNrZXQubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgcGFja2V0LnBhcmFtZXRlcnMgPSBudWxsO1xuICAgIHBhY2tldC54dWlkID0gXCJcIjtcbiAgICBwYWNrZXQucGxhdGZvcm1DaGF0SWQgPSBcIlwiO1xuICAgIHBhY2tldC5maWx0ZXJlZCA9IG1lc3NhZ2U7XG5cbiAgICB0aGlzLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCBkaW1lbnNpb24gZm9yIHRoZSB3b3JsZFxuICAgKi9cbiAgcHVibGljIGdldERpbWVuc2lvbigpOiBEaW1lbnNpb247XG5cbiAgLyoqXG4gICAqIEdldCBhIGRpbWVuc2lvbiBieSB0aGUgaWRlbnRpZmllciBmcm9tIHRoZSB3b3JsZFxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGltZW5zaW9uXG4gICAqIEByZXR1cm5zIFRoZSBkaW1lbnNpb24sIGlmIGZvdW5kOyBvdGhlcndpc2UsIHVuZGVmaW5lZFxuICAgKi9cbiAgcHVibGljIGdldERpbWVuc2lvbihpZGVudGlmaWVyOiBzdHJpbmcpOiBEaW1lbnNpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEdldCBhIGRpbWVuc2lvbiBieSB0aGUgaWRlbnRpZmllciBmcm9tIHRoZSB3b3JsZFxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGltZW5zaW9uXG4gICAqIEByZXR1cm5zIFRoZSBkaW1lbnNpb24sIGlmIGZvdW5kOyBvdGhlcndpc2UsIHVuZGVmaW5lZFxuICAgKi9cbiAgcHVibGljIGdldERpbWVuc2lvbihpZGVudGlmaWVyPzogc3RyaW5nKTogRGltZW5zaW9uIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpZmllciBpcyB1bmRlZmluZWRcbiAgICBpZiAoaWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBHZXQgdGhlIGZpcnN0IGRpbWVuc2lvblxuICAgICAgcmV0dXJuIHRoaXMuZGltZW5zaW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgYXMgRGltZW5zaW9uO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGJ5IHRoZSBpZGVudGlmaWVyXG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9ucy5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgZGltZW5zaW9ucyBpbiB0aGUgd29ybGRcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZGltZW5zaW9uc1xuICAgKi9cbiAgcHVibGljIGdldERpbWVuc2lvbnMoKTogQXJyYXk8RGltZW5zaW9uPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRpbWVuc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSB3b3JsZC5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgcGxheWVycy5cbiAgICovXG4gIHB1YmxpYyBnZXRQbGF5ZXJzKCk6IEFycmF5PFBsYXllcj4ge1xuICAgIHJldHVybiBbLi4udGhpcy5kaW1lbnNpb25zLnZhbHVlcygpXS5mbGF0TWFwKChkaW1lbnNpb24pID0+XG4gICAgICBkaW1lbnNpb24uZ2V0UGxheWVycygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgZW50aXRpZXMgaW4gdGhlIHdvcmxkLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbnRpdGllcy5cbiAgICovXG4gIHB1YmxpYyBnZXRFbnRpdGllcygpOiBBcnJheTxFbnRpdHk+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZGltZW5zaW9ucy52YWx1ZXMoKV0uZmxhdE1hcCgoZGltZW5zaW9uKSA9PlxuICAgICAgZGltZW5zaW9uLmdldEVudGl0aWVzKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGFuIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uIGFmdGVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aWNrcy5cbiAgICogQHBhcmFtIHRpY2tzIFRoZSBhbW91bnQgb2YgdGlja3MgdG8gd2FpdCBiZWZvcmUgdGhlIHNjaGVkdWxlIGlzIGNvbXBsZXRlLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCB0aWNrIHNjaGVkdWxlLlxuICAgKi9cbiAgcHVibGljIHNjaGVkdWxlKHRpY2tzOiBudW1iZXIpOiBUaWNrU2NoZWR1bGUge1xuICAgIC8vIENyZWF0ZSBhIG5ldyB0aWNrIHNjaGVkdWxlXG4gICAgY29uc3Qgc2NoZWR1bGUgPSBuZXcgVGlja1NjaGVkdWxlKHRpY2tzLCB0aGlzKTtcblxuICAgIC8vIEFkZCB0aGUgc2NoZWR1bGUgdG8gdGhlIHdvcmxkXG4gICAgdGhpcy5zY2hlZHVsZXMuYWRkKHNjaGVkdWxlKTtcblxuICAgIC8vIFJldHVybiB0aGUgc2NoZWR1bGVcbiAgICByZXR1cm4gc2NoZWR1bGU7XG4gIH1cblxuICBwdWJsaWMgYnJvYWRjYXN0KC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgdGhpcy5nZXRQbGF5ZXJzKCkpIHBsYXllci5zZW5kKC4uLnBhY2tldHMpO1xuICB9XG5cbiAgcHVibGljIGJyb2FkY2FzdEltbWVkaWF0ZSguLi5wYWNrZXRzOiBBcnJheTxEYXRhUGFja2V0Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHRoaXMuZ2V0UGxheWVycygpKSBwbGF5ZXIuc2VuZEltbWVkaWF0ZSguLi5wYWNrZXRzKTtcbiAgfVxuXG4gIHB1YmxpYyBicm9hZGNhc3RFeGNlcHQocGxheWVyOiBQbGF5ZXIsIC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvdGhlciBvZiB0aGlzLmdldFBsYXllcnMoKSlcbiAgICAgIGlmIChvdGhlciAhPT0gcGxheWVyKSBvdGhlci5zZW5kKC4uLnBhY2tldHMpO1xuICB9XG59XG5cbmV4cG9ydCB7IFdvcmxkIH07XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vZWZmZWN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdlbmVyYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BvaXNvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmlnaHQtdmlzaW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnN0YW50LWRhbWFnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW5zdGFudC1oZWFsdGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2JsaW5kbmVzc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGFya25lc3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25hdXNlYXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NwZWVkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93aXRoZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZhdGFsLXBvaXNvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2xvd25lc3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludmlzaWJpbGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2F0ZXItYnJlYXRoaW5nXCI7XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5jbGFzcyBFZmZlY3Qge1xuICAvLyBUaGUgbWluZWNyYWZ0IGVmZmVjdCB0eXBlLlxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGU7XG5cbiAgLy8gV2hldGhlciB0aGUgZWZmZWN0IGlzIGluc3RhbnRhbmVvdXMgb3Igbm90LiBEZWZhdWx0IGlzIGZhbHNlLlxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGluc3RhbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBUaGUgZWZmZWN0J3MgcGFydGljbGUgY29sb3IuXG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAyNTUsIDI1NSwgMjU1KTtcblxuICAvLyBFZmZlY3QgZHVyYXRpb24uXG4gIHB1YmxpYyBkdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8vIFRoZSBlZmZlY3QncyBhbXBsaWZpZXIuIERlZmF1bHQgaXMgMC5cbiAgcHVibGljIGFtcGxpZmllcjogbnVtYmVyO1xuXG4gIC8vIFdldGhlciB0aGUgZWZmZWN0IHNob3VsZCBzaG93IHBhcnRpY2xlcyBvciBub3QuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgcHVibGljIHNob3dQYXJ0aWNsZXM6IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGR1cmF0aW9uOiBudW1iZXIsXG4gICAgYW1wbGlmaWVyPzogbnVtYmVyLFxuICAgIHNob3dQYXJ0aWNsZXM/OiBib29sZWFuXG4gICkge1xuICAgIHRoaXMuZHVyYXRpb24gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuaW5zdGFudCA/IDAgOiBkdXJhdGlvbjtcbiAgICB0aGlzLmFtcGxpZmllciA9IGFtcGxpZmllciA/PyAwO1xuICAgIHRoaXMuc2hvd1BhcnRpY2xlcyA9IHNob3dQYXJ0aWNsZXMgPz8gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBlZmZlY3RUeXBlOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykudHlwZSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgYW1wbGlmaWVyOiB0aGlzLmFtcGxpZmllcixcbiAgICAgIHNob3dQYXJ0aWNsZXM6IHRoaXMuc2hvd1BhcnRpY2xlc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZWZmZWN0IGhhcyBleHBpcmVkLlxuICAgKiBAcmV0dXJucyBXZXRoZXIgb3Igbm90IHRoZSBlZmZlY3QgaGFzIGV4cGlyZWQuXG4gICAqL1xuXG4gIHB1YmxpYyBpc0V4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHVyYXRpb24gPD0gMDtcbiAgfVxuXG4gIHB1YmxpYyBvbkFkZD8oZW50aXR5OiBFbnRpdHkpOiB2b2lkO1xuXG4gIHB1YmxpYyBvblJlbW92ZT8oZW50aXR5OiBFbnRpdHkpOiB2b2lkO1xuXG4gIHB1YmxpYyBvblRpY2s/KGVudGl0eTogRW50aXR5KTogdm9pZDtcbn1cblxuZXhwb3J0IHsgRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlIZWFsdGhUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIFJlZ2VuZXJhdGlvbkVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuUmVnZW5lcmF0aW9uO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAyMDUsIDkyLCAxNzEpO1xuXG4gIHB1YmxpYyBvblRpY2soZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGVudGl0eSBoZWFsdGggdHJhaXQuXG4gICAgY29uc3QgZW50aXR5SGVhbHRoID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUhlYWx0aFRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBlbnRpdHkgZG9lc24ndCBoYXZlIGEgaGVhbHRoIHRyYWl0LCBtZWFucyB0aGF0IHRoZSBlbnRpdHkgY2FuJ3RcbiAgICAvLyBCZSBoZWFsZWQuXG4gICAgaWYgKCFlbnRpdHlIZWFsdGgpIHJldHVybjtcbiAgICAvLyBDb21wdXRlIHRoZSBlZmZlY3QgdGltaW5ncy5cbiAgICBjb25zdCB0aWNrc1BlclNlY29uZCA9IE1hdGgubWF4KFxuICAgICAgNTAgLyAyICoqICh0aGlzLmFtcGxpZmllciAtIDEpLFxuICAgICAgMSAqIDIgKiogKHRoaXMuYW1wbGlmaWVyIC0gNSlcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGhlYWwgaW4gdGhlIGN1cnJlbnQgdGljay5cbiAgICBpZiAoTnVtYmVyKGVudGl0eS5nZXRXb3JsZCgpLmN1cnJlbnRUaWNrKSAlIHRpY2tzUGVyU2Vjb25kICE9IDApIHJldHVybjtcbiAgICAvLyBIZWFsIHRoZSBlbnRpdHkgYnkgMSBoZWFsdGggcG9pbnQuXG4gICAgZW50aXR5SGVhbHRoLnNldChlbnRpdHlIZWFsdGguY3VycmVudFZhbHVlICsgMSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUmVnZW5lcmF0aW9uRWZmZWN0IH07XG4iLCAiaW1wb3J0IHtcbiAgRWZmZWN0VHlwZSxcbiAgQ29sb3IsXG4gIEdhbWVtb2RlLFxuICBBY3RvckRhbWFnZUNhdXNlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgUG9pc29uRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5Qb2lzb247XG4gIHB1YmxpYyBzdGF0aWMgaW5zdGFudDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgNzgsIDE0NywgNDkpO1xuXG4gIHB1YmxpYyBvblRpY2s/KGVudGl0eTogRW50aXR5KTogdm9pZCB7XG4gICAgbGV0IHRpY2tzUGVyU2Vjb25kID0gTWF0aC5mbG9vcihcbiAgICAgIE1hdGgubWF4KDI1ICogTWF0aC5wb3coMC41LCB0aGlzLmFtcGxpZmllciAtIDEpLCAxMilcbiAgICApO1xuICAgIHRpY2tzUGVyU2Vjb25kID0gTWF0aC5taW4odGlja3NQZXJTZWNvbmQsIDEwKTtcblxuICAgIGlmIChOdW1iZXIoZW50aXR5LmRpbWVuc2lvbi53b3JsZC5jdXJyZW50VGljaykgJSB0aWNrc1BlclNlY29uZCAhPSAwKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChlbnRpdHkuaXNQbGF5ZXIoKSAmJiBlbnRpdHkuZ2FtZW1vZGUgPT0gR2FtZW1vZGUuQ3JlYXRpdmUpIHJldHVybjtcbiAgICBjb25zdCBlbnRpdHlIZWFsdGggPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgaWYgKGVudGl0eUhlYWx0aC5jdXJyZW50VmFsdWUgPD0gMSkgcmV0dXJuO1xuICAgIGVudGl0eUhlYWx0aC5hcHBseURhbWFnZSgxLCB1bmRlZmluZWQsIEFjdG9yRGFtYWdlQ2F1c2UuTWFnaWMpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBvaXNvbkVmZmVjdCB9O1xuIiwgImltcG9ydCB7IENvbG9yLCBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBOaWdodFZpc2lvbkVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuTmlnaHRWaXNpb247XG4gIHB1YmxpYyBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAzMSwgMzEsIDE2MSk7XG59XG5cbmV4cG9ydCB7IE5pZ2h0VmlzaW9uRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQWN0b3JEYW1hZ2VDYXVzZSwgRWZmZWN0VHlwZSwgR2FtZW1vZGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlIZWFsdGhUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIEluc3RhbnREYW1hZ2VFZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLkluc3RhbnREYW1hZ2U7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW5zdGFudDogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHVibGljIG9uQWRkKGVudGl0eTogRW50aXR5KTogdm9pZCB7XG4gICAgLy8gVE9ETzogVW5kZWFkIGNoZWNrIGZvciBoZWFsaW5nXG4gICAgLy9pZiAoZW50aXR5KVxuXG4gICAgaWYgKGVudGl0eS5pc1BsYXllcigpICYmIGVudGl0eS5nYW1lbW9kZSA9PSBHYW1lbW9kZS5DcmVhdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWx0aFRyYWl0ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUhlYWx0aFRyYWl0KTtcblxuICAgIGlmICghaGVhbHRoVHJhaXQpIHJldHVybjtcbiAgICBoZWFsdGhUcmFpdC5hcHBseURhbWFnZShcbiAgICAgIDMgKiAyICoqIHRoaXMuYW1wbGlmaWVyLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgQWN0b3JEYW1hZ2VDYXVzZS5NYWdpY1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSW5zdGFudERhbWFnZUVmZmVjdCB9O1xuIiwgImltcG9ydCB7IEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlIZWFsdGhUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIEluc3RhbnRIZWFsdGhFZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLkluc3RhbnRIZWFsdGg7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW5zdGFudDogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHVibGljIG9uQWRkKGVudGl0eTogRW50aXR5KTogdm9pZCB7XG4gICAgY29uc3QgaGVhbHRoVHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuICAgIGNvbnN0IGN1cnJlbnRIZWFsdGggPSBoZWFsdGhUcmFpdC5jdXJyZW50VmFsdWU7XG5cbiAgICAvLyBUT0RPOiBVbmRlYWQgY2hlY2sgdG8gZGFtYWdlXG4gICAgaWYgKGN1cnJlbnRIZWFsdGggPj0gaGVhbHRoVHJhaXQuZWZmZWN0aXZlTWF4KSByZXR1cm47XG4gICAgaGVhbHRoVHJhaXQuc2V0KFxuICAgICAgTWF0aC5taW4oXG4gICAgICAgIGhlYWx0aFRyYWl0LmVmZmVjdGl2ZU1heCxcbiAgICAgICAgY3VycmVudEhlYWx0aCArIDIgKiAyICoqIHRoaXMuYW1wbGlmaWVyXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBJbnN0YW50SGVhbHRoRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIEJsaW5kbmVzc0VmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuQmxpbmRuZXNzO1xuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgMzEsIDMxLCAzNSk7XG59XG5cbmV4cG9ydCB7IEJsaW5kbmVzc0VmZmVjdCB9O1xuIiwgImltcG9ydCB7IENvbG9yLCBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBEYXJrbmVzc0VmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuRGFya25lc3M7XG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCA0MSwgMzksIDMzKTtcbn1cblxuZXhwb3J0IHsgRGFya25lc3NFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgTmF1c2Vhc0VmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuTmF1c2VhO1xuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgODUsIDI5LCA3NCk7XG59XG5cbmV4cG9ydCB7IE5hdXNlYXNFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eU1vdmVtZW50VHJhaXQgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBTcGVlZEVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuU3BlZWQ7XG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAxMjQsIDE3NSwgMTk4KTtcblxuICBwdWJsaWMgb25BZGQoZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCBtb3ZlbWVudFRyYWl0ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eU1vdmVtZW50VHJhaXQpO1xuICAgIG1vdmVtZW50VHJhaXQuc2V0KG1vdmVtZW50VHJhaXQuY3VycmVudFZhbHVlICogKDEgKyAwLjIgKiB0aGlzLmFtcGxpZmllcikpO1xuICB9XG5cbiAgcHVibGljIG9uUmVtb3ZlKGVudGl0eTogRW50aXR5KTogdm9pZCB7XG4gICAgY29uc3QgbW92ZW1lbnRUcmFpdCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlNb3ZlbWVudFRyYWl0KTtcbiAgICBtb3ZlbWVudFRyYWl0LnNldChtb3ZlbWVudFRyYWl0LmRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU3BlZWRFZmZlY3QgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckRhbWFnZUNhdXNlLFxuICBDb2xvcixcbiAgRWZmZWN0VHlwZSxcbiAgR2FtZW1vZGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSwgRW50aXR5SGVhbHRoVHJhaXQgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBXaXRoZXJFZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLldpdGhlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDUzLCA0MiwgMzkpO1xuXG4gIHB1YmxpYyBvblRpY2soZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCB0aWNrc1BlclNlY29uZCA9IE1hdGgubWF4KDQwIC8gTWF0aC5wb3coMiwgdGhpcy5hbXBsaWZpZXIgLSAxKSwgMTApO1xuXG4gICAgaWYgKE51bWJlcihlbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrKSAlIHRpY2tzUGVyU2Vjb25kICE9IDApXG4gICAgICByZXR1cm47XG4gICAgaWYgKGVudGl0eS5pc1BsYXllcigpICYmIGVudGl0eS5nYW1lbW9kZSA9PSBHYW1lbW9kZS5DcmVhdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWx0aFRyYWl0ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUhlYWx0aFRyYWl0KTtcblxuICAgIGhlYWx0aFRyYWl0LmFwcGx5RGFtYWdlKDEsIHVuZGVmaW5lZCwgQWN0b3JEYW1hZ2VDYXVzZS5NYWdpYyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgV2l0aGVyRWZmZWN0IH07XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JEYW1hZ2VDYXVzZSxcbiAgQ29sb3IsXG4gIEVmZmVjdFR5cGUsXG4gIEdhbWVtb2RlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgRmF0YWxQb2lzb25FZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLkZhdGFsUG9pc29uO1xuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgNzgsIDE0NywgNDkpO1xuXG4gIHB1YmxpYyBvblRpY2soZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBsZXQgdGlja3NQZXJTZWNvbmQgPSBNYXRoLmZsb29yKFxuICAgICAgTWF0aC5tYXgoMjUgKiBNYXRoLnBvdygwLjUsIHRoaXMuYW1wbGlmaWVyIC0gMSksIDEyKVxuICAgICk7XG4gICAgdGlja3NQZXJTZWNvbmQgPSBNYXRoLm1pbih0aWNrc1BlclNlY29uZCwgMTApO1xuXG4gICAgaWYgKE51bWJlcihlbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrKSAlIHRpY2tzUGVyU2Vjb25kICE9IDApXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoZW50aXR5LmlzUGxheWVyKCkgJiYgZW50aXR5LmdhbWVtb2RlID09IEdhbWVtb2RlLkNyZWF0aXZlKSByZXR1cm47XG4gICAgY29uc3QgZW50aXR5SGVhbHRoID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUhlYWx0aFRyYWl0KTtcbiAgICBlbnRpdHlIZWFsdGguYXBwbHlEYW1hZ2UoMSwgdW5kZWZpbmVkLCBBY3RvckRhbWFnZUNhdXNlLk1hZ2ljKTtcbiAgfVxufVxuXG5leHBvcnQgeyBGYXRhbFBvaXNvbkVmZmVjdCB9O1xuIiwgImltcG9ydCB7IENvbG9yLCBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSwgRW50aXR5TW92ZW1lbnRUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIFNsb3duZXNzRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5TbG93bmVzcztcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgOTAsIDEwOCwgMTI5KTtcblxuICBwdWJsaWMgb25BZGQoZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCBtb3ZlbWVudFRyYWl0ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eU1vdmVtZW50VHJhaXQpO1xuICAgIG1vdmVtZW50VHJhaXQuc2V0KG1vdmVtZW50VHJhaXQuY3VycmVudFZhbHVlICogKDEgLSAwLjE1ICogdGhpcy5hbXBsaWZpZXIpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW92ZShlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVtZW50VHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5TW92ZW1lbnRUcmFpdCk7XG4gICAgbW92ZW1lbnRUcmFpdC5zZXQobW92ZW1lbnRUcmFpdC5kZWZhdWx0VmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNsb3duZXNzRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlJbnZpc2liaWxpdHlUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIEludmlzaWJpbGl0eUVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuSW52aXNpYmlsaXR5O1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAxMjcsIDEzMSwgMTQ2KTtcblxuICBwdWJsaWMgb25BZGQoZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICAvLyBNYWtlIHRoZSBlbnRpdHkgaW52aXNpYmxlLlxuICAgIGVudGl0eS5nZXRUcmFpdChFbnRpdHlJbnZpc2liaWxpdHlUcmFpdCk/LnNldEludmlzaWJpbGl0eSh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW92ZShlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIC8vIE1ha2UgdGhlIGVudGl0eSB2aXNpYmxlIGFnYWluLlxuICAgIGVudGl0eS5nZXRUcmFpdChFbnRpdHlJbnZpc2liaWxpdHlUcmFpdCk/LnNldEludmlzaWJpbGl0eShmYWxzZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSW52aXNpYmlsaXR5RWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIFdhdGVyQnJlYXRoaW5nRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5XYXRlckJyZWF0aGluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgMTUyLCAyMTgsIDE5Mik7XG59XG5cbmV4cG9ydCB7IFdhdGVyQnJlYXRoaW5nRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlFZmZlY3RzIH0gZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RzL2VmZmVjdFwiO1xuXG5jbGFzcyBFZmZlY3RQYWxsZXRlIHtcbiAgcHVibGljIGVmZmVjdHM6IE1hcDxFZmZlY3RUeXBlLCB0eXBlb2YgRWZmZWN0PiA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gUmVnaXN0ZXIgYWxsIGVmZmVjdCB0eXBlcy5cbiAgICBmb3IgKGNvbnN0IGVmZmVjdCBvZiBFbnRpdHlFZmZlY3RzKSB0aGlzLnJlZ2lzdGVyRWZmZWN0KGVmZmVjdCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGVmZmVjdCB0eXBlIGluIHRoZSBlZmZlY3QgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSBlZmZlY3QgVGhlIGVmZmVjdCB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0OiB0eXBlb2YgRWZmZWN0KTogdm9pZCB7XG4gICAgdGhpcy5lZmZlY3RzLnNldChlZmZlY3QudHlwZSwgZWZmZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGEgZWZmZWN0IHR5cGUgZnJvbSB0aGUgZWZmZWN0IHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgZWZmZWN0IHR5cGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICogQHJldHVybnMgVGhlIGVmZmVjdCBpZiBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBnZXRFZmZlY3QodHlwZTogRWZmZWN0VHlwZSk6IHR5cGVvZiBFZmZlY3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVmZmVjdHMuZ2V0KHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCdzIGFsbCB0aGUgZWZmZWN0cyB0aGF0IGFyZSBpbiB0aGUgcmVnaXN0cnksXG4gICAqIEByZXR1cm5zIEFsbCB0aGUgZWZmZWN0cyB0aGF0IGFyZSByZWdpc3RlcmVkLlxuICAgKi9cblxuICBwdWJsaWMgZ2V0QWxsRWZmZWN0cygpOiBBcnJheTx0eXBlb2YgRWZmZWN0PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmVmZmVjdHMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGVmZmVjdCByZWdpc3RyeS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGVmZmVjdCB0eXBlIHRvIHJlbW92ZSBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVFZmZlY3QodHlwZTogRWZmZWN0VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuZWZmZWN0cy5kZWxldGUodHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRWZmZWN0UGFsbGV0ZSB9O1xuIiwgImltcG9ydCAqIGFzIEVmZmVjdHMgZnJvbSBcIi4vZWZmZWN0c1wiO1xuXG5pbXBvcnQgdHlwZSB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhbGxldGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VmZmVjdHNcIjtcblxuY29uc3QgRW50aXR5RWZmZWN0czogQXJyYXk8dHlwZW9mIEVmZmVjdD4gPSBbXTtcblxuLy8gSXRlcmF0ZSBvdmVyIGVhY2ggZWZmZWN0XG5mb3IgKGNvbnN0IGtleSBpbiBFZmZlY3RzKSB7XG4gIC8vIEdldCB0aGUgYmxvY2sgZWZmZWN0XG4gIGNvbnN0IGVmZmVjdCA9IEVmZmVjdHNba2V5IGFzIGtleW9mIHR5cGVvZiBFZmZlY3RzXTtcblxuICAvLyBQdXNoIHRoZSBibG9jayBlZmZlY3QgdG8gdGhlIGxpc3RcbiAgRW50aXR5RWZmZWN0cy5wdXNoKGVmZmVjdCk7XG59XG5cbmV4cG9ydCB7IEVudGl0eUVmZmVjdHMgfTtcbiIsICJpbXBvcnQge1xuICBCbG9ja1Bvc2l0aW9uLFxuICBEYXRhUGFja2V0LFxuICBEaW1lbnNpb25UeXBlLFxuICBJUG9zaXRpb24sXG4gIFRleHRQYWNrZXQsXG4gIFRleHRQYWNrZXRUeXBlLFxuICBWZWN0b3IzZlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ29tbWFuZFJlc3BvbnNlLCBEaW1lbnNpb25Qcm9wZXJ0aWVzLCBJdGVtcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBFbnRpdHlHcmF2aXR5VHJhaXQsXG4gIEVudGl0eUludmVudG9yeVRyYWl0LFxuICBFbnRpdHlJdGVtU3RhY2tUcmFpdCxcbiAgRW50aXR5TW92ZW1lbnRUcmFpdCxcbiAgRW50aXR5UGh5c2ljc1RyYWl0LFxuICBFbnRpdHlUeXBlLFxuICBQbGF5ZXIsXG4gIFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXRcbn0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQmxvY2ssIEJsb2NrUGVybXV0YXRpb24gfSBmcm9tIFwiLi4vYmxvY2tcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCIuLi9zZXJlbml0eVwiO1xuaW1wb3J0IHsgQ29tbWFuZEV4ZWN1dGlvblN0YXRlIH0gZnJvbSBcIi4uL2NvbW1hbmRzXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIi4vd29ybGRcIjtcbmltcG9ydCB7IFRlcnJhaW5HZW5lcmF0b3IgfSBmcm9tIFwiLi9nZW5lcmF0b3JcIjtcbmltcG9ydCB7IENodW5rIH0gZnJvbSBcIi4vY2h1bmtcIjtcbmltcG9ydCB7IFRpY2tTY2hlZHVsZSB9IGZyb20gXCIuL3NjaGVkdWxlXCI7XG5cbmNvbnN0IERlZmF1bHREaW1lbnNpb25Qcm9wZXJ0aWVzOiBEaW1lbnNpb25Qcm9wZXJ0aWVzID0ge1xuICBpZGVudGlmaWVyOiBcIm92ZXJ3b3JsZFwiLFxuICB0eXBlOiBEaW1lbnNpb25UeXBlLk92ZXJ3b3JsZCxcbiAgZ2VuZXJhdG9yOiBcInZvaWRcIixcbiAgdmlld0Rpc3RhbmNlOiAyMCxcbiAgc2ltdWxhdGlvbkRpc3RhbmNlOiAxMCxcbiAgc3Bhd25Qb3NpdGlvbjogWzAsIDMyNzY3LCAwXVxufTtcblxuY2xhc3MgRGltZW5zaW9uIHtcbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgb2YgdGhlIGRpbWVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wZXJ0aWVzOiBEaW1lbnNpb25Qcm9wZXJ0aWVzID0gRGVmYXVsdERpbWVuc2lvblByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpbWVuc2lvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCB0aGF0IHRoZSBkaW1lbnNpb24gYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JsZDogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0b3Igb2YgdGhlIGRpbWVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnZW5lcmF0b3I6IFRlcnJhaW5HZW5lcmF0b3I7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdGllcyBpbiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IE1hcDxiaWdpbnQsIEVudGl0eT4oKTtcblxuICAvKipcbiAgICogVGhlIGJsb2NrcyBpbiB0aGUgZGltZW5zaW9uIHRoYXQgY29udGFpbiBkYXRhLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBNYXA8YmlnaW50LCBCbG9jaz4oKTtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBjaHVua3MgdGhhdCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgYnkgdGhlIGNsaWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmlld0Rpc3RhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy52aWV3RGlzdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBjaHVua3MgdGhhdCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgYnkgdGhlIGNsaWVudC5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmlld0Rpc3RhbmNlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnByb3BlcnRpZXMudmlld0Rpc3RhbmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGluIGNodW5rcyB0aGF0IGVudGl0aWVzIHdpbGwgYmUgc2ltdWxhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBzaW11bGF0aW9uRGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnNpbXVsYXRpb25EaXN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgaW4gY2h1bmtzIHRoYXQgZW50aXRpZXMgd2lsbCBiZSBzaW11bGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc2V0IHNpbXVsYXRpb25EaXN0YW5jZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLnNpbXVsYXRpb25EaXN0YW5jZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzcGF3biBwb3NpdGlvbiBvZiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBzcGF3blBvc2l0aW9uKCk6IFZlY3RvcjNmIHtcbiAgICAvLyBHZXQgdGhlIHNwYXduIHBvc2l0aW9uIGZyb20gdGhlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwb3NpdGlvbiA9IFZlY3RvcjNmLmZyb21BcnJheSh0aGlzLnByb3BlcnRpZXMuc3Bhd25Qb3NpdGlvbik7XG5cbiAgICAvLyBGaW5kIHRoZSBzcGF3biBwb3NpdGlvbiBpZiBpdCBpcyBhdCB0aGUgbWF4aW11bSBoZWlnaHRcbiAgICAvLyBUaGlzIHdpbGwgZGV0ZXJtaW5lIHRoZSB0b3Btb3N0IGJsb2NrIGF0IHRoZSBzcGF3biBwb3NpdGlvblxuICAgIGlmIChwb3NpdGlvbi55ID49IDMyNzY3KSB7XG4gICAgICAvLyBHZXQgdGhlIHRvcG1vc3QgYmxvY2sgYXQgdGhlIHNwYXduIHBvc2l0aW9uXG4gICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0VG9wbW9zdEJsb2NrKHBvc2l0aW9uKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGF3biBwb3NpdGlvbiB0byB0aGUgdG9wbW9zdCBibG9ja1xuICAgICAgaWYgKGJsb2NrKSBwb3NpdGlvbi55ID0gYmxvY2sucG9zaXRpb24ueSArIDM7XG4gICAgICAvLyBTZXQgdGhlIHNwYXduIHBvc2l0aW9uIHRvIHRoZSB0b3Btb3N0IGJsb2NrXG4gICAgICBlbHNlIHBvc2l0aW9uLnkgPSAwO1xuXG4gICAgICAvLyBTZXQgdGhlIHNwYXduIHBvc2l0aW9uIGluIHRoZSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnNwYXduUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHNwYXduIHBvc2l0aW9uXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzcGF3biBwb3NpdGlvbiBvZiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHNldCBzcGF3blBvc2l0aW9uKHZhbHVlOiBWZWN0b3IzZikge1xuICAgIHRoaXMucHJvcGVydGllcy5zcGF3blBvc2l0aW9uID0gW3ZhbHVlLngsIHZhbHVlLnksIHZhbHVlLnpdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZGltZW5zaW9uIGZvciBhIHdvcmxkLlxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRoYXQgdGhlIGRpbWVuc2lvbiB3aWxsIGJlbG9uZyB0by5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIGRpbWVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3JsZDogV29ybGQsIHByb3BlcnRpZXM/OiBEaW1lbnNpb25Qcm9wZXJ0aWVzKSB7XG4gICAgLy8gQXNzaWduIHRoZSBzZXJlbml0eSBpbnN0YW5jZSAmIHdvcmxkXG4gICAgdGhpcy5zZXJlbml0eSA9IHdvcmxkLnNlcmVuaXR5O1xuICAgIHRoaXMud29ybGQgPSB3b3JsZDtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgZGltZW5zaW9uIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdERpbWVuc2lvblByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEdldCB0aGUgZ2VuZXJhdG9yIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgY29uc3QgZ2VuZXJhdG9yID0gdGhpcy5zZXJlbml0eS5nZXRHZW5lcmF0b3IodGhpcy5wcm9wZXJ0aWVzLmdlbmVyYXRvcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZ2VuZXJhdG9yIGV4aXN0c1xuICAgIGlmICghZ2VuZXJhdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGZpbmQgZ2VuZXJhdG9yIFwiJHt0aGlzLnByb3BlcnRpZXMuZ2VuZXJhdG9yfVwiIGZvciBkaW1lbnNpb24gXCIke3RoaXMucHJvcGVydGllcy5pZGVudGlmaWVyfVwiYFxuICAgICAgKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgZ2VuZXJhdG9yIHRvIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmdlbmVyYXRvciA9IG5ldyBnZW5lcmF0b3IodGhpcywgeyBzZWVkOiB3b3JsZC5wcm9wZXJ0aWVzLnNlZWQgfSk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIGlkZW50aWZpZXIgYW5kIHR5cGVcbiAgICB0aGlzLmlkZW50aWZpZXIgPSB0aGlzLnByb3BlcnRpZXMuaWRlbnRpZmllcjtcbiAgICB0aGlzLnR5cGUgPSB0aGlzLnByb3BlcnRpZXMudHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkaW1lbnNpb24gaW5kZXggaW4gdGhlIHdvcmxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGltZW5zaW9uIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGluZGV4T2YoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gWy4uLnRoaXMud29ybGQuZGltZW5zaW9ucy52YWx1ZXMoKV0uaW5kZXhPZih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaWNrcyB0aGUgZGltZW5zaW9uIHdpdGggYSBnaXZlbiBkZWx0YSB0aWNrLlxuICAgKiBAcGFyYW0gZGVsdGFUaWNrIFRoZSBkZWx0YSB0aWNrIHRvIHRpY2sgdGhlIGRpbWVuc2lvbiB3aXRoLlxuICAgKi9cbiAgcHVibGljIG9uVGljayhkZWx0YVRpY2s6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBubyBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb25cbiAgICBpZiAodGhpcy5nZXRQbGF5ZXJzKCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBHZXQgYWxsIHRoZSBwbGF5ZXIgcG9zaXRpb25zIGluIHRoZSBkaW1lbnNpb24uXG4gICAgY29uc3QgcGxheWVyUG9zaXRpb25zID0gdGhpcy5nZXRQbGF5ZXJzKCkubWFwKChwbGF5ZXIpID0+IHBsYXllci5wb3NpdGlvbik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgZGltZW5zaW9uXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgdGhpcy5lbnRpdGllcy52YWx1ZXMoKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwbGF5ZXIgd2l0aGluIHRoZSBzaW11bGF0aW9uIGRpc3RhbmNlIHRvIHRpY2sgdGhlIGVudGl0eVxuICAgICAgY29uc3QgaW5TaW11bGF0aW9uUmFuZ2UgPSBwbGF5ZXJQb3NpdGlvbnMuc29tZSgocG9zaXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBwb3NpdGlvbi5kaXN0YW5jZShlbnRpdHkucG9zaXRpb24pIDw9IHRoaXMuc2ltdWxhdGlvbkRpc3RhbmNlIDw8IDRcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaWNrIHRoZSBlbnRpdHkgaWYgaXQgaXMgaW4gc2ltdWxhdGlvbiByYW5nZVxuICAgICAgaWYgKGluU2ltdWxhdGlvblJhbmdlKSB7XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHRyYWl0cyBpbiB0aGUgZW50aXR5XG4gICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgZW50aXR5LnRyYWl0cy52YWx1ZXMoKSlcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVGljayB0aGUgdHJhaXRcbiAgICAgICAgICAgIHRyYWl0Lm9uVGljaz8uKGRlbHRhVGljayk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgICAgICB0aGlzLndvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB0aWNrIGVudGl0eSB0cmFpdCBcIiR7dHJhaXQuaWRlbnRpZmllcn1cIiBmb3IgZW50aXR5IFwiJHtlbnRpdHkudHlwZS5pZGVudGlmaWVyfToke2VudGl0eS51bmlxdWVJZH1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBlbnRpdHlcbiAgICAgICAgICAgIGVudGl0eS50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIGludmVudG9yeSB0cmFpdFxuICAgICAgICBpZiAoZW50aXR5Lmhhc1RyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IHRyYWl0IGZyb20gdGhlIGVudGl0eVxuICAgICAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGludmVudG9yeVxuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb250YWluZXIuc3RvcmFnZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgbnVsbFxuICAgICAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgdHJhaXRzIGluIHRoZSBpdGVtXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGl0ZW0udHJhaXRzLnZhbHVlcygpKVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRpY2sgdGhlIGl0ZW0gdHJhaXRcbiAgICAgICAgICAgICAgICB0cmFpdC5vblRpY2s/LihkZWx0YVRpY2spO1xuICAgICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIHRpY2sgaXRlbSB0cmFpdCBcIiR7dHJhaXQuaWRlbnRpZmllcn1cIiBmb3IgaXRlbSBcIiR7aXRlbS50eXBlLmlkZW50aWZpZXJ9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgaXRlbVxuICAgICAgICAgICAgICAgIGl0ZW0udHJhaXRzLmRlbGV0ZSh0cmFpdC5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJsb2NrcyBpbiB0aGUgZGltZW5zaW9uXG4gICAgZm9yIChjb25zdCBibG9jayBvZiB0aGlzLmJsb2Nrcy52YWx1ZXMoKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwbGF5ZXIgd2l0aGluIHRoZSBzaW11bGF0aW9uIGRpc3RhbmNlIHRvIHRpY2sgdGhlIGJsb2NrXG4gICAgICBjb25zdCBpblNpbXVsYXRpb25SYW5nZSA9IHBsYXllclBvc2l0aW9ucy5zb21lKChwbGF5ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHBsYXllci5kaXN0YW5jZShibG9jay5wb3NpdGlvbikgPD0gdGhpcy5zaW11bGF0aW9uRGlzdGFuY2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGljayB0aGUgYmxvY2sgaWYgaXQgaXMgaW4gc2ltdWxhdGlvbiByYW5nZVxuICAgICAgaWYgKGluU2ltdWxhdGlvblJhbmdlKSB7XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHRyYWl0cyBpbiB0aGUgYmxvY2tcbiAgICAgICAgLy8gVHJ5IHRvIHRpY2sgdGhlIGJsb2NrIHRyYWl0XG4gICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgYmxvY2sudHJhaXRzLnZhbHVlcygpKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0cmFpdC5vblRpY2s/LihkZWx0YVRpY2spO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgICAgICAgdGhpcy53b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gdGljayBibG9jayB0cmFpdCBcIiR7dHJhaXQuaWRlbnRpZmllcn1cIiBmb3IgYmxvY2sgXCIke2Jsb2NrLnBvc2l0aW9uLnh9LCAke2Jsb2NrLnBvc2l0aW9uLnl9LCAke2Jsb2NrLnBvc2l0aW9uLnp9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgYmxvY2tcbiAgICAgICAgICAgIGJsb2NrLnRyYWl0cy5kZWxldGUodHJhaXQuaWRlbnRpZmllcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdvcmxkIHRoYXQgdGhlIGRpbWVuc2lvbiBiZWxvbmdzIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgd29ybGQgdGhhdCB0aGUgZGltZW5zaW9uIGJlbG9uZ3MgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0V29ybGQoKTogV29ybGQge1xuICAgIHJldHVybiB0aGlzLndvcmxkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjaHVuayBmcm9tIHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgeCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3ogVGhlIGNodW5rIHogY29vcmRpbmF0ZS5cbiAgICogQHJldHVybnMgVGhlIGNodW5rIGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2h1bmsoY3g6IG51bWJlciwgY3o6IG51bWJlcik6IENodW5rIHtcbiAgICAvLyBSZWFkIHRoZSBjaHVuayBmcm9tIHRoZSBwcm92aWRlclxuICAgIGNvbnN0IGNodW5rID0gdGhpcy53b3JsZC5wcm92aWRlci5yZWFkQ2h1bmsoY3gsIGN6LCB0aGlzKTtcblxuICAgIC8vIFJldHVybiB0aGUgY2h1bmtcbiAgICByZXR1cm4gY2h1bms7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGNodW5rIGluIHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldENodW5rKGNodW5rOiBDaHVuayk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBDaHVua1dyaXRlU2lnbmFsXG4gICAgLy8gY29uc3Qgc2lnbmFsID0gbmV3IENodW5rV3JpdGVTaWduYWwoY2h1bmssIHRoaXMpO1xuICAgIC8vIGNvbnN0IHZhbHVlID0gc2lnbmFsLmVtaXQoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzaWduYWwgd2FzIGF0dGVtcHRlZCB0byBiZSBjYW5jZWxsZWRcbiAgICAvLyBpZiAodmFsdWUgPT09IGZhbHNlKVxuICAgIC8vICAgLy8gTG9nIGEgd2FybmluZyB0byB0aGUgY29uc29sZSwgYXMgdGhpcyBzaWduYWwgY2Fubm90IGJlIGNhbmNlbGxlZFxuICAgIC8vICAgdGhpcy53b3JsZC5sb2dnZXIud2FybihcbiAgICAvLyAgICAgYENodW5rIHdyaXRlIHNpZ25hbCBjYW5ub3QgYmUgY2FuY2VsbGVkLCBjaHVuazogJHtjaHVuay54fSwgJHtjaHVuay56fWBcbiAgICAvLyAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb25cbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLmdldFBsYXllcnMoKSkge1xuICAgICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBjaHVuayByZW5kZXJpbmcgdHJhaXRcbiAgICAgIGNvbnN0IHRyYWl0ID0gcGxheWVyLmdldFRyYWl0KFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyB0aGUgY2h1bmsgYmVpbmcgc2V0XG4gICAgICBpZiAoIXRyYWl0LmNodW5rcy5oYXMoY2h1bmsuaGFzaCkpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTZW5kIHRoZSBjaHVuayB0byB0aGUgcGxheWVyXG4gICAgICB0cmFpdC5zZW5kKGNodW5rKTtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgY2h1bmsgdG8gdGhlIHByb3ZpZGVyXG4gICAgcmV0dXJuIHRoaXMud29ybGQucHJvdmlkZXIud3JpdGVDaHVuayhjaHVuaywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGJsb2NrIGZyb20gdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldEJsb2NrKHBvc2l0aW9uOiBJUG9zaXRpb24pOiBCbG9jayB7XG4gICAgLy8gQ29udmVydCB0aGUgcG9zaXRpb24gdG8gYSBibG9jayBwb3NpdGlvblxuICAgIGNvbnN0IGJsb2NrUG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLmZyb20ocG9zaXRpb24pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBibG9jayBoYXNoIHVzaW5nIHRoZSBwb3NpdGlvblxuICAgIGNvbnN0IGhhc2ggPSBCbG9ja1Bvc2l0aW9uLmhhc2goYmxvY2tQb3NpdGlvbik7XG5cbiAgICAvLyBHZXQgdGhlIGJsb2NrIGZyb20gdGhlIGJsb2NrIGNhY2hlXG4gICAgY29uc3QgYmxvY2sgPSB0aGlzLmJsb2Nrcy5nZXQoaGFzaCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIGlmIGl0IGV4aXN0c1xuICAgIGlmIChibG9jaykgcmV0dXJuIGJsb2NrO1xuICAgIGVsc2Uge1xuICAgICAgLy8gQ29udmVydCB0aGUgYmxvY2sgcG9zaXRpb24gdG8gYSBjaHVuayBwb3NpdGlvblxuICAgICAgY29uc3QgY3ggPSBibG9ja1Bvc2l0aW9uLnggPj4gNDtcbiAgICAgIGNvbnN0IGN6ID0gYmxvY2tQb3NpdGlvbi56ID4+IDQ7XG5cbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBjaHVuayB0aGUgYmxvY2sgd2lsbCBiZSBpblxuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLmdldENodW5rKGN4LCBjeik7XG5cbiAgICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gZnJvbSB0aGUgY2h1bmtcbiAgICAgIGNvbnN0IHBlcm11dGF0aW9uID0gY2h1bmsuZ2V0UGVybXV0YXRpb24oYmxvY2tQb3NpdGlvbik7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBibG9jayB3aXRoIHRoZSBkaW1lbnNpb24sIHBvc2l0aW9uLCBhbmQgcGVybXV0YXRpb25cbiAgICAgIGNvbnN0IGJsb2NrID0gbmV3IEJsb2NrKHRoaXMsIGJsb2NrUG9zaXRpb24sIHBlcm11dGF0aW9uKTtcblxuICAgICAgLy8gR2V0IHRoZSB0cmFpdHMgZnJvbSB0aGUgYmxvY2sgcGFsZXR0ZVxuICAgICAgY29uc3QgdHJhaXRzID0gdGhpcy53b3JsZC5ibG9ja1BhbGV0dGUuZ2V0UmVnaXN0cnkoXG4gICAgICAgIHBlcm11dGF0aW9uLnR5cGUuaWRlbnRpZmllclxuICAgICAgKTtcblxuICAgICAgLy8gRmV0Y2ggYW55IHRyYWl0cyB0aGF0IGFwcGx5IHRvIHRoZSBiYXNlIHR5cGUgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIHBlcm11dGF0aW9uLnR5cGUuY29tcG9uZW50cykge1xuICAgICAgICAvLyBHZXQgdGhlIHRyYWl0IGZyb20gdGhlIGJsb2NrIHBhbGV0dGUgdXNpbmcgdGhlIGlkZW50aWZpZXJcbiAgICAgICAgY29uc3QgdHJhaXQgPSB0aGlzLndvcmxkLmJsb2NrUGFsZXR0ZS5nZXRUcmFpdChpZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzXG4gICAgICAgIGlmICh0cmFpdCkgdHJhaXRzLnB1c2godHJhaXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBGZXRjaCBhbnkgdHJhaXRzIHRoYXQgYXJlIGJsb2NrIHN0YXRlIHNwZWNpZmljXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwZXJtdXRhdGlvbi5zdGF0ZSkpIHtcbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0cmFpdCBpbiB0aGUgcmVnaXN0cnkuXG4gICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy53b3JsZC5ibG9ja1BhbGV0dGUuZ2V0QWxsVHJhaXRzKCkpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBrZXlcbiAgICAgICAgICBpZiAodHJhaXQuaWRlbnRpZmllciA9PT0ga2V5KSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgbGlzdFxuICAgICAgICAgICAgdHJhaXRzLnB1c2godHJhaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSB0cmFpdHMgYW5kIGFwcGx5IHRoZW0gdG8gdGhlIGJsb2NrXG4gICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRyYWl0cykgYmxvY2suYWRkVHJhaXQodHJhaXQpO1xuXG4gICAgICAvLyBJZiB0aGUgYmxvY2sgaGFzIGNvbXBvbmVudHMgb3IgdHJhaXRzLCB3ZSB3aWxsIGNhY2hlIHRoZSBibG9ja1xuICAgICAgaWYgKGJsb2NrLmNvbXBvbmVudHMuc2l6ZSA+IDAgfHwgYmxvY2sudHJhaXRzLnNpemUgPiAwKVxuICAgICAgICB0aGlzLmJsb2Nrcy5zZXQoaGFzaCwgYmxvY2spO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGJsb2NrXG4gICAgICByZXR1cm4gYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvcG1vc3QgYmxvY2sgaW4gd2hpY2ggdGhlIHBlcm11dGF0aW9uIGlzIG5vdCBhaXIsIGF0IHRoZSBnaXZlbiBYIGFuZCBaIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBUaGUgdG9wbW9zdCBibG9jayBpbiB3aGljaCB0aGUgcGVybXV0YXRpb24gaXMgbm90IGFpci5cbiAgICovXG4gIHB1YmxpYyBnZXRUb3Btb3N0QmxvY2socG9zaXRpb246IElQb3NpdGlvbik6IEJsb2NrIHtcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgY2h1bmtcbiAgICBjb25zdCBjaHVuayA9IHRoaXMuZ2V0Q2h1bmsocG9zaXRpb24ueCA+PiA0LCBwb3NpdGlvbi56ID4+IDQpO1xuXG4gICAgLy8gR2V0IHRoZSB0b3Btb3N0IGxldmVsIHRoYXQgaXMgbm90IGFpclxuICAgIGNvbnN0IHRvcExldmVsID0gY2h1bmsuZ2V0VG9wbW9zdExldmVsKHBvc2l0aW9uKTtcblxuICAgIC8vIFJldHVybiB0aGUgYmxvY2tcbiAgICByZXR1cm4gdGhpcy5nZXRCbG9jayh7IC4uLnBvc2l0aW9uLCB5OiB0b3BMZXZlbCB9KTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBwZXJtdXRhdGlvbiBvZiBhIGJsb2NrIGF0IGEgZ2l2ZW4gcG9zaXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdvbid0IGNvbnN0cnVjdCBhIGJsb2NrIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jay5cbiAgICogQHJldHVybnMgVGhlIGJsb2NrIHBlcm11dGF0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0UGVybXV0YXRpb24ocG9zaXRpb246IElQb3NpdGlvbik6IEJsb2NrUGVybXV0YXRpb24ge1xuICAgIC8vIENvbnZlcnQgdGhlIHBvc2l0aW9uIHRvIGEgYmxvY2sgcG9zaXRpb25cbiAgICBjb25zdCBibG9ja1Bvc2l0aW9uID0gcG9zaXRpb24gYXMgQmxvY2tQb3NpdGlvbjtcblxuICAgIC8vIENvbnZlcnQgdGhlIGJsb2NrIHBvc2l0aW9uIHRvIGEgY2h1bmsgcG9zaXRpb25cbiAgICBjb25zdCBjeCA9IGJsb2NrUG9zaXRpb24ueCA+PiA0O1xuICAgIGNvbnN0IGN6ID0gYmxvY2tQb3NpdGlvbi56ID4+IDQ7XG5cbiAgICAvLyBHZXQgdGhlIGNodW5rIG9mIHRoZSBwcm92aWRlZCBwb3NpdGlvblxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5nZXRDaHVuayhjeCwgY3opO1xuXG4gICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBmcm9tIHRoZSBjaHVua1xuICAgIHJldHVybiBjaHVuay5nZXRQZXJtdXRhdGlvbih7IHg6IGN4LCB5OiBibG9ja1Bvc2l0aW9uLnksIHo6IGN6IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyb2FkY2FzdHMgYSBtZXNzYWdlIHRvIGFsbCBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJyb2FkY2FzdC5cbiAgICovXG4gIHB1YmxpYyBzZW5kTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb25zdHJ1Y3QgdGhlIHRleHQgcGFja2V0LlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBUZXh0UGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHBhY2tldCBkYXRhLlxuICAgIHBhY2tldC50eXBlID0gVGV4dFBhY2tldFR5cGUuUmF3O1xuICAgIHBhY2tldC5uZWVkc1RyYW5zbGF0aW9uID0gZmFsc2U7XG4gICAgcGFja2V0LnNvdXJjZSA9IG51bGw7XG4gICAgcGFja2V0Lm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHBhY2tldC5wYXJhbWV0ZXJzID0gbnVsbDtcbiAgICBwYWNrZXQueHVpZCA9IFwiXCI7XG4gICAgcGFja2V0LnBsYXRmb3JtQ2hhdElkID0gXCJcIjtcbiAgICBwYWNrZXQuZmlsdGVyZWQgPSBtZXNzYWdlO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0LlxuICAgIHRoaXMuYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIHBsYXllcnMgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgcGxheWVycy5cbiAgICovXG4gIHB1YmxpYyBnZXRQbGF5ZXJzKCk6IEFycmF5PFBsYXllcj4ge1xuICAgIHJldHVybiBbLi4udGhpcy5lbnRpdGllcy52YWx1ZXMoKV0uZmlsdGVyKChlbnRpdHkpID0+IGVudGl0eS5pc1BsYXllcigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGVudGl0eSBmcm9tIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0RW50aXR5KGlkOiBiaWdpbnQsIHJ1bnRpbWVJZCA9IGZhbHNlKTogRW50aXR5IHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGlkIGlzIGEgcnVudGltZSBpZFxuICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBnZXQgdGhlIGVudGl0eSBieSB0aGUgdW5pcXVlIGlkXG4gICAgaWYgKCFydW50aW1lSWQpIHJldHVybiB0aGlzLmVudGl0aWVzLmdldChpZCkgPz8gbnVsbDtcbiAgICAvLyBJZiB0aGUgaWQgaXMgYSBydW50aW1lIGlkLCB3ZSB3aWxsIGdldCB0aGUgZW50aXR5IGJ5IHRoZSBydW50aW1lIGlkXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgWy4uLnRoaXMuZW50aXRpZXMudmFsdWVzKCldLmZpbmQoKGVudGl0eSkgPT4gZW50aXR5LnJ1bnRpbWVJZCA9PT0gaWQpIHx8XG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIGVudGl0aWVzIGluIHRoZSBkaW1lbnNpb24uXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVudGl0aWVzLlxuICAgKi9cbiAgcHVibGljIGdldEVudGl0aWVzKCk6IEFycmF5PEVudGl0eT4ge1xuICAgIHJldHVybiBbLi4udGhpcy5lbnRpdGllcy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogRmlsbHMgYSByZWdpb24gd2l0aCBhIHBlcm11dGF0aW9uLlxuICAgKiBAcGFyYW0gZnJvbSBUaGUgc3RhcnRpbmcgcG9zaXRpb24uXG4gICAqIEBwYXJhbSB0byBUaGUgZW5kaW5nIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gcGVybXV0YXRpb24gVGhlIHBlcm11dGF0aW9uIHRvIGZpbGwgdGhlIHJlZ2lvbiB3aXRoLlxuICAgKi9cbiAgcHVibGljIGZpbGwoXG4gICAgZnJvbTogSVBvc2l0aW9uLFxuICAgIHRvOiBJUG9zaXRpb24sXG4gICAgcGVybXV0YXRpb246IEJsb2NrUGVybXV0YXRpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBtaW4gYW5kIG1heCBjb29yZGluYXRlc1xuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbihmcm9tLngsIHRvLngpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbihmcm9tLnksIHRvLnkpO1xuICAgIGNvbnN0IG1pblogPSBNYXRoLm1pbihmcm9tLnosIHRvLnopO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heChmcm9tLngsIHRvLngpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heChmcm9tLnksIHRvLnkpO1xuICAgIGNvbnN0IG1heFogPSBNYXRoLm1heChmcm9tLnosIHRvLnopO1xuXG4gICAgLy8gSG9sZCB0aGUgdXBkYXRlZCBjaHVua3NcbiAgICBjb25zdCB1cGRhdGVkQ2h1bmtzID0gbmV3IFNldDxDaHVuaz4oKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgY29vcmRpbmF0ZXNcbiAgICBmb3IgKGxldCB4ID0gbWluWDsgeCA8PSBtYXhYOyB4KyspIHtcbiAgICAgIGZvciAobGV0IHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB6ID0gbWluWjsgeiA8PSBtYXhaOyB6KyspIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGNodW5rIG9mIHRoZSBibG9ja1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5nZXRDaHVuayh4ID4+IDQsIHogPj4gNCk7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgICAgIGNodW5rLnNldFBlcm11dGF0aW9uKHsgeCwgeSwgeiB9LCBwZXJtdXRhdGlvbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIGNodW5rIHRvIHRoZSB1cGRhdGVkIGNodW5rc1xuICAgICAgICAgIHVwZGF0ZWRDaHVua3MuYWRkKGNodW5rKTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgY2h1bmsgdG8gZGlydHlcbiAgICAgICAgICBjaHVuay5kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIHVwZGF0ZWQgY2h1bmtzXG4gICAgZm9yIChjb25zdCBjaHVuayBvZiB1cGRhdGVkQ2h1bmtzKSB0aGlzLnNldENodW5rKGNodW5rKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYW4gZW50aXR5IGluIHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGVudGl0eS5cbiAgICogQHJldHVybnMgVGhlIGVudGl0eSB0aGF0IHdhcyBzcGF3bmVkLlxuICAgKi9cbiAgcHVibGljIHNwYXduRW50aXR5KFxuICAgIHR5cGU6IEVudGl0eUlkZW50aWZpZXIgfCBFbnRpdHlUeXBlLFxuICAgIHBvc2l0aW9uOiBWZWN0b3IzZlxuICApOiBFbnRpdHkge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHkgaW5zdGFuY2Ugd2l0aCB0aGUgZGltZW5zaW9uIGFuZCB0eXBlXG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eSh0aGlzLCB0eXBlKTtcblxuICAgIC8vIEFzIGEgU2VyZW5pdHkgc3RhbmRhcmQsIHdlIHdpbGwgYWRkIHRoZSBncmF2aXR5LCBwaHlzaWNzLCBtb3ZlbWVudCB0cmFpdHMgdG8gdGhlIGVudGl0eVxuICAgIGVudGl0eS5hZGRUcmFpdChFbnRpdHlHcmF2aXR5VHJhaXQpO1xuICAgIGVudGl0eS5hZGRUcmFpdChFbnRpdHlQaHlzaWNzVHJhaXQpO1xuICAgIGVudGl0eS5hZGRUcmFpdChFbnRpdHlNb3ZlbWVudFRyYWl0KTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IHBvc2l0aW9uXG4gICAgZW50aXR5LnBvc2l0aW9uLnggPSBwb3NpdGlvbi54O1xuICAgIGVudGl0eS5wb3NpdGlvbi55ID0gcG9zaXRpb24ueTtcbiAgICBlbnRpdHkucG9zaXRpb24ueiA9IHBvc2l0aW9uLno7XG5cbiAgICAvLyBTcGF3biB0aGUgZW50aXR5XG4gICAgcmV0dXJuIGVudGl0eS5zcGF3bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhbiBpdGVtIGluIHRoZSBkaW1lbnNpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtU3RhY2sgVGhlIGl0ZW0gc3RhY2sgb2YgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgdGhhdCB3YXMgc3Bhd25lZC5cbiAgICovXG4gIHB1YmxpYyBzcGF3bkl0ZW08VCBleHRlbmRzIGtleW9mIEl0ZW1zPihcbiAgICBpdGVtU3RhY2s6IEl0ZW1TdGFjazxUPixcbiAgICBwb3NpdGlvbjogVmVjdG9yM2ZcbiAgKTogRW50aXR5IHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRW50aXR5IGluc3RhbmNlXG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eSh0aGlzLCBFbnRpdHlJZGVudGlmaWVyLkl0ZW0pO1xuXG4gICAgLy8gU2V0IHRoZSB3b3JsZCBpbiB0aGUgaXRlbSBzdGFjayBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFpdGVtU3RhY2sud29ybGQpIGl0ZW1TdGFjay53b3JsZCA9IHRoaXMud29ybGQ7XG5cbiAgICAvLyBTZXQgdGhlIGVudGl0eSBwb3NpdGlvblxuICAgIGVudGl0eS5wb3NpdGlvbi54ID0gcG9zaXRpb24ueDtcbiAgICBlbnRpdHkucG9zaXRpb24ueSA9IHBvc2l0aW9uLnk7XG4gICAgZW50aXR5LnBvc2l0aW9uLnogPSBwb3NpdGlvbi56O1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0gdHJhaXQsIHRoaXMgd2lsbCByZWdpc3RlciB0aGUgaXRlbSB0byB0aGUgZW50aXR5XG4gICAgY29uc3QgdHJhaXQgPSBuZXcgRW50aXR5SXRlbVN0YWNrVHJhaXQoZW50aXR5KTtcbiAgICB0cmFpdC5pdGVtU3RhY2sgPSBpdGVtU3RhY2s7XG5cbiAgICAvLyBBZGQgZ3Jhdml0eSBhbmQgcGh5c2ljcyB0cmFpdHMgdG8gdGhlIGVudGl0eVxuICAgIGVudGl0eS5hZGRUcmFpdChFbnRpdHlHcmF2aXR5VHJhaXQpO1xuICAgIGVudGl0eS5hZGRUcmFpdChFbnRpdHlQaHlzaWNzVHJhaXQpO1xuICAgIGVudGl0eS5hZGRUcmFpdChFbnRpdHlNb3ZlbWVudFRyYWl0KTtcblxuICAgIC8vIFNwYXduIHRoZSBpdGVtIGVudGl0eVxuICAgIGVudGl0eS5zcGF3bigpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpdGVtIGVudGl0eVxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBjb21tYW5kIGluIHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuXG4gICAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvZiB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyBleGVjdXRlQ29tbWFuZDxUID0gdW5rbm93bj4oY29tbWFuZDogc3RyaW5nKTogQ29tbWFuZFJlc3BvbnNlPFQ+IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY29tbWFuZCBzdGFydHMgd2l0aCBhIHNsYXNoLCByZW1vdmUgaXQgaWYgaXQgZG9lcyBub3RcbiAgICBpZiAoY29tbWFuZC5zdGFydHNXaXRoKFwiL1wiKSkgY29tbWFuZCA9IGNvbW1hbmQuc2xpY2UoMSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29tbWFuZCBleGVjdXRlIHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBuZXcgQ29tbWFuZEV4ZWN1dGlvblN0YXRlKFxuICAgICAgdGhpcy53b3JsZC5jb21tYW5kcy5nZXRBbGwoKSxcbiAgICAgIGNvbW1hbmQsXG4gICAgICB0aGlzXG4gICAgKTtcblxuICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQgc3RhdGVcbiAgICByZXR1cm4gc3RhdGUuZXhlY3V0ZSgpIGFzIENvbW1hbmRSZXNwb25zZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZSBhbiBleGVjdXRpb24gb2YgYSBmdW5jdGlvbiBhZnRlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGlja3MuXG4gICAqIEBwYXJhbSB0aWNrcyBUaGUgYW1vdW50IG9mIHRpY2tzIHRvIHdhaXQgYmVmb3JlIHRoZSBzY2hlZHVsZSBpcyBjb21wbGV0ZS5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgdGljayBzY2hlZHVsZS5cbiAgICovXG4gIHB1YmxpYyBzY2hlZHVsZSh0aWNrczogbnVtYmVyKTogVGlja1NjaGVkdWxlIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgdGljayBzY2hlZHVsZVxuICAgIGNvbnN0IHNjaGVkdWxlID0gbmV3IFRpY2tTY2hlZHVsZSh0aWNrcywgdGhpcyk7XG5cbiAgICAvLyBBZGQgdGhlIHNjaGVkdWxlIHRvIHRoZSB3b3JsZFxuICAgIHRoaXMud29ybGQuc2NoZWR1bGVzLmFkZChzY2hlZHVsZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHNjaGVkdWxlXG4gICAgcmV0dXJuIHNjaGVkdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyb2FkY2FzdCBwYWNrZXRzIHRvIGFsbCB0aGUgcGxheWVycyBpbiB0aGUgZGltZW5zaW9uLlxuICAgKiBAcGFyYW0gcGFja2V0cyBUaGUgcGFja2V0cyB0byBicm9hZGNhc3QuXG4gICAqL1xuICBwdWJsaWMgYnJvYWRjYXN0KC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgdGhpcy5nZXRQbGF5ZXJzKCkpIHBsYXllci5zZW5kKC4uLnBhY2tldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyb2FkY2FzdCBwYWNrZXRzIHRvIGFsbCB0aGUgcGxheWVycyBpbiB0aGUgZGltZW5zaW9uIGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0gcGFja2V0cyBUaGUgcGFja2V0cyB0byBicm9hZGNhc3QuXG4gICAqL1xuICBwdWJsaWMgYnJvYWRjYXN0SW1tZWRpYXRlKC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgdGhpcy5nZXRQbGF5ZXJzKCkpIHBsYXllci5zZW5kSW1tZWRpYXRlKC4uLnBhY2tldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyb2FkY2FzdCBwYWNrZXRzIHRvIGFsbCB0aGUgcGxheWVycyBpbiB0aGUgZGltZW5zaW9uIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgYnJvYWRjYXN0LlxuICAgKiBAcGFyYW0gcGFja2V0cyBUaGUgcGFja2V0cyB0byBicm9hZGNhc3QuXG4gICAqL1xuICBwdWJsaWMgYnJvYWRjYXN0RXhjZXB0KHBsYXllcjogUGxheWVyLCAuLi5wYWNrZXRzOiBBcnJheTxEYXRhUGFja2V0Pik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIgYW5kIGlzIG5vdCB0aGUgcGxheWVyIHRvIGV4Y2x1ZGVcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKVxuICAgICAgaWYgKGVudGl0eS5pc1BsYXllcigpICYmIGVudGl0eSAhPT0gcGxheWVyKSBlbnRpdHkuc2VuZCguLi5wYWNrZXRzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEaW1lbnNpb24sIERlZmF1bHREaW1lbnNpb25Qcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4vZGltZW5zaW9uXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi93b3JsZFwiO1xuXG5jbGFzcyBUaWNrU2NoZWR1bGUge1xuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiB0aWNrcyB0byB3YWl0IGJlZm9yZSB0aGUgc2NoZWR1bGUgaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZWR1bGVkVGljazogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgdGljayBhdCB3aGljaCB0aGUgc2NoZWR1bGUgd2lsbCBiZSBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wbGV0ZVRpY2s6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrcyB0byBjYWxsIHdoZW4gdGhlIHNjaGVkdWxlIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbGxiYWNrcyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0aWNrIHNjaGVkdWxlLlxuICAgKiBAcGFyYW0gc2NoZWR1bGVkVGljayBUaGUgYW1vdW50IG9mIHRpY2tzIHRvIHdhaXQgYmVmb3JlIHRoZSBzY2hlZHVsZSBpcyBjb21wbGV0ZS5cbiAgICogQHBhcmFtIHdvcmxkT3JEaW1lbnNpb24gVGhlIHdvcmxkIG9yIGRpbWVuc2lvbiB0byBzY2hlZHVsZSB0aGUgdGljayBpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzY2hlZHVsZWRUaWNrOiBiaWdpbnQgfCBudW1iZXIsXG4gICAgd29ybGRPckRpbWVuc2lvbjogV29ybGQgfCBEaW1lbnNpb25cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzY2hlZHVsZWQgdGlja1xuICAgIHRoaXMuc2NoZWR1bGVkVGljayA9IEJpZ0ludChzY2hlZHVsZWRUaWNrKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICBjb25zdCB3b3JsZCA9XG4gICAgICB3b3JsZE9yRGltZW5zaW9uIGluc3RhbmNlb2YgRGltZW5zaW9uXG4gICAgICAgID8gd29ybGRPckRpbWVuc2lvbi53b3JsZFxuICAgICAgICA6IHdvcmxkT3JEaW1lbnNpb247XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGlja1xuICAgIGNvbnN0IGN1cnJlbnRUaWNrID0gd29ybGQuY3VycmVudFRpY2s7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbXBsZXRlIHRpY2tcbiAgICB0aGlzLmNvbXBsZXRlVGljayA9IGN1cnJlbnRUaWNrICsgdGhpcy5zY2hlZHVsZWRUaWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFsbCB0aGUgY2FsbGJhY2tzIGluIHRoZSBzY2hlZHVsZS5cbiAgICovXG4gIHB1YmxpYyBleGVjdXRlKCk6IHZvaWQge1xuICAgIC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3NcbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSBjYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayB0byB0aGUgc2NoZWR1bGUuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLlxuICAgKi9cbiAgcHVibGljIG9uKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gQWRkIHRoZSBjYWxsYmFjayB0byB0aGUgc2NoZWR1bGVcbiAgICB0aGlzLmNhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIHNjaGVkdWxlLlxuICAgKi9cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBhbGwgdGhlIGNhbGxiYWNrc1xuICAgIHRoaXMuY2FsbGJhY2tzLmNsZWFyKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVGlja1NjaGVkdWxlIH07XG4iLCAiaW1wb3J0IHtcbiAgUmVtb3ZlT2JqZWN0aXZlUGFja2V0LFxuICBTY29yZWJvYXJkQWN0aW9uVHlwZSxcbiAgU2V0RGlzcGxheU9iamVjdGl2ZVBhY2tldCxcbiAgU2V0U2NvcmVQYWNrZXQsXG4gIHR5cGUgRGlzcGxheVNsb3RUeXBlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBTY29yZWJvYXJkT2JqZWN0aXZlIH0gZnJvbSBcIi4vb2JqZWN0aXZlXCI7XG5cbmltcG9ydCB0eXBlIHsgU2NvcmVib2FyZE9iamVjdGl2ZURpc3BsYXlPcHRpb25zIH0gZnJvbSBcIi4vZGlzcGxheS1vcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5cbmNsYXNzIFNjb3JlYm9hcmQge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRoZSBzY29yZWJvYXJkIGlzIGJpbmRlZCB0by5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB3b3JsZDogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3RpdmVzIG9mIHRoZSBzY29yZWJvYXJkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9iamVjdGl2ZXMgPSBuZXcgU2V0PFNjb3JlYm9hcmRPYmplY3RpdmU+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IG9iamVjdGl2ZXMgaW4gdGhlIGRpc3BsYXkgc2xvdHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2xvdHMgPSBuZXcgTWFwPERpc3BsYXlTbG90VHlwZSwgU2NvcmVib2FyZE9iamVjdGl2ZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzY29yZWJvYXJkLlxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRoZSBzY29yZWJvYXJkIHdpbGwgYmUgYmluZGVkIHRvLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmxkOiBXb3JsZCkge1xuICAgIHRoaXMud29ybGQgPSB3b3JsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvYmplY3RpdmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvYmplY3RpdmUuXG4gICAqIEByZXR1cm5zIFRoZSBvYmplY3RpdmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBubyBvYmplY3RpdmUgd2FzIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGdldE9iamVjdGl2ZShuYW1lOiBzdHJpbmcpOiBTY29yZWJvYXJkT2JqZWN0aXZlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIG9iamVjdGl2ZXMgYW5kIHJldHVybiB0aGUgb2JqZWN0aXZlIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUuXG4gICAgZm9yIChjb25zdCBvYmplY3RpdmUgb2YgdGhpcy5vYmplY3RpdmVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgb2JqZWN0aXZlIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZS5cbiAgICAgIGlmIChvYmplY3RpdmUub2JqZWN0aXZlTmFtZSA9PT0gbmFtZSkgcmV0dXJuIG9iamVjdGl2ZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIG5vIG9iamVjdGl2ZVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBvYmplY3RpdmUgdG8gdGhlIHNjb3JlYm9hcmQuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvYmplY3RpdmUuXG4gICAqIEBwYXJhbSBkaXNwbGF5IFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIG9iamVjdGl2ZS5cbiAgICogQHJldHVybnMgVGhlIG9iamVjdGl2ZSB0aGF0IHdhcyBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRPYmplY3RpdmUobmFtZTogc3RyaW5nLCBkaXNwbGF5Pzogc3RyaW5nKTogU2NvcmVib2FyZE9iamVjdGl2ZSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdGl2ZSBhbHJlYWR5IGV4aXN0cy5cbiAgICBpZiAodGhpcy5nZXRPYmplY3RpdmUobmFtZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdGl2ZSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0aXZlIGFuZCBhZGQgaXQgdG8gdGhlIHNjb3JlYm9hcmQuXG4gICAgY29uc3Qgb2JqZWN0aXZlID0gbmV3IFNjb3JlYm9hcmRPYmplY3RpdmUodGhpcy53b3JsZCwgbmFtZSwgZGlzcGxheSk7XG5cbiAgICAvLyBBZGQgdGhlIG9iamVjdGl2ZSB0byB0aGUgc2NvcmVib2FyZC5cbiAgICB0aGlzLm9iamVjdGl2ZXMuYWRkKG9iamVjdGl2ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG9iamVjdGl2ZS5cbiAgICByZXR1cm4gb2JqZWN0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIG9iamVjdGl2ZSBmcm9tIHRoZSBzY29yZWJvYXJkLlxuICAgKiBAcGFyYW0gb2JqZWN0aXZlIFRoZSBvYmplY3RpdmUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZU9iamVjdGl2ZShvYmplY3RpdmU6IHN0cmluZyB8IFNjb3JlYm9hcmRPYmplY3RpdmUpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIG9iamVjdGl2ZSBieSBuYW1lIGlmIGl0IGlzIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBvYmplY3RpdmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGRPYmplY3RpdmUgPSB0aGlzLmdldE9iamVjdGl2ZShvYmplY3RpdmUpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgb2JqZWN0aXZlIGV4aXN0c1xuICAgICAgaWYgKCFkT2JqZWN0aXZlKSB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RpdmUgZG9lcyBub3QgZXhpc3RcIik7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgb2JqZWN0aXZlIGZyb20gdGhlIHNjb3JlYm9hcmRcbiAgICAgIHRoaXMub2JqZWN0aXZlcy5kZWxldGUoZE9iamVjdGl2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgb2JqZWN0aXZlIGZyb20gdGhlIHNjb3JlYm9hcmRcbiAgICAgIHRoaXMub2JqZWN0aXZlcy5kZWxldGUob2JqZWN0aXZlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgb2JqZWN0aXZlIGF0IHRoZSBkaXNwbGF5IHNsb3QuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBkaXNwbGF5IHNsb3QgdG8gZ2V0IHRoZSBvYmplY3RpdmUgYXQuXG4gICAqIEByZXR1cm5zIFRoZSBvYmplY3RpdmUgYXQgdGhlIGRpc3BsYXkgc2xvdCwgb3IgdW5kZWZpbmVkIGlmIG5vIG9iamVjdGl2ZSB3YXMgZm91bmQuXG4gICAqL1xuICBwdWJsaWMgZ2V0T2JqZWN0aXZlQXREaXNwbGF5U2xvdChcbiAgICBzbG90OiBEaXNwbGF5U2xvdFR5cGVcbiAgKTogU2NvcmVib2FyZE9iamVjdGl2ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xvdHMuZ2V0KHNsb3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG9iamVjdGl2ZSBhdCB0aGUgZGlzcGxheSBzbG90LlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgZGlzcGxheSBzbG90IHRvIHNldCB0aGUgb2JqZWN0aXZlIGF0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBzZXQgdGhlIG9iamVjdGl2ZSB3aXRoLlxuICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0aXZlIHRoYXQgd2FzIHNldC5cbiAgICovXG4gIHB1YmxpYyBzZXRPYmplY3RpdmVBdERpc3BsYXlTbG90KFxuICAgIHNsb3Q6IERpc3BsYXlTbG90VHlwZSxcbiAgICBvcHRpb25zOiBTY29yZWJvYXJkT2JqZWN0aXZlRGlzcGxheU9wdGlvbnNcbiAgKTogU2NvcmVib2FyZE9iamVjdGl2ZSB7XG4gICAgLy8gU2VwZXJhdGUgdGhlIG9wdGlvbnMgaW50byBvYmplY3RpdmUsIHNvcnRPcmRlciwgYW5kIHBsYXllclxuICAgIGNvbnN0IHsgb2JqZWN0aXZlLCBzb3J0T3JkZXIsIHBsYXllciB9ID0gb3B0aW9ucztcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBkaXNwbGF5IG9iamVjdGl2ZSBwYWNrZXRcbiAgICBjb25zdCBkaXNwbGF5ID0gbmV3IFNldERpc3BsYXlPYmplY3RpdmVQYWNrZXQoKTtcbiAgICBkaXNwbGF5LmRpc3BsYXlTbG90ID0gc2xvdDtcbiAgICBkaXNwbGF5Lm9iamVjdGl2ZU5hbWUgPSBvYmplY3RpdmUub2JqZWN0aXZlTmFtZTtcbiAgICBkaXNwbGF5LmRpc3BsYXlOYW1lID0gb2JqZWN0aXZlLmRpc3BsYXlOYW1lO1xuICAgIGRpc3BsYXkuY3JpdGVyaWFOYW1lID0gXCJkdW1teVwiO1xuICAgIGRpc3BsYXkuc29ydE9yZGVyID0gc29ydE9yZGVyO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHNldCBzY29yZSBwYWNrZXRcbiAgICBjb25zdCBzY29yZXMgPSBuZXcgU2V0U2NvcmVQYWNrZXQoKTtcbiAgICBzY29yZXMudHlwZSA9IFNjb3JlYm9hcmRBY3Rpb25UeXBlLkNoYW5nZTtcbiAgICBzY29yZXMuZW50cmllcyA9IFsuLi5vYmplY3RpdmUucGFydGljaXBhbnRzXS5tYXAoKFtpZGVudGl0eSwgc2NvcmVdKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY29yZWJvYXJkSWQ6IGlkZW50aXR5LmlkZW50aWZpZXIsXG4gICAgICAgIG9iamVjdGl2ZU5hbWU6IG9iamVjdGl2ZS5vYmplY3RpdmVOYW1lLFxuICAgICAgICBzY29yZSxcbiAgICAgICAgaWRlbnRpdHlUeXBlOiBpZGVudGl0eS50eXBlLFxuICAgICAgICBhY3RvclVuaXF1ZUlkOiBpZGVudGl0eS5lbnRpdHk/LnVuaXF1ZUlkID8/IG51bGwsXG4gICAgICAgIGN1c3RvbU5hbWU6IGlkZW50aXR5LmRpc3BsYXlOYW1lXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gU2VuZCB0aGUgZGlzcGxheSBhbmQgc2NvcmVzIHRvIHRoZSBwbGF5ZXIgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgYnJvYWRjYXN0IGl0IHRvIHRoZSB3b3JsZFxuICAgIGlmIChwbGF5ZXIpIHtcbiAgICAgIHBsYXllci5zZW5kKGRpc3BsYXksIHNjb3Jlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29ybGQuYnJvYWRjYXN0KGRpc3BsYXksIHNjb3Jlcyk7XG4gICAgfVxuICAgIC8vIFNldCB0aGUgb2JqZWN0aXZlIGF0IHRoZSBkaXNwbGF5IHNsb3RcbiAgICB0aGlzLnNsb3RzLnNldChzbG90LCBvYmplY3RpdmUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBvYmplY3RpdmUgdGhhdCB3YXMgc2V0XG4gICAgcmV0dXJuIG9iamVjdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIG9iamVjdGl2ZSBhdCB0aGUgZGlzcGxheSBzbG90LlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgZGlzcGxheSBzbG90IHRvIGNsZWFyIHRoZSBvYmplY3RpdmUgYXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGNsZWFyIHRoZSBvYmplY3RpdmUgd2l0aC5cbiAgICogQHJldHVybnMgVGhlIG9iamVjdGl2ZSB0aGF0IHdhcyBjbGVhcmVkLlxuICAgKi9cbiAgcHVibGljIGNsZWFyT2JqZWN0aXZlQXREaXNwbGF5U2xvdChcbiAgICBzbG90OiBEaXNwbGF5U2xvdFR5cGUsXG4gICAgb3B0aW9ucz86IFNjb3JlYm9hcmRPYmplY3RpdmVEaXNwbGF5T3B0aW9uc1xuICApOiBTY29yZWJvYXJkT2JqZWN0aXZlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBHZXQgdGhlIG9iamVjdGl2ZSBhdCB0aGUgZGlzcGxheSBzbG90XG4gICAgY29uc3Qgb2JqZWN0aXZlID0gdGhpcy5zbG90cy5nZXQoc2xvdCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgb2JqZWN0aXZlIGV4aXN0c1xuICAgIGlmICghb2JqZWN0aXZlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHJlbW92ZSBvYmplY3RpdmUgcGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFJlbW92ZU9iamVjdGl2ZVBhY2tldCgpO1xuICAgIHBhY2tldC5vYmplY3RpdmVOYW1lID0gb2JqZWN0aXZlLm9iamVjdGl2ZU5hbWU7XG5cbiAgICBpZiAob3B0aW9ucz8ucGxheWVyKSB7XG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgb3B0aW9ucy5wbGF5ZXIuc2VuZChwYWNrZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgd29ybGRcbiAgICAgIHRoaXMud29ybGQuYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgb2JqZWN0aXZlIGZyb20gdGhlIGRpc3BsYXkgc2xvdFxuICAgICAgdGhpcy5zbG90cy5kZWxldGUoc2xvdCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBvYmplY3RpdmUgZnJvbSB0aGUgZGlzcGxheSBzbG90XG4gICAgcmV0dXJuIG9iamVjdGl2ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBTY29yZWJvYXJkIH07XG4iLCAiaW1wb3J0IHsgU2NvcmVib2FyZEFjdGlvblR5cGUsIFNldFNjb3JlUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgU2NvcmVib2FyZElkZW50aXR5IH0gZnJvbSBcIi4vaWRlbnRpdHlcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBTY29yZWJvYXJkIH0gZnJvbSBcIi4vc2NvcmVib2FyZFwiO1xuXG5jbGFzcyBTY29yZWJvYXJkT2JqZWN0aXZlIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JsZCB0aGUgb2JqZWN0aXZlIGlzIGJpbmRlZCB0by5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB3b3JsZDogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29yZWJvYXJkIHRoZSBvYmplY3RpdmUgaXMgYmluZGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNjb3JlYm9hcmQ6IFNjb3JlYm9hcmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJ0aWNpcGFudHMgb2YgdGhlIG9iamVjdGl2ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXJ0aWNpcGFudHMgPSBuZXcgTWFwPFNjb3JlYm9hcmRJZGVudGl0eSwgbnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0aXZlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9iamVjdGl2ZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgb2JqZWN0aXZlLlxuICAgKi9cbiAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmxkOiBXb3JsZCxcbiAgICBvYmplY3RpdmVOYW1lOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy53b3JsZCA9IHdvcmxkO1xuICAgIHRoaXMuc2NvcmVib2FyZCA9IHdvcmxkLnNjb3JlYm9hcmQ7XG4gICAgdGhpcy5vYmplY3RpdmVOYW1lID0gb2JqZWN0aXZlTmFtZTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUgPz8gb2JqZWN0aXZlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBpZGVudGl0eSBpcyBhIHBhcnRpY2lwYW50IGluIHRoZSBvYmplY3RpdmUuXG4gICAqIEBwYXJhbSBwYXJ0aWNpcGFudCBUaGUgaWRlbnRpdHkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGlkZW50aXR5IGlzIGEgcGFydGljaXBhbnQgaW4gdGhlIG9iamVjdGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGhhc1BhcnRpY2lwYW50KFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHlcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwYXJ0aWNpcGFudHMgYW5kIHJldHVybiB0aGUgaWRlbnRpdHkgd2l0aCB0aGUgbWF0Y2hpbmcgcGFydGljaXBhbnQuXG4gICAgZm9yIChjb25zdCBbaWRlbnRpdHldIG9mIHRoaXMucGFydGljaXBhbnRzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFydGljaXBhbnQgaXMgc2NvcmVib2FyZCBpZGVudGl0eVxuICAgICAgLy8gQW5kIGNoZWNrIGlmIHRoZSBzY29yZWJvYXJkIGlkZW50aXR5IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgaWYgKHBhcnRpY2lwYW50IGluc3RhbmNlb2YgU2NvcmVib2FyZElkZW50aXR5ICYmIGlkZW50aXR5ID09PSBwYXJ0aWNpcGFudClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJ0aWNpcGFudCBpcyBhIGVudGl0eVxuICAgICAgLy8gQW5kIGNoZWNrIGlmIHRoZSBlbnRpdHkgaWRlbnRpdHkgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcnRpY2lwYW50XG4gICAgICBpZiAocGFydGljaXBhbnQgaW5zdGFuY2VvZiBFbnRpdHkgJiYgaWRlbnRpdHkuZW50aXR5ID09PSBwYXJ0aWNpcGFudClcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJ0aWNpcGFudCBpcyBhIHN0cmluZ1xuICAgICAgLy8gQW5kIGNoZWNrIGlmIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGlkZW50aXR5IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcGFydGljaXBhbnQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgaWRlbnRpdHkuZGlzcGxheU5hbWUgPT09IHBhcnRpY2lwYW50XG4gICAgICApXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vIGlkZW50aXR5IHdhcyBmb3VuZC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIGlkZW50aXR5IGZyb20gdGhlIG9iamVjdGl2ZS5cbiAgICogQHBhcmFtIHBhcnRpY2lwYW50IFRoZSBpZGVudGl0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIFRoZSBpZGVudGl0eSBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBnZXRQYXJ0aWNpcGFudChcbiAgICBwYXJ0aWNpcGFudDogRW50aXR5IHwgc3RyaW5nIHwgU2NvcmVib2FyZElkZW50aXR5XG4gICk6IFNjb3JlYm9hcmRJZGVudGl0eSB8IG51bGwge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGFydGljaXBhbnRzIGFuZCByZXR1cm4gdGhlIGlkZW50aXR5IHdpdGggdGhlIG1hdGNoaW5nIHBhcnRpY2lwYW50LlxuICAgIGZvciAoY29uc3QgW2lkZW50aXR5XSBvZiB0aGlzLnBhcnRpY2lwYW50cykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIHNjb3JlYm9hcmQgaWRlbnRpdHlcbiAgICAgIC8vIEFuZCBjaGVjayBpZiB0aGUgc2NvcmVib2FyZCBpZGVudGl0eSBpcyB0aGUgc2FtZSBhcyB0aGUgcGFydGljaXBhbnRcbiAgICAgIGlmIChwYXJ0aWNpcGFudCBpbnN0YW5jZW9mIFNjb3JlYm9hcmRJZGVudGl0eSAmJiBpZGVudGl0eSA9PT0gcGFydGljaXBhbnQpXG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIGEgZW50aXR5XG4gICAgICAvLyBBbmQgY2hlY2sgaWYgdGhlIGVudGl0eSBpZGVudGl0eSBpcyB0aGUgc2FtZSBhcyB0aGUgcGFydGljaXBhbnRcbiAgICAgIGlmIChwYXJ0aWNpcGFudCBpbnN0YW5jZW9mIEVudGl0eSAmJiBpZGVudGl0eS5lbnRpdHkgPT09IHBhcnRpY2lwYW50KVxuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJ0aWNpcGFudCBpcyBhIHN0cmluZ1xuICAgICAgLy8gQW5kIGNoZWNrIGlmIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGlkZW50aXR5IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcGFydGljaXBhbnQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgaWRlbnRpdHkuZGlzcGxheU5hbWUgPT09IHBhcnRpY2lwYW50XG4gICAgICApXG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiBubyBpZGVudGl0eSB3YXMgZm91bmQuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgcGFydGljaXBhbnRzIGluIHRoZSBvYmplY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFydGljaXBhbnRzKCk6IEFycmF5PFNjb3JlYm9hcmRJZGVudGl0eT4ge1xuICAgIHJldHVybiBbLi4udGhpcy5wYXJ0aWNpcGFudHMua2V5cygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcGFydGljaXBhbnQgdG8gdGhlIG9iamVjdGl2ZS5cbiAgICogQHBhcmFtIHBhcnRpY2lwYW50IFRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQgdG8gYWRkLlxuICAgKiBAcGFyYW0gaW5pdGlhbFNjb3JlIFRoZSBpbml0aWFsIHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICovXG4gIHB1YmxpYyBhZGRQYXJ0aWNpcGFudChcbiAgICBwYXJ0aWNpcGFudDogRW50aXR5IHwgc3RyaW5nIHwgU2NvcmVib2FyZElkZW50aXR5LFxuICAgIGluaXRpYWxTY29yZSA9IDBcbiAgKTogU2NvcmVib2FyZElkZW50aXR5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGFydGljaXBhbnQgaXMgYWxyZWFkeSBpbiB0aGUgb2JqZWN0aXZlLlxuICAgIGlmICh0aGlzLmhhc1BhcnRpY2lwYW50KHBhcnRpY2lwYW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcnRpY2lwYW50IGlzIGFscmVhZHkgaW4gdGhlIG9iamVjdGl2ZS5cIik7XG5cbiAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgY29uc3QgaWRlbnRpdHkgPVxuICAgICAgcGFydGljaXBhbnQgaW5zdGFuY2VvZiBTY29yZWJvYXJkSWRlbnRpdHlcbiAgICAgICAgPyBwYXJ0aWNpcGFudFxuICAgICAgICA6IHBhcnRpY2lwYW50IGluc3RhbmNlb2YgRW50aXR5XG4gICAgICAgICAgPyBwYXJ0aWNpcGFudC5zY29yZWJvYXJkSWRlbnRpdHlcbiAgICAgICAgICA6IG5ldyBTY29yZWJvYXJkSWRlbnRpdHkocGFydGljaXBhbnQpO1xuXG4gICAgLy8gU2V0IHRoZSBwYXJ0aWNpcGFudCBpbiB0aGUgb2JqZWN0aXZlLlxuICAgIHRoaXMucGFydGljaXBhbnRzLnNldChpZGVudGl0eSwgaW5pdGlhbFNjb3JlKTtcblxuICAgIC8vIFJldHVybiB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcGFydGljaXBhbnQgZnJvbSB0aGUgb2JqZWN0aXZlIHVzaW5nIHRoZSBzcGVjaWZpZWQgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSBwYXJ0aWNpcGFudCBUaGUgaWRlbnRpdHkgb2YgdGhlIHBhcnRpY2lwYW50IHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFydGljaXBhbnQgd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYXJ0aWNpcGFudChcbiAgICBwYXJ0aWNpcGFudDogRW50aXR5IHwgc3RyaW5nIHwgU2NvcmVib2FyZElkZW50aXR5XG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIEdldCB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5nZXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpdHkgaXMgbnVsbC5cbiAgICBpZiAoIWlkZW50aXR5KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBhcnRpY2lwYW50IGZyb20gdGhlIG9iamVjdGl2ZS5cbiAgICB0aGlzLnBhcnRpY2lwYW50cy5kZWxldGUoaWRlbnRpdHkpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHBhY2tldCB0byByZW1vdmUgdGhlIHNjb3JlLlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXRTY29yZVBhY2tldCgpO1xuICAgIHBhY2tldC50eXBlID0gU2NvcmVib2FyZEFjdGlvblR5cGUuUmVtb3ZlO1xuICAgIHBhY2tldC5lbnRyaWVzID0gW1xuICAgICAge1xuICAgICAgICBzY29yZWJvYXJkSWQ6IGlkZW50aXR5LmlkZW50aWZpZXIsXG4gICAgICAgIG9iamVjdGl2ZU5hbWU6IHRoaXMub2JqZWN0aXZlTmFtZSxcbiAgICAgICAgc2NvcmU6IDAsXG4gICAgICAgIGlkZW50aXR5VHlwZTogaWRlbnRpdHkudHlwZSxcbiAgICAgICAgYWN0b3JVbmlxdWVJZDogbnVsbCxcbiAgICAgICAgY3VzdG9tTmFtZTogbnVsbFxuICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgd29ybGQuXG4gICAgdGhpcy53b3JsZC5icm9hZGNhc3QocGFja2V0KTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgcmVtb3ZlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICogQHBhcmFtIHBhcnRpY2lwYW50IFRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAqIEBwYXJhbSBzY29yZSBUaGUgbmV3IHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICovXG4gIHB1YmxpYyBzZXRTY29yZShcbiAgICBwYXJ0aWNpcGFudDogRW50aXR5IHwgc3RyaW5nIHwgU2NvcmVib2FyZElkZW50aXR5LFxuICAgIHNjb3JlOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIGNvbnN0IGlkZW50aXR5ID1cbiAgICAgIHRoaXMuZ2V0UGFydGljaXBhbnQocGFydGljaXBhbnQpID8/IHRoaXMuYWRkUGFydGljaXBhbnQocGFydGljaXBhbnQpO1xuXG4gICAgLy8gU2V0IHRoZSBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICB0aGlzLnBhcnRpY2lwYW50cy5zZXQoaWRlbnRpdHksIHNjb3JlKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBwYWNrZXQgdG8gc2V0IHRoZSBzY29yZS5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0U2NvcmVQYWNrZXQoKTtcbiAgICBwYWNrZXQudHlwZSA9IFNjb3JlYm9hcmRBY3Rpb25UeXBlLkNoYW5nZTtcbiAgICBwYWNrZXQuZW50cmllcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc2NvcmVib2FyZElkOiBpZGVudGl0eS5pZGVudGlmaWVyLFxuICAgICAgICBvYmplY3RpdmVOYW1lOiB0aGlzLm9iamVjdGl2ZU5hbWUsXG4gICAgICAgIHNjb3JlLFxuICAgICAgICBpZGVudGl0eVR5cGU6IGlkZW50aXR5LnR5cGUsXG4gICAgICAgIGFjdG9yVW5pcXVlSWQ6IGlkZW50aXR5LmVudGl0eT8udW5pcXVlSWQgPz8gbnVsbCxcbiAgICAgICAgY3VzdG9tTmFtZTogaWRlbnRpdHkuZGlzcGxheU5hbWVcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIHdvcmxkLlxuICAgIHRoaXMud29ybGQuYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHNjb3JlIHRvIHRoZSBwYXJ0aWNpcGFudCBpbiB0aGUgb2JqZWN0aXZlLlxuICAgKiBAcGFyYW0gcGFydGljaXBhbnQgVGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICogQHBhcmFtIHNjb3JlIFRoZSBzY29yZSB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBuZXcgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgKi9cbiAgcHVibGljIGFkZFNjb3JlKFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHksXG4gICAgc2NvcmU6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYXJ0aWNpcGFudCBpcyBhbHJlYWR5IGluIHRoZSBvYmplY3RpdmUuXG4gICAgY29uc3QgaWRlbnRpdHkgPVxuICAgICAgdGhpcy5nZXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCkgPz8gdGhpcy5hZGRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIGNvbnN0IGN1cnJlbnRTY29yZSA9IHRoaXMucGFydGljaXBhbnRzLmdldChpZGVudGl0eSkgPz8gMDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICBjb25zdCBuZXdTY29yZSA9IGN1cnJlbnRTY29yZSArIHNjb3JlO1xuXG4gICAgLy8gU2V0IHRoZSBuZXcgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIHRoaXMuc2V0U2NvcmUoaWRlbnRpdHksIG5ld1Njb3JlKTtcblxuICAgIC8vIFJldHVybiB0aGUgbmV3IHNjb3JlLlxuICAgIHJldHVybiBuZXdTY29yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICogQHBhcmFtIHBhcnRpY2lwYW50IFRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQsIG51bGwgaWYgdGhlIHBhcnRpY2lwYW50IGlzIG5vdCBpbiB0aGUgb2JqZWN0aXZlLlxuICAgKi9cbiAgcHVibGljIGdldFNjb3JlKFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHlcbiAgKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIGFscmVhZHkgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0UGFydGljaXBhbnQocGFydGljaXBhbnQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGlkZW50aXR5IGlzIG51bGwuXG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIHJldHVybiB0aGlzLnBhcnRpY2lwYW50cy5nZXQoaWRlbnRpdHkpIGFzIG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHNjb3JlcyBvZiBhbGwgdGhlIHBhcnRpY2lwYW50cyBpbiB0aGUgb2JqZWN0aXZlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU2NvcmVzKCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBwYWNrZXQgdG8gcmVtb3ZlIHRoZSBzY29yZS5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0U2NvcmVQYWNrZXQoKTtcbiAgICBwYWNrZXQudHlwZSA9IFNjb3JlYm9hcmRBY3Rpb25UeXBlLlJlbW92ZTtcbiAgICBwYWNrZXQuZW50cmllcyA9IFsuLi50aGlzLnBhcnRpY2lwYW50cy5rZXlzKCldLm1hcCgoaWRlbnRpdHkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjb3JlYm9hcmRJZDogaWRlbnRpdHkuaWRlbnRpZmllcixcbiAgICAgICAgb2JqZWN0aXZlTmFtZTogdGhpcy5vYmplY3RpdmVOYW1lLFxuICAgICAgICBzY29yZTogMCxcbiAgICAgICAgaWRlbnRpdHlUeXBlOiBpZGVudGl0eS50eXBlLFxuICAgICAgICBhY3RvclVuaXF1ZUlkOiBudWxsLFxuICAgICAgICBjdXN0b21OYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIHdvcmxkLlxuICAgIHRoaXMud29ybGQuYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAvLyBDbGVhciB0aGUgcGFydGljaXBhbnRzIG9mIHRoZSBvYmplY3RpdmUuXG4gICAgdGhpcy5wYXJ0aWNpcGFudHMuY2xlYXIoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTY29yZWJvYXJkT2JqZWN0aXZlIH07XG4iLCAiaW1wb3J0IHsgU2NvcmVib2FyZElkZW50aXR5VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNsYXNzIFNjb3JlYm9hcmRJZGVudGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgcnVubmluZyBpZGVudGlmaWVyIG9mIHRoZSBzY29yZWJvYXJkIGlkZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBJREVOVElGSUVSID0gMG47XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzY29yZWJvYXJkIGlkZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBTY29yZWJvYXJkSWRlbnRpdHkuSURFTlRJRklFUisrO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NvcmVib2FyZCBpZGVudGl0eSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFNjb3JlYm9hcmRJZGVudGl0eVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGlkZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgb2YgdGhlIGlkZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc2NvcmVib2FyZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBlbnRpdHkgb3IgZGlzcGxheSBuYW1lIG9mIHRoZSBpZGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2YWx1ZTogRW50aXR5IHwgc3RyaW5nLCBpZGVudGlmaWVyPzogYmlnaW50KSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIGVudGl0eS5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbnRpdHkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIuXG4gICAgICBpZiAodmFsdWUuaXNQbGF5ZXIoKSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBTY29yZWJvYXJkSWRlbnRpdHlUeXBlLlBsYXllcjtcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHZhbHVlLnVzZXJuYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50eXBlID0gU2NvcmVib2FyZElkZW50aXR5VHlwZS5FbnRpdHk7XG4gICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB2YWx1ZS50eXBlLmlkZW50aWZpZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgZW50aXR5IG9mIHRoZSBpZGVudGl0eS5cbiAgICAgIHRoaXMuaWRlbnRpZmllciA9ICFpZGVudGlmaWVyID8gdmFsdWUucnVudGltZUlkIDogaWRlbnRpZmllcjtcbiAgICAgIHRoaXMuZW50aXR5ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldCB0aGUgdHlwZSB0byBmYWtlIHBsYXllciBhbmQgc2V0IHRoZSBkaXNwbGF5IG5hbWUuXG4gICAgICB0aGlzLnR5cGUgPSBTY29yZWJvYXJkSWRlbnRpdHlUeXBlLkZha2VQbGF5ZXI7XG4gICAgICB0aGlzLmRpc3BsYXlOYW1lID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFNjb3JlYm9hcmRJZGVudGl0eSB9O1xuIiwgImltcG9ydCB7IEVuZGlhbm5lc3MsIHR5cGUgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuaW1wb3J0IHsgQ29tcG91bmRUYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvbmJ0XCI7XG5cbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQmxvY2tQZXJtdXRhdGlvbiB9IGZyb20gXCIuLi8uLi9ibG9ja1wiO1xuXG4vLyBUT0RPOiBBZGQgbG9nZ2VkIGJsb2NrcywgbGlnaHQgYmxvY2tzLCBhbmQgYmlvbWVzLlxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBibG9jayBzdG9yYWdlLlxuICovXG5jbGFzcyBCbG9ja1N0b3JhZ2Uge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gY2h1bmsgc2l6ZSBpbiB0aGUgeCBkaXJlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BWF9YID0gMTY7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGNodW5rIHNpemUgaW4gdGhlIHkgZGlyZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVhfWSA9IDE2O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBjaHVuayBzaXplIGluIHRoZSB6IGRpcmVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFYX1ogPSAxNjtcblxuICAvKipcbiAgICogVGhlIHRvdGFsIG1heGltdW0gY2h1bmsgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFYX1NJWkUgPSAxNiAqIDE2ICogMTY7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWxldHRlIG9mIHRoZSBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhbGV0dGU6IEFycmF5PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBibG9ja3Mgb2YgdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzOiBBcnJheTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgYWlyIHZhbHVlIG9mIHRoZSBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFpcjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGJsb2NrIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBibG9ja3MgVGhlIG9wdGlvbmFsIGJsb2Nrcy5cbiAgICogQHBhcmFtIHBhbGV0dGUgVGhlIG9wdGlvbmFsIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFsZXR0ZT86IEFycmF5PG51bWJlcj4sIGJsb2Nrcz86IEFycmF5PG51bWJlcj4pIHtcbiAgICAvLyBGaW5kIHRoZSBhaXIgdmFsdWUuXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkFpcik7XG4gICAgdGhpcy5haXIgPSBwZXJtdXRhdGlvbi5uZXR3b3JrO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwYWxldHRlLlxuICAgIC8vIFdoZW4gd2UgY3JlYXRlIGNodW5rcywgd2Ugd2lsbCBwcm92aWRlIHRoZSBwYWxldHRlIHdpdGggdGhlIGN1cnJlbnQgYWlyIHZhbHVlLlxuICAgIHRoaXMucGFsZXR0ZSA9IHBhbGV0dGUgPz8gW3RoaXMuYWlyXTtcblxuICAgIC8vIENyZWF0ZSB0aGUgYmxvY2sgc3RvcmFnZS5cbiAgICB0aGlzLmJsb2NrcyA9XG4gICAgICBibG9ja3MgPz8gQXJyYXkuZnJvbSh7IGxlbmd0aDogQmxvY2tTdG9yYWdlLk1BWF9TSVpFIH0sICgpID0+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgYmxvY2sgc3RvcmFnZSBpcyBlbXB0eS5cbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhbGV0dGUubGVuZ3RoID09PSAxICYmIHRoaXMucGFsZXR0ZVswXSA9PT0gdGhpcy5haXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYmxvY2sgc3RhdGUgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYnggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ6IFRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoYng6IG51bWJlciwgYnk6IG51bWJlciwgYno6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBpbmRleC5cbiAgICBjb25zdCBpbmRleCA9IEJsb2NrU3RvcmFnZS5nZXRJbmRleChieCwgYnksIGJ6KTtcblxuICAgIC8vIEdldCB0aGUgcGFsZXR0ZSBpbmRleC5cbiAgICBjb25zdCBwYWxldHRlSW5kZXggPSB0aGlzLmJsb2Nrc1tpbmRleF0gPz8gMDtcblxuICAgIC8vIFJldHVybiB0aGUgYmxvY2suXG4gICAgcmV0dXJuIHRoaXMucGFsZXR0ZVtwYWxldHRlSW5kZXhdID8/IHRoaXMuYWlyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJsb2NrIHN0YXRlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGJ4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gYnkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieiBUaGUgeiBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBibG9jayBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0ZShieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyLCBzdGF0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXRlIGV4aXN0cyBpbiB0aGUgcGFsZXR0ZS5cbiAgICBsZXQgcGFsZXR0ZUluZGV4ID0gdGhpcy5wYWxldHRlLmluZGV4T2Yoc3RhdGUpO1xuICAgIGlmIChwYWxldHRlSW5kZXggPT09IC0xKSB7XG4gICAgICAvLyBBZGQgdGhlIHN0YXRlIHRvIHRoZSBwYWxldHRlLlxuICAgICAgcGFsZXR0ZUluZGV4ID0gdGhpcy5wYWxldHRlLnB1c2goc3RhdGUpIC0gMTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGJsb2NrIHN0YXRlLlxuICAgIHRoaXMuYmxvY2tzW0Jsb2NrU3RvcmFnZS5nZXRJbmRleChieCwgYnksIGJ6KV0gPSBwYWxldHRlSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgaW5kZXggb2YgdGhlIGJsb2NrIHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYnggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ6IFRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbmRleChieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKChieCAmIDB4ZikgPDwgOCkgfCAoKGJ6ICYgMHhmKSA8PCA0KSB8IChieSAmIDB4Zik7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgYmxvY2sgc3RvcmFnZSB0byBhIGJpbmFyeSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gd3JpdGUgdG8uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShcbiAgICBzdG9yYWdlOiBCbG9ja1N0b3JhZ2UsXG4gICAgc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgbmJ0ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIGJpdHMgcGVyIGJsb2NrIGJhc2VkIG9uIHRoZSBwYWxldHRlIHNpemVcbiAgICBsZXQgYml0c1BlckJsb2NrID0gTWF0aC5jZWlsKE1hdGgubG9nMihzdG9yYWdlLnBhbGV0dGUubGVuZ3RoKSk7XG5cbiAgICAvLyBTZXQgYml0c1BlckJsb2NrIHRvIDEgaWYgY2FsY3VsYXRlZCBhcyAwLCBhbmQgcGFkIGFzIG5lY2Vzc2FyeVxuICAgIHN3aXRjaCAoYml0c1BlckJsb2NrKSB7XG4gICAgICBjYXNlIDA6IHtcbiAgICAgICAgYml0c1BlckJsb2NrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDc6XG4gICAgICBjYXNlIDg6IHtcbiAgICAgICAgYml0c1BlckJsb2NrID0gODtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJpdHNQZXJCbG9jayA9IDE2O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgYml0cyBwZXIgYmxvY2sgKHNoaWZ0ZWQgYW5kIGZsYWdnZWQpXG4gICAgc3RyZWFtLndyaXRlQnl0ZSgoYml0c1BlckJsb2NrIDw8IDEpIHwgMSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYmxvY2sgYW5kIHdvcmQgc2l6ZXNcbiAgICBjb25zdCBibG9ja3NQZXJXb3JkID0gTWF0aC5mbG9vcigzMiAvIGJpdHNQZXJCbG9jayk7XG4gICAgY29uc3Qgd29yZENvdW50ID0gTWF0aC5jZWlsKDQwOTYgLyBibG9ja3NQZXJXb3JkKTtcblxuICAgIC8vIFNlcmlhbGl6ZSB0aGUgYmxvY2tzIGludG8gdGhlIHdvcmRzXG4gICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3JkQ291bnQ7IHcrKykge1xuICAgICAgLy8gUHJlcGFyZSB0aGUgd29yZFxuICAgICAgbGV0IHdvcmQgPSAwO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGJsb2NrcyBpbiB0aGUgd29yZFxuICAgICAgZm9yIChsZXQgYmxvY2sgPSAwOyBibG9jayA8IGJsb2Nrc1BlcldvcmQ7IGJsb2NrKyspIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBibG9jayBpbmRleFxuICAgICAgICBjb25zdCBpbmRleCA9IHcgKiBibG9ja3NQZXJXb3JkICsgYmxvY2s7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGluZGV4IGlzIG91dCBvZiBib3VuZHNcbiAgICAgICAgaWYgKGluZGV4ID49IDQwOTYpIGJyZWFrOyAvLyBIYW5kbGUgYW55IGV4Y2VzcyBibG9ja3NcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJsb2NrIHN0YXRlIGFuZCBvZmZzZXRcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yYWdlLmJsb2Nrc1tpbmRleF0gPz8gMDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYmxvY2sgKiBiaXRzUGVyQmxvY2s7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGJsb2NrIHN0YXRlIHRvIHRoZSB3b3JkXG4gICAgICAgIHdvcmQgfD0gc3RhdGUgPDwgb2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSB0aGUgd29yZCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVJbnQzMih3b3JkLCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgcGFsZXR0ZSBzaXplIGRlcGVuZGluZyBvbiB0aGUgc2VyaWFsaXphdGlvbiB0eXBlXG4gICAgaWYgKG5idCkgc3RyZWFtLndyaXRlSW50MzIoc3RvcmFnZS5wYWxldHRlLmxlbmd0aCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgIGVsc2Ugc3RyZWFtLndyaXRlWmlnWmFnKHN0b3JhZ2UucGFsZXR0ZS5sZW5ndGgpO1xuXG4gICAgLy8gU2VyaWFsaXplIHBhbGV0dGUgdmFsdWVzXG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiBzdG9yYWdlLnBhbGV0dGUpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzZXJpYWxpemF0aW9uIHR5cGUgaXMgTkJUXG4gICAgICBpZiAobmJ0KSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gZnJvbSB0aGUgc3RhdGVcbiAgICAgICAgY29uc3QgcGVybXV0YXRpb24gPSBCbG9ja1Blcm11dGF0aW9uLnBlcm11dGF0aW9ucy5nZXQoc3RhdGUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwZXJtdXRhdGlvbiBleGlzdHNcbiAgICAgICAgaWYgKCFwZXJtdXRhdGlvbilcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGVybXV0YXRpb24gc3RhdGU6ICR7c3RhdGV9YCk7XG5cbiAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBwZXJtdXRhdGlvbiB0byBOQlRcbiAgICAgICAgY29uc3QgZGF0YSA9IEJsb2NrUGVybXV0YXRpb24udG9OYnQocGVybXV0YXRpb24pO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBOQlQgZGF0YSB0byB0aGUgc3RyZWFtXG4gICAgICAgIENvbXBvdW5kVGFnLndyaXRlKHN0cmVhbSwgZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXcml0ZSB0aGUgc3RhdGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVaaWdaYWcoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJsb2NrIHN0b3JhZ2UgZnJvbSBhIGJpbmFyeSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0sIG5idCA9IGZhbHNlKTogQmxvY2tTdG9yYWdlIHtcbiAgICAvLyBSZWFkIHRoZSBiaXRzIHBlciBibG9ja1xuICAgIGNvbnN0IHBhbGV0dGVBbmRGbGFnID0gc3RyZWFtLnJlYWRCeXRlKCk7XG4gICAgY29uc3QgYml0c1BlckJsb2NrID0gcGFsZXR0ZUFuZEZsYWcgPj4gMTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWxldHRlIGlzIHVzaW5nIHJ1bnRpbWUgSURzLlxuICAgIGNvbnN0IF9pc1J1bnRpbWUgPSAocGFsZXR0ZUFuZEZsYWcgJiAxKSAhPT0gMDtcblxuICAgIC8vIENhbGN1bGF0ZSBibG9jayBhbmQgd29yZCBzaXplc1xuICAgIGNvbnN0IGJsb2Nrc1BlcldvcmQgPSBNYXRoLmZsb29yKDMyIC8gYml0c1BlckJsb2NrKTtcbiAgICBjb25zdCB3b3JkQ291bnQgPSBNYXRoLmNlaWwoNDA5NiAvIGJsb2Nrc1BlcldvcmQpO1xuXG4gICAgLy8gRGVzZXJpYWxpemUgdGhlIHdvcmRzIGludG8gYmxvY2tzXG4gICAgY29uc3Qgd29yZHMgPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IHdvcmRDb3VudCB9KTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd29yZENvdW50OyBpbmRleCsrKSB7XG4gICAgICB3b3Jkc1tpbmRleF0gPSBzdHJlYW0ucmVhZEludDMyKEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIHRoZSBwYWxldHRlIHNpemUgZGVwZW5kaW5nIG9uIHRoZSBzZXJpYWxpemF0aW9uXG4gICAgY29uc3QgcGFsZXR0ZVNpemUgPSBuYnRcbiAgICAgID8gc3RyZWFtLnJlYWRJbnQzMihFbmRpYW5uZXNzLkxpdHRsZSlcbiAgICAgIDogc3RyZWFtLnJlYWRaaWdaYWcoKTtcblxuICAgIC8vIERlc2VyaWFsaXplIHRoZSBwYWxldHRlIHZhbHVlc1xuICAgIGNvbnN0IHBhbGV0dGUgPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IHBhbGV0dGVTaXplIH0pO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwYWxldHRlU2l6ZTsgaW5kZXgrKykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlcmlhbGl6YXRpb24gdHlwZSBpcyBOQlRcbiAgICAgIGlmIChuYnQpIHtcbiAgICAgICAgLy8gUmVhZCB0aGUgTkJUIGRhdGEgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IGRhdGEgPSBDb21wb3VuZFRhZy5yZWFkKHN0cmVhbSk7XG5cbiAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIHBlcm11dGF0aW9uIGZyb20gTkJUXG4gICAgICAgIGNvbnN0IHBlcm11dGF0aW9uID0gQmxvY2tQZXJtdXRhdGlvbi5mcm9tTmJ0KGRhdGEpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwZXJtdXRhdGlvbiBleGlzdHNcbiAgICAgICAgaWYgKCFwZXJtdXRhdGlvbilcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGVybXV0YXRpb24gc3RhdGU6ICR7ZGF0YS52YWx1ZU9mKHRydWUpfWApO1xuXG4gICAgICAgIC8vIEFzc2lnbiB0aGUgcGVybXV0YXRpb24gdG8gdGhlIHBhbGV0dGVcbiAgICAgICAgcGFsZXR0ZVtpbmRleF0gPSBwZXJtdXRhdGlvbi5uZXR3b3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVhZCB0aGUgc3RhdGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIHBhbGV0dGVbaW5kZXhdID0gc3RyZWFtLnJlYWRaaWdaYWcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgYmxvY2tzIGZyb20gdGhlIHdvcmRzXG4gICAgY29uc3QgYmxvY2tzID0gQXJyYXkuZnJvbTxudW1iZXI+KHsgbGVuZ3RoOiA0MDk2IH0pO1xuICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHdvcmRzXG4gICAgZm9yIChjb25zdCB3b3JkIG9mIHdvcmRzKSB7XG4gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGJsb2NrcyBpbiB0aGUgd29yZFxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGJsb2NrID0gMDtcbiAgICAgICAgYmxvY2sgPCBibG9ja3NQZXJXb3JkICYmIHBvc2l0aW9uIDwgNDA5NjtcbiAgICAgICAgYmxvY2srKywgcG9zaXRpb24rK1xuICAgICAgKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc3RhdGUgZnJvbSB0aGUgd29yZFxuICAgICAgICBjb25zdCBzdGF0ZSA9XG4gICAgICAgICAgKHdvcmQgPj4gKGJsb2NrICogYml0c1BlckJsb2NrKSkgJiAoKDEgPDwgYml0c1BlckJsb2NrKSAtIDEpO1xuXG4gICAgICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeCA9IChwb3NpdGlvbiA+PiA4KSAmIDB4ZjtcbiAgICAgICAgY29uc3QgeSA9IHBvc2l0aW9uICYgMHhmO1xuICAgICAgICBjb25zdCB6ID0gKHBvc2l0aW9uID4+IDQpICYgMHhmO1xuXG4gICAgICAgIC8vIFNldCB0aGUgYmxvY2sgc3RhdGUgaW4gdGhlIGJsb2NrcyBhcnJheVxuICAgICAgICBibG9ja3NbQmxvY2tTdG9yYWdlLmdldEluZGV4KHgsIHksIHopXSA9IHN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQmxvY2tTdG9yYWdlKHBhbGV0dGUsIGJsb2Nrcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tTdG9yYWdlIH07XG4iLCAiaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBCbG9ja1N0b3JhZ2UgfSBmcm9tIFwiLi9ibG9jay1zdG9yYWdlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN1YiBjaHVuay5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1YkNodW5rIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzdWIgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGF5ZXJzIG9mIHRoZSBzdWIgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGF5ZXJzOiBBcnJheTxCbG9ja1N0b3JhZ2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIHN1YiBjaHVuay5cbiAgICovXG4gIHB1YmxpYyBpbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc3ViIGNodW5rLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgc3ViIGNodW5rLlxuICAgKiBAcGFyYW0gbGF5ZXJzIFRoZSBsYXllcnMgb2YgdGhlIHN1YiBjaHVuay5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uPzogbnVtYmVyLCBsYXllcnM/OiBBcnJheTxCbG9ja1N0b3JhZ2U+KSB7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbiA/PyA5O1xuICAgIHRoaXMubGF5ZXJzID0gbGF5ZXJzID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgc3ViIGNodW5rIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdWIgY2h1bmsgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHN0b3JhZ2UuXG4gICAgZm9yIChjb25zdCBzdG9yYWdlIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RvcmFnZSBpcyBlbXB0eS5cbiAgICAgIGlmICghc3RvcmFnZS5pc0VtcHR5KCkpIHtcbiAgICAgICAgLy8gVGhlIHN1YiBjaHVuayBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgc3ViIGNodW5rIGlzIGVtcHR5LlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIHN0b3JhZ2UgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBzdG9yYWdlLlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXRMYXllcihpbmRleDogbnVtYmVyKTogQmxvY2tTdG9yYWdlIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RvcmFnZSBleGlzdHMuXG4gICAgaWYgKCF0aGlzLmxheWVyc1tpbmRleF0pIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdG9yYWdlLlxuICAgICAgZm9yIChsZXQgaW5kZXhfID0gMDsgaW5kZXhfIDw9IGluZGV4OyBpbmRleF8rKykge1xuICAgICAgICBpZiAoIXRoaXMubGF5ZXJzW2luZGV4X10pIHRoaXMubGF5ZXJzW2luZGV4X10gPSBuZXcgQmxvY2tTdG9yYWdlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBzdG9yYWdlLlxuICAgIHJldHVybiB0aGlzLmxheWVyc1tpbmRleF0gYXMgQmxvY2tTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIHN0YXRlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGJ4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gYnkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieiBUaGUgeiBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGxheWVyIFRoZSBsYXllciBvZiB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZShieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyLCBsYXllcjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBHZXQgdGhlIHN0b3JhZ2UuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBibG9jayBzdGF0ZS5cbiAgICByZXR1cm4gc3RvcmFnZS5nZXRTdGF0ZShieCwgYnksIGJ6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBibG9jayBzdGF0ZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBieCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gYnogVGhlIHogY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgYmxvY2sgc3RhdGUuXG4gICAqIEBwYXJhbSBsYXllciBUaGUgbGF5ZXIgb2YgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIHNldFN0YXRlKFxuICAgIGJ4OiBudW1iZXIsXG4gICAgYnk6IG51bWJlcixcbiAgICBiejogbnVtYmVyLFxuICAgIHN0YXRlOiBudW1iZXIsXG4gICAgbGF5ZXI/OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBzdG9yYWdlLlxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmdldExheWVyKGxheWVyID8/IDApO1xuXG4gICAgLy8gU2V0IHRoZSBibG9jayBzdGF0ZS5cbiAgICBzdG9yYWdlLnNldFN0YXRlKGJ4LCBieSwgYnosIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSBzdWIgY2h1bmsuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gd3JpdGUgdG8uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShcbiAgICBzdWJjaHVuazogU3ViQ2h1bmssXG4gICAgc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgbmJ0ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgLy8gV3JpdGUgdGhlIHZlcnNpb24uXG4gICAgc3RyZWFtLndyaXRlVWludDgoc3ViY2h1bmsudmVyc2lvbik7XG5cbiAgICAvLyBXcml0ZSB0aGUgc3RvcmFnZSBjb3VudC5cbiAgICBzdHJlYW0ud3JpdGVVaW50OChzdWJjaHVuay5sYXllcnMubGVuZ3RoKTtcblxuICAgIC8vIFdyaXRlIHRoZSBpbmRleC5cbiAgICBpZiAoc3ViY2h1bmsudmVyc2lvbiA9PT0gOSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIG51bGwuXG4gICAgICBpZiAoc3ViY2h1bmsuaW5kZXggPT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN1YkNodW5rIGluZGV4IGlzIG51bGwgZm9yIGZvcm1hdCB2ZXJzaW9uIDlcIik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBpbmRleC5cbiAgICAgIHN0cmVhbS53cml0ZUludDgoc3ViY2h1bmsuaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHN0b3JhZ2UgYW5kIHNlcmlhbGl6ZSBpdC5cbiAgICBmb3IgKGNvbnN0IHN0b3JhZ2Ugb2Ygc3ViY2h1bmsubGF5ZXJzKSB7XG4gICAgICAvLyBTZXJpYWxpemUgdGhlIHN0b3JhZ2UuXG4gICAgICBCbG9ja1N0b3JhZ2Uuc2VyaWFsaXplKHN0b3JhZ2UsIHN0cmVhbSwgbmJ0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIHRoZSBzdWIgY2h1bmsuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCBmcm9tLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgbmJ0ID0gZmFsc2UpOiBTdWJDaHVuayB7XG4gICAgLy8gUmVhZCB0aGUgdmVyc2lvbi5cbiAgICBjb25zdCB2ZXJzaW9uID0gc3RyZWFtLnJlYWRVaW50OCgpO1xuXG4gICAgLy8gUmVhZCB0aGUgc3RvcmFnZSBjb3VudC5cbiAgICBjb25zdCBjb3VudCA9IHN0cmVhbS5yZWFkVWludDgoKTtcblxuICAgIC8vIFJlYWQgdGhlIGluZGV4IGlmIHRoZSB2ZXJzaW9uIGlzIDkuXG4gICAgbGV0IGluZGV4ID0gbnVsbDtcbiAgICBpZiAodmVyc2lvbiA9PT0gOSkge1xuICAgICAgaW5kZXggPSBzdHJlYW0ucmVhZEludDgoKTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBzdG9yYWdlIGFuZCBkZXNlcmlhbGl6ZSBpdC5cbiAgICBjb25zdCBsYXllcnM6IEFycmF5PEJsb2NrU3RvcmFnZT4gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHtcbiAgICAgIGxheWVycy5wdXNoKEJsb2NrU3RvcmFnZS5kZXNlcmlhbGl6ZShzdHJlYW0sIG5idCkpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyBzdWIgY2h1bmsuXG4gICAgY29uc3Qgc3ViY2h1bmsgPSBuZXcgU3ViQ2h1bmsodmVyc2lvbiwgbGF5ZXJzKTtcbiAgICBzdWJjaHVuay5pbmRleCA9IGluZGV4O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBzdWIgY2h1bmsuXG4gICAgcmV0dXJuIHN1YmNodW5rO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tKGJ1ZmZlcjogQnVmZmVyLCBuYnQgPSBmYWxzZSk6IFN1YkNodW5rIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgc3RyZWFtLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgIC8vIERlc2VyaWFsaXplIHRoZSBzdWIgY2h1bmsuXG4gICAgcmV0dXJuIFN1YkNodW5rLmRlc2VyaWFsaXplKHN0cmVhbSwgbmJ0KTtcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENodW5rQ29vcmRzLFxuICBEaW1lbnNpb25UeXBlLFxuICB0eXBlIElQb3NpdGlvblxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4uLy4uL2Jsb2NrXCI7XG5cbmltcG9ydCB7IFN1YkNodW5rIH0gZnJvbSBcIi4vc3ViLWNodW5rXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNodW5rIHdpdGhpbiBhIERpbWVuc2lvbiBpbnN0YW5jZS4gQ2h1bmtzIGhvbGQgc3ViIGNodW5rcywgd2hpY2ggaG9sZCBibG9jayBzdGF0ZXMgKEJsb2NrUGVybXV0YXRpb25zKS4gQ2h1bmtzIGNhbiBiZSBkaXJ0eSwgbWVhbmluZyB0aGV5IGhhdmUgYmVlbiBtb2RpZmllZCBhbmQgbmVlZCB0byBiZSBzYXZlZC5cbiAqXG4gKiAqKkV4YW1wbGUgVXNhZ2UqKlxuICogYGBgdHlwZXNjcmlwdFxuIFx0aW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyLCBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL2Jsb2NrXCJcblx0aW1wb3J0IHsgRGltZW5zaW9uVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiXG5cdGltcG9ydCB7IENodW5rIH0gZnJvbSBcIkBzZXJlbml0eWpzL3dvcmxkXCJcblxuXHQvLyBDcmVhdGUgYSBuZXcgY2h1bmsgd2l0aCB0aGUgZGltZW5zaW9uIHR5cGUgXCJPdmVyd29ybGRcIiBhbmQgdGhlIHggYW5kIHogY29vcmRpbmF0ZXMgb2YgMFxuXHRjb25zdCBjaHVuayA9IG5ldyBDaHVuayhEaW1lbnNpb25UeXBlLk92ZXJ3b3JsZCwgMCwgMCkgLy8gRGltZW5zaW9uVHlwZSB3aWxsIGRldGVybWluZSB0aGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGNodW5rXG5cblx0Ly8gRmlyc3Qgd2UgbmVlZCB0byBvYnRhaW4gdGhlIEJsb2NrUGVybXV0YXRpb25zIHdlIHdpbGwgdXNlIHRvIHNldCB0aGUgYmxvY2tzXG5cdGNvbnN0IGJlZHJvY2sgPSBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkJlZHJvY2spXG5cdGNvbnN0IGRpcnQgPSBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkRpcnQsIHsgZGlydF90eXBlOiBcIm5vcm1hbFwiIH0pXG5cdGNvbnN0IGdyYXNzID0gQmxvY2tQZXJtdXRhdGlvbi5yZXNvbHZlKEJsb2NrSWRlbnRpZmllci5HcmFzc0Jsb2NrKVxuXG5cdC8vIFdlIGNhbiBub3cgc2V0IGEgYmxvY2sgYXQgdGhlIHgsIHksIGFuZCB6IGNvb3JkaW5hdGVzIG9mIHRoZSBjaHVua1xuXHQvLyBXZSB3aWxsIGNyZWF0ZSBhIFN1cGVyZmxhdCBjaHVuayB3aXRoIGEgbWF4aW11bSBoZWlnaHQgb2YgNFxuXHRmb3IgKGxldCB4ID0gMDsgeCA8IDE2OyB4KyspIHtcblx0XHRmb3IgKGxldCB6ID0gMDsgeiA8IDE2OyB6KyspIHtcblx0XHRcdGZvciAobGV0IHkgPSAwOyB5IDwgNDsgeSsrKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSB5IGNvb3JkaW5hdGUgaXMgMCwgaWYgc28sIHNldCB0aGUgYmxvY2sgdG8gYmVkcm9ja1xuXHRcdFx0XHRpZiAoeSA9PT0gMCkgY2h1bmsuc2V0UGVybXV0YXRpb24oeCwgeSwgeiwgYmVkcm9jaylcblxuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgeSBjb29yZGluYXRlIGlzIDEgYW5kIDIsIGlmIHNvLCBzZXQgdGhlIGJsb2NrIHRvIGRpcnRcblx0XHRcdFx0ZWxzZSBpZiAoeSA9PT0gMSB8fCB5ID09PSAyKSBjaHVuay5zZXRQZXJtdXRhdGlvbih4LCB5LCB6LCBkaXJ0KVxuXG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSB5IGNvb3JkaW5hdGUgaXMgMywgaWYgc28sIHNldCB0aGUgYmxvY2sgdG8gZ3Jhc3Ncblx0XHRcdFx0ZWxzZSBpZiAoeSA9PT0gMykgY2h1bmsuc2V0UGVybXV0YXRpb24oeCwgeSwgeiwgZ3Jhc3MpXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENodW5rIHtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBzdWIgY2h1bmtzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVhfU1VCX0NIVU5LUyA9IDI0O1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHR5cGUgb2YgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpbWVuc2lvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFogY29vcmRpbmF0ZSBvZiB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgejogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaGFzaCBrZXkgb2YgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhc2g6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHN1YiBjaHVua3Mgb2YgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1YmNodW5rczogQXJyYXk8U3ViQ2h1bms+O1xuXG4gIC8qKlxuICAgKiBBIGNhY2hlZCBidWZmZXIgb2YgdGhlIHNlcmlhbGl6ZWQgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgY2FjaGU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY2h1bmsgaGFzIGJlZW4gbW9kaWZpZWQsIGFuZCBoYXMgbm90IGJlZW4gc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgZGlydHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWYgdGhlIGNodW5rIGlzIHJlYWR5IHRvIGJlIHNlbnQgdG8gdGhlIGNsaWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkeSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY2h1bmsuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBkaW1lbnNpb24gdHlwZSBvZiB0aGUgY2h1bmsuXG4gICAqIEBwYXJhbSB4IFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGNodW5rLlxuICAgKiBAcGFyYW0geiBUaGUgWiBjb29yZGluYXRlIG9mIHRoZSBjaHVuay5cbiAgICogQHBhcmFtIHN1YmNodW5rcyBUaGUgc3ViIGNodW5rcyBvZiB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgeDogbnVtYmVyLFxuICAgIHo6IG51bWJlcixcbiAgICB0eXBlOiBEaW1lbnNpb25UeXBlLFxuICAgIHN1YmNodW5rcz86IEFycmF5PFN1YkNodW5rPlxuICApIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueiA9IHo7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmhhc2ggPSBDaHVua0Nvb3Jkcy5oYXNoKHsgeCwgeiB9KTtcbiAgICB0aGlzLnN1YmNodW5rcyA9IHN1YmNodW5rcyA/PyBBcnJheS5mcm9tKHsgbGVuZ3RoOiBDaHVuay5NQVhfU1VCX0NIVU5LUyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcm11dGF0aW9uIGF0IHRoZSBnaXZlbiBYLCBZIGFuZCBaIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0geCBUaGUgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0geSBUaGUgWSBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0geiBUaGUgWiBjb29yZGluYXRlLlxuICAgKi9cbiAgcHVibGljIGdldFBlcm11dGF0aW9uKHBvc2l0aW9uOiBJUG9zaXRpb24pOiBCbG9ja1Blcm11dGF0aW9uIHtcbiAgICAvLyBDb3JyZWN0IHRoZSBZIGxldmVsIGZvciB0aGUgb3ZlcndvcmxkLlxuICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gcG9zaXRpb247XG4gICAgY29uc3QgeWYgPSB0aGlzLnR5cGUgPT09IERpbWVuc2lvblR5cGUuT3ZlcndvcmxkID8geSArIDY0IDogeTtcblxuICAgIC8vIEdldCB0aGUgc3ViIGNodW5rLlxuICAgIGNvbnN0IHN1YmNodW5rID0gdGhpcy5nZXRTdWJDaHVuayh5ZiA+PiA0KTtcblxuICAgIC8vIEdldCB0aGUgYmxvY2sgc3RhdGUuXG4gICAgY29uc3Qgc3RhdGUgPSBzdWJjaHVuay5nZXRTdGF0ZSh4ICYgMHhmLCB5ZiAmIDB4ZiwgeiAmIDB4ZiwgMCk7IC8vIDAgPSBTb2xpZHMsIDEgPSBMaXF1aWRzIG9yIExvZ2dlZFxuXG4gICAgLy8gUmV0dXJuIHRoZSBwZXJtdXRhdGlvbi5cbiAgICByZXR1cm4gQmxvY2tQZXJtdXRhdGlvbi5wZXJtdXRhdGlvbnMuZ2V0KHN0YXRlKSBhcyBCbG9ja1Blcm11dGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGVybXV0YXRpb24gYXQgdGhlIGdpdmVuIFgsIFkgYW5kIFogY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSB4IFRoZSBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB5IFRoZSBZIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB6IFRoZSBaIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBwZXJtdXRhdGlvbiBUaGUgcGVybXV0YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc2V0UGVybXV0YXRpb24oXG4gICAgcG9zaXRpb246IElQb3NpdGlvbixcbiAgICBwZXJtdXRhdGlvbjogQmxvY2tQZXJtdXRhdGlvbixcbiAgICBkaXJ0eSA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyB4LCB5LCB6IH0gPSBwb3NpdGlvbjtcblxuICAgIC8vIENvcnJlY3QgdGhlIFkgbGV2ZWwgZm9yIHRoZSBvdmVyd29ybGQuXG4gICAgY29uc3QgeWYgPSB0aGlzLnR5cGUgPT09IERpbWVuc2lvblR5cGUuT3ZlcndvcmxkID8geSArIDY0IDogeTtcblxuICAgIC8vIEdldCB0aGUgc3ViIGNodW5rLlxuICAgIGNvbnN0IHN1YmNodW5rID0gdGhpcy5nZXRTdWJDaHVuayh5ZiA+PiA0KTtcblxuICAgIC8vIEdldCB0aGUgYmxvY2sgc3RhdGUuXG4gICAgY29uc3Qgc3RhdGUgPSBwZXJtdXRhdGlvbi5uZXR3b3JrO1xuXG4gICAgLy8gU2V0IHRoZSBibG9jay5cbiAgICBzdWJjaHVuay5zZXRTdGF0ZSh4ICYgMHhmLCB5ZiAmIDB4ZiwgeiAmIDB4Ziwgc3RhdGUsIDApOyAvLyAwID0gU29saWRzLCAxID0gTGlxdWlkcyBvciBMb2dnZWRcblxuICAgIC8vIFNldCB0aGUgY2h1bmsgYXMgZGlydHkuXG4gICAgaWYgKGRpcnR5KSB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIFNldCB0aGUgY2FjaGUgYXMgbnVsbC5cbiAgICB0aGlzLmNhY2hlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRvcG1vc3QgbGV2ZWwgaW4gd2hpY2ggYSBwZXJtdXRhdGlvbiBpcyBub3QgYWlyLCBhdCB0aGUgZ2l2ZW4gWCBhbmQgWiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBxdWVyeS5cbiAgICogQHJldHVybnMgVGhlIHRvcG1vc3QgbGV2ZWwgaW4gd2hpY2ggYSBwZXJtdXRhdGlvbiBpcyBub3QgYWlyLlxuICAgKi9cbiAgcHVibGljIGdldFRvcG1vc3RMZXZlbChwb3NpdGlvbjogSVBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBHZXQgdGhlIFkgbGV2ZWwuXG4gICAgZm9yIChsZXQgeSA9IHBvc2l0aW9uLnk7IHkgPj0gLTY0OyB5LS0pIHtcbiAgICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gYXQgdGhlIHBvc2l0aW9uLlxuICAgICAgY29uc3QgcGVybXV0YXRpb24gPSB0aGlzLmdldFBlcm11dGF0aW9uKHsgLi4ucG9zaXRpb24sIHkgfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwZXJtdXRhdGlvbiBpcyBhaXIgb3IgaXMgbm90IHNvbGlkLlxuICAgICAgaWYgKHBlcm11dGF0aW9uLnR5cGUuaWRlbnRpZmllciA9PT0gQmxvY2tJZGVudGlmaWVyLkFpcikgY29udGludWU7XG4gICAgICBpZiAoIXBlcm11dGF0aW9uLnR5cGUuc29saWQpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIFkgbGV2ZWwuXG4gICAgICByZXR1cm4geTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gMCBpZiBubyBibG9jayB3YXMgZm91bmQuXG4gICAgcmV0dXJuIC02NDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJvdHRvbW1vc3QgbGV2ZWwgaW4gd2hpY2ggYSBwZXJtdXRhdGlvbiBpcyBub3QgYWlyLCBhdCB0aGUgZ2l2ZW4gWCBhbmQgWiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBxdWVyeS5cbiAgICogQHJldHVybnMgVGhlIGJvdHRvbW1vc3QgbGV2ZWwgaW4gd2hpY2ggYSBwZXJtdXRhdGlvbiBpcyBub3QgYWlyLlxuICAgKi9cbiAgcHVibGljIGdldEJvdHRvbW1vc3RMZXZlbChwb3NpdGlvbjogSVBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBHZXQgdGhlIFkgbGV2ZWwuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPD0gcG9zaXRpb24ueTsgeSsrKSB7XG4gICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHRoaXMuZ2V0UGVybXV0YXRpb24oeyAuLi5wb3NpdGlvbiwgeSB9KTtcbiAgICAgIGlmIChwZXJtdXRhdGlvbi50eXBlLmlkZW50aWZpZXIgIT09IEJsb2NrSWRlbnRpZmllci5BaXIpIHJldHVybiB5O1xuICAgIH1cblxuICAgIC8vIFJldHVybiAwIGlmIG5vIGJsb2NrIHdhcyBmb3VuZC5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN1YiBjaHVuayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgZ2V0U3ViQ2h1bmsoaW5kZXg6IG51bWJlcik6IFN1YkNodW5rIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgYmVsb3cgMC5cbiAgICAvLyBUaGVuIHdpbGwgd2UgcmV0dXJuIHRoZSBib3R0b20gc3ViIGNodW5rLlxuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB0aGlzLmdldFN1YkNodW5rKDApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIGFib3ZlIHRoZSBtYXhpbXVtIHN1YiBjaHVua3MuXG4gICAgLy8gVGhlbiB3aWxsIHdlIHJldHVybiB0aGUgdG9wIHN1YiBjaHVuay5cbiAgICBpZiAoaW5kZXggPj0gQ2h1bmsuTUFYX1NVQl9DSFVOS1MpXG4gICAgICByZXR1cm4gdGhpcy5nZXRTdWJDaHVuayhDaHVuay5NQVhfU1VCX0NIVU5LUyAtIDEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN1YiBjaHVuayBleGlzdHMuXG4gICAgaWYgKCF0aGlzLnN1YmNodW5rc1tpbmRleF0pIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdWIgY2h1bmsuXG4gICAgICBmb3IgKGxldCBuZGV4ID0gMDsgbmRleCA8PSBpbmRleDsgbmRleCsrKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdWIgY2h1bmsgZXhpc3RzLlxuICAgICAgICBpZiAodGhpcy5zdWJjaHVua3NbbmRleF0pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdWIgY2h1bmsuXG4gICAgICAgIGNvbnN0IHN1YmNodW5rID0gbmV3IFN1YkNodW5rKCk7XG4gICAgICAgIHN1YmNodW5rLmluZGV4ID1cbiAgICAgICAgICB0aGlzLnR5cGUgPT09IERpbWVuc2lvblR5cGUuT3ZlcndvcmxkID8gbmRleCAtIDQgOiBuZGV4O1xuXG4gICAgICAgIC8vIFNldCB0aGUgc3ViIGNodW5rLlxuICAgICAgICB0aGlzLnN1YmNodW5rc1tuZGV4XSA9IHN1YmNodW5rO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgc3ViIGNodW5rLlxuICAgIHJldHVybiB0aGlzLnN1YmNodW5rc1tpbmRleF0gYXMgU3ViQ2h1bms7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhbW91bnQgb2Ygc3ViIGNodW5rcyB0aGF0IG5lZWQgdG8gYmUgc2VudC5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWJDaHVua1NlbmRDb3VudCgpOiBudW1iZXIge1xuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHN1YiBjaHVuay5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAobGV0IGluZGV4ID0gQ2h1bmsuTUFYX1NVQl9DSFVOS1MgLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICAvLyBHZXQgdGhlIHN1YiBjaHVuay5cbiAgICAgIGNvbnN0IHN1YmNodW5rID0gdGhpcy5zdWJjaHVua3NbaW5kZXhdO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3ViIGNodW5rIGV4aXN0cy5cbiAgICAgIGlmICghc3ViY2h1bmsgfHwgc3ViY2h1bmsuaXNFbXB0eSgpKSBjb3VudCsrO1xuICAgICAgLy8gQnJlYWsgaWYgdGhlIHN1YiBjaHVuayBpcyBub3QgZW1wdHksIGFzIGFsbCBzdWIgY2h1bmtzIGFmdGVyIHRoaXMgd2lsbCBub3QgYmUgZW1wdHkuXG4gICAgICBlbHNlIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgY291bnQuXG4gICAgcmV0dXJuIENodW5rLk1BWF9TVUJfQ0hVTktTIC0gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGNodW5rIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggc3ViIGNodW5rLlxuICAgIGZvciAoY29uc3Qgc3ViY2h1bmsgb2YgdGhpcy5zdWJjaHVua3MpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdWIgY2h1bmsgaXMgZW1wdHkuXG4gICAgICBpZiAoIXN1YmNodW5rIHx8ICFzdWJjaHVuay5pc0VtcHR5KCkpIHtcbiAgICAgICAgLy8gVGhlIGNodW5rIGlzIG5vdCBlbXB0eS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBjaHVuayBpcyBlbXB0eS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIGNodW5rIGludG8gYSBidWZmZXIuXG4gICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gc2VyaWFsaXplLlxuICAgKiBAcGFyYW0gbmJ0IElmIGJsb2NrIHBhbGV0dGUgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgYXMgTkJULlxuICAgKiBAcmV0dXJucyBUaGUgc2VyaWFsaXplZCBidWZmZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShjaHVuazogQ2h1bmssIG5idCA9IGZhbHNlKTogQnVmZmVyIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgaGFzIGEgY2FjaGUuXG4gICAgaWYgKGNodW5rLmNhY2hlKSByZXR1cm4gY2h1bmsuY2FjaGU7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3RyZWFtLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFNlcmlhbGl6ZSBlYWNoIHN1YiBjaHVuay5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2h1bmsuZ2V0U3ViQ2h1bmtTZW5kQ291bnQoKTsgaW5kZXgrKykge1xuICAgICAgLy8gR2V0IHRoZSBzdWIgY2h1bmsuXG4gICAgICBjb25zdCBzdWJjaHVuayA9IGNodW5rLnN1YmNodW5rc1tpbmRleF07XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdWIgY2h1bmsgZXhpc3RzLlxuICAgICAgaWYgKHN1YmNodW5rKSB7XG4gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgc3ViIGNodW5rLlxuICAgICAgICBTdWJDaHVuay5zZXJpYWxpemUoc3ViY2h1bmssIHN0cmVhbSwgbmJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBzdWIgY2h1bmsuXG4gICAgICAgIGNvbnN0IHN1YmNodW5rID0gbmV3IFN1YkNodW5rKCk7XG4gICAgICAgIHN1YmNodW5rLmluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgLy8gU2VyaWFsaXplIGFuIGVtcHR5IHN1YiBjaHVuay5cbiAgICAgICAgU3ViQ2h1bmsuc2VyaWFsaXplKHN1YmNodW5rLCBzdHJlYW0sIG5idCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmlvbWVzP1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAyNDsgaW5kZXgrKykge1xuICAgICAgc3RyZWFtLndyaXRlQnl0ZSgwKTtcbiAgICAgIHN0cmVhbS53cml0ZVZhckludCgxIDw8IDEpO1xuICAgIH1cblxuICAgIC8vIEJvcmRlciBibG9ja3M/XG4gICAgc3RyZWFtLndyaXRlQnl0ZSgwKTtcblxuICAgIC8vIFNldCB0aGUgY2FjaGUgb2YgdGhlIGNodW5rLlxuICAgIGNodW5rLmNhY2hlID0gc3RyZWFtLmdldEJ1ZmZlcigpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBidWZmZXIuXG4gICAgcmV0dXJuIGNodW5rLmNhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgYnVmZmVyIGludG8gYSBjaHVuay5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGRpbWVuc2lvbiB0eXBlIG9mIHRoZSBjaHVuay5cbiAgICogQHBhcmFtIHggVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2h1bmsuXG4gICAqIEBwYXJhbSB6IFRoZSBaIGNvb3JkaW5hdGUgb2YgdGhlIGNodW5rLlxuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdG8gZGVzZXJpYWxpemUuXG4gICAqIEBwYXJhbSBuYnQgSWYgYmxvY2sgcGFsZXR0ZSBzaG91bGQgYmUgZGVzZXJpYWxpemVkIGFzIE5CVC5cbiAgICogQHJldHVybnMgVGhlIGRlc2VyaWFsaXplZCBjaHVuay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoXG4gICAgdHlwZTogRGltZW5zaW9uVHlwZSxcbiAgICB4OiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgIG5idCA9IGZhbHNlXG4gICk6IENodW5rIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgc3RyZWFtLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgIC8vIERlc2VyaWFsaXplIGVhY2ggc3ViIGNodW5rLlxuICAgIGNvbnN0IHN1YmNodW5rczogQXJyYXk8U3ViQ2h1bms+ID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBDaHVuay5NQVhfU1VCX0NIVU5LUyB9LFxuICAgICAgKCkgPT4gbmV3IFN1YkNodW5rKClcbiAgICApO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggc3ViIGNodW5rLlxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBDaHVuay5NQVhfU1VCX0NIVU5LUzsgKytpbmRleCkge1xuICAgICAgY29uc3QgaGVhZGVyID0gc3RyZWFtLmJpbmFyeVtzdHJlYW0ub2Zmc2V0XTtcblxuICAgICAgaWYgKGhlYWRlciAhPT0gOCAmJiBoZWFkZXIgIT09IDkpIGJyZWFrO1xuICAgICAgc3ViY2h1bmtzW2luZGV4XSA9IFN1YkNodW5rLmRlc2VyaWFsaXplKHN0cmVhbSwgbmJ0KTtcbiAgICB9XG5cbiAgICAvLyBCaW9tZXM/XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDI0OyBpbmRleCsrKSB7XG4gICAgICBzdHJlYW0ucmVhZEJ5dGUoKTtcbiAgICAgIHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgfVxuXG4gICAgLy8gQm9yZGVyIGJsb2Nrcz9cbiAgICBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjaHVuay5cbiAgICBjb25zdCBjaHVuayA9IG5ldyBDaHVuayh4LCB6LCB0eXBlLCBzdWJjaHVua3MpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjaHVuay5cbiAgICByZXR1cm4gY2h1bms7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCIuLi8uLi9zZXJlbml0eVwiO1xuaW1wb3J0IHtcbiAgQmxvY2tFbnRyeSxcbiAgRW50aXR5RW50cnksXG4gIFBsYXllckVudHJ5LFxuICBXb3JsZFByb3BlcnRpZXMsXG4gIFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vY2h1bmsvY2h1bmtcIjtcbmltcG9ydCB7IERpbWVuc2lvbiB9IGZyb20gXCIuLi9kaW1lbnNpb25cIjtcbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgd29ybGQgcHJvdmlkZXIgcHJvcGVydGllcy5cbiAqL1xuY29uc3QgRGVmYXVsdFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzOiBXb3JsZFByb3ZpZGVyUHJvcGVydGllcyA9IHtcbiAgcGF0aDogXCIuL3dvcmxkc1wiXG59O1xuXG5jbGFzcyBXb3JsZFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBXb3JsZFByb3ZpZGVyKVxuICAgIC5pZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdGhhdCB0aGUgcHJvdmlkZXIgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyB3b3JsZCE6IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgd29ybGQgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKC4uLl9wYXJhbWV0ZXJzOiBBcnJheTx1bmtub3duPikge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwcm92aWRlciBpcyBzdGFydGVkLlxuICAgKi9cbiAgcHVibGljIG9uU3RhcnR1cCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwcm92aWRlciBpcyBzaHV0ZG93bi5cbiAgICovXG4gIHB1YmxpYyBvblNodXRkb3duKCk6IHZvaWQge31cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIG9uU2F2ZSgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgY2h1bmsgZm9yIGEgc3BlY2lmaWVkIGRpbWVuc2lvbiBmcm9tIHRoZSBwcm92aWRlci5cbiAgICogQHBhcmFtIGN4IFRoZSBjaHVuayB4IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBjeiBUaGUgY2h1bmsgeiBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gcmVhZCB0aGUgY2h1bmsgZnJvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkQ2h1bmsoX2N4OiBudW1iZXIsIF9jejogbnVtYmVyLCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiBDaHVuayB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ucmVhZENodW5rKCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIGNodW5rIGZvciBhIHNwZWNpZmllZCBkaW1lbnNpb24gdG8gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIGNodW5rIHRvLlxuICAgKi9cbiAgcHVibGljIHdyaXRlQ2h1bmsoX2NodW5rOiBDaHVuaywgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ud3JpdGVDaHVuaygpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgYXZhaWxhYmxlIGVudGl0aWVzIGZvciBhIHNwZWNpZmllZCBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byBnZXQgdGhlIGF2YWlsYWJsZSBlbnRpdGllcyBmb3IuXG4gICAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgZW50aXRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZEF2YWlsYWJsZUVudGl0aWVzKF9kaW1lbnNpb246IERpbWVuc2lvbik6IEFycmF5PGJpZ2ludD4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke3RoaXMuaWRlbnRpZmllcn0uZ2V0QXZhaWxhYmxlRW50aXRpZXMoKSBpcyBub3QgaW1wbGVtZW50ZWQhYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBhdmFpbGFibGUgZW50aXRpZXMgZm9yIGEgc3BlY2lmaWVkIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHdyaXRlIHRoZSBhdmFpbGFibGUgZW50aXRpZXMgZm9yLlxuICAgKiBAcGFyYW0gZW50aXRpZXMgVGhlIGVudGl0aWVzIHRvIHdyaXRlLlxuICAgKi9cbiAgcHVibGljIHdyaXRlQXZhaWxhYmxlRW50aXRpZXMoXG4gICAgX2RpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIF9lbnRpdGllczogQXJyYXk8YmlnaW50PlxuICApOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHt0aGlzLmlkZW50aWZpZXJ9LndyaXRlQXZhaWxhYmxlRW50aXRpZXMoKSBpcyBub3QgaW1wbGVtZW50ZWQhYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gZW50aXR5IGZyb20gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0gdW5pcXVlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkgdG8gcmVhZC5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHJlYWQgdGhlIGVudGl0eSBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IGRhdGEuXG4gICAqL1xuICBwdWJsaWMgcmVhZEVudGl0eShfdW5pcXVlSWQ6IGJpZ2ludCwgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogRW50aXR5RW50cnkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LnJlYWRFbnRpdHkoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFuIGVudGl0eSB0byB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSBkYXRhIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIGVudGl0eSB0by5cbiAgICovXG4gIHB1YmxpYyB3cml0ZUVudGl0eShfZW50aXR5OiBFbnRpdHlFbnRyeSwgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ud3JpdGVFbnRpdHkoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBwbGF5ZXJzIGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSB1dWlkIFRoZSB1dWlkIG9mIHRoZSBwbGF5ZXIgdG8gcmVhZC5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHJlYWQgdGhlIHBsYXllciBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgcGxheWVyIGRhdGEgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlYWRQbGF5ZXIoX3V1aWQ6IHN0cmluZywgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogUGxheWVyRW50cnkgfCBudWxsIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS5yZWFkUGxheWVyKCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHBsYXllcnMgZGF0YSB0byB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciBkYXRhIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIHBsYXllciB0by5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVBsYXllcihfcGxheWVyOiBQbGF5ZXJFbnRyeSwgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ud3JpdGVQbGF5ZXIoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGF2YWlsYWJsZSBibG9ja3MgZm9yIGEgc3BlY2lmaWVkIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHJlYWQgdGhlIGF2YWlsYWJsZSBibG9ja3MgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlYWRBdmFpbGFibGVCbG9ja3MoX2RpbWVuc2lvbjogRGltZW5zaW9uKTogQXJyYXk8YmlnaW50PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7dGhpcy5pZGVudGlmaWVyfS5yZWFkQXZhaWxhYmxlQmxvY2tzKCkgaXMgbm90IGltcGxlbWVudGVkIWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgYXZhaWxhYmxlIGJsb2NrcyBmb3IgYSBzcGVjaWZpZWQgZGltZW5zaW9uLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIGF2YWlsYWJsZSBibG9ja3MgZm9yLlxuICAgKiBAcGFyYW0gYmxvY2tzIFRoZSBibG9ja3MgdG8gd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgd3JpdGVBdmFpbGFibGVCbG9ja3MoXG4gICAgX2RpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIF9ibG9ja3M6IEFycmF5PGJpZ2ludD5cbiAgKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7dGhpcy5pZGVudGlmaWVyfS53cml0ZUF2YWlsYWJsZUJsb2NrcygpIGlzIG5vdCBpbXBsZW1lbnRlZCFgXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIGJsb2NrIGZyb20gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0gaGFzaCBUaGUgcG9zaXRpb24gaGFzaCB0byByZWFkIHRoZSBibG9jayBmcm9tLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gcmVhZCB0aGUgYmxvY2sgZnJvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkQmxvY2soX2hhc2g6IGJpZ2ludCwgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogQmxvY2tFbnRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ucmVhZEJsb2NrKCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIGJsb2NrIHRvIHRoZSBwcm92aWRlci5cbiAgICogQHBhcmFtIGJsb2NrIFRoZSBibG9jayB0byB3cml0ZS5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHdyaXRlIHRoZSBibG9jayB0by5cbiAgICogQHJldHVybnMgVGhlIGJsb2NrIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgd3JpdGVCbG9jayhfYmxvY2s6IEJsb2NrRW50cnksIF9kaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LndyaXRlQmxvY2soKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgcHJvcGVydHkgdG8gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkUHJvcGVydHkoX2tleTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS5yZWFkUHJvcGVydHkoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgcHJvcGVydHkgdG8gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVByb3BlcnR5KF9rZXk6IEJ1ZmZlciwgX3ZhbHVlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS53cml0ZVByb3BlcnR5KCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwcm92aWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBpbnN0YW5jZSB0byB1c2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKFxuICAgIF9zZXJlbml0eTogU2VyZW5pdHksXG4gICAgX3Byb3BlcnRpZXM6IFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LmluaXRpYWxpemUoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShcbiAgICBfc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIF9wcm9wZXJ0aWVzOiBXb3JsZFByb3ZpZGVyUHJvcGVydGllcyxcbiAgICBfd29ybGRQcm9wZXJ0aWVzPzogUGFydGlhbDxXb3JsZFByb3BlcnRpZXM+XG4gICk6IFdvcmxkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS5jcmVhdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgV29ybGRQcm92aWRlciwgRGVmYXVsdFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgQ2h1bmtDb29yZHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiLi4vLi4vc2VyZW5pdHlcIjtcbmltcG9ydCB7XG4gIEVudGl0eUVudHJ5LFxuICBQbGF5ZXJFbnRyeSxcbiAgV29ybGRQcm9wZXJ0aWVzLFxuICBXb3JsZFByb3ZpZGVyUHJvcGVydGllc1xufSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENodW5rIH0gZnJvbSBcIi4uL2NodW5rXCI7XG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL2RpbWVuc2lvblwiO1xuXG5pbXBvcnQgeyBXb3JsZFByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIjtcblxuY2xhc3MgSW50ZXJuYWxQcm92aWRlciBleHRlbmRzIFdvcmxkUHJvdmlkZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2FkZWQgY2h1bmtzIGluIHRoZSBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaHVua3MgPSBuZXcgTWFwPERpbWVuc2lvbiwgTWFwPGJpZ2ludCwgQ2h1bms+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXRpZXMgdGhhdCBleGlzdCBmb3IgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IE1hcDxEaW1lbnNpb24sIE1hcDxiaWdpbnQsIEVudGl0eUVudHJ5Pj4oKTtcblxuICAvKipcbiAgICogVGhlIHBsYXllcnMgdGhhdCBleGlzdCBmb3IgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcnMgPSBuZXcgTWFwPERpbWVuc2lvbiwgTWFwPHN0cmluZywgUGxheWVyRW50cnk+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyB0aGF0IGV4aXN0IGZvciB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydGllcyA9IG5ldyBNYXA8QnVmZmVyLCBCdWZmZXI+KCk7XG5cbiAgcHVibGljIHJlYWRDaHVuayhjeDogbnVtYmVyLCBjejogbnVtYmVyLCBkaW1lbnNpb246IERpbWVuc2lvbik6IENodW5rIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmtzIGNvbnRhaW4gdGhlIGRpbWVuc2lvbi5cbiAgICBpZiAoIXRoaXMuY2h1bmtzLmhhcyhkaW1lbnNpb24pKSB7XG4gICAgICB0aGlzLmNodW5rcy5zZXQoZGltZW5zaW9uLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGNodW5rcy5cbiAgICBjb25zdCBjaHVua3MgPSB0aGlzLmNodW5rcy5nZXQoZGltZW5zaW9uKSBhcyBNYXA8YmlnaW50LCBDaHVuaz47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmtzIGNvbnRhaW4gdGhlIGNodW5rIGhhc2guXG4gICAgaWYgKCFjaHVua3MuaGFzKENodW5rQ29vcmRzLmhhc2goeyB4OiBjeCwgejogY3ogfSkpKSB7XG4gICAgICBjaHVua3Muc2V0KFxuICAgICAgICBDaHVua0Nvb3Jkcy5oYXNoKHsgeDogY3gsIHo6IGN6IH0pLFxuICAgICAgICBkaW1lbnNpb24uZ2VuZXJhdG9yLmFwcGx5KGN4LCBjeilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBjaHVuayBmcm9tIHRoZSBjaHVua3MgbWFwIGZvciB0aGUgZGltZW5zaW9uLlxuICAgIGNvbnN0IGNodW5rID0gY2h1bmtzLmdldChDaHVua0Nvb3Jkcy5oYXNoKHsgeDogY3gsIHo6IGN6IH0pKSBhcyBDaHVuaztcblxuICAgIC8vIFJldHVybiB0aGUgY2h1bmsuXG4gICAgcmV0dXJuIGNodW5rO1xuICB9XG5cbiAgcHVibGljIHdyaXRlQ2h1bmsoY2h1bms6IENodW5rLCBkaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVua3MgY29udGFpbiB0aGUgZGltZW5zaW9uLlxuICAgIGlmICghdGhpcy5jaHVua3MuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMuY2h1bmtzLnNldChkaW1lbnNpb24sIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gY2h1bmtzLlxuICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuY2h1bmtzLmdldChkaW1lbnNpb24pIGFzIE1hcDxiaWdpbnQsIENodW5rPjtcblxuICAgIC8vIFNldCB0aGUgY2h1bmsuXG4gICAgY2h1bmtzLnNldChDaHVua0Nvb3Jkcy5oYXNoKHsgeDogY2h1bmsueCwgejogY2h1bmsueiB9KSwgY2h1bmspO1xuICB9XG5cbiAgcHVibGljIGdldEF2YWlsYWJsZUVudGl0aWVzKGRpbWVuc2lvbjogRGltZW5zaW9uKTogQXJyYXk8YmlnaW50PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0aWVzIGNvbnRhaW4gdGhlIGRpbWVuc2lvbi5cbiAgICBpZiAoIXRoaXMuZW50aXRpZXMuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMuZW50aXRpZXMuc2V0KGRpbWVuc2lvbiwgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiBlbnRpdGllcy5cbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuZW50aXRpZXMuZ2V0KGRpbWVuc2lvbikgYXMgTWFwPGJpZ2ludCwgRW50aXR5RW50cnk+O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBlbnRpdHkgdW5pcXVlIGlkcy5cbiAgICByZXR1cm4gWy4uLmVudGl0aWVzXS5tYXAoKFt1bmlxdWVJZF0pID0+IHVuaXF1ZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkRW50aXR5KHVuaXF1ZUlkOiBiaWdpbnQsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogRW50aXR5RW50cnkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdGllcyBjb250YWluIHRoZSBkaW1lbnNpb24uXG4gICAgaWYgKCF0aGlzLmVudGl0aWVzLmhhcyhkaW1lbnNpb24pKSB7XG4gICAgICB0aGlzLmVudGl0aWVzLnNldChkaW1lbnNpb24sIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gZW50aXRpZXMuXG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzLmdldChkaW1lbnNpb24pIGFzIE1hcDxiaWdpbnQsIEVudGl0eUVudHJ5PjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdGllcyBjb250YWluIHRoZSB1bmlxdWUgaWQuXG4gICAgaWYgKCFlbnRpdGllcy5oYXModW5pcXVlSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSB3aXRoIHVuaXF1ZSBpZCAke3VuaXF1ZUlkfSBub3QgZm91bmQhYCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBlbnRpdHkuXG4gICAgcmV0dXJuIGVudGl0aWVzLmdldCh1bmlxdWVJZCkgYXMgRW50aXR5RW50cnk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVFbnRpdHkoZW50aXR5OiBFbnRpdHlFbnRyeSwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXRpZXMgY29udGFpbiB0aGUgZGltZW5zaW9uLlxuICAgIGlmICghdGhpcy5lbnRpdGllcy5oYXMoZGltZW5zaW9uKSkge1xuICAgICAgdGhpcy5lbnRpdGllcy5zZXQoZGltZW5zaW9uLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGVudGl0aWVzLlxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5lbnRpdGllcy5nZXQoZGltZW5zaW9uKSBhcyBNYXA8YmlnaW50LCBFbnRpdHlFbnRyeT47XG5cbiAgICAvLyBTZXQgdGhlIGVudGl0eS5cbiAgICBlbnRpdGllcy5zZXQoZW50aXR5LnVuaXF1ZUlkLCBlbnRpdHkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRQbGF5ZXIodXVpZDogc3RyaW5nLCBkaW1lbnNpb246IERpbWVuc2lvbik6IFBsYXllckVudHJ5IHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllcnMgY29udGFpbiB0aGUgZGltZW5zaW9uLlxuICAgIGlmICghdGhpcy5wbGF5ZXJzLmhhcyhkaW1lbnNpb24pKSB7XG4gICAgICB0aGlzLnBsYXllcnMuc2V0KGRpbWVuc2lvbiwgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiBwbGF5ZXJzLlxuICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLnBsYXllcnMuZ2V0KGRpbWVuc2lvbikgYXMgTWFwPHN0cmluZywgUGxheWVyRW50cnk+O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllcnMgY29udGFpbiB0aGUgdXVpZC5cbiAgICBpZiAoIXBsYXllcnMuaGFzKHV1aWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsYXllci5cbiAgICByZXR1cm4gcGxheWVycy5nZXQodXVpZCkgYXMgUGxheWVyRW50cnk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVQbGF5ZXIocGxheWVyOiBQbGF5ZXJFbnRyeSwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVycyBjb250YWluIHRoZSBkaW1lbnNpb24uXG4gICAgaWYgKCF0aGlzLnBsYXllcnMuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMucGxheWVycy5zZXQoZGltZW5zaW9uLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIHBsYXllcnMuXG4gICAgY29uc3QgcGxheWVycyA9IHRoaXMucGxheWVycy5nZXQoZGltZW5zaW9uKSBhcyBNYXA8c3RyaW5nLCBQbGF5ZXJFbnRyeT47XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllci5cbiAgICBwbGF5ZXJzLnNldChwbGF5ZXIudXVpZCwgcGxheWVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkUHJvcGVydHkoa2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgcHJvcGVydGllcy5cbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWVdIG9mIHRoaXMucHJvcGVydGllcykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSBrZXkuXG4gICAgICBpZiAocHJvcGVydHkuZXF1YWxzKGtleSkpIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLlxuICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgd2l0aCBrZXkgJHtrZXkudG9TdHJpbmcoXCJoZXhcIil9IG5vdCBmb3VuZCFgKTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVByb3BlcnR5KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBEbyBub3RoaW5nIGFzIHRoZSBpbnRlcm5hbCBwcm92aWRlciBkb2VzIG5vdCByZXF1aXJlIGluaXRpYWxpemF0aW9uXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIF9wcm9wZXJ0aWVzOiBXb3JsZFByb3ZpZGVyUHJvcGVydGllcyxcbiAgICB3b3JsZFByb3BlcnRpZXM/OiBXb3JsZFByb3BlcnRpZXNcbiAgKTogV29ybGQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBwcm92aWRlciBpbnN0YW5jZVxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHRoaXMoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyB3b3JsZCBpbnN0YW5jZVxuICAgIGNvbnN0IHdvcmxkID0gbmV3IFdvcmxkKHNlcmVuaXR5LCBwcm92aWRlciwgd29ybGRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgd29ybGQgdG8gdGhlIHByb3ZpZGVyXG4gICAgcHJvdmlkZXIud29ybGQgPSB3b3JsZDtcblxuICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCB3b3JsZFxuICAgIHJldHVybiB3b3JsZDtcbiAgfVxufVxuXG5leHBvcnQgeyBJbnRlcm5hbFByb3ZpZGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0sIEVuZGlhbm5lc3MgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5pbXBvcnQgeyBMZXZlbGRiIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xldmVsZGJcIjtcbmltcG9ydCB7IEJsb2NrUG9zaXRpb24sIENodW5rQ29vcmRzIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IENodW5rLCBTdWJDaHVuayB9IGZyb20gXCIuLi9jaHVua1wiO1xuaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL2RpbWVuc2lvblwiO1xuaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiLi4vLi4vc2VyZW5pdHlcIjtcbmltcG9ydCB7XG4gIEJsb2NrRW50cnksXG4gIERpbWVuc2lvblByb3BlcnRpZXMsXG4gIEVudGl0eUVudHJ5LFxuICBQbGF5ZXJFbnRyeSxcbiAgV29ybGRQcm9wZXJ0aWVzLFxuICBXb3JsZFByb3ZpZGVyUHJvcGVydGllc1xufSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBDaHVua1JlYWR5U2lnbmFsLCBXb3JsZEluaXRpYWxpemVTaWduYWwgfSBmcm9tIFwiLi4vLi4vZXZlbnRzXCI7XG5pbXBvcnQgeyBCbG9jayB9IGZyb20gXCIuLi8uLi9ibG9ja1wiO1xuXG5pbXBvcnQgeyBXb3JsZFByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIjtcblxuY2xhc3MgTGV2ZWxEQlByb3ZpZGVyIGV4dGVuZHMgV29ybGRQcm92aWRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nID0gXCJsZXZlbGRiXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhYmFzZSBpbnN0YW5jZSBmb3IgdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRiOiBMZXZlbGRiO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGVkIGNodW5rcyBpbiB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2h1bmtzID0gbmV3IE1hcDxEaW1lbnNpb24sIE1hcDxiaWdpbnQsIENodW5rPj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIFNldCB0aGUgcGF0aCBvZiB0aGUgcHJvdmlkZXIuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcblxuICAgIC8vIE9wZW4gdGhlIGRhdGFiYXNlIGZvciB0aGUgcHJvdmlkZXJcbiAgICB0aGlzLmRiID0gTGV2ZWxkYi5vcGVuKHJlc29sdmUocGF0aCwgXCJkYlwiKSk7XG4gIH1cblxuICBwdWJsaWMgb25TaHV0ZG93bigpOiB2b2lkIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGRpbWVuc2lvbnMgYW5kIHRlcm1pbmF0ZSBhbnkgd29ya2Vycy5cbiAgICBmb3IgKGNvbnN0IGRpbWVuc2lvbiBvZiB0aGlzLndvcmxkLmRpbWVuc2lvbnMudmFsdWVzKCkpXG4gICAgICB2b2lkIGRpbWVuc2lvbi5nZW5lcmF0b3Iud29ya2VyPy50ZXJtaW5hdGUoKTtcblxuICAgIC8vIFNhdmUgYWxsIHRoZSB3b3JsZCBkYXRhLlxuICAgIHRoaXMub25TYXZlKCk7XG5cbiAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICB0aGlzLmRiLmNsb3NlKCk7XG4gIH1cblxuICBwdWJsaWMgb25TdGFydHVwKCk6IHZvaWQge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZGltZW5zaW9ucyBhbmQgbG9hZCB0aGUgZW50aXRpZXMuXG4gICAgZm9yIChjb25zdCBkaW1lbnNpb24gb2YgdGhpcy53b3JsZC5kaW1lbnNpb25zLnZhbHVlcygpKSB7XG4gICAgICAvLyBHZXQgdGhlIGF2YWlsYWJsZSBlbnRpdGllcyAmIGJsb2NrcyBmb3IgdGhlIGRpbWVuc2lvbi5cbiAgICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5yZWFkQXZhaWxhYmxlRW50aXRpZXMoZGltZW5zaW9uKTtcbiAgICAgIGNvbnN0IGJsb2NrcyA9IHRoaXMucmVhZEF2YWlsYWJsZUJsb2NrcyhkaW1lbnNpb24pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXRpZXMgYXJlIGVtcHR5LlxuICAgICAgaWYgKGVudGl0aWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja3MubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRpdGllcyBhbmQgbG9hZCB0aGVtLlxuICAgICAgZm9yIChjb25zdCB1bmlxdWVJZCBvZiBlbnRpdGllcykge1xuICAgICAgICAvLyBSZWFkIHRoZSBlbnRpdHkgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5yZWFkRW50aXR5KHVuaXF1ZUlkLCBkaW1lbnNpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbnRpdHkgaW5zdGFuY2UuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBFbnRpdHkoZGltZW5zaW9uLCBlbnRyeS5pZGVudGlmaWVyLCB7XG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgZW50cnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBlbnRpdHkgdG8gdGhlIGRpbWVuc2lvbi5cbiAgICAgICAgZW50aXR5LnNwYXduKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmxvY2tzIGFuZCBsb2FkIHRoZW0uXG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgYmxvY2tzKSB7XG4gICAgICAgIC8vIFJlYWQgdGhlIGJsb2NrIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucmVhZEJsb2NrKGhhc2gsIGRpbWVuc2lvbik7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBmcm9tIHRoZSBibG9jayBwYWxldHRlLlxuICAgICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGRpbWVuc2lvbi53b3JsZC5ibG9ja1BhbGV0dGVcbiAgICAgICAgICAuZ2V0QWxsUGVybXV0YXRpb25zKClcbiAgICAgICAgICAuZmluZCgocGVybXV0YXRpb24pID0+IHBlcm11dGF0aW9uLm5ldHdvcmsgPT09IGVudHJ5LnBlcm11dGF0aW9uKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBibG9jayBpZiB0aGUgcGVybXV0YXRpb24gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgIGlmICghcGVybXV0YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBibG9jayBpbnN0YW5jZS5cbiAgICAgICAgY29uc3QgYmxvY2sgPSBuZXcgQmxvY2soXG4gICAgICAgICAgZGltZW5zaW9uLFxuICAgICAgICAgIG5ldyBCbG9ja1Bvc2l0aW9uKC4uLmVudHJ5LnBvc2l0aW9uKSxcbiAgICAgICAgICBwZXJtdXRhdGlvbixcbiAgICAgICAgICB7IGVudHJ5IH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBkaW1lbnNpb24gYmxvY2tzIGNvbGxlY3Rpb24uXG4gICAgICAgIGRpbWVuc2lvbi5ibG9ja3Muc2V0KEJsb2NrUG9zaXRpb24uaGFzaChibG9jay5wb3NpdGlvbiksIGJsb2NrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TYXZlKCk6IHZvaWQge1xuICAgIC8vIFNhdmUgdGhlIHdvcmxkIHByb3BlcnRpZXMgdG8gdGhlIHdvcmxkIGRpcmVjdG9yeS5cbiAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGdldCBhbGwgdGhlIGRpbWVuc2lvbiBwcm9wZXJ0aWVzLlxuICAgIGNvbnN0IGRpbWVuc2lvbnM6IEFycmF5PERpbWVuc2lvblByb3BlcnRpZXM+ID0gW1xuICAgICAgLi4udGhpcy53b3JsZC5kaW1lbnNpb25zLnZhbHVlcygpXG4gICAgXS5tYXAoKGRpbWVuc2lvbikgPT4gZGltZW5zaW9uLnByb3BlcnRpZXMpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBwcm9wZXJ0aWVzLlxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLndvcmxkLnByb3BlcnRpZXM7XG4gICAgcHJvcGVydGllcy5kaW1lbnNpb25zID0gZGltZW5zaW9ucztcblxuICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSB3b3JsZCBkaXJlY3RvcnkuXG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBcInByb3BlcnRpZXMuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHByb3BlcnRpZXMsIG51bGwsIDIpXG4gICAgKTtcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2h1bmtzIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBkYXRhYmFzZS5cbiAgICBmb3IgKGNvbnN0IFtkaW1lbnNpb24sIGNodW5rc10gb2YgdGhpcy5jaHVua3MpIHtcbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2h1bmtzIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzLnZhbHVlcygpKSAvLyBDaGVjayBpZiB0aGUgY2h1bmsgaXMgZGlydHkuXG4gICAgICAgIGlmIChjaHVuay5kaXJ0eSkgdGhpcy53cml0ZUNodW5rKGNodW5rLCBkaW1lbnNpb24pO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGVudGl0aWVzIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgIGNvbnN0IGVudGl0aWVzID0gWy4uLmRpbWVuc2lvbi5lbnRpdGllcy52YWx1ZXMoKV07XG4gICAgICBjb25zdCB1bmlxdWVJZHM6IEFycmF5PGJpZ2ludD4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIuXG4gICAgICAgIGlmIChlbnRpdHkuaXNQbGF5ZXIoKSlcbiAgICAgICAgICB0aGlzLndyaXRlUGxheWVyKGVudGl0eS5nZXREYXRhRW50cnkoKSwgZGltZW5zaW9uKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGVudGl0eSB0byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAgdGhpcy53cml0ZUVudGl0eShlbnRpdHkuZ2V0RGF0YUVudHJ5KCksIGRpbWVuc2lvbik7XG4gICAgICAgICAgLy8gQWRkIHRoZSB1bmlxdWUgaWRlbnRpZmllciB0byB0aGUgbGlzdC5cbiAgICAgICAgICB1bmlxdWVJZHMucHVzaChlbnRpdHkudW5pcXVlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBhdmFpbGFibGUgZW50aXRpZXMgdG8gdGhlIGRhdGFiYXNlLlxuICAgICAgdGhpcy53cml0ZUF2YWlsYWJsZUVudGl0aWVzKGRpbWVuc2lvbiwgdW5pcXVlSWRzKTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBibG9ja3MgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAgY29uc3QgYmxvY2tzID0gWy4uLmRpbWVuc2lvbi5ibG9ja3MudmFsdWVzKCldO1xuICAgICAgY29uc3QgaGFzaGVzOiBBcnJheTxiaWdpbnQ+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgICAvLyBXcml0ZSB0aGUgYmxvY2sgdG8gdGhlIGRhdGFiYXNlLlxuICAgICAgICB0aGlzLndyaXRlQmxvY2soYmxvY2suZ2V0RGF0YUVudHJ5KCksIGRpbWVuc2lvbik7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBibG9jayBwb3NpdGlvbiBoYXNoIHRvIHRoZSBsaXN0LlxuICAgICAgICBoYXNoZXMucHVzaChCbG9ja1Bvc2l0aW9uLmhhc2goYmxvY2sucG9zaXRpb24pKTtcbiAgICAgIH1cblxuICAgICAgLy8gV3JpdGUgdGhlIGF2YWlsYWJsZSBibG9ja3MgdG8gdGhlIGRhdGFiYXNlLlxuICAgICAgdGhpcy53cml0ZUF2YWlsYWJsZUJsb2NrcyhkaW1lbnNpb24sIGhhc2hlcyk7XG5cbiAgICAgIC8vIExvZyB0aGUgYW1vdW50IG9mIGNodW5rcywgZW50aXRpZXMsIGFuZCBibG9ja3Mgc2F2ZWQuXG4gICAgICB0aGlzLndvcmxkLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU2F2ZWQgwqdjJHtjaHVua3Muc2l6ZX3Cp3IgY2h1bmtzLCDCp2Mke2VudGl0aWVzLmxlbmd0aH3Cp3IgZW50aXRpZXMsIGFuZCDCp2Mke2Jsb2Nrcy5sZW5ndGh9wqdyIGJsb2NrcyBmb3IgZGltZW5zaW9uIMKnYSR7ZGltZW5zaW9uLmlkZW50aWZpZXJ9wqdyLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWRDaHVuayhjeDogbnVtYmVyLCBjejogbnVtYmVyLCBkaW1lbnNpb246IERpbWVuc2lvbik6IENodW5rIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmtzIGNvbnRhaW4gdGhlIGRpbWVuc2lvbi5cbiAgICBpZiAoIXRoaXMuY2h1bmtzLmhhcyhkaW1lbnNpb24pKSB7XG4gICAgICB0aGlzLmNodW5rcy5zZXQoZGltZW5zaW9uLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGNodW5rcy5cbiAgICBjb25zdCBjaHVua3MgPSB0aGlzLmNodW5rcy5nZXQoZGltZW5zaW9uKSBhcyBNYXA8YmlnaW50LCBDaHVuaz47XG5cbiAgICAvLyBHZW5lcmF0ZSBhIGhhc2ggZm9yIHRoZSBjaHVuayBjb29yZGluYXRlcy5cbiAgICBjb25zdCBoYXNoID0gQ2h1bmtDb29yZHMuaGFzaCh7IHg6IGN4LCB6OiBjeiB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjYWNoZSBjb250YWlucyB0aGUgY2h1bmsuXG4gICAgaWYgKGNodW5rcy5oYXMoaGFzaCkpIHtcbiAgICAgIHJldHVybiBjaHVua3MuZ2V0KGhhc2gpIGFzIENodW5rO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oYXNDaHVuayhjeCwgY3osIGRpbWVuc2lvbikpIHtcbiAgICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBzdWJjaHVua3MuXG4gICAgICBjb25zdCBzdWJjaHVua3MgPSBuZXcgQXJyYXk8U3ViQ2h1bms+KCk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3ViY2h1bmtzIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICAvLyBUT0RPOiBEaW1lbnNpb25zIGNhbiBoYXZlIGEgZGF0YSBkcml2ZW4gbWluIGFuZCBtYXggc3ViY2h1bmsgdmFsdWUsIHdlIHNob3VsZCB1c2UgdGhhdC5cbiAgICAgIGZvciAobGV0IGN5ID0gLTQ7IGN5IDwgMTY7IGN5KyspIHtcbiAgICAgICAgLy8gUmVhZCBhbmQgcHVzaCB0aGUgc3ViY2h1bmsgdG8gdGhlIHN1YmNodW5rcyBhcnJheS5cbiAgICAgICAgc3ViY2h1bmtzLnB1c2godGhpcy5yZWFkU3ViQ2h1bmsoY3gsIGN5LCBjeiwgZGltZW5zaW9uKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjaHVuayBpbnN0YW5jZS5cbiAgICAgIGNvbnN0IGNodW5rID0gbmV3IENodW5rKGN4LCBjeiwgZGltZW5zaW9uLnR5cGUsIHN1YmNodW5rcyk7XG5cbiAgICAgIC8vIEFkZCB0aGUgY2h1bmsgdG8gdGhlIGNhY2hlLlxuICAgICAgY2h1bmtzLnNldChoYXNoLCBjaHVuayk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgY2h1bmsuXG4gICAgICByZXR1cm4gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IGNodW5rIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgICAgY29uc3QgY2h1bmsgPSBkaW1lbnNpb24uZ2VuZXJhdG9yLmFwcGx5KGN4LCBjeik7XG5cbiAgICAgIC8vIEFkZCB0aGUgY2h1bmsgdG8gdGhlIGNhY2hlLlxuICAgICAgY2h1bmtzLnNldChoYXNoLCBjaHVuayk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyByZWFkeS5cbiAgICAgIC8vIElmIHNvLCBlbWl0IGEgbmV3IENodW5rUmVhZHlTaWduYWwuXG4gICAgICBpZiAoY2h1bmsucmVhZHkpIG5ldyBDaHVua1JlYWR5U2lnbmFsKGRpbWVuc2lvbiwgY2h1bmspLmVtaXQoKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBnZW5lcmF0ZWQgY2h1bmsuXG4gICAgICByZXR1cm4gY2h1bms7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdyaXRlQ2h1bmsoY2h1bms6IENodW5rLCBkaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyBlbXB0eS5cbiAgICBpZiAoY2h1bmsuaXNFbXB0eSgpIHx8ICFjaHVuay5kaXJ0eSkgcmV0dXJuO1xuXG4gICAgLy8gV3JpdGUgdGhlIGNodW5rIHZlcnNpb24sIGluIHRoaXMgY2FzZSB3aWxsIGJlIDQwXG4gICAgdGhpcy53cml0ZUNodW5rVmVyc2lvbihjaHVuay54LCBjaHVuay56LCBkaW1lbnNpb24sIDQwKTtcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2h1bmtzIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAvLyBUT0RPOiBEaW1lbnNpb25zIGNhbiBoYXZlIGEgZGF0YSBkcml2ZW4gbWluIGFuZCBtYXggc3ViY2h1bmsgdmFsdWUsIHdlIHNob3VsZCB1c2UgdGhhdC5cbiAgICBmb3IgKGxldCBjeSA9IC00OyBjeSA8IDE2OyBjeSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHN1YmNodW5rIGZyb20gdGhlIGNodW5rLlxuICAgICAgY29uc3Qgc3ViY2h1bmsgPSBjaHVuay5nZXRTdWJDaHVuayhjeSArIDQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3ViY2h1bmsgaXMgZW1wdHkuXG4gICAgICBpZiAoIXN1YmNodW5rIHx8IHN1YmNodW5rLmlzRW1wdHkoKSkgY29udGludWU7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBzdWJjaHVuayB0byB0aGUgZGF0YWJhc2UuXG4gICAgICB0aGlzLndyaXRlU3ViQ2h1bmsoc3ViY2h1bmssIGNodW5rLngsIGN5LCBjaHVuay56LCBkaW1lbnNpb24pO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgY2h1bmsgYXMgbm90IGRpcnR5LlxuICAgIGNodW5rLmRpcnR5ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgdGhlIGNodW5rIHZlcnNpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gY3ggVGhlIGNodW5rIFggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN6IFRoZSBjaHVuayBaIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgZGltZW5zaW9uIGluZGV4LlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgY2h1bmsgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyB3cml0ZUNodW5rVmVyc2lvbihcbiAgICBjeDogbnVtYmVyLFxuICAgIGN6OiBudW1iZXIsXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgdmVyc2lvbjogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGNodW5rIHZlcnNpb25cbiAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRDaHVua1ZlcnNpb25LZXkoXG4gICAgICBjeCxcbiAgICAgIGN6LFxuICAgICAgZGltZW5zaW9uLmluZGV4T2YoKVxuICAgICk7XG5cbiAgICAvLyBXcml0ZSB0aGUgY2h1bmsgdmVyc2lvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShbdmVyc2lvbl0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGRhdGFiYXNlIGhhcyBhIGNodW5rLlxuICAgKiBAcGFyYW0gY3ggVGhlIGNodW5rIFggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN6IFRoZSBjaHVuayBaIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byBjaGVjayBmb3IgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIGhhc0NodW5rKGN4OiBudW1iZXIsIGN6OiBudW1iZXIsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGNodW5rIHZlcnNpb24uXG4gICAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRDaHVua1ZlcnNpb25LZXkoXG4gICAgICAgIGN4LFxuICAgICAgICBjeixcbiAgICAgICAgZGltZW5zaW9uLmluZGV4T2YoKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGIuZ2V0KGtleSk7XG4gICAgICBpZiAoZGF0YSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgY2h1bmsgZG9lcyBub3QgZXhpc3QuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgc3ViY2h1bmsgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3kgVGhlIHN1YmNodW5rIFkgY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN6IFRoZSBjaHVuayBaIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byByZWFkIHRoZSBzdWJjaHVuayBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgc3ViY2h1bmsgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZFN1YkNodW5rKFxuICAgIGN4OiBudW1iZXIsXG4gICAgY3k6IG51bWJlcixcbiAgICBjejogbnVtYmVyLFxuICAgIGRpbWVuc2lvbjogRGltZW5zaW9uXG4gICk6IFN1YkNodW5rIHtcbiAgICAvLyBBdHRlbXB0IHRvIHJlYWQgdGhlIHN1YmNodW5rIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgIHRyeSB7XG4gICAgICAvLyBCdWlsZCB0aGUgc3ViY2h1bmsga2V5IGZvciB0aGUgZGF0YWJhc2UuXG4gICAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRTdWJDaHVua0tleShcbiAgICAgICAgY3gsXG4gICAgICAgIGN5LFxuICAgICAgICBjeixcbiAgICAgICAgZGltZW5zaW9uLmluZGV4T2YoKVxuICAgICAgKTtcblxuICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIHN1YmNodW5rIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgY29uc3Qgc3ViY2h1bmsgPSBTdWJDaHVuay5mcm9tKHRoaXMuZGIuZ2V0KGtleSksIHRydWUpO1xuXG4gICAgICAvLyBTZXQgdGhlIGNodW5rIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3ViY2h1bmsuXG4gICAgICBzdWJjaHVuay5pbmRleCA9IGN5O1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHN1YmNodW5rIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgcmV0dXJuIHN1YmNodW5rO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gYSBuZXcgc3ViY2h1bmsuXG4gICAgICAvLyBUaGVzZSBtZWFucyB0aGUgc3ViY2h1bmsgZG9lcyBub3QgZXhpc3QuXG4gICAgICBjb25zdCBzdWJjaHVuayA9IG5ldyBTdWJDaHVuaygpO1xuXG4gICAgICAvLyBTZXQgdGhlIGNodW5rIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3ViY2h1bmsuXG4gICAgICBzdWJjaHVuay5pbmRleCA9IGN5O1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIG5ldyBzdWJjaHVuay5cbiAgICAgIHJldHVybiBzdWJjaHVuaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgc3ViY2h1bmsgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gc3ViY2h1bmsgVGhlIHN1YmNodW5rIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gY3ggVGhlIGNodW5rIFggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN5IFRoZSBzdWJjaHVuayBZIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBjeiBUaGUgY2h1bmsgWiBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIHN1YmNodW5rIHRvLlxuICAgKi9cbiAgcHVibGljIHdyaXRlU3ViQ2h1bmsoXG4gICAgc3ViY2h1bms6IFN1YkNodW5rLFxuICAgIGN4OiBudW1iZXIsXG4gICAgY3k6IG51bWJlcixcbiAgICBjejogbnVtYmVyLFxuICAgIGRpbWVuc2lvbjogRGltZW5zaW9uXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIHN1YmNodW5rLlxuICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZFN1YkNodW5rS2V5KFxuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIGN6LFxuICAgICAgZGltZW5zaW9uLmluZGV4T2YoKVxuICAgICk7XG5cbiAgICAvLyBTZXQgdGhlIHN1YmNodW5rIGluZGV4LlxuICAgIHN1YmNodW5rLmluZGV4ID0gY3k7XG5cbiAgICAvLyBTZXJpYWxpemUgdGhlIHN1YmNodW5rIHRvIGEgYnVmZmVyXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgIFN1YkNodW5rLnNlcmlhbGl6ZShzdWJjaHVuaywgc3RyZWFtLCB0cnVlKTtcblxuICAgIC8vIFdyaXRlIHRoZSBzdWJjaHVuayB0byB0aGUgZGF0YWJhc2VcbiAgICB0aGlzLmRiLnB1dChrZXksIHN0cmVhbS5nZXRCdWZmZXIoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEF2YWlsYWJsZUVudGl0aWVzKGRpbWVuc2lvbjogRGltZW5zaW9uKTogQXJyYXk8YmlnaW50PiB7XG4gICAgLy8gUHJlcGFyZSBhbiBhcnJheSB0byBzdG9yZSB0aGUgZW50aXRpZXMgdW5pcXVlIGlkZW50aWZpZXJzLlxuICAgIGNvbnN0IHVuaXF1ZUlkcyA9IG5ldyBBcnJheTxiaWdpbnQ+KCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIHJlYWQgdGhlIGVudGl0aWVzIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBhY3RvciBsaXN0LlxuICAgICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkQWN0b3JMaXN0S2V5KGRpbWVuc2lvbik7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKHRoaXMuZGIuZ2V0KGtleSkpO1xuXG4gICAgICAvLyBSZWFkIHRoZSB1bmlxdWUgaWRlbnRpZmllcnMgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAgZG8gdW5pcXVlSWRzLnB1c2goc3RyZWFtLnJlYWRJbnQ2NChFbmRpYW5uZXNzLkxpdHRsZSkpO1xuICAgICAgd2hpbGUgKCFzdHJlYW0uY3Vyc29yQXRFbmQoKSk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXJzLlxuICAgICAgcmV0dXJuIHVuaXF1ZUlkcztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICAgICAgcmV0dXJuIHVuaXF1ZUlkcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVBdmFpbGFibGVFbnRpdGllcyhcbiAgICBkaW1lbnNpb246IERpbWVuc2lvbixcbiAgICBlbnRpdGllczogQXJyYXk8YmlnaW50PlxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBhY3RvciBsaXN0LlxuICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZEFjdG9yTGlzdEtleShkaW1lbnNpb24pO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgdW5pcXVlIGlkZW50aWZpZXJzIHRvIHRoZSBzdHJlYW0uXG4gICAgZm9yIChjb25zdCB1bmlxdWVJZCBvZiBlbnRpdGllcylcbiAgICAgIHN0cmVhbS53cml0ZUludDY0KHVuaXF1ZUlkLCBFbmRpYW5uZXNzLkxpdHRsZSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgc3RyZWFtIHRvIHRoZSBkYXRhYmFzZS5cbiAgICB0aGlzLmRiLnB1dChrZXksIHN0cmVhbS5nZXRCdWZmZXIoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEVudGl0eSh1bmlxdWVJZDogYmlnaW50LCBkaW1lbnNpb246IERpbWVuc2lvbik6IEVudGl0eUVudHJ5IHtcbiAgICAvLyBHZXQgYWxsIHRoZSBhdmFpbGFibGUgZW50aXRpZXMgZm9yIHRoZSBkaW1lbnNpb24uXG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLnJlYWRBdmFpbGFibGVFbnRpdGllcyhkaW1lbnNpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBleGlzdHMuXG4gICAgaWYgKCFlbnRpdGllcy5pbmNsdWRlcyh1bmlxdWVJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5IHdpdGggdW5pcXVlIGlkICR7dW5pcXVlSWR9IG5vdCBmb3VuZCFgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBlbnRpdHkuXG4gICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkQWN0b3JEYXRhS2V5KHVuaXF1ZUlkKTtcblxuICAgIC8vIFJlYWQgdGhlIGVudGl0eSBkYXRhIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZGIuZ2V0KGtleSk7XG5cbiAgICAvLyBQYXJzZSB0aGUgZW50aXR5IGRhdGEgZnJvbSB0aGUgYnVmZmVyLlxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGJ1ZmZlci50b1N0cmluZygpLCAoXywgdmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuZW5kc1dpdGgoXCJCaWdJbnRfdFwiKSkge1xuICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlLnNsaWNlKDAsIC04KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJJbmZpbml0eV90XCIpIHJldHVybiBJbmZpbml0eTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gXCItSW5maW5pdHlfdFwiKSByZXR1cm4gLUluZmluaXR5O1xuICAgICAgaWYgKHZhbHVlID09PSBcIk5hTl90XCIpIHJldHVybiBOdW1iZXIuTmFOO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSkgYXMgRW50aXR5RW50cnk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGVudGl0eSBkYXRhLlxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHVibGljIHdyaXRlRW50aXR5KGVudGl0eTogRW50aXR5RW50cnksIGRpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IGFsbCB0aGUgYXZhaWxhYmxlIGVudGl0aWVzIGZvciB0aGUgZGltZW5zaW9uLlxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5yZWFkQXZhaWxhYmxlRW50aXRpZXMoZGltZW5zaW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKCFlbnRpdGllcy5pbmNsdWRlcyhlbnRpdHkudW5pcXVlSWQpKSBlbnRpdGllcy5wdXNoKGVudGl0eS51bmlxdWVJZCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgZW50aXR5IHRvIHRoZSBkYXRhYmFzZS5cbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZW50aXR5LCAoXywgdmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiB2YWx1ZS50b1N0cmluZygpICsgXCJCaWdJbnRfdFwiO1xuICAgICAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkgcmV0dXJuIFwiSW5maW5pdHlfdFwiO1xuICAgICAgaWYgKHZhbHVlID09PSAtSW5maW5pdHkpIHJldHVybiBcIi1JbmZpbml0eV90XCI7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuIFwiTmFOX3RcIjtcblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0aGUgZW50aXR5IGRhdGEgdG8gYSBidWZmZXIuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSk7XG5cbiAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBlbnRpdHkuXG4gICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkQWN0b3JEYXRhS2V5KGVudGl0eS51bmlxdWVJZCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgZW50aXR5IGRhdGEgdG8gdGhlIGRhdGFiYXNlLlxuICAgIHRoaXMuZGIucHV0KGtleSwgYnVmZmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkUGxheWVyKHV1aWQ6IHN0cmluZywgZGltZW5zaW9uOiBEaW1lbnNpb24pOiBQbGF5ZXJFbnRyeSB8IG51bGwge1xuICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgcGxheWVyIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBwbGF5ZXIuXG4gICAgICBjb25zdCBrZXkgPSBgcGxheWVyX3NlcnZlcl8ke3V1aWR9XyR7ZGltZW5zaW9uLmlkZW50aWZpZXJ9YDtcblxuICAgICAgLy8gUmVhZCB0aGUgcGxheWVyIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmRiLmdldChCdWZmZXIuZnJvbShrZXkpKTtcblxuICAgICAgLy8gUGFyc2UgdGhlIHBsYXllciBkYXRhIGZyb20gdGhlIGJ1ZmZlci5cbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGJ1ZmZlci50b1N0cmluZygpLCAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5lbmRzV2l0aChcIkJpZ0ludF90XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludCh2YWx1ZS5zbGljZSgwLCAtOCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIkluZmluaXR5X3RcIikgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICBpZiAodmFsdWUgPT09IFwiLUluZmluaXR5X3RcIikgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIk5hTl90XCIpIHJldHVybiBOdW1iZXIuTmFOO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pIGFzIFBsYXllckVudHJ5O1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHBsYXllciBkYXRhLlxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVQbGF5ZXIocGxheWVyOiBQbGF5ZXJFbnRyeSwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBXZSB3YW50IHRvIHN0cmluZ2lmeSB0aGUgcGxheWVyIGRhdGEgYW5kIHdyaXRlIGl0IHRvIHRoZSBkYXRhYmFzZS5cbiAgICAvLyBTbyB3ZSBuZWVkIGEgY3VzdG9tIHNlcmlhbGl6YXRpb24gbWV0aG9kIGZvciBiaWdpbnRzLCBhcyBKU09OLnN0cmluZ2lmeSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0uXG4gICAgLy8gU2FtZSBnb2VzIGZvciBJbmZpbml0eSwgLUluZmluaXR5IGFuZCBOYU4sIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRob3NlIGhlcmUuXG4gICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHBsYXllciwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKSArIFwiQmlnSW50X3RcIjtcbiAgICAgIGlmICh2YWx1ZSA9PT0gSW5maW5pdHkpIHJldHVybiBcIkluZmluaXR5X3RcIjtcbiAgICAgIGlmICh2YWx1ZSA9PT0gLUluZmluaXR5KSByZXR1cm4gXCItSW5maW5pdHlfdFwiO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiBcIk5hTl90XCI7XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHBsYXllciBkYXRhIHRvIGEgYnVmZmVyLlxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuXG4gICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgcGxheWVyLlxuICAgIGNvbnN0IGtleSA9IGBwbGF5ZXJfc2VydmVyXyR7cGxheWVyLnV1aWR9XyR7ZGltZW5zaW9uLmlkZW50aWZpZXJ9YDtcblxuICAgIC8vIFdyaXRlIHRoZSBwbGF5ZXIgZGF0YSB0byB0aGUgZGF0YWJhc2UuXG4gICAgdGhpcy5kYi5wdXQoQnVmZmVyLmZyb20oa2V5KSwgYnVmZmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkQXZhaWxhYmxlQmxvY2tzKGRpbWVuc2lvbjogRGltZW5zaW9uKTogQXJyYXk8YmlnaW50PiB7XG4gICAgLy8gUHJlcGFyZSBhbiBhcnJheSB0byBzdG9yZSB0aGUgYmxvY2sgcG9zaXRpb25zIGhhc2hlcy5cbiAgICBjb25zdCBoYXNoZXMgPSBuZXcgQXJyYXk8YmlnaW50PigpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byByZWFkIHRoZSBibG9ja3MgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGJsb2NrIGxpc3QuXG4gICAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRCbG9ja0RhdGFMaXN0S2V5KGRpbWVuc2lvbik7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKHRoaXMuZGIuZ2V0KGtleSkpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBibG9jayBwb3NpdGlvbnMgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAgZG8ge1xuICAgICAgICAvLyBSZWFkIHRoZSBibG9jayBwb3NpdGlvbiBoYXNoIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgICAgY29uc3QgaGFzaCA9IHN0cmVhbS5yZWFkWmlnWm9uZygpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgcG9zaXRpb24gdG8gdGhlIGxpc3QuXG4gICAgICAgIGhhc2hlcy5wdXNoKGhhc2gpO1xuICAgICAgfSB3aGlsZSAoIXN0cmVhbS5jdXJzb3JBdEVuZCgpKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBibG9jayBwb3NpdGlvbnMgaGFzaGVzLlxuICAgICAgcmV0dXJuIGhhc2hlcztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICAgICAgcmV0dXJuIGhhc2hlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVBdmFpbGFibGVCbG9ja3MoXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgYmxvY2tzOiBBcnJheTxiaWdpbnQ+XG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGJsb2NrIGxpc3QuXG4gICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkQmxvY2tEYXRhTGlzdEtleShkaW1lbnNpb24pO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgYmxvY2sgcG9zaXRpb25zIHRvIHRoZSBzdHJlYW0uXG4gICAgZm9yIChjb25zdCBoYXNoIG9mIGJsb2Nrcykgc3RyZWFtLndyaXRlWmlnWm9uZyhoYXNoKTtcblxuICAgIC8vIFdyaXRlIHRoZSBzdHJlYW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgIHRoaXMuZGIucHV0KGtleSwgc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkQmxvY2soaGFzaDogYmlnaW50LCBkaW1lbnNpb246IERpbWVuc2lvbik6IEJsb2NrRW50cnkge1xuICAgIC8vIFVuaGFzaCB0aGUgYmxvY2sgcG9zaXRpb24uXG4gICAgY29uc3QgcG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLnVuaGFzaChoYXNoKTtcblxuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGJsb2NrLlxuICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZEJsb2NrRGF0YUtleShcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgZGltZW5zaW9uLmluZGV4T2YoKVxuICAgICk7XG5cbiAgICAvLyBSZWFkIHRoZSBibG9jayBkYXRhIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZGIuZ2V0KGtleSk7XG5cbiAgICAvLyBQYXJzZSB0aGUgYmxvY2sgZGF0YSBmcm9tIHRoZSBidWZmZXIuXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpIGFzIEJsb2NrRW50cnk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIGRhdGEuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVCbG9jayhibG9jazogQmxvY2tFbnRyeSwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBibG9jayBwb3NpdGlvbiBpbnN0YW5jZS5cbiAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBCbG9ja1Bvc2l0aW9uKC4uLmJsb2NrLnBvc2l0aW9uKTtcblxuICAgIC8vIFdyaXRlIHRoZSBibG9jayB0byB0aGUgZGF0YWJhc2UuXG4gICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGJsb2NrKTtcblxuICAgIC8vIENvbnZlcnQgdGhlIGJsb2NrIGRhdGEgdG8gYSBidWZmZXIuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSk7XG5cbiAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBibG9jay5cbiAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRCbG9ja0RhdGFLZXkoXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGRpbWVuc2lvbi5pbmRleE9mKClcbiAgICApO1xuXG4gICAgLy8gV3JpdGUgdGhlIGJsb2NrIGRhdGEgdG8gdGhlIGRhdGFiYXNlLlxuICAgIHRoaXMuZGIucHV0KGtleSwgYnVmZmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkUHJvcGVydHkoa2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLmRiLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlUHJvcGVydHkoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5kYi5wdXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGluaXRpYWxpemUoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM6IFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIC8vIFJlc29sdmUgdGhlIHBhdGggZm9yIHRoZSB3b3JsZHMgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHByb3BlcnRpZXMucGF0aCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBwcm92aWRlZCBleGlzdHMuXG4gICAgLy8gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSB0aGUgZGlyZWN0b3J5LlxuICAgIGlmICghZXhpc3RzU3luYyhwYXRoKSkgbWtkaXJTeW5jKHBhdGgpO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGRpcmVjdG9yaWVzIGluIHRoZSB3b3JsZCBkaXJlY3RvcnkuXG4gICAgLy8gRXhjbHVkaW5nIGZpbGUgdHlwZXMsIGFzIGEgd29ybGQgZW50cnkgaXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSByZWFkZGlyU3luYyhwYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkuZmlsdGVyKFxuICAgICAgKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KClcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eS5cbiAgICAvLyBJZiBpdCBpcywgY3JlYXRlIGEgbmV3IHdvcmxkIHdpdGggdGhlIGRlZmF1bHQgaWRlbnRpZmllci5cbiAgICBpZiAoZGlyZWN0b3JpZXMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHZvaWQgc2VyZW5pdHkucmVnaXN0ZXJXb3JsZChcbiAgICAgICAgdGhpcy5jcmVhdGUoc2VyZW5pdHksIHByb3BlcnRpZXMsIHsgaWRlbnRpZmllcjogXCJkZWZhdWx0XCIgfSlcbiAgICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHdvcmxkIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeS5cbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgLy8gR2V0IHRoZSBwYXRoIGZvciB0aGUgd29ybGQuXG4gICAgICBjb25zdCB3b3JsZFBhdGggPSByZXNvbHZlKHBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgLy8gR2V0IHRoZSB3b3JsZCBwcm9wZXJ0aWVzLlxuICAgICAgbGV0IHByb3BlcnRpZXM6IFBhcnRpYWw8V29ybGRQcm9wZXJ0aWVzPiA9IHsgaWRlbnRpZmllcjogZGlyZWN0b3J5Lm5hbWUgfTtcbiAgICAgIGlmIChleGlzdHNTeW5jKHJlc29sdmUod29ybGRQYXRoLCBcInByb3BlcnRpZXMuanNvblwiKSkpIHtcbiAgICAgICAgLy8gUmVhZCB0aGUgcHJvcGVydGllcyBvZiB0aGUgd29ybGQuXG4gICAgICAgIHByb3BlcnRpZXMgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHdvcmxkUGF0aCwgXCJwcm9wZXJ0aWVzLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHdvcmxkIGluc3RhbmNlLlxuICAgICAgY29uc3Qgd29ybGQgPSBuZXcgV29ybGQoc2VyZW5pdHksIG5ldyB0aGlzKHdvcmxkUGF0aCksIHByb3BlcnRpZXMpO1xuXG4gICAgICAvLyBBc3NpZ24gdGhlIHdvcmxkIHRvIHRoZSBwcm92aWRlci5cbiAgICAgIHdvcmxkLnByb3ZpZGVyLndvcmxkID0gd29ybGQ7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBXb3JsZEluaXRpYWxpemVkU2lnbmFsIGluc3RhbmNlLlxuICAgICAgbmV3IFdvcmxkSW5pdGlhbGl6ZVNpZ25hbCh3b3JsZCkuZW1pdCgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgcHJvcGVydGllcyB0byB0aGUgd29ybGQuXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHdvcmxkUGF0aCwgXCJwcm9wZXJ0aWVzLmpzb25cIiksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHdvcmxkLnByb3BlcnRpZXMsIG51bGwsIDIpXG4gICAgICApO1xuXG4gICAgICAvLyBQcmVwYXJlIHRoZSBkaW1lbnNpb25zIGZvciB0aGUgd29ybGQuXG4gICAgICBmb3IgKGNvbnN0IGRpbWVuc2lvbiBvZiB3b3JsZC5kaW1lbnNpb25zLnZhbHVlcygpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc3Bhd24gcG9zaXRpb24gb2YgdGhlIGRpbWVuc2lvbi5cbiAgICAgICAgY29uc3Qgc3ggPSBkaW1lbnNpb24ucHJvcGVydGllcy5zcGF3blBvc2l0aW9uWzBdID4+IDQ7XG4gICAgICAgIGNvbnN0IHN6ID0gZGltZW5zaW9uLnByb3BlcnRpZXMuc3Bhd25Qb3NpdGlvblsyXSA+PiA0O1xuXG4gICAgICAgIC8vIEdldCB0aGUgdmlldyBkaXN0YW5jZSBvZiB0aGUgZGltZW5zaW9uLlxuICAgICAgICBjb25zdCB2aWV3RGlzdGFuY2UgPSBkaW1lbnNpb24udmlld0Rpc3RhbmNlO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGNodW5rcyB0byBwcmVnZW5lcmF0ZS5cbiAgICAgICAgY29uc3QgYW1vdW50ID0gKHZpZXdEaXN0YW5jZSAqIDIgKyAxKSAqKiAyO1xuXG4gICAgICAgIC8vIExvZyB0aGUgYW1vdW50IG9mIGNodW5rcyB0byBwcmVnZW5lcmF0ZS5cbiAgICAgICAgd29ybGQubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFByZXBhcmluZyDCp2Mke2Ftb3VudH3Cp3IgY2h1bmtzIGZvciBkaW1lbnNpb24gwqdhJHtkaW1lbnNpb24uaWRlbnRpZmllcn3Cp3IuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgY2h1bmtzIHRvIHByZWdlbmVyYXRlLlxuICAgICAgICBmb3IgKGxldCB4ID0gLXZpZXdEaXN0YW5jZTsgeCA8PSB2aWV3RGlzdGFuY2U7IHgrKykge1xuICAgICAgICAgIGZvciAobGV0IHogPSAtdmlld0Rpc3RhbmNlOyB6IDw9IHZpZXdEaXN0YW5jZTsgeisrKSB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBjaHVuayBmcm9tIHRoZSBwcm92aWRlci5cbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gd29ybGQucHJvdmlkZXIucmVhZENodW5rKHN4ICsgeCwgc3ogKyB6LCBkaW1lbnNpb24pO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgaXMgcmVhZHkuXG4gICAgICAgICAgICBpZiAoIWNodW5rLnJlYWR5KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBjaHVuaywgdGhlIHdpbGwgY2FjaGUgdGhlIGNodW5rIGluIHRoZSBwcm92aWRlci5cbiAgICAgICAgICAgIGNodW5rLmNhY2hlID0gQ2h1bmsuc2VyaWFsaXplKGNodW5rKTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBkaXJ0eSBmbGFnIHRvIGZhbHNlLlxuICAgICAgICAgICAgY2h1bmsuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3MgbWVzc2FnZS5cbiAgICAgICAgd29ybGQubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBwcmVnZW5lcmF0ZWQgwqdjJHthbW91bnR9wqdyIGNodW5rcyBmb3IgZm9yIGRpbWVuc2lvbiDCp2Eke2RpbWVuc2lvbi5pZGVudGlmaWVyfcKnci5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSB3b3JsZCB3aXRoIHRoZSBzZXJlbml0eSBpbnN0YW5jZS5cbiAgICAgIHNlcmVuaXR5LnJlZ2lzdGVyV29ybGQod29ybGQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgIHNlcmVuaXR5OiBTZXJlbml0eSxcbiAgICBwcm9wZXJ0aWVzOiBXb3JsZFByb3ZpZGVyUHJvcGVydGllcyxcbiAgICB3b3JsZFByb3BlcnRpZXM/OiBQYXJ0aWFsPFdvcmxkUHJvcGVydGllcz5cbiAgKTogV29ybGQge1xuICAgIC8vIFJlc29sdmUgdGhlIHBhdGggZm9yIHRoZSB3b3JsZHMgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHByb3BlcnRpZXMucGF0aCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBwcm92aWRlZCBleGlzdHMuXG4gICAgLy8gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSB0aGUgZGlyZWN0b3J5LlxuICAgIGlmICghZXhpc3RzU3luYyhwYXRoKSkgbWtkaXJTeW5jKHBhdGgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYSB3b3JsZCBpZGVudGlmaWVyIHdhcyBwcm92aWRlZC5cbiAgICBpZiAoIXdvcmxkUHJvcGVydGllcz8uaWRlbnRpZmllcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgd29ybGQgaWRlbnRpZmllciBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBuZXcgd29ybGQuXCIpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBwYXRoIGZyb20gdGhlIHByb3BlcnRpZXMuXG4gICAgY29uc3Qgd29ybGRQYXRoID0gcmVzb2x2ZShwYXRoLCB3b3JsZFByb3BlcnRpZXMuaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd29ybGQgYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKGV4aXN0c1N5bmMod29ybGRQYXRoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdvcmxkIHdpdGggaWRlbnRpZmllciAke3dvcmxkUHJvcGVydGllcy5pZGVudGlmaWVyfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHdvcmxkIGRpcmVjdG9yeS5cbiAgICBta2RpclN5bmMod29ybGRQYXRoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyB3b3JsZCBpbnN0YW5jZS5cbiAgICBjb25zdCB3b3JsZCA9IG5ldyBXb3JsZChzZXJlbml0eSwgbmV3IHRoaXMod29ybGRQYXRoKSwgd29ybGRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgd29ybGQgdG8gdGhlIHByb3ZpZGVyLlxuICAgIHdvcmxkLnByb3ZpZGVyLndvcmxkID0gd29ybGQ7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgV29ybGRJbml0aWFsaXplZFNpZ25hbCBpbnN0YW5jZS5cbiAgICBuZXcgV29ybGRJbml0aWFsaXplU2lnbmFsKHdvcmxkKS5lbWl0KCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIHdvcmxkLlxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICByZXNvbHZlKHdvcmxkUGF0aCwgXCJwcm9wZXJ0aWVzLmpzb25cIiksXG4gICAgICBKU09OLnN0cmluZ2lmeSh3b3JsZC5wcm9wZXJ0aWVzLCBudWxsLCAyKVxuICAgICk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkaW1lbnNpb25zIGZvciB0aGUgd29ybGQuXG4gICAgZm9yIChjb25zdCBkaW1lbnNpb24gb2Ygd29ybGQuZGltZW5zaW9ucy52YWx1ZXMoKSkge1xuICAgICAgLy8gR2V0IHRoZSBzcGF3biBwb3NpdGlvbiBvZiB0aGUgZGltZW5zaW9uLlxuICAgICAgY29uc3Qgc3ggPSBkaW1lbnNpb24ucHJvcGVydGllcy5zcGF3blBvc2l0aW9uWzBdID4+IDQ7XG4gICAgICBjb25zdCBzeiA9IGRpbWVuc2lvbi5wcm9wZXJ0aWVzLnNwYXduUG9zaXRpb25bMl0gPj4gNDtcblxuICAgICAgLy8gR2V0IHRoZSB2aWV3IGRpc3RhbmNlIG9mIHRoZSBkaW1lbnNpb24uXG4gICAgICBjb25zdCB2aWV3RGlzdGFuY2UgPSBkaW1lbnNpb24udmlld0Rpc3RhbmNlO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBjaHVua3MgdG8gcHJlZ2VuZXJhdGUuXG4gICAgICBjb25zdCBhbW91bnQgPSAodmlld0Rpc3RhbmNlICogMiArIDEpICoqIDI7XG5cbiAgICAgIC8vIExvZyB0aGUgYW1vdW50IG9mIGNodW5rcyB0byBwcmVnZW5lcmF0ZS5cbiAgICAgIHdvcmxkLmxvZ2dlci5pbmZvKFxuICAgICAgICBgUHJlcGFyaW5nIMKnYyR7YW1vdW50fcKnciBjaHVua3MgZm9yIGRpbWVuc2lvbiDCp2Eke2RpbWVuc2lvbi5pZGVudGlmaWVyfcKnci5gXG4gICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGNodW5rcyB0byBwcmVnZW5lcmF0ZS5cbiAgICAgIGZvciAobGV0IHggPSAtdmlld0Rpc3RhbmNlOyB4IDw9IHZpZXdEaXN0YW5jZTsgeCsrKSB7XG4gICAgICAgIGZvciAobGV0IHogPSAtdmlld0Rpc3RhbmNlOyB6IDw9IHZpZXdEaXN0YW5jZTsgeisrKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgY2h1bmsgZnJvbSB0aGUgcHJvdmlkZXIuXG4gICAgICAgICAgY29uc3QgY2h1bmsgPSB3b3JsZC5wcm92aWRlci5yZWFkQ2h1bmsoc3ggKyB4LCBzeiArIHosIGRpbWVuc2lvbik7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgaXMgcmVhZHkuXG4gICAgICAgICAgaWYgKCFjaHVuay5yZWFkeSkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGNodW5rLCB0aGUgd2lsbCBjYWNoZSB0aGUgY2h1bmsgaW4gdGhlIHByb3ZpZGVyLlxuICAgICAgICAgIGNodW5rLmNhY2hlID0gQ2h1bmsuc2VyaWFsaXplKGNodW5rKTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgZGlydHkgZmxhZyB0byBmYWxzZS5cbiAgICAgICAgICBjaHVuay5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2VzcyBtZXNzYWdlLlxuICAgICAgd29ybGQubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcHJlZ2VuZXJhdGVkIMKnYyR7YW1vdW50fcKnciBjaHVua3MgZm9yIGZvciBkaW1lbnNpb24gwqdhJHtkaW1lbnNpb24uaWRlbnRpZmllcn3Cp3IuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNyZWF0ZWQgd29ybGQuXG4gICAgcmV0dXJuIHdvcmxkO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc3ViY2h1bmsga2V5IGZvciB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3kgVGhlIHN1YmNodW5rIFkgY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN6IFRoZSBjaHVuayBaIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgZGltZW5zaW9uIGluZGV4LlxuICAgKiBAcmV0dXJucyBUaGUgYnVmZmVyIGtleSBmb3IgdGhlIHN1YmNodW5rXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkU3ViQ2h1bmtLZXkoXG4gICAgY3g6IG51bWJlcixcbiAgICBjeTogbnVtYmVyLFxuICAgIGN6OiBudW1iZXIsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBCdWZmZXIge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGNodW5rIGNvb3JkaW5hdGVzIHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlSW50MzIoY3gsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICBzdHJlYW0ud3JpdGVJbnQzMihjeiwgRW5kaWFubmVzcy5MaXR0bGUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIG5vdCAwLlxuICAgIGlmIChpbmRleCAhPT0gMCkgc3RyZWFtLndyaXRlSW50MzIoaW5kZXgsIEVuZGlhbm5lc3MuTGl0dGxlKTtcblxuICAgIC8vIFdyaXRlIHRoZSBxdWVyeSBrZXkgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVCeXRlKDB4MmYpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHN1YmNodW5rIGluZGV4IHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlQnl0ZShjeSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW0uXG4gICAgcmV0dXJuIHN0cmVhbS5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNodW5rIHZlcnNpb24ga2V5IGZvciB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3ogVGhlIGNodW5rIFogY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBkaW1lbnNpb24gaW5kZXguXG4gICAqIEByZXR1cm5zIFRoZSBidWZmZXIga2V5IGZvciB0aGUgY2h1bmsgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWlsZENodW5rVmVyc2lvbktleShcbiAgICBjeDogbnVtYmVyLFxuICAgIGN6OiBudW1iZXIsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBCdWZmZXIge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGNodW5rIGNvb3JkaW5hdGVzIHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlSW50MzIoY3gsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICBzdHJlYW0ud3JpdGVJbnQzMihjeiwgRW5kaWFubmVzcy5MaXR0bGUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIG5vdCAwLlxuICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgc3RyZWFtLndyaXRlSW50MzIoaW5kZXgsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgY2h1bmsgdmVyc2lvbiBieXRlIHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlQnl0ZSgweDJjKTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgIHJldHVybiBzdHJlYW0uZ2V0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgYWN0b3IgbGlzdCBrZXkgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHJlYWQgdGhlIGFjdG9yIGxpc3Qga2V5IGZvci5cbiAgICogQHJldHVybnMgVGhlIGJ1ZmZlciBrZXkgZm9yIHRoZSBhY3RvciBsaXN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkQWN0b3JMaXN0S2V5KGRpbWVuc2lvbjogRGltZW5zaW9uKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUga2V5IHN5bWJvbCB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlSW50MzIoMHg2NF82OV82N183MCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgbm90IDAuXG4gICAgaWYgKGRpbWVuc2lvbi5pbmRleE9mKCkgIT09IDApXG4gICAgICBzdHJlYW0ud3JpdGVJbnQzMihkaW1lbnNpb24uaW5kZXhPZigpLCBFbmRpYW5uZXNzLkxpdHRsZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW0uXG4gICAgcmV0dXJuIHN0cmVhbS5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBhY3RvciBkYXRhIGtleSBmb3IgdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gdW5pcXVlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhY3Rvci5cbiAgICogQHJldHVybnMgVGhlIGJ1ZmZlciBrZXkgZm9yIHRoZSBhY3RvciBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkQWN0b3JEYXRhS2V5KHVuaXF1ZUlkOiBiaWdpbnQpOiBCdWZmZXIge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGtleSBzeW1ib2wgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20oXCJhY3RvcnByZWZpeFwiLCBcImFzY2lpXCIpKTtcblxuICAgIC8vIFdyaXRlIHRoZSB1bmlxdWUgaWRlbnRpZmllciB0byB0aGUgc3RyZWFtLlxuICAgIHN0cmVhbS53cml0ZUludDY0KHVuaXF1ZUlkLCBFbmRpYW5uZXNzLkxpdHRsZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW0uXG4gICAgcmV0dXJuIHN0cmVhbS5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGJsb2NrIGtleSBmb3IgdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGJsb2NrIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGRpbWVuc2lvbiBpbmRleC5cbiAgICogQHJldHVybnMgVGhlIGJ1ZmZlciBrZXkgZm9yIHRoZSBibG9ja1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWlsZEJsb2NrRGF0YUxpc3RLZXkoZGltZW5zaW9uOiBEaW1lbnNpb24pOiBCdWZmZXIge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGtleSBzeW1ib2wgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVJbnQzMigweDYyXzZjXzZmXzYzXzZiKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpbmRleCBpcyBub3QgMC5cbiAgICBpZiAoZGltZW5zaW9uLmluZGV4T2YoKSAhPT0gMClcbiAgICAgIHN0cmVhbS53cml0ZUludDMyKGRpbWVuc2lvbi5pbmRleE9mKCksIEVuZGlhbm5lc3MuTGl0dGxlKTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbS5cbiAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYmxvY2sga2V5IGZvciB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgYmxvY2sgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgZGltZW5zaW9uIGluZGV4LlxuICAgKiBAcmV0dXJucyBUaGUgYnVmZmVyIGtleSBmb3IgdGhlIGJsb2NrXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkQmxvY2tEYXRhS2V5KFxuICAgIHBvc2l0aW9uOiBCbG9ja1Bvc2l0aW9uLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogQnVmZmVyIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBibG9jayBwb3NpdGlvbiB0byB0aGUgc3RyZWFtLlxuICAgIHN0cmVhbS53cml0ZVppZ1phZyhwb3NpdGlvbi54KTtcbiAgICBzdHJlYW0ud3JpdGVaaWdaYWcocG9zaXRpb24ueSk7XG4gICAgc3RyZWFtLndyaXRlWmlnWmFnKHBvc2l0aW9uLnopO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIG5vdCAwLlxuICAgIGlmIChpbmRleCAhPT0gMCkgc3RyZWFtLndyaXRlSW50MzIoaW5kZXgsIEVuZGlhbm5lc3MuTGl0dGxlKTtcblxuICAgIC8vIFdyaXRlIHRoZSBrZXkgc3ltYm9sIHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlQnl0ZSgweDJkKTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbS5cbiAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICB9XG59XG5cbmV4cG9ydCB7IExldmVsREJQcm92aWRlciB9O1xuIiwgImltcG9ydCB7IENodW5rIH0gZnJvbSBcIi4uL2NodW5rXCI7XG5pbXBvcnQgeyBUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL2RpbWVuc2lvblwiO1xuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB7IENodW5rUmVhZHlTaWduYWwgfSBmcm9tIFwiLi4vLi4vZXZlbnRzXCI7XG5cbmltcG9ydCB0eXBlIHsgVGVycmFpbldvcmtlciB9IGZyb20gXCIuL3dvcmtlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZXIgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuXG5jb25zdCBEZWZhdWx0VGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXM6IFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzID0ge1xuICBzZWVkOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAweDdmZmZmZmZmKVxufTtcblxuY2xhc3MgVGVycmFpbkdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXJyYWluIHdvcmtlciBmb3IgdGhlIGdlbmVyYXRvci5cbiAgICogVGhpcyBpcyBzZXQgYnkgdGhlIHdvcmtlciBkZWNvcmF0b3IsIHdoaWNoIHdpbGwgY3JlYXRlIGEgd29ya2VyIHRocmVhZCBmb3IgdGhlIGdlbmVyYXRvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX3dvcmtlcjogdHlwZW9mIFRlcnJhaW5Xb3JrZXIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGdlbmVyYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFRlcnJhaW5HZW5lcmF0b3IpXG4gICAgLmlkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gb2YgdGhlIGdlbmVyYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkaW1lbnNpb246IERpbWVuc2lvbjtcblxuICAvKipcbiAgICogVGhlIHdvcmxkIG9mIHRoZSBnZW5lcmF0b3IuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ybGQ6IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnRpZXM6IFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzID1cbiAgICBEZWZhdWx0VGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBjaHVua3MgdGhhdCBhcmUgcXVldWVkIGZvciB0aHJlYWRlZCBnZW5lcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHF1ZXVlID0gbmV3IE1hcDxiaWdpbnQsIENodW5rPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2VyIGZvciB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtlcjogV29ya2VyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0ZXJyYWluIGdlbmVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGRpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIGRpbWVuc2lvbiAmIHdvcmxkIG9mIHRoZSBnZW5lcmF0b3IuXG4gICAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247XG4gICAgdGhpcy53b3JsZCA9IGRpbWVuc2lvbi53b3JsZDtcblxuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2VuZXJhdG9yLlxuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGdlbmVyYXRvci5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcikuaWRlbnRpZmllcjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHdvcmtlciBpZiBhdmFpbGFibGUuXG4gICAgdGhpcy53b3JrZXIgPVxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFRlcnJhaW5HZW5lcmF0b3IpLl93b3JrZXI/LmluaXRpYWxpemUoXG4gICAgICAgIHRoaXMucHJvcGVydGllc1xuICAgICAgKSA/PyBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHdvcmtlciBpcyBhdmFpbGFibGUgYW5kIGxpc3RlbiBmb3IgbWVzc2FnZXMuXG4gICAgdGhpcy53b3JrZXI/Lm9uKFwibWVzc2FnZVwiLCAoY2h1bms6IENodW5rICYgeyBpZGVudGlmaWVyOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNodW5rLmlkZW50aWZpZXIgIT09IHRoaXMuaWRlbnRpZmllcikgcmV0dXJuO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjaHVuay5cbiAgICAgIHRoaXMucHJvY2VzcyhjaHVuayk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgY2h1bmsgYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIF9jeCBUaGUgY2h1bmsgeCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gX2N6IFRoZSBjaHVuayB6IGNvb3JkaW5hdGUuXG4gICAqL1xuICBwdWJsaWMgYXBwbHkoX2N4OiBudW1iZXIsIF9jejogbnVtYmVyKTogQ2h1bmsge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LmFwcGx5KCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRvZmYgYSBjaHVuayB0byB0aGUgd29ya2VyIGZvciBnZW5lcmF0aW9uLlxuICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRvIGhhbmRvZmYuXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZG9mZihjaHVuazogQ2h1bmspOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgd29ya2VyIGlzIGF2YWlsYWJsZS5cbiAgICBpZiAoIXRoaXMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgaXMgbm90IGF2YWlsYWJsZS5cIik7XG5cbiAgICAvLyBBZGQgdGhlIGNodW5rIHRvIHRoZSBxdWV1ZS5cbiAgICB0aGlzLnF1ZXVlLnNldChjaHVuay5oYXNoLCBjaHVuayk7XG5cbiAgICAvLyBTZXBhcmF0ZSB0aGUgY2h1bmsgZGF0YS5cbiAgICBjb25zdCB7IHg6IGN4LCB6OiBjeiB9ID0gY2h1bms7XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiB0eXBlLlxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRpbWVuc2lvbi50eXBlO1xuXG4gICAgLy8gSGFuZG9mZiB0aGUgY2h1bmsgZ2VuZXJhdGlvbiB0byB0aGUgd29ya2VyIHRocmVhZC5cbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7IGN4LCBjeiwgdHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYSBjaHVuayB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgdGhlIHdvcmtlci5cbiAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0aGF0IHdhcyBnZW5lcmF0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2VzcyhjaHVuazogQ2h1bmspOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBxdWV1ZWQgY2h1bmsgZnJvbSB0aGUgc2V0LlxuICAgIGNvbnN0IHF1ZXVlZCA9IHRoaXMucXVldWUuZ2V0KGNodW5rLmhhc2gpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIHdhcyBmb3VuZC5cbiAgICBpZiAoIXF1ZXVlZCkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBxdWV1ZWQgY2h1bmsgd2l0aCB0aGUgZ2VuZXJhdGVkIGRhdGEuXG4gICAgLy8gU2luY2Ugd29ya2VycyBhcmUgbm90IGFsbG93ZWQgdG8gdHJhbnNmZXIgY2xhc3MgaW5zdGFuY2VzLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IGNvcHkgdGhlIGRhdGEuXG4gICAgZm9yIChjb25zdCBzdWIgb2YgY2h1bmsuc3ViY2h1bmtzKSB7XG4gICAgICAvLyBDb250aW51ZSBpZiB0aGUgc3ViY2h1bmsgaXMgbnVsbC5cbiAgICAgIGlmICghc3ViKSBjb250aW51ZTtcblxuICAgICAgLy8gR2V0IHRoZSBzdWJjaHVuayBmcm9tIHRoZSBxdWV1ZWQgY2h1bmsuXG4gICAgICBjb25zdCBzdWJjaHVuayA9IHF1ZXVlZC5nZXRTdWJDaHVuayhjaHVuay5zdWJjaHVua3MuaW5kZXhPZihzdWIpKTtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsYXllcnMgYW5kIGNvcHkgdGhlIGRhdGEuXG4gICAgICBmb3IgKGNvbnN0IGxheSBvZiBzdWIubGF5ZXJzKSB7XG4gICAgICAgIC8vIEdldCB0aGUgbGF5ZXIgZnJvbSB0aGUgcXVldWVkXG4gICAgICAgIGNvbnN0IGxheWVyID0gc3ViY2h1bmsuZ2V0TGF5ZXIoc3ViLmxheWVycy5pbmRleE9mKGxheSkpO1xuXG4gICAgICAgIC8vIENvcHkgdGhlIGJsb2NrIGRhdGEuXG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBibG9ja10gb2YgbGF5LmJsb2Nrcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBsYXllci5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IHRoZSBwYWxldHRlIGRhdGEuXG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBibG9ja10gb2YgbGF5LnBhbGV0dGUuZW50cmllcygpKSB7XG4gICAgICAgICAgbGF5ZXIucGFsZXR0ZVtpbmRleF0gPSBibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBjYW4gbWFyayB0aGUgY2h1bmsgYXMgcmVhZHkuXG4gICAgcXVldWVkLnJlYWR5ID0gdHJ1ZTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBDaHVua1JlYWR5U2lnbmFsIGZvciB0aGUgY2h1bmsuXG4gICAgbmV3IENodW5rUmVhZHlTaWduYWwodGhpcy5kaW1lbnNpb24sIHF1ZXVlZCkuZW1pdCgpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBjaHVuayBmcm9tIHRoZSBxdWV1ZS5cbiAgICB0aGlzLnF1ZXVlLmRlbGV0ZShjaHVuay5oYXNoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBUZXJyYWluR2VuZXJhdG9yIH07XG4iLCAiaW1wb3J0IHsgaXNNYWluVGhyZWFkLCB0eXBlIFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5cbmltcG9ydCB7IFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5cbmltcG9ydCB0eXBlIHsgVGVycmFpbkdlbmVyYXRvciB9IGZyb20gXCIuLi9nZW5lcmF0b3JcIjtcbmltcG9ydCB0eXBlIHsgRGltZW5zaW9uVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHR5cGUgeyBDaHVuayB9IGZyb20gXCIuLi8uLi9jaHVua1wiO1xuXG5jbGFzcyBUZXJyYWluV29ya2VyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSB3b3JrZXIgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGF0aCA9IF9fZmlsZW5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JrZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydGllczogVGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0b3IgZm9yIHRoZSB3b3JrZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2VuZXJhdG9yOiB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB3b3JrZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZ2VuZXJhdG9yOiB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcixcbiAgICBwcm9wZXJ0aWVzOiBUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllc1xuICApIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIG1haW4gdGhyZWFkXG4gICAgaWYgKGlzTWFpblRocmVhZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciBjYW4gb25seSBiZSBpbml0aWFsaXplZCBpbiBhIHdvcmtlciB0aHJlYWRcIik7XG5cbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtlclxuICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cbiAgICAvLyBTZXQgdGhlIGdlbmVyYXRvciBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgY2h1bmsgYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIF9jeCBUaGUgY2h1bmsgeCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gX2N6ICBUaGUgY2h1bmsgeiBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gX3R5cGUgVGhlIGRpbWVuc2lvbiB0eXBlIG9mIHRoZSBjaHVuay5cbiAgICovXG4gIHB1YmxpYyBhcHBseShfY3g6IG51bWJlciwgX2N6OiBudW1iZXIsIF90eXBlOiBEaW1lbnNpb25UeXBlKTogQ2h1bmsge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmdlbmVyYXRvci5pZGVudGlmaWVyfS5hcHBseSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgd29ya2VyIHRocmVhZC5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgd29ya2VyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKF9wcm9wZXJ0aWVzOiBUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllcyk6IFdvcmtlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubmFtZX0uaW5pdGlhbGl6ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBUZXJyYWluV29ya2VyIH07XG4iLCAiaW1wb3J0IHtcbiAgaXNNYWluVGhyZWFkLFxuICBwYXJlbnRQb3J0LFxuICB3b3JrZXJEYXRhLFxuICBXb3JrZXIgYXMgV29ya2VyVGhyZWFkXG59IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5cbmltcG9ydCB7IERpbWVuc2lvblR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgVGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHR5cGUgeyBUZXJyYWluV29ya2VyIH0gZnJvbSBcIi4vd29ya2VyXCI7XG5pbXBvcnQgdHlwZSB7IFRlcnJhaW5HZW5lcmF0b3IgfSBmcm9tIFwiLi4vZ2VuZXJhdG9yXCI7XG5cbmludGVyZmFjZSBXb3JrZXJEYXRhIHtcbiAgY3g6IG51bWJlcjtcbiAgY3o6IG51bWJlcjtcbiAgdHlwZTogRGltZW5zaW9uVHlwZTtcbiAgaWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gV29ya2VyKGdlbmVyYXRvcjogdHlwZW9mIFRlcnJhaW5HZW5lcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh3b3JrZXI6IHR5cGVvZiBUZXJyYWluV29ya2VyKSB7XG4gICAgLy8gQmluZCB0aGUgZ2VuZXJhdG9yIGFuZCB3b3JrZXIgdG9nZXRoZXJcbiAgICBnZW5lcmF0b3IuX3dvcmtlciA9IHdvcmtlcjtcblxuICAgIC8vIERlY2xhcmUgdGhlIGluaXRpYWxpemUgbWV0aG9kIGZvciB0aGUgd29ya2VyXG4gICAgd29ya2VyLmluaXRpYWxpemUgPSAocHJvcGVydGllczogVGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgbWFpbiB0aHJlYWRcbiAgICAgIGlmICghaXNNYWluVGhyZWFkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgY2FuIG9ubHkgYmUgaW5pdGlhbGl6ZWQgaW4gYSB3b3JrZXIgdGhyZWFkXCIpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgd29ya2VyIHRocmVhZFxuICAgICAgcmV0dXJuIG5ldyBXb3JrZXJUaHJlYWQod29ya2VyLnBhdGgsIHsgd29ya2VyRGF0YTogcHJvcGVydGllcyB9KTtcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSB3b3JrZXIgdGhyZWFkXG4gICAgaWYgKCFpc01haW5UaHJlYWQpIHtcbiAgICAgIC8vIFNldCB0aGUgc2VlZCBvZiB0aGUgd29ya2VyXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB3b3JrZXIoZ2VuZXJhdG9yLCB3b3JrZXJEYXRhKTtcblxuICAgICAgLy8gQmluZCB0aGUgbWVzc2FnZSBldmVudCB0byB0aGUgd29ya2VyXG4gICAgICBwYXJlbnRQb3J0Py5vbihcIm1lc3NhZ2VcIiwgKGRhdGE6IFdvcmtlckRhdGEpID0+IHtcbiAgICAgICAgLy8gQ2FsbCB0aGUgYXBwbHkgbWV0aG9kIG9mIHRoZSB3b3JrZXIgdG8gZ2VuZXJhdGUgdGhlIGNodW5rXG4gICAgICAgIGNvbnN0IGNodW5rID0gaW5zdGFuY2UuYXBwbHkoZGF0YS5jeCwgZGF0YS5jeiwgZGF0YS50eXBlKTtcblxuICAgICAgICAvLyBTZW5kIHRoZSBnZW5lcmF0ZWQgY2h1bmsgYmFjayB0byB0aGUgbWFpbiB0aHJlYWRcbiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyBpZGVudGlmaWVyOiBnZW5lcmF0b3IuaWRlbnRpZmllciwgLi4uY2h1bmsgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCB7IFdvcmtlciB9O1xuIiwgImltcG9ydCB7IENodW5rIH0gZnJvbSBcIi4uL2NodW5rXCI7XG5pbXBvcnQgeyBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4uLy4uL2Jsb2NrXCI7XG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgVGVycmFpbkdlbmVyYXRvciB9IGZyb20gXCIuL2dlbmVyYXRvclwiO1xuXG5jbGFzcyBWb2lkR2VuZXJhdG9yIGV4dGVuZHMgVGVycmFpbkdlbmVyYXRvciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwidm9pZFwiO1xuXG4gIHB1YmxpYyBhcHBseShjeDogbnVtYmVyLCBjejogbnVtYmVyKTogQ2h1bmsge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBjaHVua1xuICAgIGNvbnN0IGNodW5rID0gbmV3IENodW5rKGN4LCBjeiwgdGhpcy5kaW1lbnNpb24udHlwZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgaXMgY2VudGVyZWQgYXQgdGhlIG9yaWdpblxuICAgIGlmIChjeCA9PT0gMCAmJiBjeiA9PT0gMCkge1xuICAgICAgLy8gU2V0IGEgYmVkcm9jayBibG9jayBhdCB0aGUgY2VudGVyIG9mIHRoZSBjaHVua1xuICAgICAgY2h1bmsuc2V0UGVybXV0YXRpb24oXG4gICAgICAgIHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgICAgICBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkJlZHJvY2spXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgZ2VuZXJhdGVkIGNodW5rXG4gICAgcmV0dXJuIGNodW5rO1xuICB9XG59XG5cbmV4cG9ydCB7IFZvaWRHZW5lcmF0b3IgfTtcbiIsICJpbXBvcnQgeyBUZXJyYWluR2VuZXJhdG9yIH0gZnJvbSBcIi4uL2dlbmVyYXRvclwiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vLi4vY2h1bmtcIjtcblxuY2xhc3MgU3VwZXJmbGF0R2VuZXJhdG9yIGV4dGVuZHMgVGVycmFpbkdlbmVyYXRvciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwic3VwZXJmbGF0XCI7XG5cbiAgcHVibGljIGFwcGx5KGN4OiBudW1iZXIsIGN6OiBudW1iZXIpOiBDaHVuayB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNodW5rIGFuZCBzZXQgaXQgYXMgbm90IHJlYWR5XG4gICAgY29uc3QgY2h1bmsgPSBuZXcgQ2h1bmsoY3gsIGN6LCB0aGlzLmRpbWVuc2lvbi50eXBlKTtcbiAgICBjaHVuay5yZWFkeSA9IGZhbHNlO1xuXG4gICAgLy8gSGFuZCB0aGUgY2h1bmsgdG8gdGhlIHdvcmtlclxuICAgIHRoaXMuaGFuZG9mZihjaHVuayk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNodW5rXG4gICAgcmV0dXJuIGNodW5rO1xuICB9XG59XG5cbmV4cG9ydCB7IFN1cGVyZmxhdEdlbmVyYXRvciB9O1xuIiwgImltcG9ydCB7IERpbWVuc2lvblR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQmxvY2tQZXJtdXRhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9ibG9ja1wiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vLi4vY2h1bmtcIjtcbmltcG9ydCB7IFRlcnJhaW5Xb3JrZXIsIFdvcmtlciB9IGZyb20gXCIuLi93b3JrZXJcIjtcbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBTdXBlcmZsYXRHZW5lcmF0b3IgfSBmcm9tIFwiLi9nZW5lcmF0b3JcIjtcblxuQFdvcmtlcihTdXBlcmZsYXRHZW5lcmF0b3IpXG5jbGFzcyBTdXBlcmZsYXRXb3JrZXIgZXh0ZW5kcyBUZXJyYWluV29ya2VyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYXRoID0gX19maWxlbmFtZTtcblxuICBwdWJsaWMgYmVkcm9jayA9IEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuQmVkcm9jayk7XG4gIHB1YmxpYyBkaXJ0ID0gQmxvY2tQZXJtdXRhdGlvbi5yZXNvbHZlKEJsb2NrSWRlbnRpZmllci5EaXJ0KTtcbiAgcHVibGljIGdyYXNzID0gQmxvY2tQZXJtdXRhdGlvbi5yZXNvbHZlKEJsb2NrSWRlbnRpZmllci5HcmFzc0Jsb2NrKTtcblxuICBwdWJsaWMgYXBwbHkoY3g6IG51bWJlciwgY3o6IG51bWJlciwgdHlwZTogRGltZW5zaW9uVHlwZSk6IENodW5rIHtcbiAgICBjb25zdCBjaHVuayA9IG5ldyBDaHVuayhjeCwgY3osIHR5cGUpO1xuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCAxNjsgeCsrKSB7XG4gICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IDE2OyB6KyspIHtcbiAgICAgICAgZm9yIChsZXQgeSA9IC02NDsgeSA8IC02MDsgeSsrKSB7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB7IHgsIHksIHogfTtcblxuICAgICAgICAgIGlmICh5ID09PSAtNjQpIHtcbiAgICAgICAgICAgIGNodW5rLnNldFBlcm11dGF0aW9uKHBvc2l0aW9uLCB0aGlzLmJlZHJvY2ssIGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHkgPT09IC02MyB8fCB5ID09PSAtNjIpIHtcbiAgICAgICAgICAgIGNodW5rLnNldFBlcm11dGF0aW9uKHBvc2l0aW9uLCB0aGlzLmRpcnQsIGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsuc2V0UGVybXV0YXRpb24ocG9zaXRpb24sIHRoaXMuZ3Jhc3MsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNodW5rLlxuICAgIHJldHVybiBjaHVuaztcbiAgfVxufVxuXG5leHBvcnQgeyBTdXBlcmZsYXRXb3JrZXIgfTtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEludGVnZXJFbnVtLCBTdHJpbmdFbnVtLCBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJ0cmFuc2ZlclwiLFxuICAgIFwiVHJhbnNmZXIgYSBwbGF5ZXIgdG8gYSBkaWZmZXJlbnQgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgYWRkcmVzczogU3RyaW5nRW51bSxcbiAgICAgICAgICBwb3J0OiBJbnRlZ2VyRW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB0YXJnZXRzXG4gICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXR1cm4gbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgYWRkcmVzcyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbnRleHQuYWRkcmVzcy5yZXN1bHQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwb3J0IGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBwb3J0ID0gY29udGV4dC5wb3J0LnJlc3VsdCBhcyBudW1iZXI7XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBhIHBsYXllclxuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNQbGF5ZXIoKSkge1xuICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgIGDCp2NFbnRpdHkgwqc0JHt0YXJnZXQudW5pcXVlSWR9wqdjIGlzIG5vdCBhIHBsYXllci7Cp3JgXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgbmV4dCB0YXJnZXRcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYW5zZmVyIHRoZSBwbGF5ZXIgdG8gdGhlIG5ldyBzZXJ2ZXJcbiAgICAgICAgICAgIHRhcmdldC50cmFuc2ZlcihhZGRyZXNzLCBwb3J0KTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgIGDCp2FUcmFuc2ZlcnJlZCDCpzIke3RhcmdldC51c2VybmFtZX3Cp2EgdG8gwqcyJHthZGRyZXNzfToke3BvcnR9wqdhLsKncmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZS5qb2luKFwiXFxuXCIpIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCwgVmVjdG9yM2YgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5RW51bSwgUG9zaXRpb25FbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXRibG9jayBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwic3VtbW9uXCIsXG4gICAgXCJTdW1tb25zIGFuIGVudGl0eSBhdCBhIHNwZWNpZmllZCBsb2NhdGlvblwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBvdmVybG9hZCBmb3IgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgZW50aXR5OiBFbnRpdHlFbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9yaWdpbiBpcyBhIGRpbWVuc2lvbiwgaWYgc28sIHRocm93IGFuIGVycm9yXG4gICAgICAgICAgaWYgKCEoY29udGV4dC5vcmlnaW4gaW5zdGFuY2VvZiBFbnRpdHkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcIllvdSBjYW4ndCB1c2UgdGhpcyBjb21tYW5kIGluIHRoaXMgY29udGV4dCwgdHJ5IGFkZGluZyBhIHBvc2l0aW9uIGFyZ3VtZW50LlwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIGVudGl0eVxuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSAoY29udGV4dC5lbnRpdHkucmVzdWx0IGFzIHN0cmluZykuaW5jbHVkZXMoXCI6XCIpXG4gICAgICAgICAgICA/IChjb250ZXh0LmVudGl0eS5yZXN1bHQgYXMgRW50aXR5SWRlbnRpZmllcilcbiAgICAgICAgICAgIDogKGBtaW5lY3JhZnQ6JHtjb250ZXh0LmVudGl0eS5yZXN1bHR9YCBhcyBFbnRpdHlJZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGVudGl0eVxuICAgICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gY29udGV4dC5vcmlnaW4ucG9zaXRpb24uZmxvb3IoKTtcblxuICAgICAgICAgIC8vIFNwYXduIHRoZSBlbnRpdHkgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvblxuICAgICAgICAgIGNvbnRleHQub3JpZ2luLmRpbWVuc2lvbi5zcGF3bkVudGl0eShcbiAgICAgICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgICAgICBuZXcgVmVjdG9yM2YoeCwgeSwgeilcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgc3VjY2VzcyBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgc3VtbW9uZWQgZW50aXR5IGF0ICR7eH0sICR7eX0sICR7en0hYFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBvdmVybG9hZCBmb3IgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgZW50aXR5OiBFbnRpdHlFbnVtLFxuICAgICAgICAgIHBvc2l0aW9uOiBQb3NpdGlvbkVudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgZW50aXR5IGFuZCBwb3NpdGlvblxuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSAoY29udGV4dC5lbnRpdHkucmVzdWx0IGFzIHN0cmluZykuaW5jbHVkZXMoXCI6XCIpXG4gICAgICAgICAgICA/IChjb250ZXh0LmVudGl0eS5yZXN1bHQgYXMgRW50aXR5SWRlbnRpZmllcilcbiAgICAgICAgICAgIDogKGBtaW5lY3JhZnQ6JHtjb250ZXh0LmVudGl0eS5yZXN1bHR9YCBhcyBFbnRpdHlJZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCB7IHgsIHksIHogfSA9IGNvbnRleHQucG9zaXRpb24ucmVzdWx0IGFzIFZlY3RvcjNmO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gYmFzZWQgb24gdGhlIG9yaWdpblxuICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICAgICAgICBjb250ZXh0Lm9yaWdpbiBpbnN0YW5jZW9mIEVudGl0eVxuICAgICAgICAgICAgICA/IGNvbnRleHQub3JpZ2luLmRpbWVuc2lvblxuICAgICAgICAgICAgICA6IGNvbnRleHQub3JpZ2luO1xuXG4gICAgICAgICAgLy8gU3VtbW9uIHRoZSBlbnRpdHkgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvblxuICAgICAgICAgIGRpbWVuc2lvbi5zcGF3bkVudGl0eShpZGVudGlmaWVyLCBuZXcgVmVjdG9yM2YoeCwgeSwgeikpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRGFtYWdlQ2F1c2UsXG4gIENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwsXG4gIEdhbWVtb2RlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG4vKipcbiAqIFdoZW4gZXhlY3V0aW5nIC9raWxsIG9uIGEgcGxheWVyLCBpZiB0aGUgcGxheWVyXG4gKiBoYXMgb25lIG9mIHRoZXNlIGdhbWVtb2RlcywgdGhlIHBsYXllciB3aWxsIGJlIGlnbm9yZWQuXG4gKi9cbmNvbnN0IElHTk9SRURfR0FNRU1PREVTID0gbmV3IFNldChbXG4gIEdhbWVtb2RlLkNyZWF0aXZlLFxuICBHYW1lbW9kZS5DcmVhdGl2ZVNwZWN0YXRvcixcbiAgR2FtZW1vZGUuU3BlY3RhdG9yXG5dKTtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBraWxsIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJraWxsXCIsXG4gICAgXCJLaWxscyBlbnRpdGllcyAocGxheWVycywgbW9icywgZXRjLikuXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdGFyZ2V0XG4gICAgICAgICAgY29udGV4dC50YXJnZXQudmFsaWRhdGUodHJ1ZSk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBubyB0YXJnZXRzXG4gICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXR1cm4gbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIFBsYXllciAmJlxuICAgICAgICAgICAgICBJR05PUkVEX0dBTUVNT0RFUy5oYXModGFyZ2V0LmdhbWVtb2RlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgYMKnY1BsYXllciDCpzQke3RhcmdldC51c2VybmFtZX3Cp2MgaXMgaW4gYSBnYW1lbW9kZSB0aGF0IGNhbm5vdCBiZSBraWxsZWQuwqdyYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsYXllclxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gS2lsbCB0aGUgZW50aXR5XG4gICAgICAgICAgICB0YXJnZXQua2lsbCh1bmRlZmluZWQsIEFjdG9yRGFtYWdlQ2F1c2UuTm9uZSk7XG5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICBgwqdhS2lsbGVkIMKnMiR7dGFyZ2V0LmlzUGxheWVyKCkgPyB0YXJnZXQudXNlcm5hbWUgOiB0YXJnZXQudW5pcXVlSWR9wqdhLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZS5qb2luKFwiXFxuXCIpIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICAvLyBSZWdpc3RlciB0aGUgc3RvcCBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwic3RvcFwiLFxuICAgIFwiU3RvcHMgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICAvLyBzdG9wIHRoZSBzZXJ2ZXJcbiAgICAgIHdvcmxkLnNlcmVuaXR5LnN0b3AoKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFN0cmluZ0VudW0sIFRhcmdldEVudW0sIFdvcmxkRW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwid29ybGRcIixcbiAgICBcIkNoYW5nZSB0aGUgY3VycmVudCB3b3JsZCBvZiBhbiBlbnRpdHlcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICB3b3JsZDogV29ybGRFbnVtLFxuICAgICAgICAgIGRpbWVuc2lvbjogW1N0cmluZ0VudW0sIHRydWVdXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzZXJlbml0eSBpbnN0YW5jZSBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3Qgc2VyZW5pdHkgPSBjb250ZXh0Lm9yaWdpbi5nZXRXb3JsZCgpLnNlcmVuaXR5O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHRhcmdldHNcbiAgICAgICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0YXJnZXRzIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgd29ybGQgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHdvcmxkID0gc2VyZW5pdHkuZ2V0V29ybGQoY29udGV4dC53b3JsZC5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCBleGlzdHNcbiAgICAgICAgICBpZiAoIXdvcmxkKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3JsZCBkb2VzIG5vdCBleGlzdC5cIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgZGltZW5zaW9uID0gY29udGV4dC5kaW1lbnNpb24ucmVzdWx0XG4gICAgICAgICAgICA/IHdvcmxkLmdldERpbWVuc2lvbihjb250ZXh0LmRpbWVuc2lvbi5yZXN1bHQgYXMgc3RyaW5nKVxuICAgICAgICAgICAgOiB3b3JsZC5nZXREaW1lbnNpb24oKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkaW1lbnNpb24gZXhpc3RzXG4gICAgICAgICAgaWYgKCFkaW1lbnNpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaW1lbnNpb24gZG9lcyBub3QgZXhpc3QgaW4gc3BlY2lmaWVkIHdvcmxkLlwiKTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIHJldHVybiBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdGFyZ2V0c1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgd29ybGQgb2YgdGhlIHRhcmdldFxuICAgICAgICAgICAgdGFyZ2V0LnRlbGVwb3J0KHRhcmdldC5wb3NpdGlvbiwgZGltZW5zaW9uKTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgIGDCp2FTdWNjZXNzZnVsbHkgY2hhbmdlZCB0aGUgd29ybGQgb2YgwqcyJHt0YXJnZXQuaXNQbGF5ZXIoKSA/IHRhcmdldC51c2VybmFtZSA6IHRhcmdldC51bmlxdWVJZH3Cp2EgdG8gwqcyJHt3b3JsZC5wcm9wZXJ0aWVzLmlkZW50aWZpZXJ9wqdhIGluIGRpbWVuc2lvbiDCpzIke2RpbWVuc2lvbi5wcm9wZXJ0aWVzLmlkZW50aWZpZXJ9wqdhLsKncmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZS5qb2luKFwiXFxuXCIpIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJvcFwiLFxuICAgIFwiU2V0IHRoZSBvcGVyYXRvciBzdGF0dXMgb2YgYSBwbGF5ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB0YXJnZXRzXG4gICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXR1cm4gbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGEgcGxheWVyXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc1BsYXllcigpKSB7XG4gICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgYMKnY0VudGl0eSDCpzQke3RhcmdldC51bmlxdWVJZH3Cp2MgaXMgbm90IGEgcGxheWVyLsKncmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBTa2lwIHRvIHRoZSBuZXh0IHRhcmdldFxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBhbHJlYWR5IGEgc2VydmVyIG9wZXJhdG9yXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmlzT3AoKSkge1xuICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgIGDCp2NQbGF5ZXIgwqc0JHt0YXJnZXQudXNlcm5hbWV9wqdjIGlzIGFscmVhZHkgYSBzZXJ2ZXIgb3BlcmF0b3Igb3IgaGFzIGEgaGlnaGVyIHBlcm1pc3Npb24gbGV2ZWwuwqdyYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgdG8gdGhlIG5leHQgdGFyZ2V0XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIG9wZXJhdG9yIHN0YXR1cyBvZiB0aGUgcGxheWVyXG4gICAgICAgICAgICB0YXJnZXQub3AoKTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgIGDCp2FTdWNjZXNzZnVsbHkgbWFkZSDCpzIke3RhcmdldC51c2VybmFtZX3Cp2EgYSBzZXJ2ZXIgb3BlcmF0b3IuwqdyYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1lc3NhZ2VcbiAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlLmpvaW4oXCJcXG5cIikgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcImRlb3BcIixcbiAgICBcIlJlbW92ZSB0aGUgb3BlcmF0b3Igc3RhdHVzIG9mIGEgcGxheWVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdGFyZ2V0c1xuICAgICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldHMgbWF0Y2hlZCB0aGUgc2VsZWN0b3IuXCIpO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmV0dXJuIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBhIHBsYXllclxuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNQbGF5ZXIoKSkge1xuICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgIGDCp2NFbnRpdHkgwqc0JHt0YXJnZXQudW5pcXVlSWR9wqdjIGlzIG5vdCBhIHBsYXllci7Cp3JgXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgbmV4dCB0YXJnZXRcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgbm90IGEgc2VydmVyIG9wZXJhdG9yXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc09wKCkpIHtcbiAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICBgwqdjUGxheWVyIMKnNCR7dGFyZ2V0LnVzZXJuYW1lfcKnYyBpcyBub3QgYSBzZXJ2ZXIgb3BlcmF0b3IuwqdyYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgdG8gdGhlIG5leHQgdGFyZ2V0XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9wZXJhdG9yIHN0YXR1cyBvZiB0aGUgcGxheWVyXG4gICAgICAgICAgICB0YXJnZXQuZGVvcCgpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgYMKnYVN1Y2Nlc3NmdWxseSByZW1vdmVkIMKnMiR7dGFyZ2V0LnVzZXJuYW1lfcKnYSBhcyBhIHNlcnZlciBvcGVyYXRvci7Cp3JgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJldHVybiB0aGUgbWVzc2FnZVxuICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2Uuam9pbihcIlxcblwiKSB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIHN0b3AgY29tbWFuZFxuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInNhdmVcIixcbiAgICBcIlNhdmUgdGhlIGN1cnJlbnQgd29ybGQncyBkYXRhIHRvIGRpc2tcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgLy8gU2F2ZSB0aGUgd29ybGRcbiAgICAgIHdvcmxkLnByb3ZpZGVyLm9uU2F2ZSgpO1xuXG4gICAgICAvLyBSZXR1cm4gYSBtZXNzYWdlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBcIldvcmxkIGhhcyBiZWVuIHNhdmVkLCBjaGVjayBjb25zb2xlIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuXCJcbiAgICAgIH07XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IEdhbWVtb2RlIGZyb20gXCIuL2dhbWVtb2RlXCI7XG5pbXBvcnQgQWJpbGl0eSBmcm9tIFwiLi9hYmlsaXR5XCI7XG5pbXBvcnQgQ2xlYXIgZnJvbSBcIi4vY2xlYXJcIjtcbmltcG9ydCBGaWxsIGZyb20gXCIuL2ZpbGxcIjtcbmltcG9ydCBHaXZlIGZyb20gXCIuL2dpdmVcIjtcbmltcG9ydCBLaWNrIGZyb20gXCIuL2tpY2tcIjtcbmltcG9ydCBTZXRibG9jayBmcm9tIFwiLi9zZXRibG9ja1wiO1xuaW1wb3J0IFRhZyBmcm9tIFwiLi90YWdcIjtcbmltcG9ydCBUcCBmcm9tIFwiLi90cFwiO1xuaW1wb3J0IFRyYW5zZmVyIGZyb20gXCIuL3RyYW5zZmVyXCI7XG5pbXBvcnQgU3VtbW9uIGZyb20gXCIuL3N1bW1vblwiO1xuaW1wb3J0IEtpbGwgZnJvbSBcIi4va2lsbFwiO1xuaW1wb3J0IFNUT1AgZnJvbSBcIi4vc3RvcFwiO1xuaW1wb3J0IFdPUkxEIGZyb20gXCIuL3dvcmxkXCI7XG5pbXBvcnQgT1AgZnJvbSBcIi4vb3BcIjtcbmltcG9ydCBERU9QIGZyb20gXCIuL2Rlb3BcIjtcbmltcG9ydCBTQVZFIGZyb20gXCIuL3NhdmVcIjtcblxuLy8gRGVmaW5lIGFsbCB0aGUgYWRtaW4gY29tbWFuZHNcbmNvbnN0IEFkbWluQ29tbWFuZHMgPSBbXG4gIEdhbWVtb2RlLFxuICBBYmlsaXR5LFxuICBDbGVhcixcbiAgRmlsbCxcbiAgR2l2ZSxcbiAgS2ljayxcbiAgU2V0YmxvY2ssXG4gIFRhZyxcbiAgVHAsXG4gIFRyYW5zZmVyLFxuICBTdW1tb24sXG4gIEtpbGwsXG4gIFNUT1AsXG4gIFdPUkxELFxuICBPUCxcbiAgREVPUCxcbiAgU0FWRVxuXTtcblxuZXhwb3J0IHsgQWRtaW5Db21tYW5kcyB9O1xuIiwgImltcG9ydCB7IE1JTkVDUkFGVF9WRVJTSU9OLCBQUk9UT0NPTF9WRVJTSU9OIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFwiYWJvdXRcIiwgXCJHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlclwiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGDCpzdUaGlzIHNlcnZlciBpcyBydW5uaW5nIMKndVNlcmVuaXR5SlPCpzcgZm9yIE1pbmVjcmFmdCBCZWRyb2NrIEVkaXRpb24uIMKnOCh2JHtNSU5FQ1JBRlRfVkVSU0lPTn0sIHByb3RvLXYke1BST1RPQ09MX1ZFUlNJT059KcKncmBcbiAgICB9O1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCBBYm91dCBmcm9tIFwiLi9hYm91dFwiO1xuXG5jb25zdCBDb21tb25Db21tYW5kcyA9IFtBYm91dF07XG5cbmV4cG9ydCB7IENvbW1vbkNvbW1hbmRzIH07XG4iLCAiaW1wb3J0IHsgY3JlYXRlSW50ZXJmYWNlIH0gZnJvbSBcIm5vZGU6cmVhZGxpbmVcIjtcbmltcG9ydCB7IHN0ZGluLCBzdGRvdXQgfSBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5cbmltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5cbmNsYXNzIENvbnNvbGVJbnRlcmZhY2Uge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmZhY2UgPSBjcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBzdGRpbixcbiAgICBvdXRwdXQ6IHN0ZG91dCxcbiAgICB0ZXJtaW5hbDogdHJ1ZVxuICB9KTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2VyZW5pdHk6IFNlcmVuaXR5KSB7XG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcbiAgICBzdGRpbi5yZXN1bWUoKTtcblxuICAgIHRoaXMuaW50ZXJmYWNlLm9uKFwibGluZVwiLCB0aGlzLm9uTGluZS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuaW50ZXJmYWNlLnNldFByb21wdChcIj4gXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTGluZShsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgbGluZSBzdGFydHMgd2l0aCBhIC9cbiAgICAvLyBJZiBzbywgc2xpY2UgdGhlIGxpbmUgYW5kIGV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICBjb25zdCBmb3JtYXQgPSBsaW5lLnN0YXJ0c1dpdGgoXCIvXCIpID8gbGluZS5zbGljZSgxKSA6IGxpbmU7XG5cbiAgICAvLyBQYXJzZSB0aGUgZmxhZ3MgZnJvbSB0aGUgY29tbWFuZFxuICAgIGNvbnN0IHsgY29tbWFuZCwgZmxhZ3MgfSA9IHRoaXMucGFyc2VGbGFncyhmb3JtYXQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBkaW1lbnNpb24gZmxhZyBhbmQgd29ybGQgZmxhZyBhcmUgcHJlc2VudFxuICAgIGNvbnN0IGRpbWVuc2lvbkZsYWcgPSBmbGFncy5maW5kKChba2V5XSkgPT4ga2V5ID09PSBcImRpbVwiKTtcbiAgICBjb25zdCB3b3JsZEZsYWcgPSBmbGFncy5maW5kKChba2V5XSkgPT4ga2V5ID09PSBcIndvcmxkXCIpO1xuXG4gICAgaWYgKHdvcmxkRmxhZyAmJiAhZGltZW5zaW9uRmxhZykge1xuICAgICAgLy8gR2V0IHRoZSB3b3JsZCBmcm9tIHRoZSB3b3JsZCBmbGFnXG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMuc2VyZW5pdHkud29ybGRzLmdldCh3b3JsZEZsYWdbMV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgd29ybGQgZXhpc3RzXG4gICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXCJUaGUgc3BlY2lmaWVkIHdvcmxkIGRvZXMgbm90IGV4aXN0XCIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBkZWZhdWx0IGRpbWVuc2lvbiBvZiB0aGUgd29ybGRcbiAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHdvcmxkLmdldERpbWVuc2lvbigpO1xuXG4gICAgICAvLyBBdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICAgICAgY29uc3QgZXhlY3V0ZSA9IGRpbWVuc2lvbi5leGVjdXRlQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29tbWFuZCBpcyB1bmRlZmluZWRcbiAgICAgICAgaWYgKCFleGVjdXRlLm1lc3NhZ2UpIHJldHVybjtcblxuICAgICAgICAvLyBMb2cgdGhlIGNvbW1hbmQgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgd29ybGQubG9nZ2VyLmluZm8oYMKnYSR7ZXhlY3V0ZS5tZXNzYWdlfcKncmApO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIENhc3QgdGhlIHJlYXNvbiB0byBhbiBlcnJvclxuICAgICAgICBjb25zdCBlcnJvciA9IHJlYXNvbiBhcyBFcnJvcjtcblxuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHdvcmxkLmxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbkZsYWcgJiYgIXdvcmxkRmxhZykge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXG4gICAgICAgIFwiWW91IG11c3Qgc3BlY2lmeSBhIHdvcmxkIGZsYWcgd2hlbiBzcGVjaWZ5aW5nIGEgZGltZW5zaW9uIGZsYWdcIlxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uRmxhZyAmJiB3b3JsZEZsYWcpIHtcbiAgICAgIC8vIEdldCB0aGUgd29ybGQgZnJvbSB0aGUgd29ybGQgZmxhZ1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnNlcmVuaXR5Lndvcmxkcy5nZXQod29ybGRGbGFnWzFdKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHdvcmxkIGV4aXN0c1xuICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFwiVGhlIHNwZWNpZmllZCB3b3JsZCBkb2VzIG5vdCBleGlzdFwiKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGZyb20gdGhlIGRpbWVuc2lvbiBmbGFnXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSB3b3JsZC5nZXREaW1lbnNpb24oZGltZW5zaW9uRmxhZ1sxXSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBkaW1lbnNpb24gZXhpc3RzXG4gICAgICBpZiAoIWRpbWVuc2lvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFwiVGhlIHNwZWNpZmllZCBkaW1lbnNpb24gZG9lcyBub3QgZXhpc3RcIik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICAgICAgY29uc3QgZXhlY3V0ZSA9IGRpbWVuc2lvbi5leGVjdXRlQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29tbWFuZCBpcyB1bmRlZmluZWRcbiAgICAgICAgaWYgKCFleGVjdXRlLm1lc3NhZ2UpIHJldHVybjtcblxuICAgICAgICAvLyBMb2cgdGhlIGNvbW1hbmQgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgd29ybGQubG9nZ2VyLnN1Y2Nlc3MoYCR7ZXhlY3V0ZS5tZXNzYWdlfcKncmApO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIENhc3QgdGhlIHJlYXNvbiB0byBhbiBlcnJvclxuICAgICAgICBjb25zdCBlcnJvciA9IHJlYXNvbiBhcyBFcnJvcjtcblxuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHdvcmxkLmxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IHRoZSBkZWZhdWx0IHdvcmxkIG9mIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnNlcmVuaXR5LmdldFdvcmxkKCk7XG4gICAgICAvLyBHZXQgdGhlIGRlZmF1bHQgZGltZW5zaW9uIG9mIHRoZSB3b3JsZFxuICAgICAgY29uc3QgZGltZW5zaW9uID0gd29ybGQuZ2V0RGltZW5zaW9uKCk7XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgICAgICBjb25zdCBleGVjdXRlID0gZGltZW5zaW9uLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIGlzIHVuZGVmaW5lZFxuICAgICAgICBpZiAoIWV4ZWN1dGUubWVzc2FnZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIExvZyB0aGUgY29tbWFuZCB0byB0aGUgY29uc29sZVxuICAgICAgICB3b3JsZC5sb2dnZXIuaW5mbyhgwqdhJHtleGVjdXRlLm1lc3NhZ2V9wqdyYCk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gQ2FzdCB0aGUgcmVhc29uIHRvIGFuIGVycm9yXG4gICAgICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGFzIEVycm9yO1xuXG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgd29ybGQubG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUZsYWdzKGNvbW1hbmQ6IHN0cmluZyk6IHtcbiAgICBjb21tYW5kOiBzdHJpbmc7XG4gICAgZmxhZ3M6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+O1xuICB9IHtcbiAgICAvLyBFeGFtcGxlOiAvc2V0YmxvY2sgMCAxMDAgMCBzdG9uZSAtLWRpbT1vdmVyd29ybGQgLS13b3JsZD10ZXN0MTIzXG4gICAgY29uc3QgZmxhZ3MgPSBjb21tYW5kXG4gICAgICAuc3BsaXQoXCItLVwiKVxuICAgICAgLnNsaWNlKDEpXG4gICAgICAubWFwKChmbGFnKSA9PiB7XG4gICAgICAgIC8vIFNwbGl0IHRoZSBmbGFnIGJ5IHRoZSBlcXVhbHMgc2lnblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBmbGFnLnNwbGl0KFwiPVwiKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNwYWNlIGFmdGVyIHRoZSB2YWx1ZVxuICAgICAgICAvLyBJZiBzbywgc2xpY2UgdGhlIHZhbHVlXG4gICAgICAgIGlmICh2YWx1ZT8uZW5kc1dpdGgoXCIgXCIpKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgc3BhY2VcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHZhbHVlLmluZGV4T2YoXCIgXCIpO1xuXG4gICAgICAgICAgLy8gU2xpY2UgdGhlIHZhbHVlXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGtleSBhbmQgdmFsdWVcbiAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICAgIH0pIGFzIEFycmF5PFtzdHJpbmcsIHN0cmluZ10+O1xuXG4gICAgY29uc3QgbmV3Q29tbWFuZCA9IGNvbW1hbmQuc3BsaXQoXCItLVwiKT8uWzBdPy50cmltKCkgPz8gY29tbWFuZDtcblxuICAgIHJldHVybiB7IGNvbW1hbmQ6IG5ld0NvbW1hbmQsIGZsYWdzIH07XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29uc29sZUludGVyZmFjZSB9O1xuIiwgImltcG9ydCB7IEl0ZW1JZGVudGlmaWVyIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBJdGVtcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSXRlbUVudW0gfSBmcm9tIFwiLi4vY29tbWFuZHNcIjtcblxuaW1wb3J0IHsgQ3JlYXRpdmVJdGVtLCBJdGVtVHJhaXRzLCBJdGVtVHlwZSB9IGZyb20gXCIuXCI7XG5cbmltcG9ydCB0eXBlIHsgSXRlbVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRzXCI7XG5pbXBvcnQgdHlwZSB7IEJsb2NrVHlwZSB9IGZyb20gXCIuLi9ibG9ja1wiO1xuXG5jbGFzcyBJdGVtUGFsZXR0ZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBpdGVtIHR5cGVzIGZvciB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlcyA9IEl0ZW1UeXBlLnR5cGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgY3JlYXRpdmUgY29udGVudCBmb3IgdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpdmVDb250ZW50ID0gQ3JlYXRpdmVJdGVtLml0ZW1zO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBpdGVtIHRyYWl0cyBmb3IgdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBJdGVtVHJhaXQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RyeSBmb3IgdGhlIGl0ZW0gdHJhaXRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gbmV3IE1hcDxJdGVtSWRlbnRpZmllciwgQXJyYXk8dHlwZW9mIEl0ZW1UcmFpdD4+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFJlZ2lzdGVyIGFsbCBpdGVtIHRyYWl0cy5cbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIEl0ZW1UcmFpdHMpIHRoaXMucmVnaXN0ZXJUcmFpdCh0cmFpdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgaXRlbSB0eXBlcyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcmV0dXJucyBBbGwgaXRlbSB0eXBlcyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PEl0ZW1UeXBlPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnR5cGVzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGl0ZW0gdHlwZSBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaXRlbSBpZGVudGlmaWVyIHRvIGdldC5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gdHlwZSBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGU8VCBleHRlbmRzIGtleW9mIEl0ZW1zPihpZGVudGlmaWVyOiBUKTogSXRlbVR5cGU8VD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcy5nZXQoaWRlbnRpZmllcikgYXMgSXRlbVR5cGU8VD47XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gaXRlbSB0eXBlIGZyb20gdGhlIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBibG9jayB0eXBlIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIHR5cGUgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlVHlwZSh0eXBlOiBCbG9ja1R5cGUpOiBJdGVtVHlwZSB8IG51bGwge1xuICAgIHJldHVybiBbLi4udGhpcy50eXBlcy52YWx1ZXMoKV0uZmluZCgoaXRlbSkgPT4gaXRlbS5ibG9jayA9PT0gdHlwZSkgPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclR5cGUodHlwZTogSXRlbVR5cGUpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSB0eXBlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICBpZiAodGhpcy50eXBlcy5oYXModHlwZS5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW0gdHlwZS5cbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmlkZW50aWZpZXIsIHR5cGUpO1xuXG4gICAgLy8gQWRkIHRoZSBpdGVtIHR5cGUgdG8gdGhlIGl0ZW0gZW51bS5cbiAgICBJdGVtRW51bS5vcHRpb25zLnB1c2godHlwZS5pZGVudGlmaWVyKTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBpdGVtIHR5cGUgd2FzIHJlZ2lzdGVyZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVnaXN0cnkoaWRlbnRpZmllcjogSXRlbUlkZW50aWZpZXIpOiBBcnJheTx0eXBlb2YgSXRlbVRyYWl0PiB7XG4gICAgLy8gR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGl0ZW0gaWRlbnRpZmllci5cbiAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMucmVnaXN0cnkuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZWdpc3RyeSBmb3IgdGhlIGl0ZW0gaWRlbnRpZmllci5cbiAgICByZXR1cm4gcmVnaXN0cnkgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgY3JlYXRpdmUgY29udGVudCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcmV0dXJucyBBbGwgY3JlYXRpdmUgY29udGVudCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldENyZWF0aXZlQ29udGVudCgpOiBBcnJheTxDcmVhdGl2ZUl0ZW0+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY3JlYXRpdmVDb250ZW50LnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3JlYXRpdmUgY29udGVudCBieSBpbmRleC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3JlYXRpdmUgY29udGVudC5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0aXZlIGNvbnRlbnQgYnkgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3JlYXRpdmVDb250ZW50QnlJbmRleChpbmRleDogbnVtYmVyKTogQ3JlYXRpdmVJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRpdmVDb250ZW50LmdldChpbmRleCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5ldyBjcmVhdGl2ZSBpdGVtLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgaXRlbSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0gYXV4aWxsYXJ5IFRoZSBhdXhpbGxhcnkgZGF0YSBmb3IgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDcmVhdGl2ZUNvbnRlbnQodHlwZTogSXRlbVR5cGUsIGF1eGlsbGFyeSA9IDApOiB2b2lkIHtcbiAgICAvLyBUT0RPOiBBZGQgTkJUIHN1cHBvcnRcblxuICAgIC8vIEdldCB0aGUgaW5kZXggZm9yIHRoZSBjcmVhdGl2ZSBpdGVtLlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jcmVhdGl2ZUNvbnRlbnQuc2l6ZTtcblxuICAgIC8vIFNldCB0aGUgY3JlYXRpdmUgaXRlbSBpbiB0aGUgcmVnaXN0cnkuXG4gICAgdGhpcy5jcmVhdGl2ZUNvbnRlbnQuc2V0KGluZGV4LCBuZXcgQ3JlYXRpdmVJdGVtKHR5cGUsIGF1eGlsbGFyeSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYSBjcmVhdGl2ZSBpdGVtIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNyZWF0aXZlIGl0ZW0gdG8gdW5yZWdpc3Rlci5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyQ3JlYXRpdmVDb250ZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0aXZlQ29udGVudC5kZWxldGUoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjcmVhdGl2ZSBjb250ZW50IGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJDcmVhdGl2ZUNvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGl2ZUNvbnRlbnQuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBpdGVtIHRyYWl0IHRvIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGl0ZW0gdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGl0ZW0gdHJhaXQgd2FzIHJlZ2lzdGVyZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVRyYWl0KTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gdHJhaXQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgIGlmICh0aGlzLnRyYWl0cy5oYXModHJhaXQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBpdGVtIHRyYWl0LlxuICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCB0cmFpdCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGl0ZW0gdHlwZXMuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHRyYWl0LnR5cGVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcmVnaXN0cnkgaGFzIHRoZSBpdGVtIGlkZW50aWZpZXIuXG4gICAgICBpZiAoIXRoaXMucmVnaXN0cnkuaGFzKHR5cGUpKVxuICAgICAgICAvLyBTZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgaXRlbSBpZGVudGlmaWVyLlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldCh0eXBlLCBbXSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBpdGVtIGlkZW50aWZpZXIuXG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMucmVnaXN0cnkuZ2V0KHR5cGUpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcmVnaXN0cnkgZXhpc3RzLlxuICAgICAgaWYgKHJlZ2lzdHJ5KSB7XG4gICAgICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSByZWdpc3RyeS5cbiAgICAgICAgcmVnaXN0cnkucHVzaCh0cmFpdCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGl0ZW0gaWRlbnRpZmllci5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQodHlwZSwgcmVnaXN0cnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBpdGVtIHRyYWl0IHdhcyByZWdpc3RlcmVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGl0ZW0gdHJhaXRzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsVHJhaXRzKCk6IEFycmF5PHR5cGVvZiBJdGVtVHJhaXQ+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMudHJhaXRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGl0ZW0gdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdHJhaXQuXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIHRyYWl0IGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQoaWRlbnRpZmllcjogc3RyaW5nKTogdHlwZW9mIEl0ZW1UcmFpdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyYWl0cy5nZXQoaWRlbnRpZmllcikgPz8gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgeyBJdGVtUGFsZXR0ZSB9O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL3RyYWl0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9idW5kbGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VxdWlwcGFibGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VuY2hhbnRhYmxlXCI7XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IFRyYWl0IH0gZnJvbSBcIi4uLy4uL3RyYWl0XCI7XG5pbXBvcnQgeyBJdGVtVXNlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL3N0YWNrXCI7XG5cbmNsYXNzIEl0ZW1UcmFpdDxUIGV4dGVuZHMgSXRlbUlkZW50aWZpZXI+IGV4dGVuZHMgVHJhaXQge1xuICAvKipcbiAgICogVGhlIGl0ZW0gdHlwZSBpZGVudGlmaWVycyB0aGF0IHRoaXMgdHJhaXQgaXMgY29tcGF0aWJsZSB3aXRoIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxJdGVtSWRlbnRpZmllcj4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gc3RhY2sgdGhhdCB0aGlzIHRyYWl0IGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGl0ZW06IEl0ZW1TdGFjazxUPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gc3RhY2sgdGhhdCB0aGlzIHRyYWl0IHdpbGwgYmUgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoaXRlbTogSXRlbVN0YWNrPFQ+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIHRyYWl0IHRvIHRoZSBpdGVtIHN0YWNrXG4gICAgaXRlbS5hZGRUcmFpdCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyB1c2VkIGJ5IGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCB1c2VkIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgaXRlbSB1c2UuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGl0ZW0gdXNlIHdhcyBzdWNjZXNzZnVsOyBkZWZhdWx0IGlzIHRydWVcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXNlPyhcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBvcHRpb25zOiBQYXJ0aWFsPEl0ZW1Vc2VPcHRpb25zPlxuICApOiBib29sZWFuIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGl0ZW0gaXMgc3RvcHBlZCBiZWluZyB1c2VkIGJ5IGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBzdG9wcGVkIHVzaW5nIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgaXRlbSB1c2UuXG4gICAqL1xuICBwdWJsaWMgb25TdG9wVXNlPyhcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBvcHRpb25zOiBQYXJ0aWFsPEl0ZW1Vc2VPcHRpb25zPlxuICApOiBib29sZWFuIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGl0ZW0gaXMgdXNlZCBieSBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgdXNlZCB0aGUgaXRlbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIGl0ZW0gdXNlLlxuICAgKi9cbiAgcHVibGljIG9uVXNlPyhcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBvcHRpb25zOiBQYXJ0aWFsPEl0ZW1Vc2VPcHRpb25zPlxuICApOiBib29sZWFuIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRhaW5lciB0aGF0IHRoZSBpdGVtIGlzIHN0b3JlZCBpbiBpcyBvcGVuZWQuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IG9wZW5lZCB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIG9uQ29udGFpbmVyT3Blbj8ocGxheWVyOiBQbGF5ZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udGFpbmVyIHRoYXQgdGhlIGl0ZW0gaXMgc3RvcmVkIGluIGlzIGNsb3NlZC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgY2xvc2VkIHRoZSBjb250YWluZXJcbiAgICovXG4gIHB1YmxpYyBvbkNvbnRhaW5lckNsb3NlPyhwbGF5ZXI6IFBsYXllcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIGFub3RoZXIgaXRlbSB0cmFpdCB0byB0aGlzIG9uZS5cbiAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBpdGVtIHRyYWl0IHRvIGNvbXBhcmUuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGl0ZW0gdHJhaXRzIGFyZSBlcXVhbC5cbiAgICovXG4gIHB1YmxpYyBlcXVhbHMob3RoZXI6IEl0ZW1UcmFpdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlkZW50aWZpZXIgPT09IG90aGVyLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmVzIHRoZSBpdGVtIHRyYWl0IHRvIGFub3RoZXIgaXRlbSBzdGFjay5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gc3RhY2sgdG8gY2xvbmUgdGhlIGNvbXBvbmVudCB0by5cbiAgICogQHJldHVybnMgQSBuZXcgaXRlbSB0cmFpdC5cbiAgICovXG4gIHB1YmxpYyBjbG9uZShpdGVtOiBJdGVtU3RhY2s8VD4pOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRyYWl0XG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3ICh0aGlzLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBpdGVtOiBJdGVtU3RhY2s8VD4sXG4gICAgICBpZGVudGlmaWVyOiBzdHJpbmdcbiAgICApID0+IEl0ZW1UcmFpdDxUPikoaXRlbSwgdGhpcy5pZGVudGlmaWVyKSBhcyB0aGlzO1xuXG4gICAgLy8gQ29weSB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMpKSB7XG4gICAgICAvLyBTa2lwIHRoZSBpdGVtLlxuICAgICAgaWYgKGtleSA9PT0gXCJpdGVtXCIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBjb21wb25lbnRba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgdHJhaXRcbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1UcmFpdCB9O1xuIiwgImltcG9ydCB7IEludFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcbmltcG9ydCB7XG4gIENvbnRhaW5lcklkLFxuICBDb250YWluZXJOYW1lLFxuICBDb250YWluZXJUeXBlLFxuICBGdWxsQ29udGFpbmVyTmFtZSxcbiAgSW52ZW50b3J5Q29udGVudFBhY2tldCxcbiAgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3Jcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEl0ZW1JZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vc3RhY2tcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9jb250YWluZXJcIjtcblxuaW1wb3J0IHsgSXRlbVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgSXRlbUJ1bmRsZVRyYWl0PFQgZXh0ZW5kcyBJdGVtSWRlbnRpZmllcj4gZXh0ZW5kcyBJdGVtVHJhaXQ8VD4ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImR5bmFtaWNfY29udGFpbmVyXCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtcbiAgICBJdGVtSWRlbnRpZmllci5CdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuQmx1ZUJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5CbGFja0J1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5Ccm93bkJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5DeWFuQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLkdyYXlCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuR3JlZW5CdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuTGlnaHRCbHVlQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLkxpZ2h0R3JheUJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5MaW1lQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLk1hZ2VudGFCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuT3JhbmdlQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLlBpbmtCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuUHVycGxlQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLlJlZEJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5XaGl0ZUJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5ZZWxsb3dCdW5kbGVcbiAgXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lciBvZiB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoaXRlbTogSXRlbVN0YWNrPFQ+KSB7XG4gICAgc3VwZXIoaXRlbSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBoYXMgYSBidW5kbGUgaWQuXG4gICAgaWYgKCFpdGVtLmNvbXBvbmVudHMuaGFzKFwiZHluYW1pY19jb250YWluZXJcIikpIHtcbiAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IGJ1bmRsZSBpZC5cbiAgICAgIGNvbnN0IGlkID0gTWF0aC5hYnMoRGF0ZS5ub3coKSA+PiA0KSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDMyKTtcblxuICAgICAgLy8gU2V0IHRoZSBidW5kbGUgaWQgY29tcG9uZW50IGFuZCBuYnQuXG4gICAgICBpdGVtLmNvbXBvbmVudHMuc2V0KFwiZHluYW1pY19jb250YWluZXJcIiwgaWQpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaW50IHRhZyBmb3IgdGhlIGJ1bmRsZSBpZC5cbiAgICAgIGNvbnN0IHRhZyA9IG5ldyBJbnRUYWcoXCJidW5kbGVfaWRcIiwgaWQpO1xuXG4gICAgICAvLyBTZXQgdGhlIGJ1bmRsZSBpZCBuYnQuXG4gICAgICBpdGVtLm5idC5zZXQoXCJidW5kbGVfaWRcIiwgdGFnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IHRoZSBidW5kbGUgaWQuXG4gICAgICBjb25zdCBpZCA9IGl0ZW0uY29tcG9uZW50cy5nZXQoXCJkeW5hbWljX2NvbnRhaW5lclwiKSBhcyBudW1iZXI7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnQgdGFnIGZvciB0aGUgYnVuZGxlIGlkLlxuICAgICAgY29uc3QgdGFnID0gbmV3IEludFRhZyhcImJ1bmRsZV9pZFwiLCBpZCk7XG5cbiAgICAgIC8vIFNldCB0aGUgYnVuZGxlIGlkIG5idC5cbiAgICAgIGl0ZW0ubmJ0LnNldChcImJ1bmRsZV9pZFwiLCB0YWcpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb250YWluZXIuXG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgQ29udGFpbmVyKFxuICAgICAgQ29udGFpbmVyVHlwZS5Ob25lLFxuICAgICAgQ29udGFpbmVySWQuUmVnaXN0cnksXG4gICAgICA2NFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJ1bmRsZSBpZCBvZiB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZHluYW1pY0lkKCk6IG51bWJlciB7XG4gICAgLy8gUmV0dXJuIHRoZSBidW5kbGUgaWQuXG4gICAgcmV0dXJuICh0aGlzLml0ZW0uY29tcG9uZW50cy5nZXQoXCJkeW5hbWljX2NvbnRhaW5lclwiKSBhcyBudW1iZXIpID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYnVuZGxlIGlkIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHNldCBkeW5hbWljSWQoaWQ6IG51bWJlcikge1xuICAgIC8vIFNldCB0aGUgYnVuZGxlIGlkLlxuICAgIHRoaXMuaXRlbS5jb21wb25lbnRzLnNldChcImR5bmFtaWNfY29udGFpbmVyXCIsIGlkKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBpbnQgdGFnIGZvciB0aGUgYnVuZGxlIGlkLlxuICAgIGNvbnN0IHRhZyA9IG5ldyBJbnRUYWcoXCJidW5kbGVfaWRcIiwgaWQpO1xuXG4gICAgLy8gU2V0IHRoZSBidW5kbGUgaWQgbmJ0LlxuICAgIHRoaXMuaXRlbS5uYnQuc2V0KFwiYnVuZGxlX2lkXCIsIHRhZyk7XG4gIH1cblxuICBwdWJsaWMgb25Db250YWluZXJPcGVuKHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQWRkIHRoZSBwbGF5ZXIgdG8gdGhlIG9jY3VwYW50cyBvZiB0aGUgY29udGFpbmVyLlxuICAgIHRoaXMuY29udGFpbmVyLm9jY3VwYW50cy5hZGQocGxheWVyKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbnRhaW5lckNsb3NlKHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHRoZSBwbGF5ZXIgZnJvbSB0aGUgb2NjdXBhbnRzIG9mIHRoZSBjb250YWluZXIuXG4gICAgdGhpcy5jb250YWluZXIub2NjdXBhbnRzLmRlbGV0ZShwbGF5ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uVGljaygpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGljayBvZiB0aGUgd29ybGQuXG4gICAgY29uc3QgY3VycmVudFRpY2sgPSB0aGlzLml0ZW0ud29ybGQuY3VycmVudFRpY2s7XG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgbm8gb2NjdXBhbnRzIGluIHRoZSBjb250YWluZXIuXG4gICAgLy8gQW5kIHRoZSBjdXJyZW50IHRpY2sgaXMgZGl2aXNpYmxlIGJ5IDUuXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLm9jY3VwYW50cy5zaXplID09PSAwIHx8IGN1cnJlbnRUaWNrICUgNW4gIT09IDBuKSByZXR1cm47XG5cbiAgICAvLyBTZW5kIHRoZSBpdGVtcyBpbiB0aGUgYnVuZGxlIHRvIHRoZSBwbGF5ZXIuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQoKTtcbiAgICBwYWNrZXQuY29udGFpbmVySWQgPSBDb250YWluZXJJZC5SZWdpc3RyeTtcbiAgICBwYWNrZXQuc3RvcmFnZUl0ZW0gPSBJdGVtU3RhY2sudG9OZXR3b3JrU3RhY2sodGhpcy5pdGVtKTtcbiAgICBwYWNrZXQuZnVsbENvbnRhaW5lck5hbWUgPSBuZXcgRnVsbENvbnRhaW5lck5hbWUoXG4gICAgICBDb250YWluZXJOYW1lLkR5bmFtaWMsXG4gICAgICB0aGlzLmR5bmFtaWNJZFxuICAgICk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBpdGVtcyBpbiB0aGUgYnVuZGxlLlxuICAgIHBhY2tldC5pdGVtcyA9IFtdO1xuXG4gICAgLy8gUHVzaCB0aGUgaXRlbSBzdGFja3MgdG8gdGhlIHBhY2tldC5cbiAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20odGhpcy5jb250YWluZXIuc3RvcmFnZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRhaW5lci5zaXplOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgaXRlbSBzdGFjayBmcm9tIHRoZSBidW5kbGUuXG4gICAgICBjb25zdCBzdGFjayA9IGl0ZW1zW2ldO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBzdGFjayBleGlzdHMuXG4gICAgICAvLyBJZiBub3QsIHB1c2ggYW4gZW1wdHkgaXRlbSBzdGFjay5cbiAgICAgIGlmICghc3RhY2spIHBhY2tldC5pdGVtcy5wdXNoKG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcigwKSk7XG4gICAgICAvLyBQdXNoIHRoZSBpdGVtIHN0YWNrIHRvIHRoZSBwYWNrZXQuXG4gICAgICBlbHNlIHBhY2tldC5pdGVtcy5wdXNoKEl0ZW1TdGFjay50b05ldHdvcmtTdGFjayhzdGFjaykpO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgb2NjdXBhbnRzIG9mIHRoZSBjb250YWluZXIuXG4gICAgZm9yIChjb25zdCBvY2N1cGFudCBvZiB0aGlzLmNvbnRhaW5lci5vY2N1cGFudHMpIG9jY3VwYW50LnNlbmQocGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBJdGVtQnVuZGxlVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZywgTkJUVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vc3RhY2tcIjtcblxuY2xhc3MgSXRlbVN0YWNrTmJ0TWFwIGV4dGVuZHMgTWFwPHN0cmluZywgTkJUVGFnPiB7XG4gIC8qKlxuICAgKiBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBuYnQgbWFwIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGl0ZW1TdGFjazogSXRlbVN0YWNrO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBpdGVtIHN0YWNrIG5idCBtYXAuXG4gICAqIEBwYXJhbSBpdGVtU3RhY2sgVGhlIGl0ZW0gc3RhY2sgdGhhdCB0aGUgbmJ0IG1hcCB3aWxsIGJlIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGl0ZW1TdGFjazogSXRlbVN0YWNrKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLml0ZW1TdGFjayA9IGl0ZW1TdGFjaztcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8VCBleHRlbmRzIE5CVFRhZz4oa2V5OiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSkgYXMgVDtcbiAgfVxuXG4gIHB1YmxpYyBhZGQodmFsdWU6IE5CVFRhZzx1bmtub3duPik6IHRoaXMge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldCBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5zZXQodmFsdWUubmFtZSwgdmFsdWUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBuYnQgZGF0YSB3aGVuIGEgbmV3IHZhbHVlIGlzIGFkZGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBOQlRUYWc8dW5rbm93bj4pOiB0aGlzIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXQgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBuYnQgZGF0YSB3aGVuIGEgbmV3IHZhbHVlIGlzIGFkZGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBkZWxldGUgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVsZXRlKGtleSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIG5idCBkYXRhIHdoZW4gYSB2YWx1ZSBpcyByZW1vdmVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBjbGVhciBtZXRob2RcbiAgICBzdXBlci5jbGVhcigpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBuYnQgZGF0YSB3aGVuIHRoZSBtYXAgaXMgY2xlYXJlZFxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIG5idCBtYXAgdG8gYSBjb21wb3VuZCB0YWcuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgdG9Db21wb3VuZCgpOiBDb21wb3VuZFRhZyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbXBvdW5kIHRhZ1xuICAgIGNvbnN0IHJvb3QgPSBuZXcgQ29tcG91bmRUYWcoXCJcIik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIG1hcFxuICAgIGZvciAoY29uc3QgW18sIHZhbHVlXSBvZiB0aGlzKSB7XG4gICAgICAvLyBBZGQgdGhlIHRhZyB0byB0aGUgY29tcG91bmRcbiAgICAgIHJvb3QuYWRkVGFnKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNvbXBvdW5kXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgdGFncyBmcm9tIGEgY29tcG91bmQgdG8gdGhlIG1hcC5cbiAgICogQHBhcmFtIHJvb3QgVGhlIGNvbXBvdW5kIHRhZyB0byBhZGQgdGhlIHRhZ3MgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBmcm9tQ29tcG91bmQocm9vdDogQ29tcG91bmRUYWcpOiB2b2lkIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRhZ3MgaW4gdGhlIGNvbXBvdW5kXG4gICAgZm9yIChjb25zdCB0YWcgb2Ygcm9vdC5nZXRUYWdzKCkpIHtcbiAgICAgIC8vIFNldCB0aGUgdGFnIGluIHRoZSBtYXBcbiAgICAgIHRoaXMuc2V0KHRhZy5uYW1lLCB0YWcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemUoKTogQnVmZmVyIHtcbiAgICAvLyBHZXQgdGhlIGNvbXBvdW5kIHRhZyBmcm9tIHRoZSBtYXBcbiAgICBjb25zdCByb290ID0gdGhpcy50b0NvbXBvdW5kKCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIHRvIHdyaXRlIHRoZSBkYXRhXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGNvbXBvdW5kIHRhZyB0byB0aGUgc3RyZWFtXG4gICAgQ29tcG91bmRUYWcud3JpdGUoc3RyZWFtLCByb290KTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyXG4gICAgcmV0dXJuIHN0cmVhbS5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZShidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gdG8gcmVhZCB0aGUgZGF0YVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgIC8vIFJlYWQgdGhlIGNvbXBvdW5kIHRhZyBmcm9tIHRoZSBzdHJlYW1cbiAgICBjb25zdCByb290ID0gQ29tcG91bmRUYWcucmVhZChzdHJlYW0pO1xuXG4gICAgLy8gQWRkIHRoZSB0YWdzIGZyb20gdGhlIGNvbXBvdW5kIHRvIHRoZSBtYXBcbiAgICB0aGlzLmZyb21Db21wb3VuZChyb290KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgaW4gYSBjb250YWluZXIuXG4gICAgaWYgKCF0aGlzLml0ZW1TdGFjay5jb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgc2xvdCBvZiB0aGUgaXRlbSBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLml0ZW1TdGFjay5jb250YWluZXIuc3RvcmFnZS5pbmRleE9mKHRoaXMuaXRlbVN0YWNrKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIDAgb3IgbGVzcy5cbiAgICBpZiAodGhpcy5pdGVtU3RhY2suYW1vdW50IDw9IDApIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBjb250YWluZXIuXG4gICAgICB0aGlzLml0ZW1TdGFjay5jb250YWluZXIuY2xlYXJTbG90KHNsb3QpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgaXRlbSBpbiB0aGUgY29udGFpbmVyLlxuICAgIGVsc2UgdGhpcy5pdGVtU3RhY2suY29udGFpbmVyLnNldEl0ZW0oc2xvdCwgdGhpcy5pdGVtU3RhY2spO1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1TdGFja05idE1hcCB9O1xuIiwgImltcG9ydCB7XG4gIE5ldHdvcmtJdGVtSW5zdGFuY2VEZXNjcmlwdG9yLFxuICBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvclxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIEl0ZW1zLFxuICBJdGVtU3RhY2tFbnRyeSxcbiAgSXRlbVN0YWNrUHJvcGVydGllcyxcbiAgSXRlbVVzZU9wdGlvbnMsXG4gIEpTT05MaWtlVmFsdWVcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuXG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gXCIuL2lkZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtVHJhaXQgfSBmcm9tIFwiLi90cmFpdHNcIjtcbmltcG9ydCB7IEl0ZW1TdGFja05idE1hcCB9IGZyb20gXCIuL21hcHNcIjtcblxuY29uc3QgRGVmYXVsdEl0ZW1TdGFja1Byb3BlcnRpZXM6IEl0ZW1TdGFja1Byb3BlcnRpZXMgPSB7XG4gIGFtb3VudDogMSxcbiAgYXV4aWxsYXJ5OiAwXG59O1xuXG5jbGFzcyBJdGVtU3RhY2s8VCBleHRlbmRzIGtleW9mIEl0ZW1zID0ga2V5b2YgSXRlbXM+IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEl0ZW1UeXBlPFQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50cyBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEpTT05MaWtlVmFsdWU+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFpdHMgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzID0gbmV3IE1hcDxzdHJpbmcsIEl0ZW1UcmFpdDxUPj4oKTtcblxuICAvKipcbiAgICogVGhlIG5idCBkYXRhIG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5idCA9IG5ldyBJdGVtU3RhY2tOYnRNYXAodGhpcyk7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpdGVtIHN0YWNrIGlzIHN0YWNrYWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGFja2FibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHN0YWNrIHNpemUgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4QW1vdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCB0aGUgaXRlbSBzdGFjayBpcyBpbi5cbiAgICovXG4gIHB1YmxpYyB3b3JsZCE6IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRoZSBpdGVtIHN0YWNrIGlzIGluLlxuICAgKiBJZiB0aGUgaXRlbSBzdGFjayBpcyBub3QgaW4gYSBjb250YWluZXIsIHRoaXMgd2lsbCBiZSBudWxsLlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5lcjogQ29udGFpbmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYW1vdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXhpbGxhcnkgZGF0YSBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhdXhpbGxhcnk6IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogVCB8IEl0ZW1JZGVudGlmaWVyIHwgSXRlbVR5cGU8VD4sXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8SXRlbVN0YWNrUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gQXNzaWduIHRoZSB0eXBlIG9mIHRoZSBpdGVtIHN0YWNrXG4gICAgdGhpcy50eXBlID1cbiAgICAgIGlkZW50aWZpZXIgaW5zdGFuY2VvZiBJdGVtVHlwZVxuICAgICAgICA/IGlkZW50aWZpZXJcbiAgICAgICAgOiAoSXRlbVR5cGUuZ2V0KGlkZW50aWZpZXIgYXMgVCkgYXMgSXRlbVR5cGU8VD4pOyAvLyBUT0RPOiBGaXggdGhpcywgZmV0Y2ggZnJvbSBwYWxldHRlXG5cbiAgICAvLyBTcHJlYWQgdGhlIGRlZmF1bHQgcHJvcGVydGllcyBhbmQgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXNcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uRGVmYXVsdEl0ZW1TdGFja1Byb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgaXRlbSBzdGFja1xuICAgIHRoaXMuYW1vdW50ID0gcHJvcHMuYW1vdW50O1xuICAgIHRoaXMuYXV4aWxsYXJ5ID0gcHJvcHMuYXV4aWxsYXJ5O1xuXG4gICAgLy8gQXNzaWduIHRoZSBzdGFja2FibGUgYW5kIG1heCBhbW91bnQgcHJvcGVydGllc1xuICAgIHRoaXMuc3RhY2thYmxlID0gdGhpcy50eXBlLnN0YWNrYWJsZTtcbiAgICB0aGlzLm1heEFtb3VudCA9IHRoaXMudHlwZS5tYXhBbW91bnQ7XG5cbiAgICAvLyBDaGVjayBpZiBhIHdvcmxkIHdhcyBwcm92aWRlZFxuICAgIGlmIChwcm9wcy53b3JsZCkge1xuICAgICAgLy8gQXNzaWduIHRoZSB3b3JsZCB0byB0aGUgaXRlbSBzdGFja1xuICAgICAgdGhpcy53b3JsZCA9IHByb3BzLndvcmxkO1xuXG4gICAgICAvLyBDaGVjayBpZiBhIGVudHJ5IHdhcyBwcm92aWRlZFxuICAgICAgaWYgKHByb3BzLmVudHJ5KVxuICAgICAgICAvLyBMb2FkIHRoZSBkYXRhIGVudHJ5IGZvciB0aGUgaXRlbSBzdGFja1xuICAgICAgICB0aGlzLmxvYWREYXRhRW50cnkocHJvcHMud29ybGQsIHByb3BzLmVudHJ5KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaXRlbSBzdGFja1xuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSB0cmFpdHMgZm9yIHRoZSBpdGVtc3RhY2tcbiAgICBjb25zdCB0cmFpdHMgPSB0aGlzLndvcmxkLml0ZW1QYWxldHRlLmdldFJlZ2lzdHJ5KHRoaXMudHlwZS5pZGVudGlmaWVyKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSB0cmFpdHMgdG8gdGhlIGl0ZW1zdGFja1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdHJhaXRzKSBpZiAoIXRoaXMuaGFzVHJhaXQodHJhaXQpKSB0aGlzLmFkZFRyYWl0KHRyYWl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBpdGVtIHN0YWNrIGluIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIGluIGEgY29udGFpbmVyLlxuICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgc2xvdCBvZiB0aGUgaXRlbSBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNvbnRhaW5lci5zdG9yYWdlLmluZGV4T2YodGhpcyk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyAwIG9yIGxlc3MuXG4gICAgaWYgKHRoaXMuYW1vdW50IDw9IDApIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBjb250YWluZXIuXG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGVhclNsb3Qoc2xvdCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBpdGVtIGluIHRoZSBjb250YWluZXIuXG4gICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zZXRJdGVtKHNsb3QsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYW1vdW50IG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldEFtb3VudChhbW91bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgYW1vdW50IG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgIHRoaXMuYW1vdW50ID0gYW1vdW50O1xuXG4gICAgLy8gVXBkYXRlIHRoZSBpdGVtIGluIHRoZSBjb250YWluZXIuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyZW1lbnRzIHRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBkZWNyZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgZGVjcmVtZW50KGFtb3VudD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0QW1vdW50KHRoaXMuYW1vdW50IC0gKGFtb3VudCA/PyAxKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVtZW50cyB0aGUgYW1vdW50IG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdG8gaW5jcmVtZW50LlxuICAgKi9cbiAgcHVibGljIGluY3JlbWVudChhbW91bnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldEFtb3VudCh0aGlzLmFtb3VudCArIChhbW91bnQgPz8gMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhdXNlcyBhIHBsYXllciB0byB1c2UgdGhlIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB1c2luZyB0aGUgaXRlbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBpdGVtIHVzZS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaXRlbSB1c2Ugd2FzIHN1Y2Nlc3NmdWw7IGRlZmF1bHQgaXMgdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyB1c2UocGxheWVyOiBQbGF5ZXIsIG9wdGlvbnM6IFBhcnRpYWw8SXRlbVVzZU9wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgLy8gVHJpZ2dlciB0aGUgaXRlbSBvblVzZSB0cmFpdCBldmVudFxuICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIFNldCB0aGUgY2FuY2VsZWQgZmxhZyBpbiB0aGUgb3B0aW9uc1xuICAgICAgb3B0aW9ucy5jYW5jZWxlZCA9IGNhbmNlbGVkO1xuXG4gICAgICAvLyBBdHRlbXB0IHRvIHRyaWdnZXIgdGhlIG9uVXNlIHRyYWl0IGV2ZW50XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgYnJlYWsgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRyYWl0Lm9uVXNlPy4ocGxheWVyLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgICAgLy8gQXMgdGhlIHRyYWl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWV0aG9kXG4gICAgICAgIGlmIChzdWNjZXNzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgYnJlYWtcbiAgICAgICAgY2FuY2VsZWQgPSAhc3VjY2VzcztcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHBsYXllclxuICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgLnNlcmVuaXR5LmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gdHJpZ2dlciBvblVzZSB0cmFpdCBldmVudCBmb3IgaXRlbSBcIiR7dGhpcy50eXBlLmlkZW50aWZpZXJ9XCIgaW4gZGltZW5zaW9uIFwiJHtwbGF5ZXIuZGltZW5zaW9uLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgKTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIGl0ZW1cbiAgICAgICAgdGhpcy50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBpdGVtIHVzZSB3YXMgY2FuY2VsZWRcbiAgICByZXR1cm4gIWNhbmNlbGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGl0ZW1zdGFjayBoYXMgdGhlIHNwZWNpZmllZCB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBjaGVjayBmb3JcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaXRlbXN0YWNrIGhhcyB0aGUgdHJhaXRcbiAgICovXG4gIHB1YmxpYyBoYXNUcmFpdCh0cmFpdDogc3RyaW5nIHwgdHlwZW9mIEl0ZW1UcmFpdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRyYWl0cy5oYXMoXG4gICAgICB0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBpdGVtc3RhY2suXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gZ2V0IGZyb20gdGhlIGl0ZW1zdGFja1xuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0PEsgZXh0ZW5kcyB0eXBlb2YgSXRlbVRyYWl0PFQ+Pih0cmFpdDogSyk6IEluc3RhbmNlVHlwZTxLPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGl0ZW1zdGFjay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgaXRlbXN0YWNrXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQodHJhaXQ6IHN0cmluZyk6IEl0ZW1UcmFpdDxUPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBpdGVtc3RhY2suXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gZ2V0IGZyb20gdGhlIGl0ZW1zdGFja1xuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgSXRlbVRyYWl0PFQ+KTogSXRlbVRyYWl0PFQ+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldChcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICkgYXMgSXRlbVRyYWl0PFQ+IHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgdHJhaXQgZnJvbSB0aGUgaXRlbXN0YWNrLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgSXRlbVRyYWl0PFQ+KTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSB0cmFpdCBmcm9tIHRoZSBpdGVtc3RhY2tcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMudHJhaXRzLmdldChcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICk7XG5cbiAgICAvLyBDYWxsIHRoZSBvblJlbW92ZSB0cmFpdCBldmVudFxuICAgIGluc3RhbmNlPy5vblJlbW92ZT8uKCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIGl0ZW1zdGFja1xuICAgIHRoaXMudHJhaXRzLmRlbGV0ZSh0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0cmFpdCB0byB0aGUgaXRlbXN0YWNrLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGFkZFxuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFpdDxLIGV4dGVuZHMgdHlwZW9mIEl0ZW1UcmFpdDxUPj4oXG4gICAgdHJhaXQ6IEsgfCBJdGVtVHJhaXQ8VD5cbiAgKTogSW5zdGFuY2VUeXBlPEs+IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAodGhpcy50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhaXQodHJhaXQuaWRlbnRpZmllcikgYXMgSW5zdGFuY2VUeXBlPEs+O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGlzIGluIHRoZSBwYWxldHRlXG4gICAgaWYgKHRoaXMud29ybGQgJiYgIXRoaXMud29ybGQuaXRlbVBhbGV0dGUudHJhaXRzLmhhcyh0cmFpdC5pZGVudGlmaWVyKSlcbiAgICAgIHRoaXMud29ybGQubG9nZ2VyLndhcm4oXG4gICAgICAgIGBUcmFpdCBcIsKnYyR7dHJhaXQuaWRlbnRpZmllcn3Cp3JcIiB3YXMgYWRkZWQgdG8gaXRlbXN0YWNrIFwiwqdkJHt0aGlzLnR5cGUuaWRlbnRpZmllcn3Cp3JcIiBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGUuIFRoaXMgbWF5IHJlc3VsdCBpbiBhIGRlc2VyaWxpemF0aW9uIGVycm9yLmBcbiAgICAgICk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGFkZCB0aGUgdHJhaXQgdG8gdGhlIGl0ZW1zdGFja1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaXMgYW4gaW5zdGFuY2Ugb2YgSXRlbVRyYWl0XG4gICAgICBpZiAodHJhaXQgaW5zdGFuY2VvZiBJdGVtVHJhaXQpIHtcbiAgICAgICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgaXRlbXN0YWNrXG4gICAgICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCB0cmFpdCk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgb25BZGQgdHJhaXQgZXZlbnRcbiAgICAgICAgdHJhaXQub25BZGQ/LigpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICAgICAgcmV0dXJuIHRyYWl0IGFzIEluc3RhbmNlVHlwZTxLPjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhaXRcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgdHJhaXQodGhpcyk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgaXRlbXN0YWNrXG4gICAgICAgIHRoaXMudHJhaXRzLnNldChpbnN0YW5jZS5pZGVudGlmaWVyLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgb25BZGQgdHJhaXQgZXZlbnRcbiAgICAgICAgaW5zdGFuY2Uub25BZGQ/LigpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlIGFzIEluc3RhbmNlVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgIHRoaXMud29ybGQubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGFkZCB0cmFpdCBcIiR7dHJhaXQuaWRlbnRpZmllcn1cIiB0byBpdGVtc3RhY2sgXCIke3RoaXMudHlwZS5pZGVudGlmaWVyfVwiYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gbnVsbCBhcyB0aGUgdHJhaXQgd2FzIG5vdCBhZGRlZFxuICAgICAgcmV0dXJuIG51bGwgYXMgSW5zdGFuY2VUeXBlPEs+O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlcXVhbHMob3RoZXI6IEl0ZW1TdGFjayk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBpZGVudGlmaWVycyAmIGF1eCBhcmUgZXF1YWwuXG4gICAgaWYgKHRoaXMudHlwZS5pZGVudGlmaWVyICE9PSBvdGhlci50eXBlLmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5hdXhpbGxhcnkgIT09IG90aGVyLmF1eGlsbGFyeSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNvbXBvbmVudHMuc2l6ZSAhPT0gb3RoZXIuY29tcG9uZW50cy5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMudHJhaXRzLnNpemUgIT09IG90aGVyLnRyYWl0cy5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMubmJ0LnNpemUgIT09IG90aGVyLm5idC5zaXplKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBTdHJpbmdpZnkgdGhlIGNvbXBvbmVudHMuXG4gICAgY29uc3QgY29tcG9uZW50cyA9IEpTT04uc3RyaW5naWZ5KFsuLi50aGlzLmNvbXBvbmVudHMuZW50cmllcygpXSk7XG4gICAgY29uc3Qgb3RoZXJDb21wb25lbnRzID0gSlNPTi5zdHJpbmdpZnkoWy4uLm90aGVyLmNvbXBvbmVudHMuZW50cmllcygpXSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29tcG9uZW50cyBhcmUgZXF1YWwuXG4gICAgaWYgKGNvbXBvbmVudHMgIT09IG90aGVyQ29tcG9uZW50cykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0cmFpdHMuXG4gICAgZm9yIChjb25zdCBbaWRlbnRpZmllciwgdHJhaXRdIG9mIHRoaXMudHJhaXRzKSB7XG4gICAgICAvLyBHZXQgdGhlIG90aGVyIHRyYWl0LlxuICAgICAgY29uc3Qgb3RoZXJUcmFpdCA9IG90aGVyLnRyYWl0cy5nZXQoaWRlbnRpZmllcikgYXMgSXRlbVRyYWl0PFQ+O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgb3RoZXIgdHJhaXQgZXhpc3RzLlxuICAgICAgaWYgKCFvdGhlclRyYWl0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdHMgYXJlIGVxdWFsLlxuICAgICAgaWYgKCF0cmFpdC5lcXVhbHMob3RoZXJUcmFpdCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIG5idC5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm5idCkge1xuICAgICAgLy8gR2V0IHRoZSBvdGhlciB2YWx1ZS5cbiAgICAgIGNvbnN0IG90aGVyVmFsdWUgPSBvdGhlci5uYnQuZ2V0KGtleSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBvdGhlciB2YWx1ZSBleGlzdHMuXG4gICAgICBpZiAoIW90aGVyVmFsdWUpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gR2V0IHRoZSBzbmJ0IHZhbHVlcyBvZiB0aGUgbmJ0LlxuICAgICAgY29uc3Qgc25idCA9IHZhbHVlLnZhbHVlT2YodHJ1ZSkgYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgb3RoZXJTbmJ0ID0gb3RoZXJWYWx1ZS52YWx1ZU9mKHRydWUpIGFzIHN0cmluZztcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5idCB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgaWYgKHNuYnQgIT09IG90aGVyU25idCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBpdGVtIHN0YWNrcyBhcmUgZXF1YWwuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGF0YSBlbnRyeSBmb3IgdGhlIGl0ZW0gc3RhY2suXG4gICAqIEByZXR1cm5zIFRoZSBkYXRhIGVudHJ5IGZvciB0aGUgaXRlbSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBnZXREYXRhRW50cnkoKTogSXRlbVN0YWNrRW50cnkge1xuICAgIC8vIENyZWF0ZSB0aGUgaXRlbSBzdGFjayBlbnRyeS5cbiAgICBjb25zdCBlbnRyeTogSXRlbVN0YWNrRW50cnkgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLnR5cGUuaWRlbnRpZmllcixcbiAgICAgIGFtb3VudDogdGhpcy5hbW91bnQsXG4gICAgICBhdXhpbGxhcnk6IHRoaXMuYXV4aWxsYXJ5LFxuICAgICAgY29tcG9uZW50czogWy4uLnRoaXMuY29tcG9uZW50cy5lbnRyaWVzKCldLFxuICAgICAgdHJhaXRzOiBbLi4udGhpcy50cmFpdHMua2V5cygpXSxcbiAgICAgIG5idDogdGhpcy5uYnQuc2VyaWFsaXplKCkudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICB9O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpdGVtIHN0YWNrIGVudHJ5LlxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgZGF0YSBlbnRyeSBmb3IgdGhlIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgdG8gbG9hZCB0aGUgaXRlbSBzdGFjayBpbi5cbiAgICogQHBhcmFtIGVudHJ5IFRoZSBpdGVtIHN0YWNrIGVudHJ5IHRvIGxvYWQuXG4gICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgbG9hZERhdGFFbnRyeShcbiAgICB3b3JsZDogV29ybGQsXG4gICAgZW50cnk6IEl0ZW1TdGFja0VudHJ5LFxuICAgIG92ZXJ3cml0ZSA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgaWRlbnRpZmllcnMgbWF0Y2guXG4gICAgaWYgKGVudHJ5LmlkZW50aWZpZXIgIT09IHRoaXMudHlwZS5pZGVudGlmaWVyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGl0ZW1zdGFjayBlbnRyeSBhcyB0aGUgdHlwZSBpZGVudGlmaWVyIGRvZXMgbm90IG1hdGNoIVwiXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudHJ5IHNob3VsZCBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGRhdGEuXG4gICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYW5kIHRyYWl0cy5cbiAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgICAgdGhpcy50cmFpdHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGl0ZW0gc3RhY2sgcHJvcGVydGllcy5cbiAgICB0aGlzLmFtb3VudCA9IGVudHJ5LmFtb3VudDtcbiAgICB0aGlzLmF1eGlsbGFyeSA9IGVudHJ5LmF1eGlsbGFyeTtcblxuICAgIC8vIEFkZCB0aGUgY29tcG9uZW50cyB0byB0aGUgc3RhY2ssIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeS5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50cy5oYXMoa2V5KSkgdGhpcy5jb21wb25lbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHRyYWl0cyB0byB0aGUgaXRlbXN0YWNrLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBlbnRyeS50cmFpdHMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWxldHRlIGhhcyB0aGUgdHJhaXRcbiAgICAgIGNvbnN0IHRyYWl0VHlwZSA9IHdvcmxkLml0ZW1QYWxldHRlLnRyYWl0cy5nZXQodHJhaXQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzIGluIHRoZSBwYWxldHRlXG4gICAgICBpZiAoIXRyYWl0VHlwZSkge1xuICAgICAgICB3b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHRyYWl0IFwiJHt0cmFpdH1cIiBmb3IgaXRlbXN0YWNrIFwiJHt0aGlzLnR5cGUuaWRlbnRpZmllcn1cIiBhcyBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZWBcbiAgICAgICAgKTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBhZGQgdGhlIHRyYWl0IHRvIHRoZSBpdGVtc3RhY2tcbiAgICAgIHRoaXMuYWRkVHJhaXQodHJhaXRUeXBlKTtcbiAgICB9XG5cbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgbmJ0IGRhdGEuXG4gICAgdGhpcy5uYnQuZGVzZXJpYWxpemUoQnVmZmVyLmZyb20oZW50cnkubmJ0LCBcImJhc2U2NFwiKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGl0ZW0gc3RhY2sgdG8gYSBuZXR3b3JrIGl0ZW0gaW5zdGFuY2UgZGVzY3JpcHRvci5cbiAgICogV2hpY2ggaXMgdXNlZCBvbiB0aGUgcHJvdG9jb2wgbGV2ZWwuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHN0YWNrIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIFRoZSBuZXR3b3JrIGl0ZW0gaW5zdGFuY2UgZGVzY3JpcHRvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdG9OZXR3b3JrSW5zdGFuY2UoXG4gICAgaXRlbTogSXRlbVN0YWNrXG4gICk6IE5ldHdvcmtJdGVtSW5zdGFuY2VEZXNjcmlwdG9yIHtcbiAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9jay5cbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGl0ZW0udHlwZS5ibG9jaz8ucGVybXV0YXRpb25zW2l0ZW0uYXV4aWxsYXJ5XTtcblxuICAgIC8vIFJldHVybiB0aGUgaXRlbSBpbnN0YW5jZSBkZXNjcmlwdG9yLlxuICAgIHJldHVybiB7XG4gICAgICBuZXR3b3JrOiBpdGVtLnR5cGUubmV0d29yayxcbiAgICAgIHN0YWNrU2l6ZTogaXRlbS5hbW91bnQsXG4gICAgICBtZXRhZGF0YTogaXRlbS5hdXhpbGxhcnksXG4gICAgICBuZXR3b3JrQmxvY2tJZDogcGVybXV0YXRpb24/Lm5ldHdvcmsgPz8gMCxcbiAgICAgIGV4dHJhczoge1xuICAgICAgICBuYnQ6IGl0ZW0ubmJ0LnRvQ29tcG91bmQoKSxcbiAgICAgICAgY2FuRGVzdHJveTogW10sXG4gICAgICAgIGNhblBsYWNlT246IFtdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgaXRlbSBzdGFjayB0byBhIG5ldHdvcmsgaXRlbSBzdGFjayBkZXNjcmlwdG9yLlxuICAgKiBXaGljaCBpcyB1c2VkIG9uIHRoZSBwcm90b2NvbCBsZXZlbC5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gc3RhY2sgdG8gY29udmVydC5cbiAgICogQHJldHVybnMgVGhlIG5ldHdvcmsgaXRlbSBzdGFjayBkZXNjcmlwdG9yLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0b05ldHdvcmtTdGFjayhpdGVtOiBJdGVtU3RhY2spOiBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciB7XG4gICAgLy8gR2V0IG5ldHdvcmsgaXRlbSBpbnN0YW5jZSBkZXNjcmlwdG9yLlxuICAgIGNvbnN0IGluc3RhbmNlID0gSXRlbVN0YWNrLnRvTmV0d29ya0luc3RhbmNlKGl0ZW0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpdGVtIHN0YWNrIGRlc2NyaXB0b3IuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmluc3RhbmNlLFxuICAgICAgc3RhY2tOZXRJZDogbnVsbCAvLyBUT0RPOiBJbXBsZW1lbnQgc3RhY2tOZXRJZCwgdGhpcyBpcyBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuIHRyYWNrIHRoZSBpdGVtIHN0YWNrLlxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBuZXR3b3JrIGl0ZW0gaW5zdGFuY2UgZGVzY3JpcHRvciB0byBhbiBpdGVtIHN0YWNrLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgbmV0d29yayBpdGVtIGluc3RhbmNlIGRlc2NyaXB0b3IuXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tTmV0d29ya0luc3RhbmNlKFxuICAgIGRlc2NyaXB0b3I6IE5ldHdvcmtJdGVtSW5zdGFuY2VEZXNjcmlwdG9yXG4gICk6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIC8vIEdldCB0aGUgaXRlbSB0eXBlIGZyb20gdGhlIG5ldHdvcmsuXG4gICAgY29uc3QgdHlwZSA9IEl0ZW1UeXBlLmdldEJ5TmV0d29yayhkZXNjcmlwdG9yLm5ldHdvcmspO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gdHlwZSB3YXMgZm91bmQuXG4gICAgaWYgKCF0eXBlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENyZWF0ZSB0aGUgaXRlbSBzdGFjay5cbiAgICBjb25zdCBpdGVtID0gbmV3IHRoaXModHlwZS5pZGVudGlmaWVyLCB7XG4gICAgICBhbW91bnQ6IGRlc2NyaXB0b3Iuc3RhY2tTaXplID8/IDEsXG4gICAgICBhdXhpbGxhcnk6IGRlc2NyaXB0b3IubWV0YWRhdGEgPz8gMFxuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpdGVtIHN0YWNrLlxuICAgIHJldHVybiBpdGVtO1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1TdGFjaywgRGVmYXVsdEl0ZW1TdGFja1Byb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQge1xuICBFcXVpcG1lbnRTbG90LFxuICBMZXZlbFNvdW5kRXZlbnQsXG4gIExldmVsU291bmRFdmVudFBhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIsIEl0ZW1Vc2VNZXRob2QgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIEVudGl0eUVxdWlwbWVudFRyYWl0LFxuICBFbnRpdHlJbnZlbnRvcnlUcmFpdCxcbiAgUGxheWVyXG59IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IEl0ZW1Vc2VPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEl0ZW1UcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEl0ZW1FcXVpcHBhYmxlVHJhaXQ8VCBleHRlbmRzIEl0ZW1JZGVudGlmaWVyPiBleHRlbmRzIEl0ZW1UcmFpdDxUPiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZXF1aXBwYWJsZVwiO1xuICBwdWJsaWMgc2xvdD86IEVxdWlwbWVudFNsb3QgPSBFcXVpcG1lbnRTbG90LkNoZXN0O1xuICBwdWJsaWMgc3RhdGljIHR5cGVzOiBBcnJheTxJdGVtSWRlbnRpZmllcj4gPSBbXG4gICAgSXRlbUlkZW50aWZpZXIuRGlhbW9uZENoZXN0cGxhdGVcbiAgXTtcblxuICBwdWJsaWMgb25Vc2UoXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgb3B0aW9uczogUGFydGlhbDxJdGVtVXNlT3B0aW9ucz5cbiAgKTogYm9vbGVhbiB8IHZvaWQge1xuICAgIGlmIChvcHRpb25zLm1ldGhvZCAhPSBJdGVtVXNlTWV0aG9kLkNsaWNrIHx8IHRoaXMuc2xvdCA9PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGxheWVyRXF1aXBtZW50ID0gcGxheWVyLmdldFRyYWl0KEVudGl0eUVxdWlwbWVudFRyYWl0KTtcblxuICAgIGlmICghcGxheWVyRXF1aXBtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGxheWVySW52ZW50b3J5ID0gcGxheWVyLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcbiAgICBjb25zdCBzb3VuZFBhY2tldCA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICBzb3VuZFBhY2tldC5ldmVudCA9IExldmVsU291bmRFdmVudC5FcXVpcEdlbmVyaWM7XG4gICAgc291bmRQYWNrZXQucG9zaXRpb24gPSBwbGF5ZXIucG9zaXRpb247XG4gICAgc291bmRQYWNrZXQuYWN0b3JJZGVudGlmaWVyID0gcGxheWVyLnR5cGUuaWRlbnRpZmllcjtcbiAgICBzb3VuZFBhY2tldC5kYXRhID0gLTE7XG4gICAgc291bmRQYWNrZXQuaXNCYWJ5TW9iID0gZmFsc2U7XG4gICAgc291bmRQYWNrZXQuaXNHbG9iYWwgPSBmYWxzZTtcblxuICAgIHBsYXllci5zZW5kKHNvdW5kUGFja2V0KTtcblxuICAgIHBsYXllckludmVudG9yeS5jb250YWluZXIuc3dhcEl0ZW1zKFxuICAgICAgcGxheWVySW52ZW50b3J5LnNlbGVjdGVkU2xvdCxcbiAgICAgIHRoaXMuc2xvdCxcbiAgICAgIHBsYXllckVxdWlwbWVudC5jb250YWluZXJcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1FcXVpcHBhYmxlVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZywgTGlzdFRhZywgU2hvcnRUYWcsIFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcbmltcG9ydCB7IEVuY2hhbnRtZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEl0ZW1JZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEl0ZW1UcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmludGVyZmFjZSBFbmNoYW50bWVudFZhbHVlIHtcbiAgaWQ6IFNob3J0VGFnO1xuICBsdmw6IFNob3J0VGFnO1xufVxuXG5jbGFzcyBJdGVtRW5jaGFudGFibGVUcmFpdDxUIGV4dGVuZHMgSXRlbUlkZW50aWZpZXI+IGV4dGVuZHMgSXRlbVRyYWl0PFQ+IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJlbmNoYW50YWJsZVwiO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlbmNoYW50bWVudHMgb24gdGhlIGl0ZW0gc3RhY2suXG4gICAqIEByZXR1cm5zIFRoZSBtYXAgb2YgZW5jaGFudG1lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldEVuY2hhbnRtZW50cygpOiBNYXA8RW5jaGFudG1lbnQsIG51bWJlcj4ge1xuICAgIC8vIEdldCB0aGUgZW5jaGFudG1lbnQgbGlzdCB0YWcgZnJvbSB0aGUgaXRlbSBzdGFjaydzIE5CVFxuICAgIGNvbnN0IGVuY2ggPVxuICAgICAgdGhpcy5pdGVtLm5idC5nZXQ8TGlzdFRhZzxDb21wb3VuZFRhZzxFbmNoYW50bWVudFZhbHVlPj4+KFwiZW5jaFwiKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBtYXAgdG8gc3RvcmUgdGhlIGVuY2hhbnRtZW50c1xuICAgIGNvbnN0IGVuY2hhbnRtZW50cyA9IG5ldyBNYXA8RW5jaGFudG1lbnQsIG51bWJlcj4oKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZyBleGlzdHNcbiAgICBpZiAoZW5jaClcbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGVuY2hhbnRtZW50IGluIHRoZSBsaXN0IHRhZ1xuICAgICAgZm9yIChjb25zdCB7IHZhbHVlIH0gb2YgZW5jaC52YWx1ZSlcbiAgICAgICAgZW5jaGFudG1lbnRzLnNldCh2YWx1ZS5pZC52YWx1ZSwgdmFsdWUubHZsLnZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgbWFwIG9mIGVuY2hhbnRtZW50c1xuICAgIHJldHVybiBlbmNoYW50bWVudHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBlbmNoYW50bWVudCBsZXZlbCBmcm9tIHRoZSBpdGVtIHN0YWNrLlxuICAgKiBAcGFyYW0gaWQgVGhlIGVuY2hhbnRtZW50IGlkLlxuICAgKiBAcmV0dXJucyBUaGUgZW5jaGFudG1lbnQgbGV2ZWwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2UsIG51bGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0RW5jaGFudG1lbnQoaWQ6IEVuY2hhbnRtZW50KTogbnVtYmVyIHwgbnVsbCB7XG4gICAgLy8gR2V0IHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZyBmcm9tIHRoZSBpdGVtIHN0YWNrJ3MgTkJUXG4gICAgY29uc3QgZW5jaGFudG1lbnRzID0gdGhpcy5nZXRFbmNoYW50bWVudHMoKTtcblxuICAgIC8vIFJldHVybiB0aGUgZW5jaGFudG1lbnQgbGV2ZWwgaWYgdGhlIGVuY2hhbnRtZW50IGV4aXN0c1xuICAgIHJldHVybiBlbmNoYW50bWVudHMuZ2V0KGlkKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaXRlbSBzdGFjayBoYXMgYW4gZW5jaGFudG1lbnQuXG4gICAqIEBwYXJhbSBpZCBUaGUgZW5jaGFudG1lbnQgaWQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGl0ZW0gc3RhY2sgaGFzIHRoZSBlbmNoYW50bWVudC5cbiAgICovXG4gIHB1YmxpYyBoYXNFbmNoYW50bWVudChpZDogRW5jaGFudG1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFbmNoYW50bWVudChpZCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbmNoYW50bWVudCB0byB0aGUgaXRlbSBzdGFjay5cbiAgICogQHBhcmFtIGlkIFRoZSBlbmNoYW50bWVudCBpZC5cbiAgICogQHBhcmFtIGxldmVsIFRoZSBlbmNoYW50bWVudCBsZXZlbC5cbiAgICovXG4gIHB1YmxpYyBhZGRFbmNoYW50bWVudChpZDogRW5jaGFudG1lbnQsIGxldmVsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnIGZyb20gdGhlIGl0ZW0gc3RhY2sncyBOQlRcbiAgICBjb25zdCBlbmNoID1cbiAgICAgIHRoaXMuaXRlbS5uYnQuZ2V0PExpc3RUYWc8Q29tcG91bmRUYWc8RW5jaGFudG1lbnRWYWx1ZT4+PihcImVuY2hcIik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW5jaGFudG1lbnQgbGlzdCB0YWcgZXhpc3RzXG4gICAgaWYgKGVuY2gpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbmNoYW50bWVudCB2YWx1ZVxuICAgICAgY29uc3QgdmFsdWUgPSBuZXcgQ29tcG91bmRUYWc8RW5jaGFudG1lbnRWYWx1ZT4oKTtcblxuICAgICAgLy8gU2V0IHRoZSBlbmNoYW50bWVudCB2YWx1ZSdzIGlkIGFuZCBsZXZlbFxuICAgICAgdmFsdWUuY3JlYXRlU2hvcnRUYWcoXCJpZFwiLCBpZCk7XG4gICAgICB2YWx1ZS5jcmVhdGVTaG9ydFRhZyhcImx2bFwiLCBsZXZlbCk7XG5cbiAgICAgIC8vIEFkZCB0aGUgZW5jaGFudG1lbnQgdmFsdWUgdG8gdGhlIGxpc3QgdGFnXG4gICAgICBlbmNoLnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbmJ0J3MgZW5jaGFudG1lbnQgbGlzdCB0YWdcbiAgICB0aGlzLml0ZW0ubmJ0LnNldChcImVuY2hcIiwgZW5jaCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZW5jaGFudG1lbnQgbGlzdCB0YWcgZnJvbSB0aGUgaXRlbSBzdGFjaydzIE5CVC5cbiAgICogQHJldHVybnMgVGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnLlxuICAgKi9cbiAgcHVibGljIGdldE5idCgpOiBMaXN0VGFnPENvbXBvdW5kVGFnPEVuY2hhbnRtZW50VmFsdWU+PiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5uYnQuZ2V0PExpc3RUYWc8Q29tcG91bmRUYWc8RW5jaGFudG1lbnRWYWx1ZT4+PihcImVuY2hcIik7XG4gIH1cblxuICBwdWJsaWMgb25BZGQoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaGFzIHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZ1xuICAgIGlmICghdGhpcy5pdGVtLm5idC5oYXMoXCJlbmNoXCIpKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnXG4gICAgICBjb25zdCBlbmNoID0gbmV3IExpc3RUYWcoXCJlbmNoXCIsIFtdLCBUYWcuQ29tcG91bmQpO1xuXG4gICAgICAvLyBBZGQgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnIHRvIHRoZSBpdGVtIHN0YWNrJ3MgTkJUXG4gICAgICB0aGlzLml0ZW0ubmJ0LmFkZChlbmNoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdmUoKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZyBmcm9tIHRoZSBpdGVtIHN0YWNrJ3MgTkJUXG4gICAgdGhpcy5pdGVtLm5idC5kZWxldGUoXCJlbmNoXCIpO1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1FbmNoYW50YWJsZVRyYWl0IH07XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhbGV0dGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyYWl0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RhY2tcIjtcblxuaW1wb3J0ICogYXMgVHJhaXRzIGZyb20gXCIuL3RyYWl0c1wiO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBhbGwgaXRlbSBzdGFjayB0cmFpdHNcbiAqL1xuY29uc3QgSXRlbVRyYWl0cyA9IEFycmF5PHR5cGVvZiBUcmFpdHMuSXRlbVRyYWl0PigpO1xuXG4vLyBJdGVyYXRlIG92ZXIgZWFjaCB0cmFpdFxuZm9yIChjb25zdCBrZXkgaW4gVHJhaXRzKSB7XG4gIC8vIEdldCB0aGUgaXRlbSB0cmFpdFxuICBjb25zdCB0cmFpdCA9IFRyYWl0c1trZXkgYXMga2V5b2YgdHlwZW9mIFRyYWl0c107XG5cbiAgLy8gUHVzaCB0aGUgaXRlbSB0cmFpdCB0byB0aGUgbGlzdFxuICBJdGVtVHJhaXRzLnB1c2godHJhaXQpO1xufVxuXG5leHBvcnQgeyBJdGVtVHJhaXRzIH07XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vdHJhaXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F0dHJpYnV0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxheWVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ncmF2aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2xsaXNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Fpci1zdXBwbHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25hbWV0YWdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludmVudG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaXRlbS1zdGFja1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGh5c2ljc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZWZmZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmlzaWJpbGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXF1aXBtZW50XCI7XG4iLCAiaW1wb3J0IHsgVHJhaXQgfSBmcm9tIFwiLi4vLi4vdHJhaXRcIjtcbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIsIEVudGl0eUludGVyYWN0TWV0aG9kIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vcGxheWVyXCI7XG5pbXBvcnQgeyBDb21tYW5kRXhlY3V0aW9uU3RhdGUgfSBmcm9tIFwiLi4vLi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9jb250YWluZXJcIjtcblxuY2xhc3MgRW50aXR5VHJhaXQgZXh0ZW5kcyBUcmFpdCB7XG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHR5cGUgaWRlbnRpZmllcnMgdGhhdCB0aGlzIHRyYWl0IGlzIGNvbXBhdGlibGUgd2l0aCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlczogQXJyYXk8RW50aXR5SWRlbnRpZmllcj4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRoYXQgdGhpcyB0cmFpdCB3aWxsIGJlIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAgIC8vIEFkZCB0aGUgdHJhaXQgdG8gdGhlIGVudGl0eS5cbiAgICBlbnRpdHkuYWRkVHJhaXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHRoZW4gdGhlIGVudGl0eSB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgdG8gaXMgc3Bhd25lZCBpbnRvIGEgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIG9uU3Bhd24/KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbnRpdHkgdGhhdCB0aGlzIHRyYWl0IGlzIGF0dGFjaGVkIHRvIGlzIGRlc3Bhd25lZCBmcm9tIGEgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIG9uRGVzcGF3bj8oKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVudGl0eSB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgdG8gaXMgaW50ZXJhY3RlZCB3aXRoIGJ5IGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnRlcmFjdGVkIHdpdGggdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRoYXQgdGhlIHBsYXllciB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBvbkludGVyYWN0PyhwbGF5ZXI6IFBsYXllciwgbWV0aG9kOiBFbnRpdHlJbnRlcmFjdE1ldGhvZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbnRpdHkgdGhhdCB0aGlzIHRyYWl0IGlzIGF0dGFjaGVkIGV4ZWN1dGVzIGEgY29tbWFuZC5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBjb21tYW5kIGV4ZWN1dGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bDsgZGVmYXVsdCBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIG9uQ29tbWFuZD8oc3RhdGU6IENvbW1hbmRFeGVjdXRpb25TdGF0ZSk6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRhaW5lciB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgb25Db250YWluZXJVcGRhdGU/KGNvbnRhaW5lcjogQ29udGFpbmVyKTogdm9pZDtcblxuICAvKipcbiAgICogQ2xvbmVzIHRoZSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0byBjbG9uZSB0aGUgdHJhaXQgdG8uXG4gICAqIEByZXR1cm5zIEEgbmV3IGVudGl0eSB0cmFpdC5cbiAgICovXG4gIHB1YmxpYyBjbG9uZShlbnRpdHk6IEVudGl0eSk6IHRoaXMge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhaXQuXG4gICAgY29uc3QgdHJhaXQgPSBuZXcgKHRoaXMuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIGVudGl0eTogRW50aXR5LFxuICAgICAgaWRlbnRpZmllcjogc3RyaW5nXG4gICAgKSA9PiBFbnRpdHlUcmFpdCkoZW50aXR5LCB0aGlzLmlkZW50aWZpZXIpIGFzIHRoaXM7XG5cbiAgICAvLyBDb3B5IHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcykpIHtcbiAgICAgIC8vIFNraXAgdGhlIGVudGl0eS5cbiAgICAgIGlmIChrZXkgPT09IFwiZW50aXR5XCIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICB0cmFpdFtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSB0cmFpdC5cbiAgICByZXR1cm4gdHJhaXQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5VHJhaXQgfTtcbiIsICJpbXBvcnQgeyBBdHRyaWJ1dGUsIEF0dHJpYnV0ZU5hbWUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi4vdHJhaXRcIjtcbmltcG9ydCB7IEpTT05MaWtlT2JqZWN0IH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5cbmludGVyZmFjZSBBdHRyaWJ1dGVQcm9wZXJ0aWVzIGV4dGVuZHMgSlNPTkxpa2VPYmplY3Qge1xuICBhdHRyaWJ1dGU6IEF0dHJpYnV0ZU5hbWU7XG4gIGN1cnJlbnQ6IG51bWJlcjtcbiAgZWZmZWN0aXZlTWluOiBudW1iZXI7XG4gIGVmZmVjdGl2ZU1heDogbnVtYmVyO1xuICBkZWZhdWx0VmFsdWU6IG51bWJlcjtcbn1cblxuY2xhc3MgRW50aXR5QXR0cmlidXRlVHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpdFxuICAgKi9cbiAgcHVibGljIGF0dHJpYnV0ZSE6IEF0dHJpYnV0ZU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBlZmZlY3RpdmVNaW46IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBlZmZlY3RpdmVNYXg6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldCgpPy5jdXJyZW50ID8/IHRoaXMuZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHVibGljIHNldCBjdXJyZW50VmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgZW5hYmxlZCBvciBub3RcbiAgICovXG4gIHB1YmxpYyBnZXQoKTogQXR0cmlidXRlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBHZXQgdGhlIGNvbXBvbmVudCB2YWx1ZSBmcm9tIHRoZSBlbnRpdHlcbiAgICByZXR1cm4gdGhpcy5lbnRpdHkuYXR0cmlidXRlcy5nZXQodGhpcy5hdHRyaWJ1dGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlYXNlcyB0aGUgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdG8gaW5jcmVhc2UgdGhlIGF0dHJpYnV0ZSBjdXJyZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGluY3JlYXNlKGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXQodGhpcy5jdXJyZW50VmFsdWUgKyBhbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY3JlYXNlcyB0aGUgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdG8gZGVjcmVhc2UgdGhlIGF0dHJpYnV0ZSBjdXJyZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGRlY3JlYXNlKGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXQodGhpcy5jdXJyZW50VmFsdWUgLSBhbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gICAqIEBwYXJhbSB2YWx1ZSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgZW5hYmxlZCBvciBub3RcbiAgICogQHBhcmFtIHVwZGF0ZSBXaGV0aGVyIHRvIHVwZGF0ZSB0aGUgZW50aXR5J3MgYWN0b3IgZGF0YTsgZGVmYXVsdCBpcyB0cnVlXG4gICAqL1xuICBwdWJsaWMgc2V0KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgYXR0cmlidXRlIHByb3BlcnRpZXMgb2JqZWN0XG4gICAgY29uc3QgcHJvcGVydGllczogQXR0cmlidXRlUHJvcGVydGllcyA9IHtcbiAgICAgIGF0dHJpYnV0ZTogdGhpcy5hdHRyaWJ1dGUsXG4gICAgICBjdXJyZW50OiB2YWx1ZSxcbiAgICAgIGVmZmVjdGl2ZU1pbjogdGhpcy5lZmZlY3RpdmVNaW4sXG4gICAgICBlZmZlY3RpdmVNYXg6IHRoaXMuZWZmZWN0aXZlTWF4LFxuICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmRlZmF1bHRWYWx1ZVxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgYXR0cmlidXRlIG9iamVjdFxuICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoXG4gICAgICB0aGlzLmVmZmVjdGl2ZU1pbixcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWF4LFxuICAgICAgdmFsdWUsXG4gICAgICAtSW5maW5pdHksXG4gICAgICBJbmZpbml0eSxcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlLFxuICAgICAgdGhpcy5hdHRyaWJ1dGUsXG4gICAgICBbXVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbXBvbmVudCB2YWx1ZVxuICAgIHRoaXMuZW50aXR5LmNvbXBvbmVudHMuc2V0KHRoaXMuaWRlbnRpZmllciwgcHJvcGVydGllcyk7XG4gICAgdGhpcy5lbnRpdHkuYXR0cmlidXRlcy5zZXQodGhpcy5hdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyB0aGUgY29tcG9uZW50XG4gICAgaWYgKHRoaXMuZW50aXR5LmNvbXBvbmVudHMuaGFzKHRoaXMuaWRlbnRpZmllcikpIHtcbiAgICAgIC8vIEdldCB0aGUgY29tcG9uZW50IHZhbHVlIGZyb20gdGhlIGVudGl0eVxuICAgICAgY29uc3QgZW5hYmxlZCA9IHRoaXMuZW50aXR5LmNvbXBvbmVudHMuZ2V0KFxuICAgICAgICB0aGlzLmlkZW50aWZpZXJcbiAgICAgICkgYXMgQXR0cmlidXRlUHJvcGVydGllcztcblxuICAgICAgLy8gU2V0IHRoZSBlbnRpdHkgZmxhZ1xuICAgICAgdGhpcy5zZXQoZW5hYmxlZC5jdXJyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2V0IHRoZSBjb21wb25lbnQgdmFsdWUgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgIHRoaXMuc2V0KHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5QXR0cmlidXRlVHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBBdHRyaWJ1dGVOYW1lLFxuICBNb3ZlQWN0b3JEZWx0YVBhY2tldCxcbiAgTW92ZURlbHRhRmxhZ3Ncbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRW50aXR5QXR0cmlidXRlVHJhaXQgfSBmcm9tIFwiLi9hdHRyaWJ1dGVcIjtcblxuY2xhc3MgRW50aXR5TW92ZW1lbnRUcmFpdCBleHRlbmRzIEVudGl0eUF0dHJpYnV0ZVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJtb3ZlbWVudFwiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYXR0cmlidXRlID0gQXR0cmlidXRlTmFtZS5Nb3ZlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdGl2ZU1pbiA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBlZmZlY3RpdmVNYXggPSAzLjQwMl84MjNfNDY2ZSszODtcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZSA9IDAuMTtcblxuICBwdWJsaWMgb25UaWNrKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgbW92aW5nXG4gICAgaWYgKCF0aGlzLmVudGl0eS5pc01vdmluZykgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IE1vdmVBY3RvckRlbHRhUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IE1vdmVBY3RvckRlbHRhUGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHBhY2tldCBwcm9wZXJ0aWVzXG4gICAgcGFja2V0LnJ1bnRpbWVJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQuZmxhZ3MgPSBNb3ZlRGVsdGFGbGFncy5BbGw7XG4gICAgcGFja2V0LnggPSB0aGlzLmVudGl0eS5wb3NpdGlvbi54O1xuICAgIHBhY2tldC55ID0gdGhpcy5lbnRpdHkucG9zaXRpb24ueTtcbiAgICBwYWNrZXQueiA9IHRoaXMuZW50aXR5LnBvc2l0aW9uLno7XG4gICAgcGFja2V0LnlhdyA9IHRoaXMuZW50aXR5LnJvdGF0aW9uLnlhdztcbiAgICBwYWNrZXQuaGVhZFlhdyA9IHRoaXMuZW50aXR5LnJvdGF0aW9uLmhlYWRZYXc7XG4gICAgcGFja2V0LnBpdGNoID0gdGhpcy5lbnRpdHkucm90YXRpb24ucGl0Y2g7XG5cbiAgICAvLyBBZGp1c3QgdGhlIHkgcG9zaXRpb24gb2YgdGhlIGVudGl0eVxuICAgIGlmICghdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSAmJiAhdGhpcy5lbnRpdHkuaXNJdGVtKCkpIHBhY2tldC55IC09IDAuMjU7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIG9uIHRoZSBncm91bmRcbiAgICBpZiAodGhpcy5lbnRpdHkub25Hcm91bmQpIHBhY2tldC5mbGFncyB8PSBNb3ZlRGVsdGFGbGFncy5Pbkdyb3VuZDtcblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIGFsbCBwbGF5ZXJzXG4gICAgaWYgKHRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBtb3ZpbmcgZW50aXR5IGlzIGEgcGxheWVyXG4gICAgICAvLyBJZiBzbywgYnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gYWxsIHBsYXllcnMgZXhjZXB0IHRoZSBtb3ZpbmcgZW50aXR5XG4gICAgICB0aGlzLmVudGl0eS5kaW1lbnNpb24uYnJvYWRjYXN0RXhjZXB0KHRoaXMuZW50aXR5LCBwYWNrZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVudGl0eS5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eU1vdmVtZW50VHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBBYmlsaXR5SW5kZXgsXG4gIEFjdG9yRGFtYWdlQ2F1c2UsXG4gIEFjdG9yRXZlbnRJZHMsXG4gIEFjdG9yRXZlbnRQYWNrZXQsXG4gIEF0dHJpYnV0ZU5hbWUsXG4gIEdhbWVtb2RlLFxuICBWZWN0b3IzZlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciwgRW50aXR5SW50ZXJhY3RNZXRob2QgfSBmcm9tIFwiLi4vLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9wbGF5ZXJcIjtcbmltcG9ydCB7IEVudGl0eUhlYWx0aENoYW5nZWRTaWduYWwsIEVudGl0eUh1cnRTaWduYWwgfSBmcm9tIFwiLi4vLi4vLi4vZXZlbnRzXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEVudGl0eUF0dHJpYnV0ZVRyYWl0IH0gZnJvbSBcIi4vYXR0cmlidXRlXCI7XG5cbmNsYXNzIEVudGl0eUhlYWx0aFRyYWl0IGV4dGVuZHMgRW50aXR5QXR0cmlidXRlVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImhlYWx0aFwiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYXR0cmlidXRlID0gQXR0cmlidXRlTmFtZS5IZWFsdGg7XG4gIHB1YmxpYyByZWFkb25seSBlZmZlY3RpdmVNaW4gPSAwO1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0aXZlTWF4ID0gMjA7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWUgPSAyMDtcblxuICBwdWJsaWMgYXBwbHlEYW1hZ2UoXG4gICAgYW1vdW50OiBudW1iZXIsXG4gICAgZGFtYWdlcj86IEVudGl0eSxcbiAgICBjYXVzZT86IEFjdG9yRGFtYWdlQ2F1c2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eUh1cnRTaWduYWwoXG4gICAgICB0aGlzLmVudGl0eSxcbiAgICAgIGFtb3VudCxcbiAgICAgIGNhdXNlLFxuICAgICAgZGFtYWdlclxuICAgICk7XG5cbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyBoZWFsdGggdmFsdWVcbiAgICB0aGlzLmN1cnJlbnRWYWx1ZSAtPSBhbW91bnQ7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQWN0b3JFdmVudFBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBY3RvckV2ZW50UGFja2V0KCk7XG4gICAgcGFja2V0LmFjdG9yUnVudGltZUlkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuICAgIHBhY2tldC5ldmVudElkID0gQWN0b3JFdmVudElkcy5IVVJUX0FOSU1BVElPTjtcbiAgICBwYWNrZXQuZXZlbnREYXRhID0gY2F1c2UgPz8gQWN0b3JEYW1hZ2VDYXVzZS5Ob25lO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gYWxsIHBsYXllcnNcbiAgICB0aGlzLmVudGl0eS5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaGVhbHRoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwXG4gICAgLy8gSWYgc28sIHRoZSBlbnRpdHkgaXMgZGVhZFxuICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSA8PSAwKSB0aGlzLmVudGl0eS5raWxsKGRhbWFnZXIsIGNhdXNlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFbnRpdHlIZWFsdGhDaGFuZ2VkU2lnbmFsKFxuICAgICAgdGhpcy5lbnRpdHksXG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSxcbiAgICAgIHZhbHVlXG4gICAgKTtcblxuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuICAgIHN1cGVyLnNldCh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcmFjdChwbGF5ZXI6IFBsYXllciwgbWV0aG9kOiBFbnRpdHlJbnRlcmFjdE1ldGhvZCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBtZXRob2QgaXMgbm90IGFuIGF0dGFjazsgaWYgaXQgaXMgbm90LCByZXR1cm5cbiAgICBpZiAobWV0aG9kICE9PSBFbnRpdHlJbnRlcmFjdE1ldGhvZC5BdHRhY2spIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGF0dGFjayBwbGF5ZXJzOyBpZiBpdCBkb2VzIG5vdCwgcmV0dXJuXG4gICAgaWYgKFxuICAgICAgIXBsYXllci5hYmlsaXRpZXMuZ2V0KEFiaWxpdHlJbmRleC5BdHRhY2tQbGF5ZXJzKSAmJlxuICAgICAgdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGF0dGFjayBtb2JzOyBpZiBpdCBkb2VzIG5vdCwgcmV0dXJuXG4gICAgaWYgKFxuICAgICAgIXBsYXllci5hYmlsaXRpZXMuZ2V0KEFiaWxpdHlJbmRleC5BdHRhY2tNb2JzKSAmJlxuICAgICAgIXRoaXMuZW50aXR5LmlzUGxheWVyKClcbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGVudGl0eSBpcyBhIHBsYXllciBhbmQgaXMgaW4gY3JlYXRpdmUgbW9kZTsgaWYgaXQgaXMsIHJldHVyblxuICAgIGlmICh0aGlzLmVudGl0eS5pc1BsYXllcigpICYmIHRoaXMuZW50aXR5LmdhbWVtb2RlID09PSBHYW1lbW9kZS5DcmVhdGl2ZSlcbiAgICAgIHJldHVybjtcblxuICAgIC8vIFdlIHdhbnQgdG8gYXBwbHkga25vY2sgYmFjayB0byB0aGUgZW50aXR5IHdoZW4gaXQgaXMgYXR0YWNrZWQsIGJhc2VkIG9uIHRoZSBkaXJlY3Rpb24gdGhlIHBsYXllciBpcyBmYWNpbmcuXG4gICAgLy8gR2V0IHRoZSBkaXJlY3Rpb24gdGhlIHBsYXllciBpcyBmYWNpbmdcbiAgICBjb25zdCB7IGhlYWRZYXcsIHBpdGNoIH0gPSBwbGF5ZXIucm90YXRpb247XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBpdGNoICYgaGVhZFlhdywgc28gdGhlIGVudGl0eSB3aWxsIGJlIHNwYXduZWQgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uXG4gICAgY29uc3QgaGVhZFlhd1JhZCA9IChoZWFkWWF3ICogTWF0aC5QSSkgLyAxODA7XG4gICAgY29uc3QgcGl0Y2hSYWQgPSAocGl0Y2ggKiBNYXRoLlBJKSAvIDE4MDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGVudGl0eSBiYXNlZCBvbiB0aGUgcGxheWVyJ3Mgcm90YXRpb25cbiAgICAvLyBOT1RFOiBUaGVzZSBudW1iZXJzIGFyZSBub3Qgb2ZmaWNpYWwvdmFuaWxsYSB2YWx1ZXMsIHRoZXNlIHNlZW0gdG8gd29yayBzaW1pbGFyIHRvIHRoZSB2YW5pbGxhIHZhbHVlcy5cbiAgICAvLyBJZiB3ZSBjYW4gZ2V0IHRoZSBvZmZpY2lhbCB2YWx1ZXMsIHdlIHNob3VsZCByZXBsYWNlIHRoZXNlIHdpdGggdGhlIG9mZmljaWFsIHZhbHVlcy5cbiAgICBjb25zdCB4ID0gKC1NYXRoLnNpbihoZWFkWWF3UmFkKSAqIE1hdGguY29zKHBpdGNoUmFkKSkgLyAzLjc1O1xuICAgIGNvbnN0IHkgPSAwLjI7XG4gICAgY29uc3QgeiA9IChNYXRoLmNvcyhoZWFkWWF3UmFkKSAqIE1hdGguY29zKHBpdGNoUmFkKSkgLyAzLjc1O1xuXG4gICAgLy8gU2V0IHRoZSB2ZWxvY2l0eSBvZiB0aGUgZW50aXR5XG4gICAgdGhpcy5lbnRpdHkuc2V0TW90aW9uKG5ldyBWZWN0b3IzZih4LCB5LCB6KSk7XG5cbiAgICAvLyBBcHBseSBkYW1hZ2UgdG8gdGhlIGVudGl0eVxuICAgIC8vIFRPRE86IENhbGN1bGF0ZSB0aGUgZGFtYWdlIGJhc2VkIG9uIHRoZSBwbGF5ZXIncyBpdGVtXG4gICAgdGhpcy5hcHBseURhbWFnZSgxLCBwbGF5ZXIsIEFjdG9yRGFtYWdlQ2F1c2UuRW50aXR5QXR0YWNrKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlIZWFsdGhUcmFpdCB9O1xuIiwgImltcG9ydCB7IEdhbWVtb2RlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9wbGF5ZXJcIjtcbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4uL3RyYWl0XCI7XG5cbmNsYXNzIFBsYXllclRyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyID0gdGhpcy5lbnRpdHkgYXMgUGxheWVyO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGxheWVyIHNlbmRzIGEgY2hhdCBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0aGF0IHRoZSBwbGF5ZXIgc2VudC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY2hhdCBtZXNzYWdlIHdhcyBzdWNjZXNzZnVsOyBkZWZhdWx0IGlzIHRydWVcbiAgICovXG4gIHB1YmxpYyBvbkNoYXQ/KG1lc3NhZ2U6IHN0cmluZyk6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHBsYXllcnMgZ2FtZW1vZGUgaXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIHByZXZpb3VzIFRoZSBwcmV2aW91cyBnYW1lbW9kZSBvZiB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIG9uR2FtZW1vZGVDaGFuZ2U/KHByZXZpb3VzOiBHYW1lbW9kZSk6IHZvaWQ7XG59XG5cbmV4cG9ydCB7IFBsYXllclRyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgQ2h1bmtDb29yZHMsXG4gIExldmVsQ2h1bmtQYWNrZXQsXG4gIE5ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vLi4vLi4vd29ybGQvY2h1bmtcIjtcblxuaW1wb3J0IHsgUGxheWVyVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBQbGF5ZXJDaHVua1JlbmRlcmluZ1RyYWl0IGV4dGVuZHMgUGxheWVyVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImNodW5rX3JlbmRlcmluZ1wiO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBjaHVuayBoYXNoZXMgdGhhdCBoYXZlIGJlZW4gc2VudCB0byB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNodW5rcyA9IG5ldyBTZXQ8YmlnaW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlldyBkaXN0YW5jZSBvZiB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIHZpZXdEaXN0YW5jZSA9IHRoaXMucGxheWVyLmRpbWVuc2lvbi52aWV3RGlzdGFuY2U7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY2h1bmsgdG8gdGhlIHBsYXllci5cbiAgICogQHBhcmFtIGNodW5rcyBUaGUgY2h1bmtzIHRvIHNlbmQgdG8gdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyBzZW5kKC4uLmNodW5rczogQXJyYXk8Q2h1bms+KTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBhbW91bnQgb2YgY2h1bmtzIHRvIHNlbmRcbiAgICBjb25zdCBhbW91bnQgPSBjaHVua3MubGVuZ3RoO1xuXG4gICAgLy8gV2Ugd2FudCB0byBzZW5kIHRoZSBjaHVua3MgaW4gYmF0Y2hlcyBvZiA4XG4gICAgY29uc3QgYmF0Y2hlcyA9IE1hdGguY2VpbChhbW91bnQgLyA4KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYmF0Y2hlc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXRjaGVzOyBpbmRleCsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHN0YXJ0IGFuZCBlbmQgaW5kZXggb2YgdGhlIGJhdGNoXG4gICAgICBjb25zdCBzdGFydCA9IGluZGV4ICogODtcbiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgOCwgYW1vdW50KTtcblxuICAgICAgLy8gR2V0IHRoZSBjaHVua3MgdG8gc2VuZFxuICAgICAgY29uc3QgYmF0Y2ggPSBjaHVua3Muc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgICAgIGNvbnN0IGxldmVsQ2h1bmtzID0gYmF0Y2gubWFwKChjaHVuaykgPT4ge1xuICAgICAgICB0aGlzLmNodW5rcy5hZGQoY2h1bmsuaGFzaCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IExldmVsQ2h1bmtQYWNrZXRcbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IExldmVsQ2h1bmtQYWNrZXQoKTtcblxuICAgICAgICAvLyBBc3NpZ24gdGhlIGNodW5rIGRhdGEgdG8gdGhlIHBhY2tldFxuICAgICAgICBwYWNrZXQueCA9IGNodW5rLng7XG4gICAgICAgIHBhY2tldC56ID0gY2h1bmsuejtcbiAgICAgICAgcGFja2V0LmRpbWVuc2lvbiA9IGNodW5rLnR5cGU7XG4gICAgICAgIHBhY2tldC5zdWJDaHVua0NvdW50ID0gY2h1bmsuZ2V0U3ViQ2h1bmtTZW5kQ291bnQoKTtcbiAgICAgICAgcGFja2V0LmNhY2hlRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuZGF0YSA9IENodW5rLnNlcmlhbGl6ZShjaHVuayk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwYWNrZXRcbiAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXRzIHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMucGxheWVyLnNlbmQoLi4ubGV2ZWxDaHVua3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBjaHVuayBoYXMgYmVlbiBzZW50IHRvIHRoZSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBoYXNoIFRoZSBoYXNoIG9mIHRoZSBjaHVuayB0byBjaGVjay5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2h1bmsgaGFzIGJlZW4gc2VudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHNlbnQoaGFzaDogYmlnaW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2h1bmtzLmhhcyhoYXNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwbGF5ZXIgYW5kIGEgY2h1bmsuXG4gICAqIEBwYXJhbSBjaHVuayBUaGUgaGFzaCBvZiB0aGUgY2h1bmsgdG8gZ2V0IHRoZSBkaXN0YW5jZSB0by5cbiAgICogQHJldHVybnMgVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBsYXllciBhbmQgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIGRpc3RhbmNlKGhhc2g6IGJpZ2ludCk6IG51bWJlciB7XG4gICAgLy8gQ29udmVydCB0aGUgY2h1bmsgaGFzaCB0byBhIGNodW5rIHBvc2l0aW9uXG4gICAgY29uc3QgeyB4OiBjeCwgejogY3ogfSA9IENodW5rQ29vcmRzLnVuaGFzaChoYXNoKTtcblxuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgY2h1bmsgcG9zaXRpb25cbiAgICBjb25zdCBweCA9IHRoaXMucGxheWVyLnBvc2l0aW9uLnggPj4gNDtcbiAgICBjb25zdCBweiA9IHRoaXMucGxheWVyLnBvc2l0aW9uLnogPj4gNDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBsYXllciBhbmQgdGhlIGNodW5rXG4gICAgcmV0dXJuIE1hdGguaHlwb3QoY3ggLSBweCwgY3ogLSBweik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmV4dCBzZXQgb2YgY2h1bmsgaGFzaGVzIHRvIHNlbmQgdG8gdGhlIHBsYXllci5cbiAgICogQG5vdGUgVGhpcyBtZXRob2Qgb2J0YWlucyB0aGUgY2h1bmtzIHRoYXQgYXJlIHdpdGhpbiB0aGUgcGxheWVyJ3MgdmlldyBkaXN0YW5jZS5cbiAgICogQHBhcmFtIGRpc3RhbmNlIFRoZSBkaXN0YW5jZSB0byBjYWxjdWxhdGUgdGhlIGNodW5rcyBmb3IuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGNodW5rIGhhc2hlcyB0byBzZW5kIHRvIHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgbmV4dChkaXN0YW5jZT86IG51bWJlcik6IEFycmF5PGJpZ2ludD4ge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgY2h1bmsgcG9zaXRpb24gb2YgdGhlIGVudGl0eVxuICAgIGNvbnN0IGN4ID0gdGhpcy5wbGF5ZXIucG9zaXRpb24ueCA+PiA0O1xuICAgIGNvbnN0IGN6ID0gdGhpcy5wbGF5ZXIucG9zaXRpb24ueiA+PiA0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvciB1c2UgdGhlIHNpbXVsYXRpb24gZGlzdGFuY2Ugb2YgdGhlIGRpbWVuc2lvblxuICAgIGNvbnN0IGQgPSBkaXN0YW5jZSA/PyB0aGlzLnZpZXdEaXN0YW5jZTtcblxuICAgIC8vIFByZXBhcmUgYW4gYXJyYXkgdG8gc3RvcmUgdGhlIGNodW5rcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0byB0aGUgcGxheWVyLlxuICAgIGNvbnN0IGhhc2hlczogQXJyYXk8YmlnaW50PiA9IFtdO1xuXG4gICAgLy8gR2V0IHRoZSBjaHVua3MgdG8gcmVuZGVyLCB3ZSB3YW50IHRvIGdldCB0aGUgY2h1bmtzIGZyb20gdGhlIGluc2lkZSBvdXRcbiAgICBmb3IgKGxldCBkeCA9IC1kOyBkeCA8PSBkOyBkeCsrKSB7XG4gICAgICBmb3IgKGxldCBkeiA9IC1kOyBkeiA8PSBkOyBkeisrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgaGFzaCBvZiB0aGUgY2h1bmtcbiAgICAgICAgY29uc3QgaGFzaCA9IENodW5rQ29vcmRzLmhhc2goeyB4OiBjeCArIGR4LCB6OiBjeiArIGR6IH0pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICAgIGlmICh0aGlzLmNodW5rcy5oYXMoaGFzaCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxheWVyIGFuZCB0aGUgY2h1bmtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmh5cG90KGR4LCBkeik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIHdpdGhpbiB0aGUgdmlldyBkaXN0YW5jZVxuICAgICAgICBpZiAoZGlzdGFuY2UgPD0gZCArIDAuNSkgaGFzaGVzLnB1c2goaGFzaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBoYXNoZXNcbiAgICByZXR1cm4gaGFzaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY2h1bmtzIGZyb20gdGhlIHBsYXllcidzIHZpZXcuXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGNodW5rIHRvIGNsZWFyLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKHBvc2l0aW9uPzogQ2h1bmtDb29yZHMpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IHRoZSBoYXNoZXMgdG8gY29vcmRpbmF0ZXNcbiAgICBjb25zdCBjb29yZHMgPSBwb3NpdGlvblxuICAgICAgPyBbcG9zaXRpb25dXG4gICAgICA6IFsuLi50aGlzLmNodW5rc10ubWFwKChoYXNoKSA9PiBDaHVua0Nvb3Jkcy51bmhhc2goaGFzaCkpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNodW5rXG4gICAgY29uc3QgZW1wdHkgPSBuZXcgQ2h1bmsoMCwgMCwgdGhpcy5wbGF5ZXIuZGltZW5zaW9uLnR5cGUpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjb29yZGluYXRlc1xuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgTGV2ZWxDaHVua1BhY2tldFxuICAgICAgY29uc3QgcGFja2V0ID0gbmV3IExldmVsQ2h1bmtQYWNrZXQoKTtcblxuICAgICAgLy8gQXNzaWduIHRoZSBjaHVuayBkYXRhIHRvIHRoZSBwYWNrZXRcbiAgICAgIHBhY2tldC54ID0gY29vcmQueDtcbiAgICAgIHBhY2tldC56ID0gY29vcmQuejtcbiAgICAgIHBhY2tldC5kaW1lbnNpb24gPSB0aGlzLnBsYXllci5kaW1lbnNpb24udHlwZTtcbiAgICAgIHBhY2tldC5zdWJDaHVua0NvdW50ID0gZW1wdHkuZ2V0U3ViQ2h1bmtTZW5kQ291bnQoKTtcbiAgICAgIHBhY2tldC5jYWNoZUVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIHBhY2tldC5kYXRhID0gQ2h1bmsuc2VyaWFsaXplKGVtcHR5KTtcblxuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMucGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBjaHVuayBmcm9tIHRoZSBwbGF5ZXIncyB2aWV3XG4gICAgICB0aGlzLmNodW5rcy5kZWxldGUoQ2h1bmtDb29yZHMuaGFzaChjb29yZCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBzcGF3bmVkXG4gICAgaWYgKCF0aGlzLnBsYXllci5pc0FsaXZlKSByZXR1cm47XG5cbiAgICAvLyBHZXQgdGhlIG5leHQgY2h1bmtzIHRvIHNlbmQgdG8gdGhlIHBsYXllclxuICAgIGNvbnN0IGhhc2hlcyA9IFsuLi50aGlzLm5leHQoKSwgLi4udGhpcy5jaHVua3NdLmZpbHRlcihcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIGNodW5rcyB0aGF0IGFyZSBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICAoaGFzaCkgPT4gIXRoaXMuY2h1bmtzLmhhcyhoYXNoKVxuICAgICk7XG5cbiAgICAvLyBHZXQgdGhlIGNvb3JkcyBvZiB0aGUgY2h1bmtzXG4gICAgY29uc3QgY29vcmRzID0gaGFzaGVzLm1hcCgoaGFzaCkgPT4gQ2h1bmtDb29yZHMudW5oYXNoKGhhc2gpKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2h1bmtzIHRvIHNlbmRcbiAgICBpZiAoY29vcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB0aGUgY2h1bmtzIHRvIHNlbmRcbiAgICAgIGNvbnN0IGNodW5rcyA9IGNvb3Jkc1xuICAgICAgICAubWFwKChjb29yZCkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICAgICAgaWYgKHRoaXMuY2h1bmtzLmhhcyhDaHVua0Nvb3Jkcy5oYXNoKGNvb3JkKSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBjaHVuayBmcm9tIHRoZSBkaW1lbnNpb25cbiAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMucGxheWVyLmRpbWVuc2lvbi5nZXRDaHVuayhjb29yZC54LCBjb29yZC56KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyByZWFkeVxuICAgICAgICAgIGlmICghY2h1bmsucmVhZHkpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBjaHVua1xuICAgICAgICAgIHJldHVybiBjaHVuaztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoY2h1bmspID0+IGNodW5rICE9PSBudWxsKSBhcyBBcnJheTxDaHVuaz47XG5cbiAgICAgIC8vIFNlbmQgdGhlIGNodW5rcyB0byB0aGUgcGxheWVyXG4gICAgICB0aGlzLnNlbmQoLi4uY2h1bmtzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2hlY2sgaWYgYW55IGNodW5rcyBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGxheWVyJ3Mgdmlld1xuICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMuY2h1bmtzKSB7XG4gICAgICAgIC8vIEdldCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxheWVyIGFuZCB0aGUgY2h1bmtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKGhhc2gpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyBvdXRzaWRlIG9mIHRoZSBwbGF5ZXIncyB2aWV3IGRpc3RhbmNlXG4gICAgICAgIGlmIChkaXN0YW5jZSA+IHRoaXMudmlld0Rpc3RhbmNlICsgMC41KSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBjaHVuayBwb3NpdGlvblxuICAgICAgICAgIGNvbnN0IHsgeCwgeiB9ID0gQ2h1bmtDb29yZHMudW5oYXNoKGhhc2gpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGhlIGNodW5rIGZyb20gdGhlIHBsYXllcidzIHZpZXdcbiAgICAgICAgICB0aGlzLmNsZWFyKHsgeCwgeiB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0XG4gICAgICBjb25zdCB1cGRhdGUgPSBuZXcgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0KCk7XG5cbiAgICAgIC8vIEFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBwYWNrZXRcbiAgICAgIHVwZGF0ZS5yYWRpdXMgPSB0aGlzLnZpZXdEaXN0YW5jZSA8PCA0O1xuICAgICAgdXBkYXRlLmNvb3JkaW5hdGUgPSB0aGlzLnBsYXllci5wb3NpdGlvbi5mbG9vcigpO1xuICAgICAgdXBkYXRlLnNhdmVkQ2h1bmtzID0gWy4uLnRoaXMuY2h1bmtzXS5tYXAoKGhhc2gpID0+XG4gICAgICAgIENodW5rQ29vcmRzLnVuaGFzaChoYXNoKVxuICAgICAgKTtcblxuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0cyB0byB0aGUgcGxheWVyXG4gICAgICB0aGlzLnBsYXllci5zZW5kKHVwZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRGVzcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDbGVhciB0aGUgY2h1bmtzIGZyb20gdGhlIHBsYXllcidzIHZpZXdcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFiaWxpdHlMYXllclR5cGUsXG4gIEFiaWxpdHlTZXQsXG4gIEFkZEVudGl0eVBhY2tldCxcbiAgQWRkSXRlbUFjdG9yUGFja2V0LFxuICBBZGRQbGF5ZXJQYWNrZXQsXG4gIE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yLFxuICBQcm9wZXJ0eVN5bmNEYXRhLFxuICBSZW1vdmVFbnRpdHlQYWNrZXQsXG4gIFZlY3RvcjNmXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCB9IGZyb20gXCIuLi9pbnZlbnRvcnlcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi8uLi8uLi9pdGVtXCI7XG5pbXBvcnQgeyBFbnRpdHlJdGVtU3RhY2tUcmFpdCB9IGZyb20gXCIuLi9pdGVtLXN0YWNrXCI7XG5cbmltcG9ydCB7IFBsYXllclRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcbmltcG9ydCB7IFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQgfSBmcm9tIFwiLi9jaHVuay1yZW5kZXJpbmdcIjtcblxuY2xhc3MgUGxheWVyRW50aXR5UmVuZGVyaW5nVHJhaXQgZXh0ZW5kcyBQbGF5ZXJUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZW50aXR5X3JlbmRlcmluZ1wiO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIC8qKlxuICAgKiBBIGNvbGxlY3RpdmUgbWFwIG9mIGFsbCB0aGUgZW50aXRpZXMgdGhhdCBoYXZlIGJlZW4gcmVuZGVyZWQgZm9yIHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXM6IFNldDxiaWdpbnQ+ID0gbmV3IFNldCgpO1xuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBzcGF3bmVkXG4gICAgaWYgKCF0aGlzLnBsYXllci5pc0FsaXZlKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBhIGNodW5rIHJlbmRlcmluZyBjb21wb25lbnRcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLnBsYXllci5nZXRUcmFpdChQbGF5ZXJDaHVua1JlbmRlcmluZ1RyYWl0KTtcbiAgICBpZiAoIWNvbXBvbmVudCkgcmV0dXJuO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyB2aWV3IGRpc3RhbmNlXG4gICAgY29uc3Qgdmlld0Rpc3RhbmNlID0gY29tcG9uZW50LnZpZXdEaXN0YW5jZSA8PCA0O1xuXG4gICAgLy8gR2V0IGFsbCB0aGUgZW50aXRpZXMgaW4gdGhlIHBsYXllcidzIGRpbWVuc2lvblxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5wbGF5ZXIuZGltZW5zaW9uLmVudGl0aWVzO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBlbnRpdGllc1xuICAgIGZvciAoY29uc3QgW3VuaXF1ZSwgZW50aXR5XSBvZiBlbnRpdGllcykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyB0aGUgcGxheWVyIG9yIGlmIHRoZSBlbnRpdHkgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZFxuICAgICAgaWYgKHRoaXMuZW50aXRpZXMuaGFzKHVuaXF1ZSkgfHwgZW50aXR5ID09PSB0aGlzLnBsYXllcikgY29udGludWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYWxpdmVcbiAgICAgIGlmICghZW50aXR5LmlzQWxpdmUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIHdpdGhpbiB0aGUgcGxheWVyJ3MgdmlldyBkaXN0YW5jZVxuICAgICAgaWYgKHRoaXMuZGlzdGFuY2UoZW50aXR5LnBvc2l0aW9uLCB0aGlzLnBsYXllci5wb3NpdGlvbikgPiB2aWV3RGlzdGFuY2UpXG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAvLyBBZGQgdGhlIGVudGl0eSB0byB0aGUgcmVuZGVyZWQgZW50aXRpZXNcbiAgICAgIHRoaXMuZW50aXRpZXMuYWRkKHVuaXF1ZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXJcbiAgICAgIGlmIChlbnRpdHkuaXNQbGF5ZXIoKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgQWRkUGxheWVyUGFja2V0XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBZGRQbGF5ZXJQYWNrZXQoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBsYXllcnMgaW52ZW50b3J5XG4gICAgICAgIGNvbnN0IGludmVudG9yeSA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGhlbGQgaXRlbVxuICAgICAgICBjb25zdCBoZWxkSXRlbSA9IGludmVudG9yeS5nZXRIZWxkSXRlbSgpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICAgICAgcGFja2V0LnV1aWQgPSBlbnRpdHkudXVpZDtcbiAgICAgICAgcGFja2V0LnVzZXJuYW1lID0gZW50aXR5LnVzZXJuYW1lO1xuICAgICAgICBwYWNrZXQucnVudGltZUlkID0gZW50aXR5LnJ1bnRpbWVJZDtcbiAgICAgICAgcGFja2V0LnBsYXRmb3JtQ2hhdElkID0gU3RyaW5nKCk7IC8vIFRPRE86IE5vdCBzdXJlIHdoYXQgdGhpcyBpc1xuICAgICAgICBwYWNrZXQucG9zaXRpb24gPSBlbnRpdHkucG9zaXRpb247XG4gICAgICAgIHBhY2tldC52ZWxvY2l0eSA9IGVudGl0eS52ZWxvY2l0eTtcbiAgICAgICAgcGFja2V0LnBpdGNoID0gZW50aXR5LnJvdGF0aW9uLnBpdGNoO1xuICAgICAgICBwYWNrZXQueWF3ID0gZW50aXR5LnJvdGF0aW9uLnlhdztcbiAgICAgICAgcGFja2V0LmhlYWRZYXcgPSBlbnRpdHkucm90YXRpb24uaGVhZFlhdztcbiAgICAgICAgcGFja2V0LmhlbGRJdGVtID1cbiAgICAgICAgICBoZWxkSXRlbSA9PT0gbnVsbFxuICAgICAgICAgICAgPyBuZXcgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IoMClcbiAgICAgICAgICAgIDogSXRlbVN0YWNrLnRvTmV0d29ya1N0YWNrKGhlbGRJdGVtKTtcbiAgICAgICAgcGFja2V0LmdhbWVtb2RlID0gMDtcbiAgICAgICAgcGFja2V0LmRhdGEgPSBbLi4uZW50aXR5Lm1ldGFkYXRhLnZhbHVlcygpXTtcbiAgICAgICAgcGFja2V0LnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydHlTeW5jRGF0YShbXSwgW10pO1xuICAgICAgICBwYWNrZXQudW5pcXVlRW50aXR5SWQgPSBlbnRpdHkudW5pcXVlSWQ7XG4gICAgICAgIHBhY2tldC5wcmVtaXNzaW9uTGV2ZWwgPSBlbnRpdHkucGVybWlzc2lvbjtcbiAgICAgICAgcGFja2V0LmNvbW1hbmRQZXJtaXNzaW9uID0gZW50aXR5LnBlcm1pc3Npb24gPT09IDIgPyAxIDogMDtcbiAgICAgICAgcGFja2V0LmFiaWxpdGllcyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBBYmlsaXR5TGF5ZXJUeXBlLkJhc2UsXG4gICAgICAgICAgICBhYmlsaXRpZXM6IFsuLi5lbnRpdHkuYWJpbGl0aWVzLmVudHJpZXMoKV0ubWFwKFxuICAgICAgICAgICAgICAoW2FiaWxpdHksIHZhbHVlXSkgPT4gbmV3IEFiaWxpdHlTZXQoYWJpbGl0eSwgdmFsdWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd2Fsa1NwZWVkOiAwLjEsXG4gICAgICAgICAgICBmbHlTcGVlZDogMC4wNVxuICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICAgICAgcGFja2V0LmxpbmtzID0gW107XG4gICAgICAgIHBhY2tldC5kZXZpY2VJZCA9IFwiXCI7XG4gICAgICAgIHBhY2tldC5kZXZpY2VPUyA9IDA7XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5wbGF5ZXIuc2VuZChwYWNrZXQpO1xuXG4gICAgICAgIC8vIENvbnRpbnVlIHRvIHRoZSBuZXh0IGVudGl0eVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhbiBpdGVtXG4gICAgICBpZiAoZW50aXR5LmlzSXRlbSgpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgaXRlbSBjb21wb25lbnRcbiAgICAgICAgY29uc3QgaXRlbUNvbXBvbmVudCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlJdGVtU3RhY2tUcmFpdCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEFkZEl0ZW1BY3RvclBhY2tldFxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgQWRkSXRlbUFjdG9yUGFja2V0KCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwYWNrZXQgcHJvcGVydGllc1xuICAgICAgICBwYWNrZXQudW5pcXVlSWQgPSBlbnRpdHkudW5pcXVlSWQ7XG4gICAgICAgIHBhY2tldC5ydW50aW1lSWQgPSBlbnRpdHkucnVudGltZUlkO1xuICAgICAgICBwYWNrZXQuaXRlbSA9IEl0ZW1TdGFjay50b05ldHdvcmtTdGFjayhpdGVtQ29tcG9uZW50Lml0ZW1TdGFjayk7XG4gICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IGVudGl0eS5wb3NpdGlvbjtcbiAgICAgICAgcGFja2V0LnZlbG9jaXR5ID0gZW50aXR5LnZlbG9jaXR5O1xuICAgICAgICBwYWNrZXQuZGF0YSA9IFsuLi5lbnRpdHkubWV0YWRhdGEudmFsdWVzKCldO1xuICAgICAgICBwYWNrZXQuZnJvbUZpc2hpbmcgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLnBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAgICAgLy8gQ29udGludWUgdG8gdGhlIG5leHQgZW50aXR5XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgQWRkRW50aXR5UGFja2V0XG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgQWRkRW50aXR5UGFja2V0KCk7XG5cbiAgICAgIC8vIFNldCB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICAgIHBhY2tldC51bmlxdWVFbnRpdHlJZCA9IGVudGl0eS51bmlxdWVJZDtcbiAgICAgIHBhY2tldC5ydW50aW1lSWQgPSBlbnRpdHkucnVudGltZUlkO1xuICAgICAgcGFja2V0LmlkZW50aWZpZXIgPSBlbnRpdHkudHlwZS5pZGVudGlmaWVyO1xuICAgICAgcGFja2V0LnBvc2l0aW9uID0gZW50aXR5LnBvc2l0aW9uO1xuICAgICAgcGFja2V0LnZlbG9jaXR5ID0gZW50aXR5LnZlbG9jaXR5O1xuICAgICAgcGFja2V0LnBpdGNoID0gZW50aXR5LnJvdGF0aW9uLnBpdGNoO1xuICAgICAgcGFja2V0LnlhdyA9IGVudGl0eS5yb3RhdGlvbi55YXc7XG4gICAgICBwYWNrZXQuaGVhZFlhdyA9IGVudGl0eS5yb3RhdGlvbi5oZWFkWWF3O1xuICAgICAgcGFja2V0LmJvZHlZYXcgPSBlbnRpdHkucm90YXRpb24ueWF3O1xuICAgICAgcGFja2V0LmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgIHBhY2tldC5kYXRhID0gWy4uLmVudGl0eS5tZXRhZGF0YS52YWx1ZXMoKV07XG4gICAgICBwYWNrZXQucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0eVN5bmNEYXRhKFtdLCBbXSk7XG4gICAgICBwYWNrZXQubGlua3MgPSBbXTtcblxuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMucGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgICAgLy8gU3luYyB0aGUgZW50aXR5XG4gICAgICAvLyBlbnRpdHkuc3luYygpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZW50aXRpZXNcbiAgICBmb3IgKGNvbnN0IHVuaXF1ZSBvZiB0aGlzLmVudGl0aWVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIHN0aWxsIGluIHRoZSBwbGF5ZXIncyBkaW1lbnNpb25cbiAgICAgIGlmICh0aGlzLnBsYXllci5kaW1lbnNpb24uZW50aXRpZXMuaGFzKHVuaXF1ZSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBlbnRpdHlcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5wbGF5ZXIuZGltZW5zaW9uLmVudGl0aWVzLmdldCh1bmlxdWUpO1xuICAgICAgICBpZiAoIWVudGl0eSkgY29udGludWU7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBpbiB0aGUgcGxheWVyJ3MgdmlldyBkaXN0YW5jZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5kaXN0YW5jZShlbnRpdHkucG9zaXRpb24sIHRoaXMucGxheWVyLnBvc2l0aW9uKSA8PSB2aWV3RGlzdGFuY2VcbiAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyByZW1vdmUgZW50aXR5IHBhY2tldFxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgUmVtb3ZlRW50aXR5UGFja2V0KCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSB1bmlxdWUgZW50aXR5IGlkXG4gICAgICAgIHBhY2tldC51bmlxdWVFbnRpdHlJZCA9IHVuaXF1ZTtcblxuICAgICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLnBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBlbnRpdHkgZnJvbSB0aGUgcmVuZGVyZWQgZW50aXRpZXNcbiAgICAgICAgdGhpcy5lbnRpdGllcy5kZWxldGUodW5pcXVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyByZW1vdmUgZW50aXR5IHBhY2tldFxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgUmVtb3ZlRW50aXR5UGFja2V0KCk7XG4gICAgICAgIHBhY2tldC51bmlxdWVFbnRpdHlJZCA9IHVuaXF1ZTtcblxuICAgICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLnBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBlbnRpdHkgZnJvbSB0aGUgcmVuZGVyZWQgZW50aXRpZXNcbiAgICAgICAgdGhpcy5lbnRpdGllcy5kZWxldGUodW5pcXVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25EZXNwYXduKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSBlbnRpdGllc1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRoZSBlbnRpdGllcyB0aGF0IGhhdmUgYmVlbiByZW5kZXJlZCBmb3IgdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGVudGl0aWVzXG4gICAgZm9yIChjb25zdCB1bmlxdWUgb2YgdGhpcy5lbnRpdGllcykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJlbW92ZSBlbnRpdHkgcGFja2V0XG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgUmVtb3ZlRW50aXR5UGFja2V0KCk7XG4gICAgICBwYWNrZXQudW5pcXVlRW50aXR5SWQgPSB1bmlxdWU7XG5cbiAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICB0aGlzLnBsYXllci5zZW5kKHBhY2tldCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIGVudGl0aWVzXG4gICAgdGhpcy5lbnRpdGllcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGRpc3RhbmNlKGE6IFZlY3RvcjNmLCBiOiBWZWN0b3IzZik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguc3FydChcbiAgICAgIE1hdGgucG93KGEueCAtIGIueCwgMikgKyBNYXRoLnBvdyhhLnkgLSBiLnksIDIpICsgTWF0aC5wb3coYS56IC0gYi56LCAyKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyRW50aXR5UmVuZGVyaW5nVHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBDb250YWluZXJJZCxcbiAgQ29udGFpbmVyVHlwZSxcbiAgTW9iRXF1aXBtZW50UGFja2V0LFxuICBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvclxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgRW50aXR5Q29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uLy4uL2l0ZW1cIjtcbmltcG9ydCB7IEl0ZW1TdGFja0VudHJ5LCBKU09OTGlrZU9iamVjdCB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmludGVyZmFjZSBJbnZlbnRvcnlDb21wb25lbnQgZXh0ZW5kcyBKU09OTGlrZU9iamVjdCB7XG4gIHNpemU6IG51bWJlcjtcbiAgaXRlbXM6IEFycmF5PFtudW1iZXIsIEl0ZW1TdGFja0VudHJ5XT47XG59XG5cbmNsYXNzIEVudGl0eUludmVudG9yeVRyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImludmVudG9yeVwiO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRoYXQgaG9sZHMgdGhlIGludmVudG9yeSBpdGVtcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXI6IEVudGl0eUNvbnRhaW5lcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY29udGFpbmVyIHRoYXQgdGhpcyB0cmFpdCByZXByZXNlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUgPSBDb250YWluZXJUeXBlLkludmVudG9yeTtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lciB0aGF0IHRoaXMgdHJhaXQgcmVwcmVzZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJJZDogQ29udGFpbmVySWQgPSBDb250YWluZXJJZC5JbnZlbnRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2Ygc2xvdHMgaW4gdGhlIGludmVudG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnZlbnRvcnlTaXplOiBudW1iZXIgPSAzNjtcblxuICAvKipcbiAgICogVGhlIHNlbGVjdGVkIHNsb3QgaW4gdGhlIGludmVudG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RlZFNsb3Q6IG51bWJlciA9IDA7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoZW50aXR5KTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb250YWluZXJcbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBFbnRpdHlDb250YWluZXIoXG4gICAgICBlbnRpdHksXG4gICAgICB0aGlzLmNvbnRhaW5lclR5cGUsXG4gICAgICB0aGlzLmNvbnRhaW5lcklkLFxuICAgICAgdGhpcy5pbnZlbnRvcnlTaXplXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBoZWxkIGl0ZW0gaW4gdGhlIGludmVudG9yeS5cbiAgICogQHJldHVybnMgVGhlIGhlbGQgaXRlbSBpbiB0aGUgaW52ZW50b3J5LlxuICAgKi9cbiAgcHVibGljIGdldEhlbGRJdGVtKCk6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5nZXRJdGVtKHRoaXMuc2VsZWN0ZWRTbG90KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWxkIGl0ZW0gaW4gdGhlIGludmVudG9yeS5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gc2V0IHRoZSBoZWxkIGl0ZW0gdG8uXG4gICAqL1xuICBwdWJsaWMgc2V0SGVsZEl0ZW0oc2xvdDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBub3QgYSBwbGF5ZXJcbiAgICBpZiAoIXRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHJldHVybjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBNb2JFcXVpcG1lbnRQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgTW9iRXF1aXBtZW50UGFja2V0KCk7XG5cbiAgICAvLyBHZXQgdGhlIGhlbGQgaXRlbSBmcm9tIHRoZSBpbnZlbnRvcnlcbiAgICBjb25zdCBoZWxkSXRlbSA9IHRoaXMuZ2V0SGVsZEl0ZW0oKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBpdGVtIGRlc2NyaXB0b3IgZnJvbSB0aGUgaGVsZCBpdGVtXG4gICAgY29uc3QgaXRlbURlc2NyaXB0b3IgPSBoZWxkSXRlbVxuICAgICAgPyBJdGVtU3RhY2sudG9OZXR3b3JrU3RhY2soaGVsZEl0ZW0pXG4gICAgICA6IG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcigwKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICBwYWNrZXQucnVudGltZUVudGl0eUlkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuICAgIHBhY2tldC5jb250YWluZXJJZCA9IHRoaXMuY29udGFpbmVySWQ7XG4gICAgcGFja2V0LnNlbGVjdGVkU2xvdCA9IHNsb3Q7XG4gICAgcGFja2V0LnNsb3QgPSBzbG90O1xuICAgIHBhY2tldC5pdGVtID0gaXRlbURlc2NyaXB0b3I7XG5cbiAgICAvLyBTZXQgdGhlIHNlbGVjdGVkIHNsb3QgdG8gdGhlIHNsb3RcbiAgICB0aGlzLnNlbGVjdGVkU2xvdCA9IHNsb3Q7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgIHRoaXMuZW50aXR5LnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblNwYXduKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSBjb21wb25lbnRcbiAgICBpZiAodGhpcy5lbnRpdHkuY29tcG9uZW50cy5oYXMoXCJpbnZlbnRvcnlcIikpIHtcbiAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IGNvbXBvbmVudCBmcm9tIHRoZSBlbnRpdHlcbiAgICAgIGNvbnN0IGludmVudG9yeSA9IHRoaXMuZW50aXR5LmNvbXBvbmVudHMuZ2V0KFxuICAgICAgICBcImludmVudG9yeVwiXG4gICAgICApIGFzIEludmVudG9yeUNvbXBvbmVudDtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggaXRlbSBpbiB0aGUgaW52ZW50b3J5XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW52ZW50b3J5Lml0ZW1zKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc2xvdCBhbmQgZW50cnkgZnJvbSB0aGUgaXRlbVxuICAgICAgICBjb25zdCBzbG90ID0gaXRlbVswXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gaXRlbVsxXSBhcyBJdGVtU3RhY2tFbnRyeTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbSBzdGFja1xuICAgICAgICBjb25zdCBzdGFjayA9IG5ldyBJdGVtU3RhY2soZW50cnkuaWRlbnRpZmllciwge1xuICAgICAgICAgIGFtb3VudDogZW50cnkuYW1vdW50LFxuICAgICAgICAgIGF1eGlsbGFyeTogZW50cnkuYXV4aWxsYXJ5LFxuICAgICAgICAgIHdvcmxkOiB0aGlzLmVudGl0eS5nZXRXb3JsZCgpLFxuICAgICAgICAgIGVudHJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgaXRlbSBzdGFjayB0byB0aGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNldEl0ZW0oc2xvdCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXJcbiAgICBpZiAodGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkgdGhpcy5jb250YWluZXIudXBkYXRlKHRoaXMuZW50aXR5KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlc3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGludmVudG9yeSBjb21wb25lbnRcbiAgICBjb25zdCBpbnZlbnRvcnk6IEludmVudG9yeUNvbXBvbmVudCA9IHtcbiAgICAgIHNpemU6IHRoaXMuaW52ZW50b3J5U2l6ZSxcbiAgICAgIGl0ZW1zOiBbXVxuICAgIH07XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBpdGVtIGluIHRoZSBjb250YWluZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW52ZW50b3J5U2l6ZTsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIGl0ZW0gc3RhY2sgYXQgdGhlIGluZGV4XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jb250YWluZXIuZ2V0SXRlbShpKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgbnVsbFxuICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBHZXQgdGhlIGRhdGEgZW50cnkgb2YgdGhlIGl0ZW0gc3RhY2tcbiAgICAgIGNvbnN0IGVudHJ5ID0gaXRlbS5nZXREYXRhRW50cnkoKTtcblxuICAgICAgLy8gUHVzaCB0aGUgaXRlbSBzdGFjayBlbnRyeSB0byB0aGUgaW52ZW50b3J5IGl0ZW1zXG4gICAgICBpbnZlbnRvcnkuaXRlbXMucHVzaChbaSwgZW50cnldKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGludmVudG9yeSBjb21wb25lbnQgdG8gdGhlIGVudGl0eVxuICAgIHRoaXMuZW50aXR5LmNvbXBvbmVudHMuc2V0KFwiaW52ZW50b3J5XCIsIGludmVudG9yeSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5SW52ZW50b3J5VHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBDb250YWluZXJJZCxcbiAgQ29udGFpbmVyT3BlblBhY2tldCxcbiAgQ29udGFpbmVyVHlwZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IFBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4vZW50aXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi9wbGF5ZXJcIjtcblxuY2xhc3MgRW50aXR5Q29udGFpbmVyIGV4dGVuZHMgQ29udGFpbmVyIHtcbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCB0aGlzIGNvbnRhaW5lciBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgdHlwZTogQ29udGFpbmVyVHlwZSxcbiAgICBpZGVudGlmaWVyOiBDb250YWluZXJJZCxcbiAgICBzaXplOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIodHlwZSwgaWRlbnRpZmllciwgc2l6ZSk7XG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gIH1cblxuICBwdWJsaWMgc2V0SXRlbShzbG90OiBudW1iZXIsIGl0ZW1TdGFjazogSXRlbVN0YWNrKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0SXRlbSBtZXRob2RcbiAgICBzdXBlci5zZXRJdGVtKHNsb3QsIGl0ZW1TdGFjayk7XG5cbiAgICAvLyBTZXQgdGhlIHdvcmxkIGluIHRoZSBpdGVtIHN0YWNrIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICBpZiAoIWl0ZW1TdGFjay53b3JsZCkgaXRlbVN0YWNrLndvcmxkID0gdGhpcy5lbnRpdHkuZ2V0V29ybGQoKTtcbiAgICBpdGVtU3RhY2suaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllclxuICAgIGlmICh0aGlzLmVudGl0eS5pc1BsYXllcigpKSB0aGlzLnVwZGF0ZSh0aGlzLmVudGl0eSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTbG90KHNsb3Q6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGNsZWFyU2xvdCBtZXRob2RcbiAgICBzdXBlci5jbGVhclNsb3Qoc2xvdCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbnRhaW5lciBpZiB0aGUgZW50aXR5IGlzIGEgcGxheWVyXG4gICAgaWYgKHRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHRoaXMudXBkYXRlKHRoaXMuZW50aXR5KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUocGxheWVyPzogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgdXBkYXRlIG1ldGhvZFxuICAgIHN1cGVyLnVwZGF0ZShwbGF5ZXIpO1xuXG4gICAgLy8gQ2FsbCB0aGUgb25Db250YWluZXJVcGRhdGUgbWV0aG9kIGZvciB0aGUgYmxvY2sgdHJhaXRzXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLmVudGl0eS50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhbGwgdGhlIHRyYWl0IG1ldGhvZFxuICAgICAgICB0cmFpdC5vbkNvbnRhaW5lclVwZGF0ZT8uKHRoaXMpO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5lbnRpdHlcbiAgICAgICAgICAuZ2V0V29ybGQoKVxuICAgICAgICAgIC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHRyaWdnZXIgb25Db250YWluZXJVcGRhdGUgdHJhaXQgZXZlbnQgZm9yIGVudGl0eSBcIiR7dGhpcy5lbnRpdHkudHlwZS5pZGVudGlmaWVyfToke3RoaXMuZW50aXR5LnVuaXF1ZUlkfVwiIGluIGRpbWVuc2lvbiBcIiR7dGhpcy5lbnRpdHkuZGltZW5zaW9uLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgKTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIGVudGl0eVxuICAgICAgICB0aGlzLmVudGl0eS50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93KHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJPcGVuZWRDb250YWluZXJTaWduYWwocGxheWVyLCB0aGlzKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZFxuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuXG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2hvdyBtZXRob2RcbiAgICBzdXBlci5zaG93KHBsYXllcik7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQ29udGFpbmVyT3BlblBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBDb250YWluZXJPcGVuUGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXNcbiAgICBwYWNrZXQuaWRlbnRpZmllciA9IHRoaXMuaWRlbnRpZmllcjtcbiAgICBwYWNrZXQudHlwZSA9IHRoaXMudHlwZTtcbiAgICBwYWNrZXQucG9zaXRpb24gPSB0aGlzLmVudGl0eS5wb3NpdGlvbjtcbiAgICBwYWNrZXQudW5pcXVlSWQgPSB0aGlzLmVudGl0eS51bmlxdWVJZDtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgcGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlDb250YWluZXIgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckV2ZW50SWRzLFxuICBBY3RvckV2ZW50UGFja2V0LFxuICBMZXZlbFNvdW5kRXZlbnQsXG4gIExldmVsU291bmRFdmVudFBhY2tldCxcbiAgVGFrZUl0ZW1BY3RvclBhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciwgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi8uLi9pdGVtXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vcGxheWVyXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2tFbnRyeSB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCB9IGZyb20gXCIuL2ludmVudG9yeVwiO1xuXG5jbGFzcyBFbnRpdHlJdGVtU3RhY2tUcmFpdCBleHRlbmRzIEVudGl0eVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJpdGVtc3RhY2tcIjtcblxuICAvKipcbiAgICogVGhlIGJpcnRoIHRpY2sgb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmlydGhUaWNrOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHN0YWNrIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgaXRlbVN0YWNrOiBJdGVtU3RhY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBsaWZlc3BhbiBvZiB0aGUgaXRlbSBpbiB0aWNrcy5cbiAgICovXG4gIHB1YmxpYyBsaWZlU3BhbjogbnVtYmVyID0gNjAwMDtcblxuICAvKipcbiAgICogVGhlIHBpY2t1cCB0aWNrIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBpY2t1cFRpY2s6IGJpZ2ludCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHBsYXllciBvZiB0aGUgaXRlbS5cbiAgICovXG4gIHByb3RlY3RlZCB0YXJnZXQ6IFBsYXllciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVyZ2luZyBzdGF0ZSBvZiB0aGUgaXRlbS5cbiAgICovXG4gIHByb3RlY3RlZCBtZXJnaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IGludmVudG9yeSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gaXRlbVN0YWNrIFRoZSBpdGVtIHN0YWNrIG9mIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIEEgbmV3IGVudGl0eSBpbnZlbnRvcnkgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoZW50aXR5KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgdHlwZSBpcyBhbiBpdGVtXG4gICAgLy8gSWYgbm90IHdlIHRocm93IGFuIGVycm9yXG4gICAgaWYgKGVudGl0eS50eXBlLmlkZW50aWZpZXIgIT09IEVudGl0eUlkZW50aWZpZXIuSXRlbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW50aXR5IG11c3QgYmUgYW4gaXRlbVwiKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGNvbXBvbmVudCBvZiB0aGUgaXRlbSBzdGFjayBmcm9tIHRoZSBlbnRpdHlcbiAgICBjb25zdCBlbnRyeSA9IGVudGl0eS5jb21wb25lbnRzLmdldChcIml0ZW1zdGFja1wiKSBhcyBJdGVtU3RhY2tFbnRyeTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyeSBleGlzdHNcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIC8vIFNldCB0aGUgaXRlbSBzdGFjayBvZiB0aGUgY29tcG9uZW50XG4gICAgICB0aGlzLml0ZW1TdGFjayA9IG5ldyBJdGVtU3RhY2soZW50cnkuaWRlbnRpZmllciwgeyBlbnRyeSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2V0IHRoZSBpdGVtIHN0YWNrIG9mIHRoZSBjb21wb25lbnRcbiAgICAgIHRoaXMuaXRlbVN0YWNrID0gbmV3IEl0ZW1TdGFjayhJdGVtSWRlbnRpZmllci5BaXIpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgYmlydGggdGljayBvZiB0aGUgaXRlbVxuICAgIHRoaXMuYmlydGhUaWNrID0gZW50aXR5LmRpbWVuc2lvbi53b3JsZC5jdXJyZW50VGljaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaWZlc3BhbiBvZiB0aGUgaXRlbS5cbiAgICogQHJldHVybnMgVGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldExpZmVTcGFuKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubGlmZVNwYW47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbGlmZXNwYW4gb2YgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbGlmZXNwYW4gb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgc2V0TGlmZVNwYW4odmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubGlmZVNwYW4gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB1cCB0aGUgaXRlbSBieSBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgcGlja2VkIHVwIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHBpY2t1cChwbGF5ZXI6IFBsYXllcik6IHZvaWQge1xuICAgIC8vIFRlbGVwb3J0IHRoZSBpdGVtIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmVudGl0eS50ZWxlcG9ydChwbGF5ZXIucG9zaXRpb24pO1xuXG4gICAgLy8gU2V0IHRoZSBwbGF5ZXIgYXMgdGhlIHRhcmdldFxuICAgIHRoaXMudGFyZ2V0ID0gcGxheWVyO1xuXG4gICAgLy8gU2V0IHRoZSBwaWNrdXAgdGlja1xuICAgIHRoaXMucGlja3VwVGljayA9IHRoaXMuZW50aXR5LmRpbWVuc2lvbi53b3JsZC5jdXJyZW50VGljaztcbiAgfVxuXG4gIHB1YmxpYyBpbmNyZW1lbnQoYW1vdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtU3RhY2suaW5jcmVtZW50KGFtb3VudCk7XG5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgQWN0b3JFdmVudFBhY2tldCgpO1xuICAgIHBhY2tldC5ldmVudElkID0gQWN0b3JFdmVudElkcy5JVEVNX0VOVElUWV9NRVJHRTtcbiAgICBwYWNrZXQuZXZlbnREYXRhID0gdGhpcy5pdGVtU3RhY2suYW1vdW50O1xuICAgIHBhY2tldC5hY3RvclJ1bnRpbWVJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcblxuICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWNyZW1lbnQoYW1vdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtU3RhY2suZGVjcmVtZW50KGFtb3VudCk7XG5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgQWN0b3JFdmVudFBhY2tldCgpO1xuICAgIHBhY2tldC5ldmVudElkID0gQWN0b3JFdmVudElkcy5JVEVNX0VOVElUWV9NRVJHRTtcbiAgICBwYWNrZXQuZXZlbnREYXRhID0gdGhpcy5pdGVtU3RhY2suYW1vdW50O1xuICAgIHBhY2tldC5hY3RvclJ1bnRpbWVJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcblxuICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gU2V0IHRoZSBpdGVtIHN0YWNrIGNvbXBvbmVudCBvZiB0aGUgZW50aXR5XG4gICAgdGhpcy5lbnRpdHkuY29tcG9uZW50cy5zZXQoXCJpdGVtc3RhY2tcIiwgdGhpcy5pdGVtU3RhY2suZ2V0RGF0YUVudHJ5KCkpO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHRpY2tcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5lbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgb24gdGhlIGdyb3VuZCBhbmQgdGhlIGN1cnJlbnQgdGljayBpcyBhIG11bHRpcGxlIG9mIDI1XG4gICAgaWYgKFxuICAgICAgdGhpcy5lbnRpdHkub25Hcm91bmQgJiZcbiAgICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi53b3JsZC5jdXJyZW50VGljayAlIDI1biA9PT0gMG4gJiZcbiAgICAgIHRoaXMucGlja3VwVGljayA9PT0gbnVsbFxuICAgICkge1xuICAgICAgLy8gR2V0IGFsbCB0aGUgaXRlbSBlbnRpdGllcyBpbiB0aGUgZGltZW5zaW9uXG4gICAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuZW50aXR5LmRpbWVuc2lvblxuICAgICAgICAuZ2V0RW50aXRpZXMoKVxuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4LmlzSXRlbSgpKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBleGlzdGluZyBpdGVtIHN0YWNrIG5lYXJieSB3aXRoaW4gYSAwLjUgYmxvY2sgcmFkaXVzXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZW50aXR5XSBvZiBlbnRpdGllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgLy8gQ29udGludWUgaWYgdGhlIGl0ZW0gaXMgYmVpbmcgbWVyZ2VkXG4gICAgICAgIGlmICh0aGlzLm1lcmdpbmcgJiYgaW5kZXggIT09IGVudGl0aWVzLmxlbmd0aCAtIDEpIGNvbnRpbnVlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBiZWluZyBtZXJnZWQgYW5kIHRoZSBlbnRpdHkgaXMgdGhlIGxhc3QgaXRlbVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1lcmdpbmcgJiYgaW5kZXggPT09IGVudGl0aWVzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgLy8gU2V0IG1lcmdpbmcgdG8gZmFsc2UgYXMgaXRzIGRvbmVcbiAgICAgICAgICB0aGlzLm1lcmdpbmcgPSBmYWxzZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIHRoZSBzYW1lIGFzIHRoZSBpdGVtXG4gICAgICAgIGlmIChlbnRpdHkgPT09IHRoaXMuZW50aXR5KSBjb250aW51ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGVudGl0aWVzXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZW50aXR5LnBvc2l0aW9uLnN1YnRyYWN0KHRoaXMuZW50aXR5LnBvc2l0aW9uKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgaXMgbGVzcyB0aGFuIDAuNSBibG9ja3NcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLngpIDw9IDAuOSAmJlxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnkpIDw9IDAuOSAmJlxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnopIDw9IDAuOVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gY29tcG9uZW50IG9mIHRoZSBlbnRpdHlcbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SXRlbVN0YWNrVHJhaXQpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IGNvbXBvbmVudC5pdGVtU3RhY2s7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgaXRlbSBzdGFjayBpcyBmdWxsXG4gICAgICAgICAgaWYgKGV4aXN0aW5nSXRlbS5hbW91bnQgPj0gZXhpc3RpbmdJdGVtLm1heEFtb3VudCkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBzdGFja3MgYXJlIHRoZSBzYW1lXG4gICAgICAgICAgaWYgKCFleGlzdGluZ0l0ZW0uZXF1YWxzKHRoaXMuaXRlbVN0YWNrKSkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIGl0ZW0gc3RhY2sgYW5kIGRlc3Bhd24gdGhlIGV4aXN0aW5nIGl0ZW1cbiAgICAgICAgICB0aGlzLmluY3JlbWVudChleGlzdGluZ0l0ZW0uYW1vdW50KTtcbiAgICAgICAgICBjb21wb25lbnQuZW50aXR5LmRlc3Bhd24oKTtcblxuICAgICAgICAgIC8vIFNldCBtZXJnaW5nIHRvIHRydWVcbiAgICAgICAgICB0aGlzLm1lcmdpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSB0YXJnZXQgcGxheWVyXG4gICAgaWYgKFxuICAgICAgdGhpcy50YXJnZXQgJiYgLy8gQ2hlY2sgaWYgdGhlIHBpY2t1cCB0aWNrIGlzIG5vdCBudWxsXG4gICAgICB0aGlzLnBpY2t1cFRpY2sgJiYgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdGljayBpcyBncmVhdGVyIHRoYW4gdGhlIHBpY2t1cCB0aWNrXG4gICAgICBjdXJyZW50IC0gdGhpcy5waWNrdXBUaWNrID49IDVuXG4gICAgKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgdGFrZSBpdGVtIGFjdG9yIHBhY2tldFxuICAgICAgY29uc3QgdGFrZSA9IG5ldyBUYWtlSXRlbUFjdG9yUGFja2V0KCk7XG4gICAgICB0YWtlLml0ZW1SdW50aW1lSWQgPSB0aGlzLmVudGl0eS5ydW50aW1lSWQ7XG4gICAgICB0YWtlLnRhcmdldFJ1bnRpbWVJZCA9IHRoaXMudGFyZ2V0LnJ1bnRpbWVJZDtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxldmVsIHNvdW5kIGV2ZW50IHBhY2tldFxuICAgICAgY29uc3Qgc291bmQgPSBuZXcgTGV2ZWxTb3VuZEV2ZW50UGFja2V0KCk7XG4gICAgICBzb3VuZC5ldmVudCA9IExldmVsU291bmRFdmVudC5Qb3A7XG4gICAgICBzb3VuZC5wb3NpdGlvbiA9IHRoaXMudGFyZ2V0LnBvc2l0aW9uO1xuICAgICAgc291bmQuYWN0b3JJZGVudGlmaWVyID0gdGhpcy5lbnRpdHkudHlwZS5pZGVudGlmaWVyO1xuICAgICAgc291bmQuZGF0YSA9IC0xO1xuICAgICAgc291bmQuaXNCYWJ5TW9iID0gZmFsc2U7XG4gICAgICBzb3VuZC5pc0dsb2JhbCA9IGZhbHNlO1xuXG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXRzIHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMudGFyZ2V0LnNlbmQoc291bmQpO1xuICAgICAgdGhpcy50YXJnZXQuZGltZW5zaW9uLmJyb2FkY2FzdCh0YWtlKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGludmVudG9yeSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGludmVudG9yeSA9IHRoaXMudGFyZ2V0LmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgLy8gQWRkIHRoZSBpdGVtIHRvIHRoZSBwbGF5ZXJzIGludmVudG9yeVxuICAgICAgaW52ZW50b3J5LmNvbnRhaW5lci5hZGRJdGVtKHRoaXMuaXRlbVN0YWNrKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIGRpbWVuc2lvblxuICAgICAgdGhpcy5lbnRpdHkuZGVzcGF3bigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50YXJnZXQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGFsaXZlIGZvciAxMCB0aWNrc1xuICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgaXRlbSBmcm9tIGJlaW5nIHBpY2tlZCB1cCBpbW1lZGlhdGVseVxuICAgIGlmIChjdXJyZW50IC0gdGhpcy5iaXJ0aFRpY2sgPD0gMTBuKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0aWNrIGlzIGEgbXVsdGlwbGUgb2YgNVxuICAgIGlmIChjdXJyZW50ICUgNW4gIT09IDBuKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBsYXllciBuZWFyYnkgd2l0aGluIGEgMSBibG9jayByYWRpdXNcbiAgICBjb25zdCBwbGF5ZXJzID0gdGhpcy5lbnRpdHkuZGltZW5zaW9uLmdldFBsYXllcnMoKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5lbnRpdHkucG9zaXRpb247XG5cbiAgICAvLyBDaGVjayBpZiBhIHBsYXllciBpcyB3aXRoaW4gYSAxIGJsb2NrIHJhZGl1c1xuICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHBsYXllcnMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgYWxpdmVcbiAgICAgIGlmICghcGxheWVyLmlzQWxpdmUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBsYXllciBhbmQgdGhlIGl0ZW1cbiAgICAgIGNvbnN0IHBsYXllclBvcyA9IHBsYXllci5wb3NpdGlvbjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gcGxheWVyUG9zLnN1YnRyYWN0KGl0ZW0pO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBsYXllciBhbmQgdGhlIGl0ZW1cbiAgICAgIGlmIChcbiAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UueCkgPD0gMSAmJlxuICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS55IC0gMSkgPD0gMSAmJlxuICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS56KSA8PSAxXG4gICAgICApIHtcbiAgICAgICAgLy8gU2V0IHRoZSBwbGF5ZXIgYXMgdGhlIHRhcmdldFxuICAgICAgICB0aGlzLnRhcmdldCA9IHBsYXllcjtcblxuICAgICAgICAvLyBTZXQgdGhlIHBpY2t1cCB0aWNrXG4gICAgICAgIHRoaXMucGlja3VwVGljayA9IGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gYWxpdmUgZm9yIHRoZSBsaWZlc3BhblxuICAgIGlmIChjdXJyZW50IC0gdGhpcy5iaXJ0aFRpY2sgPj0gQmlnSW50KHRoaXMubGlmZVNwYW4pKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgZGltZW5zaW9uXG4gICAgICB0aGlzLmVudGl0eS5kZXNwYXduKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUl0ZW1TdGFja1RyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgUGxheWVyTGlzdEFjdGlvbixcbiAgUGxheWVyTGlzdFBhY2tldCxcbiAgUGxheWVyTGlzdFJlY29yZFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBQbGF5ZXJUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIFBsYXllckxpc3RUcmFpdCBleHRlbmRzIFBsYXllclRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbGF5ZXJfbGlzdFwiO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVycyB0aGF0IGFyZSBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIHBsYXllciBsaXN0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBwbGF5ZXIgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgYWxsIHRoZSBwbGF5ZXJzIGZyb20gdGhlIHBsYXllciBsaXN0XG4gICAgY29uc3QgcmVtb3ZlID0gbmV3IFBsYXllckxpc3RQYWNrZXQoKTtcbiAgICByZW1vdmUuYWN0aW9uID0gUGxheWVyTGlzdEFjdGlvbi5SZW1vdmU7XG4gICAgcmVtb3ZlLnJlY29yZHMgPSBbLi4udGhpcy5wbGF5ZXJzXS5tYXAoXG4gICAgICAodXVpZCkgPT4gbmV3IFBsYXllckxpc3RSZWNvcmQodXVpZClcbiAgICApO1xuXG4gICAgLy8gQ2xlYXIgdGhlIHBsYXllciBsaXN0XG4gICAgdGhpcy5wbGF5ZXJzLmNsZWFyKCk7XG5cbiAgICAvLyBTZW5kIHRoZSByZW1vdmUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnBsYXllci5zZW5kKHJlbW92ZSk7XG4gIH1cblxuICBwdWJsaWMgb25UaWNrKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgc3Bhd25lZFxuICAgIGlmICghdGhpcy5wbGF5ZXIuaXNBbGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHRpY2sgb2YgdGhlIHdvcmxkXG4gICAgY29uc3QgY3VycmVudFRpY2sgPSB0aGlzLnBsYXllci5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2s7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0aWNrIGlzIGRpdmlzaWJsZSBieSAyMFxuICAgIC8vIFdlIGRvbid0IG5lZWQgdGhpcyBydW5uaW5nIGV2ZXJ5IHRpY2tcbiAgICBpZiAoY3VycmVudFRpY2sgJSAyMG4gIT09IDBuKSByZXR1cm47XG5cbiAgICAvLyBHZXQgYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBwbGF5ZXIncyB3b3JsZFxuICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLnBsYXllci5kaW1lbnNpb24ud29ybGQuZ2V0UGxheWVycygpO1xuXG4gICAgLy8gRmlsdGVyIG91dCB0aGUgcGxheWVycyB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBwbGF5ZXIgbGlzdCAmIGlmIHRoZSBwbGF5ZXIgaXMgc3Bhd25lZFxuICAgIGNvbnN0IGFkZGluZyA9IHBsYXllcnMuZmlsdGVyKFxuICAgICAgKHBsYXllcikgPT4gIXRoaXMucGxheWVycy5oYXMocGxheWVyLnV1aWQpICYmIHBsYXllci5pc0FsaXZlXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5ZXIgbGlzdCBwYWNrZXQgZm9yIHRoZSBwbGF5ZXJzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgcGxheWVyIGxpc3RcbiAgICBjb25zdCBhZGQgPSBuZXcgUGxheWVyTGlzdFBhY2tldCgpO1xuICAgIGFkZC5hY3Rpb24gPSBQbGF5ZXJMaXN0QWN0aW9uLkFkZDtcbiAgICBhZGQucmVjb3JkcyA9IGFkZGluZy5tYXAoKHBsYXllcikgPT4gKHtcbiAgICAgIHVuaXF1ZUlkOiBwbGF5ZXIudW5pcXVlSWQsXG4gICAgICB1dWlkOiBwbGF5ZXIudXVpZCxcbiAgICAgIHh1aWQ6IHBsYXllci54dWlkLFxuICAgICAgdXNlcm5hbWU6IHBsYXllci51c2VybmFtZSxcbiAgICAgIHNraW46IHBsYXllci5za2luLFxuICAgICAgcGxhdGZvcm1CdWlsZDogMCwgLy8gVE9ETzogR2V0IHRoZSBwbGF0Zm9ybSBidWlsZCBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgIHBsYXRmb3JtQ2hhdElkZW50aWZpZXI6IFwiXCIsXG4gICAgICBpc0hvc3Q6IGZhbHNlLFxuICAgICAgaXNWaXNpdG9yOiBmYWxzZSxcbiAgICAgIGlzVGVhY2hlcjogZmFsc2VcbiAgICB9KSk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IHRoZSBwbGF5ZXJzIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHBsYXllciBsaXN0XG4gICAgY29uc3QgcmVtb3ZpbmcgPSBbLi4udGhpcy5wbGF5ZXJzXS5maWx0ZXIoXG4gICAgICAodXVpZCkgPT4gIXBsYXllcnMuc29tZSgoeCkgPT4geC51dWlkID09PSB1dWlkKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWVyIGxpc3QgcGFja2V0IGZvciB0aGUgcGxheWVycyB0aGF0IG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBwbGF5ZXIgbGlzdFxuICAgIGNvbnN0IHJlbW92ZSA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgcmVtb3ZlLmFjdGlvbiA9IFBsYXllckxpc3RBY3Rpb24uUmVtb3ZlO1xuICAgIHJlbW92ZS5yZWNvcmRzID0gcmVtb3ZpbmcubWFwKCh1dWlkKSA9PiBuZXcgUGxheWVyTGlzdFJlY29yZCh1dWlkKSk7XG5cbiAgICAvLyBTZW5kIHRoZSBwbGF5ZXIgbGlzdCBwYWNrZXRzIHRvIHRoZSBwbGF5ZXJcbiAgICBpZiAoYWRkLnJlY29yZHMubGVuZ3RoID4gMCkgdGhpcy5wbGF5ZXIuc2VuZChhZGQpO1xuICAgIGlmIChyZW1vdmUucmVjb3Jkcy5sZW5ndGggPiAwKSB0aGlzLnBsYXllci5zZW5kKHJlbW92ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBsYXllciBsaXN0XG4gICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgYWRkaW5nKSB7XG4gICAgICAvLyBBZGQgdGhlIHBsYXllciB0byB0aGUgcGxheWVyIGxpc3RcbiAgICAgIHRoaXMucGxheWVycy5hZGQocGxheWVyLnV1aWQpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHBsYXllcidzIG1ldGFkYXRhIGFuZCBhYmlsaXRpZXNcbiAgICAgIHBsYXllci5tZXRhZGF0YS51cGRhdGUoKTtcbiAgICAgIHBsYXllci5hYmlsaXRpZXMudXBkYXRlKCk7XG4gICAgICBwbGF5ZXIuYWJpbGl0aWVzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgcGxheWVyIGxpc3RcbiAgICBmb3IgKGNvbnN0IHV1aWQgb2YgcmVtb3ZpbmcpIHRoaXMucGxheWVycy5kZWxldGUodXVpZCk7XG4gIH1cblxuICBwdWJsaWMgb25EZXNwYXduKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSBwbGF5ZXIgbGlzdFxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJMaXN0VHJhaXQgfTtcbiIsICJpbXBvcnQgeyBDb250YWluZXJJZCwgQ29udGFpbmVyVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlDb250YWluZXIgfSBmcm9tIFwiLi4vLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vcGxheWVyXCI7XG5cbmltcG9ydCB7IFBsYXllclRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgUGxheWVyQ3Vyc29yVHJhaXQgZXh0ZW5kcyBQbGF5ZXJUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiY3Vyc29yXCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUgaW52ZW50b3J5IGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogRW50aXR5Q29udGFpbmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBjb250YWluZXIgdGhhdCB0aGlzIHRyYWl0IHJlcHJlc2VudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZSA9IENvbnRhaW5lclR5cGUuSW52ZW50b3J5O1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoYXQgdGhpcyB0cmFpdCByZXByZXNlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcklkOiBDb250YWluZXJJZCA9IENvbnRhaW5lcklkLlVpO1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHNsb3RzIGluIHRoZSBpbnZlbnRvcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW52ZW50b3J5U2l6ZTogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogVGhlIHNlbGVjdGVkIHNsb3QgaW4gdGhlIGludmVudG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RlZFNsb3Q6IG51bWJlciA9IDA7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIocGxheWVyKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb250YWluZXJcbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBFbnRpdHlDb250YWluZXIoXG4gICAgICBwbGF5ZXIsXG4gICAgICB0aGlzLmNvbnRhaW5lclR5cGUsXG4gICAgICB0aGlzLmNvbnRhaW5lcklkLFxuICAgICAgdGhpcy5pbnZlbnRvcnlTaXplXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJDdXJzb3JUcmFpdCB9O1xuIiwgImltcG9ydCB7IEF0dHJpYnV0ZU5hbWUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgRW50aXR5QXR0cmlidXRlVHJhaXQgfSBmcm9tIFwiLi4vYXR0cmlidXRlXCI7XG5cbmNsYXNzIFBsYXllclNhdHVyYXRpb25UcmFpdCBleHRlbmRzIEVudGl0eUF0dHJpYnV0ZVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJzYXR1cmF0aW9uXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIHB1YmxpYyBhdHRyaWJ1dGU6IEF0dHJpYnV0ZU5hbWUgPSBBdHRyaWJ1dGVOYW1lLlBsYXllclNhdHVyYXRpb247XG4gIHB1YmxpYyBlZmZlY3RpdmVNYXg6IG51bWJlciA9IDIwO1xuICBwdWJsaWMgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAyMDtcbiAgcHVibGljIGVmZmVjdGl2ZU1pbjogbnVtYmVyID0gMDtcbn1cblxuZXhwb3J0IHsgUGxheWVyU2F0dXJhdGlvblRyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JEYW1hZ2VDYXVzZSxcbiAgQXR0cmlidXRlTmFtZSxcbiAgR2FtZW1vZGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUF0dHJpYnV0ZVRyYWl0LCBFbnRpdHlIZWFsdGhUcmFpdCB9IGZyb20gXCIuLi9hdHRyaWJ1dGVcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgUGxheWVyRXhoYXVzdGlvblRyYWl0IH0gZnJvbSBcIi4vZXhoYXVzdGlvblwiO1xuaW1wb3J0IHsgUGxheWVyU2F0dXJhdGlvblRyYWl0IH0gZnJvbSBcIi4vc2F0dXJhdGlvblwiO1xuXG5jbGFzcyBQbGF5ZXJIdW5nZXJUcmFpdCBleHRlbmRzIEVudGl0eUF0dHJpYnV0ZVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJodW5nZXJcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlczogQXJyYXk8RW50aXR5SWRlbnRpZmllcj4gPSBbXG4gICAgRW50aXR5SWRlbnRpZmllci5QbGF5ZXJcbiAgXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ2ZWFibGVHYW1lbW9kZXMgPSBbXG4gICAgR2FtZW1vZGUuQWR2ZW50dXJlLFxuICAgIEdhbWVtb2RlLlN1cnZpdmFsXG4gIF07XG5cbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdGl2ZU1heDogbnVtYmVyID0gMjA7XG4gIHB1YmxpYyByZWFkb25seSBlZmZlY3RpdmVNaW46IG51bWJlciA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDIwO1xuICBwdWJsaWMgcmVhZG9ubHkgYXR0cmlidXRlOiBBdHRyaWJ1dGVOYW1lID0gQXR0cmlidXRlTmFtZS5QbGF5ZXJIdW5nZXI7XG5cbiAgcHJpdmF0ZSBleGhhdXN0aW9uVHJhaXQ/OiBQbGF5ZXJFeGhhdXN0aW9uVHJhaXQ7XG4gIHByaXZhdGUgc2F0dXJhdGlvblRyYWl0PzogUGxheWVyU2F0dXJhdGlvblRyYWl0O1xuICBwcml2YXRlIHRpbWVyOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSkge1xuICAgIHN1cGVyKGVudGl0eSk7XG4gICAgaWYgKCFlbnRpdHkuaXNQbGF5ZXIoKSkgZW50aXR5LnJlbW92ZVRyYWl0KFBsYXllckh1bmdlclRyYWl0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZW50aXR5LmlzQWxpdmUgfHxcbiAgICAgICF0aGlzLmVudGl0eS5pc1BsYXllcigpIHx8XG4gICAgICAhdGhpcy5zdGFydmVhYmxlR2FtZW1vZGVzLmluY2x1ZGVzKHRoaXMuZW50aXR5LmdhbWVtb2RlKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBwbGF5ZXJIZWFsdGhUcmFpdCA9IHRoaXMuZW50aXR5LmdldFRyYWl0KEVudGl0eUhlYWx0aFRyYWl0KTtcblxuICAgIHRoaXMudGltZXIrKztcblxuICAgIGlmICh0aGlzLnRpbWVyID49IDgwKSB0aGlzLnRpbWVyID0gMDtcbiAgICBpZiAodGhpcy50aW1lciA9PSAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID49IDE4ICYmXG4gICAgICAgIHBsYXllckhlYWx0aFRyYWl0LmN1cnJlbnRWYWx1ZSA8IHBsYXllckhlYWx0aFRyYWl0LmVmZmVjdGl2ZU1heFxuICAgICAgKSB7XG4gICAgICAgIHBsYXllckhlYWx0aFRyYWl0LnNldChwbGF5ZXJIZWFsdGhUcmFpdC5jdXJyZW50VmFsdWUgKyAxKTtcbiAgICAgICAgdGhpcy5leGhhdXN0KDYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSA8PSAwKSB7XG4gICAgICAgIHBsYXllckhlYWx0aFRyYWl0LmFwcGx5RGFtYWdlKDEsIHVuZGVmaW5lZCwgQWN0b3JEYW1hZ2VDYXVzZS5TdGFydmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNwYXduKCk6IHZvaWQge1xuICAgIHRoaXMuZXhoYXVzdGlvblRyYWl0ID0gdGhpcy5lbnRpdHkuZ2V0VHJhaXQoUGxheWVyRXhoYXVzdGlvblRyYWl0KTtcbiAgICB0aGlzLnNhdHVyYXRpb25UcmFpdCA9IHRoaXMuZW50aXR5LmdldFRyYWl0KFBsYXllclNhdHVyYXRpb25UcmFpdCk7XG5cbiAgICBpZiAoIXRoaXMuZXhoYXVzdGlvblRyYWl0IHx8ICF0aGlzLnNhdHVyYXRpb25UcmFpdClcbiAgICAgIHRoaXMuZW50aXR5LnJlbW92ZVRyYWl0KFBsYXllckh1bmdlclRyYWl0KTtcbiAgfVxuXG4gIHB1YmxpYyBleGhhdXN0KGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNhdHVyYXRpb25UcmFpdCB8fCAhdGhpcy5leGhhdXN0aW9uVHJhaXQpIHJldHVybjtcbiAgICB0aGlzLmV4aGF1c3Rpb25UcmFpdC5pbmNyZWFzZShhbW91bnQpO1xuXG4gICAgd2hpbGUgKHRoaXMuZXhoYXVzdGlvblRyYWl0LmN1cnJlbnRWYWx1ZSA+PSA0KSB7XG4gICAgICB0aGlzLmV4aGF1c3Rpb25UcmFpdC5kZWNyZWFzZSg0KTtcblxuICAgICAgaWYgKHRoaXMuc2F0dXJhdGlvblRyYWl0LmN1cnJlbnRWYWx1ZSA+IDApIHtcbiAgICAgICAgdGhpcy5zYXR1cmF0aW9uVHJhaXQuc2V0KFxuICAgICAgICAgIE1hdGgubWF4KDAsIHRoaXMuc2F0dXJhdGlvblRyYWl0LmN1cnJlbnRWYWx1ZSAtIDEpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VycmVudFZhbHVlID4gMCkgdGhpcy5jdXJyZW50VmFsdWUtLTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNIdW5ncnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlIDwgdGhpcy5lZmZlY3RpdmVNYXg7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVySHVuZ2VyVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBBdHRyaWJ1dGVOYW1lIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUF0dHJpYnV0ZVRyYWl0IH0gZnJvbSBcIi4uL2F0dHJpYnV0ZVwiO1xuXG5jbGFzcyBQbGF5ZXJFeGhhdXN0aW9uVHJhaXQgZXh0ZW5kcyBFbnRpdHlBdHRyaWJ1dGVUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZXhoYXVzdGlvblwiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICBwdWJsaWMgYXR0cmlidXRlOiBBdHRyaWJ1dGVOYW1lID0gQXR0cmlidXRlTmFtZS5QbGF5ZXJFeGhhdXN0aW9uO1xuICBwdWJsaWMgZWZmZWN0aXZlTWF4OiBudW1iZXIgPSA1O1xuICBwdWJsaWMgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZWZmZWN0aXZlTWluOiBudW1iZXIgPSAwO1xufVxuXG5leHBvcnQgeyBQbGF5ZXJFeGhhdXN0aW9uVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBBY3RvckZsYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEVudGl0eUdyYXZpdHlUcmFpdCBleHRlbmRzIEVudGl0eVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJncmF2aXR5XCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBtZXRhZGF0YSBmbGFnIHZhbHVlIGZvciBncmF2aXR5XG4gICAgaWYgKCF0aGlzLmVudGl0eS5mbGFncy5oYXMoQWN0b3JGbGFnLkhhc0dyYXZpdHkpKSB7XG4gICAgICAvLyBTZXQgdGhlIGVudGl0eSBmbGFnIGZvciBncmF2aXR5XG4gICAgICB0aGlzLmVudGl0eS5mbGFncy5zZXQoQWN0b3JGbGFnLkhhc0dyYXZpdHksIHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlHcmF2aXR5VHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckRhdGFJZCxcbiAgQWN0b3JEYXRhVHlwZSxcbiAgQWN0b3JGbGFnLFxuICBEYXRhSXRlbSxcbiAgR2FtZW1vZGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBFbnRpdHlDb2xsaXNpb24gZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiY29sbGlzaW9uXCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVudGl0eSBjb2xsaXNpb24gYm94LlxuICAgKi9cbiAgcHVibGljIGhlaWdodDogbnVtYmVyID0gMS43O1xuXG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIGVudGl0eSBjb2xsaXNpb24gYm94LlxuICAgKi9cbiAgcHVibGljIHdpZHRoOiBudW1iZXIgPSAwLjY7XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBtZXRhZGF0YSBmbGFnIHZhbHVlIGZvciBncmF2aXR5XG4gICAgaWYgKCF0aGlzLmVudGl0eS5mbGFncy5oYXMoQWN0b3JGbGFnLkhhc0NvbGxpc2lvbikpIHtcbiAgICAgIC8vIFNldCB0aGUgZW50aXR5IGZsYWcgZm9yIGdyYXZpdHlcbiAgICAgIHRoaXMuZW50aXR5LmZsYWdzLnNldChBY3RvckZsYWcuSGFzQ29sbGlzaW9uLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIHZhbHVlIGZvciBjb2xsaXNpb24gaGVpZ2h0XG4gICAgaWYgKCF0aGlzLmVudGl0eS5tZXRhZGF0YS5oYXMoQWN0b3JEYXRhSWQuUmVzZXJ2ZWQwNTQpKSB7XG4gICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgaGVpZ2h0IHZhbHVlXG4gICAgICB0aGlzLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBtZXRhZGF0YSB2YWx1ZSBmb3IgY29sbGlzaW9uIHdpZHRoXG4gICAgaWYgKCF0aGlzLmVudGl0eS5tZXRhZGF0YS5oYXMoQWN0b3JEYXRhSWQuUmVzZXJ2ZWQwNTMpKSB7XG4gICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgd2lkdGggdmFsdWVcbiAgICAgIHRoaXMuc2V0V2lkdGgodGhpcy53aWR0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uR2FtZW1vZGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBub3QgYSBwbGF5ZXJcbiAgICBpZiAoIXRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHJldHVybjtcblxuICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgbm93IGluIHNwZWN0YXRvciBtb2RlLCBjb2xsaXNpb24gc2hvdWxkIGJlIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuZW50aXR5LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3IpXG4gICAgICB0aGlzLmVudGl0eS5mbGFncy5zZXQoQWN0b3JGbGFnLkhhc0NvbGxpc2lvbiwgZmFsc2UpO1xuICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgbm90IGluIHNwZWN0YXRvciBtb2RlLCBjb2xsaXNpb24gc2hvdWxkIGJlIGVuYWJsZWRcbiAgICBlbHNlIHRoaXMuZW50aXR5LmZsYWdzLnNldChBY3RvckZsYWcuSGFzQ29sbGlzaW9uLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGVudGl0eSBjb2xsaXNpb24gYm94LlxuICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGVudGl0eSBjb2xsaXNpb24gYm94LlxuICAgKi9cbiAgcHVibGljIHNldEhlaWdodChoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRhSXRlbSBvYmplY3RcbiAgICBjb25zdCBkYXRhID0gbmV3IERhdGFJdGVtKFxuICAgICAgQWN0b3JEYXRhSWQuUmVzZXJ2ZWQwNTQsXG4gICAgICBBY3RvckRhdGFUeXBlLkZsb2F0LFxuICAgICAgaGVpZ2h0XG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IGNvbGxpc2lvbiBoZWlnaHRcbiAgICB0aGlzLmVudGl0eS5tZXRhZGF0YS5zZXQoQWN0b3JEYXRhSWQuUmVzZXJ2ZWQwNTQsIGRhdGEpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBoZWlnaHQgdmFsdWVcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZW50aXR5IGNvbGxpc2lvbiBib3guXG4gICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIGVudGl0eSBjb2xsaXNpb24gYm94LlxuICAgKi9cbiAgcHVibGljIHNldFdpZHRoKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRGF0YUl0ZW0gb2JqZWN0XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhSXRlbShcbiAgICAgIEFjdG9yRGF0YUlkLlJlc2VydmVkMDUzLFxuICAgICAgQWN0b3JEYXRhVHlwZS5GbG9hdCxcbiAgICAgIHdpZHRoXG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IGNvbGxpc2lvbiB3aWR0aFxuICAgIHRoaXMuZW50aXR5Lm1ldGFkYXRhLnNldChBY3RvckRhdGFJZC5SZXNlcnZlZDA1MywgZGF0YSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHdpZHRoIHZhbHVlXG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUNvbGxpc2lvbiB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRGFtYWdlQ2F1c2UsXG4gIEFjdG9yRGF0YUlkLFxuICBBY3RvckRhdGFUeXBlLFxuICBBY3RvckZsYWcsXG4gIERhdGFJdGVtLFxuICBFZmZlY3RUeXBlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcbmltcG9ydCB7IEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4vYXR0cmlidXRlXCI7XG5cbmNsYXNzIEVudGl0eUFpclN1cHBseVRyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImFpcl9zdXBwbHlcIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICBwdWJsaWMgb25UaWNrKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgbm90IGFsaXZlIG9yIGlzIG5vdCBicmVhdGhpbmcuXG4gICAgaWYgKCF0aGlzLmVudGl0eS5pc0FsaXZlIHx8ICF0aGlzLmVudGl0eS5mbGFncy5nZXQoQWN0b3JGbGFnLkJyZWF0aGluZykpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGUgZW50aXR5IGlzIGEgcGxheWVyIGFuZCBpcyBpbiBhIG5vdCBkcm93bmFibGUgZ2FtZW1vZGUuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IGFpciB0aWNrcyBvZiB0aGUgZW50aXR5LlxuICAgIGNvbnN0IGN1cnJlbnRBaXJUaWNrcyA9IHRoaXMuZ2V0QWlyU3VwcGx5VGlja3MoKTtcbiAgICBpZiAoIXRoaXMuY2FuQnJlYXRoZSgpKSB7XG4gICAgICAvLyBUaGUgYWlyIHN1cHBseSBpcyByZWR1Y2VkIGJ5IDEgdGljay5cbiAgICAgIC8vIElmIHRoZSBlbnRpdHkgYWlyIHN1cHBseSByZWFjaGVzIC0yMCwgaXQgc3RhcnRzIGRyb3duaW5nXG5cbiAgICAgIHRoaXMuc2V0QWlyU3VwcGx5VGlja3MoY3VycmVudEFpclRpY2tzIC0gMSk7XG4gICAgICBpZiAoY3VycmVudEFpclRpY2tzID4gLTIwKSByZXR1cm47XG4gICAgICAvLyBSZXNldCB0aGUgYWlyIHN1cHBseSB0byAwLlxuICAgICAgdGhpcy5zZXRBaXJTdXBwbHlUaWNrcygwKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBoZWFsdGggdHJhaXQuXG4gICAgICAvLyBJZiB0aGUgZW50aXR5IGhhcyBhIGhlYWx0aCB0cmFpdCwgYXBwbHkgZGFtYWdlIHRvIHRoZSBlbnRpdHkuXG4gICAgICBpZiAoIXRoaXMuZW50aXR5Lmhhc1RyYWl0KEVudGl0eUhlYWx0aFRyYWl0KSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgdGhlIGhlYWx0aCB0cmFpdCBvZiB0aGUgZW50aXR5LlxuICAgICAgY29uc3QgaGVhbHRoID0gdGhpcy5lbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgICAvLyBBcHBseSBkYW1hZ2UgdG8gdGhlIGVudGl0eSBiYXNlZCBvbiB0aGUgZW50aXR5J3MgY3VycmVudCBzdGF0ZS5cbiAgICAgIGhlYWx0aC5hcHBseURhbWFnZShcbiAgICAgICAgMC41LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMuZW50aXR5LmlzU3dpbW1pbmdcbiAgICAgICAgICA/IEFjdG9yRGFtYWdlQ2F1c2UuRHJvd25pbmdcbiAgICAgICAgICA6IEFjdG9yRGFtYWdlQ2F1c2UuU3VmZm9jYXRpb25cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVudGl0eSBhaXIgc3VwcGx5IGlzIGZ1bGwgdGhlbiByZXR1cm4uXG4gICAgaWYgKGN1cnJlbnRBaXJUaWNrcyA+PSAzMDApIHJldHVybjtcbiAgICB0aGlzLnNldEFpclN1cHBseVRpY2tzKGN1cnJlbnRBaXJUaWNrcyArIDUpO1xuICAgIC8vIFRoZSBlbnRpdHkgY2FuIGJyZWF0aGUsIHNvIHdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBhaXIgc3VwcGx5LlxuICB9XG5cbiAgcHJpdmF0ZSBjYW5CcmVhdGhlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJsb2NrQXRIZWFkID0gdGhpcy5lbnRpdHkuZGltZW5zaW9uLmdldEJsb2NrKFxuICAgICAgdGhpcy5lbnRpdHkucG9zaXRpb24uZmxvb3IoKVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKCFibG9ja0F0SGVhZC5pc0xpcXVpZCgpICYmICFibG9ja0F0SGVhZC5pc1NvbGlkKCkpIHx8XG4gICAgICB0aGlzLmVudGl0eS5oYXNFZmZlY3QoRWZmZWN0VHlwZS5XYXRlckJyZWF0aGluZylcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBtZXRhZGF0YSBmbGFnIHZhbHVlIGZvciBncmF2aXR5XG4gICAgaWYgKCF0aGlzLmVudGl0eS5mbGFncy5oYXMoQWN0b3JGbGFnLkJyZWF0aGluZykpIHtcbiAgICAgIC8vIFNldCB0aGUgZW50aXR5IGZsYWcgZm9yIGdyYXZpdHlcbiAgICAgIHRoaXMuZW50aXR5LmZsYWdzLnNldChBY3RvckZsYWcuQnJlYXRoaW5nLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5Lm1ldGFkYXRhLmhhcyhBY3RvckRhdGFJZC5BaXJTdXBwbHkpKSB7XG4gICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgYWlyIHN1cHBseSB2YWx1ZVxuICAgICAgdGhpcy5zZXRBaXJTdXBwbHlUaWNrcygzMDApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRBaXJTdXBwbHlUaWNrcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGFpclN1cHBseURhdGEgPSB0aGlzLmVudGl0eS5tZXRhZGF0YS5nZXQoQWN0b3JEYXRhSWQuQWlyU3VwcGx5KTtcblxuICAgIGlmIChhaXJTdXBwbHlEYXRhKSB7XG4gICAgICByZXR1cm4gYWlyU3VwcGx5RGF0YS52YWx1ZSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgc2V0QWlyU3VwcGx5VGlja3ModGlja3M6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSB0aGUgYWlyIHN1cHBseSBkYXRhIGl0ZW0uXG4gICAgY29uc3QgYWlyU3VwcGx5RGF0YSA9IG5ldyBEYXRhSXRlbShcbiAgICAgIEFjdG9yRGF0YUlkLkFpclN1cHBseSxcbiAgICAgIEFjdG9yRGF0YVR5cGUuU2hvcnQsXG4gICAgICB0aWNrc1xuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgYWlyIHN1cHBseSBkYXRhXG4gICAgdGhpcy5lbnRpdHkubWV0YWRhdGEuc2V0KEFjdG9yRGF0YUlkLkFpclN1cHBseSwgYWlyU3VwcGx5RGF0YSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5QWlyU3VwcGx5VHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckRhdGFJZCxcbiAgQWN0b3JEYXRhVHlwZSxcbiAgQWN0b3JGbGFnLFxuICBEYXRhSXRlbVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEVudGl0eU5hbWVUYWdUcmFpdCBleHRlbmRzIEVudGl0eVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJuYW1ldGFnXCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIGVudGl0eSBuYW1lIHRhZ1xuICAgIGlmICghdGhpcy5lbnRpdHkubWV0YWRhdGEuaGFzKEFjdG9yRGF0YUlkLk5hbWUpKSB7XG4gICAgICAvLyBHZXQgdGhlIGRlZmF1bHQgbmFtZSB0YWcgdmFsdWVcbiAgICAgIGNvbnN0IG5hbWV0YWcgPSB0aGlzLmVudGl0eS5pc1BsYXllcigpID8gdGhpcy5lbnRpdHkudXNlcm5hbWUgOiBTdHJpbmcoKTtcblxuICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IG5hbWUgdGFnIHZhbHVlXG4gICAgICB0aGlzLnNldE5hbWVUYWcobmFtZXRhZyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIGVudGl0eSBuYW1lIHRhZyB2aXNpYmlsaXR5XG4gICAgaWYgKCF0aGlzLmVudGl0eS5tZXRhZGF0YS5oYXMoQWN0b3JEYXRhSWQuTmFtZXRhZ0Fsd2F5c1Nob3cpKSB7XG4gICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgbmFtZSB0YWcgdmlzaWJpbGl0eSB2YWx1ZVxuICAgICAgaWYgKHRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHtcbiAgICAgICAgLy8gUGxheWVyIG5hbWUgdGFncyBhcmUgYWx3YXlzIHZpc2libGVcbiAgICAgICAgdGhpcy5zZXRWaXNpYmlsaXR5KHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXIgZW50aXR5IG5hbWUgdGFncyBhcmUgbm90IGFsd2F5cyB2aXNpYmxlXG4gICAgICAgIHRoaXMuc2V0VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5hbWUgdGFnIG9mIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRhZyBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHNldE5hbWVUYWcobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IERhdGFJdGVtIG9iamVjdFxuICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YUl0ZW0oQWN0b3JEYXRhSWQuTmFtZSwgQWN0b3JEYXRhVHlwZS5TdHJpbmcsIG5hbWUpO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgY29sbGlzaW9uIGhlaWdodFxuICAgIHRoaXMuZW50aXR5Lm1ldGFkYXRhLnNldChBY3RvckRhdGFJZC5OYW1lLCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIHRhZyBvZiB0aGUgZW50aXR5LlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZSB0YWcgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBnZXROYW1lVGFnKCk6IHN0cmluZyB7XG4gICAgLy8gR2V0IHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIGVudGl0eSBuYW1lIHRhZ1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmVudGl0eS5tZXRhZGF0YS5nZXQoQWN0b3JEYXRhSWQuTmFtZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbWV0YWRhdGEgdmFsdWUgaXMgdmFsaWRcbiAgICByZXR1cm4gZGF0YSA/IChkYXRhLnZhbHVlIGFzIHN0cmluZykgOiBTdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIG5hbWUgdGFnIG9mIHRoZSBlbnRpdHkgaXMgYWx3YXlzIHZpc2libGUuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5hbWUgdGFnIG9mIHRoZSBlbnRpdHkgaXMgYWx3YXlzIHZpc2libGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlzaWJpbGl0eSgpOiBib29sZWFuIHtcbiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgZW50aXR5IG5hbWUgdGFnIHZpc2liaWxpdHlcbiAgICBjb25zdCBkYXRhID0gdGhpcy5lbnRpdHkubWV0YWRhdGEuZ2V0KEFjdG9yRGF0YUlkLk5hbWV0YWdBbHdheXNTaG93KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBtZXRhZGF0YSB2YWx1ZSBpcyB2YWxpZFxuICAgIHJldHVybiBkYXRhID8gKGRhdGEudmFsdWUgYXMgbnVtYmVyKSA9PT0gMSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgbmFtZSB0YWcgb2YgdGhlIGVudGl0eSBpcyBhbHdheXMgdmlzaWJsZS5cbiAgICogQHBhcmFtIHZpc2libGUgV2hldGhlciB0aGUgbmFtZSB0YWcgb2YgdGhlIGVudGl0eSBpcyBhbHdheXMgdmlzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzZXRWaXNpYmlsaXR5KHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRGF0YUl0ZW0gb2JqZWN0XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhSXRlbShcbiAgICAgIEFjdG9yRGF0YUlkLk5hbWV0YWdBbHdheXNTaG93LFxuICAgICAgQWN0b3JEYXRhVHlwZS5CeXRlLFxuICAgICAgdmlzaWJsZSA/IDEgOiAwXG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IGNvbGxpc2lvbiBoZWlnaHRcbiAgICB0aGlzLmVudGl0eS5tZXRhZGF0YS5zZXQoQWN0b3JEYXRhSWQuTmFtZXRhZ0Fsd2F5c1Nob3csIGRhdGEpO1xuICAgIHRoaXMuZW50aXR5LmZsYWdzLnNldChBY3RvckZsYWcuQWx3YXlzU2hvd05hbWUsIHZpc2libGUpOyAvLyA/IE5vdCBzdXJlIHdoeSB0aGlzIGlzIGJvdGggaW4gbWV0YWRhdGEgYW5kIGZsYWdzXG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5TmFtZVRhZ1RyYWl0IH07XG4iLCAiaW1wb3J0IHsgRW50aXR5R3Jhdml0eVRyYWl0IH0gZnJvbSBcIi4vZ3Jhdml0eVwiO1xuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBFbnRpdHlQaHlzaWNzVHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGh5c2ljc1wiO1xuXG4gIHB1YmxpYyBncmF2aXR5ID0gMC4wNTtcblxuICBwdWJsaWMgb25UaWNrKCk6IHZvaWQge1xuICAgIC8vIE5vcnRoID0gLXosIFNvdXRoID0gK3osIEVhc3QgPSAreCwgV2VzdCA9IC14XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIGFsaXZlXG4gICAgaWYgKHRoaXMuZW50aXR5LmlzQWxpdmUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICBjb25zdCBoYXNHcmF2aXR5ID0gdGhpcy5lbnRpdHkuaGFzVHJhaXQoRW50aXR5R3Jhdml0eVRyYWl0KTtcblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuZW50aXR5LmRpbWVuc2lvbjtcblxuICAgIGNvbnN0IHZlbG9jaXR5ID0gdGhpcy5lbnRpdHkudmVsb2NpdHk7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmVudGl0eS5wb3NpdGlvbjtcblxuICAgIGNvbnN0IGhpdGJveFdpZHRoID0gMC4xNTtcbiAgICBjb25zdCBoaXRib3hIZWlnaHQgPSAwLjE1O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBtb3ZpbmdcbiAgICBpZiAodmVsb2NpdHkuaXNaZXJvKCkpIHRoaXMuZW50aXR5LmlzTW92aW5nID0gZmFsc2U7XG4gICAgZWxzZSB0aGlzLmVudGl0eS5pc01vdmluZyA9IHRydWU7XG5cbiAgICBpZiAodmVsb2NpdHkueSAhPT0gMCkge1xuICAgICAgY29uc3QgbmVnYXRlID0gdmVsb2NpdHkueSA8IDAgPyAtMSA6IDE7XG5cbiAgICAgIC8vIEdldCB0aGUgYmxvY2sgaW4gdGhlIGRpcmVjdGlvbiB0aGUgZW50aXR5IGlzIG1vdmluZ1xuICAgICAgY29uc3QgYnggPSBNYXRoLmZsb29yKHBvc2l0aW9uLnggLSBoaXRib3hXaWR0aCk7XG4gICAgICBjb25zdCBieSA9IE1hdGguZmxvb3IocG9zaXRpb24ueSArIHZlbG9jaXR5LnkgKyBoaXRib3hIZWlnaHQgKiBuZWdhdGUpO1xuICAgICAgY29uc3QgYnogPSBNYXRoLmZsb29yKHBvc2l0aW9uLnogLSBoaXRib3hXaWR0aCk7XG4gICAgICBjb25zdCBibG9jayA9IGRpbWVuc2lvbi5nZXRCbG9jayh7IHg6IGJ4LCB5OiBieSwgejogYnogfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBzb2xpZCBvciBpZiB0aGUgdmVsb2NpdHkgaXMgYXBwcm9hY2hpbmcgMFxuICAgICAgaWYgKGJsb2NrLmlzU29saWQoKSB8fCBNYXRoLmFicyh2ZWxvY2l0eS55KSA8IDAuMDEpIHtcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSBibG9jayBiZWxvdyB0aGUgZW50aXR5XG4gICAgICAgIGNvbnN0IGJlbG93ID0gZGltZW5zaW9uLmdldEJsb2NrKHsgeDogYngsIHk6IGJ5IC0gMSwgejogYnogfSk7XG5cbiAgICAgICAgLy8gQXBwbHkgZ3Jhdml0eSB0byB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnkgKj0gaGFzR3Jhdml0eVxuICAgICAgICAgID8gMSAtIHRoaXMuZ3Jhdml0eVxuICAgICAgICAgIDogYmVsb3cuZ2V0VHlwZSgpLmZyaWN0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZW50aXR5J3MgcG9zaXRpb25cbiAgICAgICAgdGhpcy5lbnRpdHkucG9zaXRpb24ueSArPSB2ZWxvY2l0eS55O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgbW92aW5nIG5vcnRoXG4gICAgaWYgKHZlbG9jaXR5LnogIT09IDApIHtcbiAgICAgIGNvbnN0IG5lZ2F0ZSA9IHZlbG9jaXR5LnogPCAwID8gLTEgOiAxO1xuXG4gICAgICAvLyBHZXQgdGhlIGJsb2NrIGluIHRoZSBkaXJlY3Rpb24gdGhlIGVudGl0eSBpcyBtb3ZpbmdcbiAgICAgIGNvbnN0IGJ4ID0gTWF0aC5mbG9vcihwb3NpdGlvbi54ICsgaGl0Ym94V2lkdGgpO1xuICAgICAgY29uc3QgYnkgPSBNYXRoLmZsb29yKHBvc2l0aW9uLnkgKyBoaXRib3hIZWlnaHQpO1xuICAgICAgY29uc3QgYnogPSBNYXRoLmZsb29yKHBvc2l0aW9uLnogKyB2ZWxvY2l0eS56ICsgaGl0Ym94V2lkdGggKiBuZWdhdGUpO1xuICAgICAgY29uc3QgYmxvY2sgPSBkaW1lbnNpb24uZ2V0QmxvY2soeyB4OiBieCwgeTogYnksIHo6IGJ6IH0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaXMgc29saWQgb3IgaWYgdGhlIHZlbG9jaXR5IGlzIGFwcHJvYWNoaW5nIDBcbiAgICAgIGlmIChibG9jay5pc1NvbGlkKCkpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBlbnRpdHkncyB2ZWxvY2l0eSB0byAwXG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnogPSAwO1xuXG4gICAgICAgIC8vIFNsaWdodGx5IHB1c2ggdGhlIGVudGl0eSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnogKz0gMC4xNiAqIC1uZWdhdGU7XG4gICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKHZlbG9jaXR5LnopIDwgMC4wMSkge1xuICAgICAgICAvLyBTZXQgdGhlIGVudGl0eSdzIHZlbG9jaXR5IHRvIDBcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueiA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSBibG9jayBiZWxvdyB0aGUgZW50aXR5XG4gICAgICAgIGNvbnN0IGJlbG93ID0gZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgICAgICB4OiBNYXRoLmZsb29yKHBvc2l0aW9uLngpLFxuICAgICAgICAgIHk6IE1hdGguZmxvb3IocG9zaXRpb24ueSArIGhpdGJveEhlaWdodCksXG4gICAgICAgICAgejogTWF0aC5mbG9vcihwb3NpdGlvbi56KVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSBibG9jayBiZWxvdyB0aGUgZW50aXR5XG4gICAgICAgIGNvbnN0IGZyaWN0aW9uID0gYmVsb3cuZ2V0VHlwZSgpLmZyaWN0aW9uO1xuXG4gICAgICAgIC8vIEFwcGx5IGdyYXZpdHkgdG8gdGhlIGVudGl0eVxuICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS56ICo9IGZyaWN0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZW50aXR5J3MgcG9zaXRpb25cbiAgICAgICAgdGhpcy5lbnRpdHkucG9zaXRpb24ueiArPSB2ZWxvY2l0eS56O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgbW92aW5nIGVhc3RcbiAgICBpZiAodmVsb2NpdHkueCAhPT0gMCkge1xuICAgICAgY29uc3QgbmVnYXRlID0gdmVsb2NpdHkueCA8IDAgPyAtMSA6IDE7XG5cbiAgICAgIC8vIEdldCB0aGUgYmxvY2sgaW4gdGhlIGRpcmVjdGlvbiB0aGUgZW50aXR5IGlzIG1vdmluZ1xuICAgICAgY29uc3QgYnggPSBNYXRoLmZsb29yKHBvc2l0aW9uLnggKyB2ZWxvY2l0eS54ICsgaGl0Ym94V2lkdGggKiBuZWdhdGUpO1xuICAgICAgY29uc3QgYnkgPSBNYXRoLmZsb29yKHBvc2l0aW9uLnkgKyBoaXRib3hIZWlnaHQpO1xuICAgICAgY29uc3QgYnogPSBNYXRoLmZsb29yKHBvc2l0aW9uLnogKyBoaXRib3hXaWR0aCk7XG4gICAgICBjb25zdCBibG9jayA9IGRpbWVuc2lvbi5nZXRCbG9jayh7IHg6IGJ4LCB5OiBieSwgejogYnogfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBzb2xpZCBvciBpZiB0aGUgdmVsb2NpdHkgaXMgYXBwcm9hY2hpbmcgMFxuICAgICAgaWYgKGJsb2NrLmlzU29saWQoKSkge1xuICAgICAgICAvLyBTZXQgdGhlIGVudGl0eSdzIHZlbG9jaXR5IHRvIDBcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueCA9IDA7XG5cbiAgICAgICAgLy8gU2xpZ2hseSBwdXNoIHRoZSBlbnRpdHkgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS54ICs9IDAuMTYgKiAtbmVnYXRlO1xuICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyh2ZWxvY2l0eS54KSA8IDAuMDEpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBlbnRpdHkncyB2ZWxvY2l0eSB0byAwXG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR2V0IHRoZSBmcmljdGlvbiBvZiB0aGUgYmxvY2sgYmVsb3cgdGhlIGVudGl0eVxuICAgICAgICBjb25zdCBiZWxvdyA9IGRpbWVuc2lvbi5nZXRCbG9jayh7XG4gICAgICAgICAgeDogTWF0aC5mbG9vcihwb3NpdGlvbi54KSxcbiAgICAgICAgICB5OiBNYXRoLmZsb29yKHBvc2l0aW9uLnkgKyBoaXRib3hIZWlnaHQpLFxuICAgICAgICAgIHo6IE1hdGguZmxvb3IocG9zaXRpb24ueilcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBmcmljdGlvbiBvZiB0aGUgYmxvY2sgYmVsb3cgdGhlIGVudGl0eVxuICAgICAgICBjb25zdCBmcmljdGlvbiA9IGJlbG93LmdldFR5cGUoKS5mcmljdGlvbjtcblxuICAgICAgICAvLyBBcHBseSBncmF2aXR5IHRvIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueCAqPSBmcmljdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGVudGl0eSdzIHBvc2l0aW9uXG4gICAgICAgIHRoaXMuZW50aXR5LnBvc2l0aW9uLnggKz0gdmVsb2NpdHkueDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzR3Jhdml0eSkge1xuICAgICAgLy8gR2V0IHRoZSBibG9jayBiZWxvdyB0aGUgZW50aXR5XG4gICAgICBjb25zdCBiZWxvdyA9IGRpbWVuc2lvbi5nZXRCbG9jayh7XG4gICAgICAgIHg6IE1hdGguZmxvb3IocG9zaXRpb24ueCksXG4gICAgICAgIHk6IE1hdGgucm91bmQocG9zaXRpb24ueSArIGhpdGJveEhlaWdodCAtIDEpLFxuICAgICAgICB6OiBNYXRoLmZsb29yKHBvc2l0aW9uLnopXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGJlbG93IHRoZSBlbnRpdHkgaXMgc29saWRcbiAgICAgIGlmIChiZWxvdy5pc1NvbGlkKCkpIHtcbiAgICAgICAgLy8gQXBwbHkgZ3Jhdml0eSB0byB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnkgPSAwO1xuXG4gICAgICAgIC8vIEFwcGx5IGZyaWN0aW9uIHRvIHRoZSBlbnRpdHlcbiAgICAgICAgaWYgKHRoaXMuZW50aXR5LnZlbG9jaXR5LnogIT09IDApXG4gICAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueiAqPSBiZWxvdy5nZXRUeXBlKCkuZnJpY3Rpb247XG5cbiAgICAgICAgLy8gQXBwbHkgZnJpY3Rpb24gdG8gdGhlIGVudGl0eVxuICAgICAgICBpZiAodGhpcy5lbnRpdHkudmVsb2NpdHkueCAhPT0gMClcbiAgICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS54ICo9IGJlbG93LmdldFR5cGUoKS5mcmljdGlvbjtcblxuICAgICAgICAvLyBTZXQgdGhlIGVudGl0eSB0byBvbiBncm91bmRcbiAgICAgICAgdGhpcy5lbnRpdHkub25Hcm91bmQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXBwbHkgZ3Jhdml0eSB0byB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnkgLT0gdGhpcy5ncmF2aXR5O1xuXG4gICAgICAgIC8vIFNldCB0aGUgZW50aXR5IHRvIG5vdCBvbiBncm91bmRcbiAgICAgICAgdGhpcy5lbnRpdHkub25Hcm91bmQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5UGh5c2ljc1RyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgRWZmZWN0VHlwZSxcbiAgTGV2ZWxFdmVudCxcbiAgTGV2ZWxFdmVudFBhY2tldCxcbiAgTW9iRWZmZWN0RXZlbnRzLFxuICBNb2JFZmZlY3RQYWNrZXQsXG4gIFZlY3RvcjNmXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi4vLi4vZWZmZWN0XCI7XG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlFZmZlY3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBFZmZlY3RBZGRTaWduYWwsIEVmZmVjdFJlbW92ZVNpZ25hbCB9IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcblxuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5pbnRlcmZhY2Ugc2F2ZWRFZmZlY3Qge1xuICBlZmZlY3RUeXBlOiBFZmZlY3RUeXBlO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBhbXBsaWZpZXI6IG51bWJlcjtcbiAgc2hvd1BhcnRpY2xlczogYm9vbGVhbjtcbn1cblxuY2xhc3MgRW50aXR5RWZmZWN0c1RyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImVmZmVjdHNcIjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGVmZmVjdHM6IE1hcDxFZmZlY3RUeXBlLCBFZmZlY3Q+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbdHlwZSwgZWZmZWN0XSBvZiB0aGlzLmVmZmVjdHMpIHtcbiAgICAgIGVmZmVjdC5vblRpY2s/Lih0aGlzLmVudGl0eSk7XG5cbiAgICAgIGlmICghZWZmZWN0LmlzRXhwaXJlZCgpKSB7XG4gICAgICAgIC8vIFJlZHVjZSB0aGUgZWZmZWN0IGR1cmF0aW9uIGJ5IHR3byB0aWNrcy5cbiAgICAgICAgZWZmZWN0LmR1cmF0aW9uIC09IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmUodHlwZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGljbGVJbnRlcnZhbCA9IHRoaXMuZWZmZWN0cy5zaXplID4gMSA/IDhuIDogMm47XG4gICAgLy8gU3Bhd24gYSBwYXJ0aWNsZSBiYXNlZCBvbiB0aGUgZWZmZWN0IHNpemUgaW50ZXJ2YWwuXG4gICAgaWYgKHRoaXMuZW50aXR5LmdldFdvcmxkKCkuY3VycmVudFRpY2sgJSBwYXJ0aWNsZUludGVydmFsID09IDBuKSB7XG4gICAgICBjb25zdCBlZmZlY3QgPSB0aGlzLmdldFBhcnRpY2xlRWZmZWN0KCk7XG5cbiAgICAgIGlmICghZWZmZWN0KSByZXR1cm47XG4gICAgICAvLyBTcGF3biB0aGUgcGFydGljbGUuXG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxFdmVudFBhY2tldCgpO1xuICAgICAgcGFja2V0LmV2ZW50ID0gTGV2ZWxFdmVudC5QYXJ0aWNsZUxlZ2FjeUV2ZW50IHwgMzQ7XG4gICAgICBwYWNrZXQuZGF0YSA9IGVmZmVjdC5jb2xvci50b0ludCgpO1xuICAgICAgcGFja2V0LnBvc2l0aW9uID0gdGhpcy5lbnRpdHkucG9zaXRpb24uc3VidHJhY3QobmV3IFZlY3RvcjNmKDAsIDEsIDApKTtcblxuICAgICAgdGhpcy5lbnRpdHkuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUoZWZmZWN0VHlwZTogRWZmZWN0VHlwZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZmZlY3RzLmhhcyhlZmZlY3RUeXBlKSkgcmV0dXJuO1xuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFZmZlY3RSZW1vdmVTaWduYWwodGhpcy5lbnRpdHksIGVmZmVjdFR5cGUpO1xuXG4gICAgc2lnbmFsLmVtaXQoKTtcbiAgICB0aGlzLmVmZmVjdHMuZ2V0KGVmZmVjdFR5cGUpPy5vblJlbW92ZT8uKHRoaXMuZW50aXR5KTtcbiAgICB0aGlzLmVmZmVjdHMuZGVsZXRlKGVmZmVjdFR5cGUpO1xuXG4gICAgaWYgKCF0aGlzLmVudGl0eS5pc1BsYXllcigpKSByZXR1cm47XG4gICAgLy8gQ3JlYXRlIHRoZSBlZmZlY3QgcmVtb3ZhbCBwYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IE1vYkVmZmVjdFBhY2tldCgpO1xuICAgIHBhY2tldC5ydW50aW1lSWQgPSB0aGlzLmVudGl0eS5ydW50aW1lSWQ7XG4gICAgcGFja2V0LmV2ZW50SWQgPSBNb2JFZmZlY3RFdmVudHMuRWZmZWN0UmVtb3ZlO1xuICAgIHBhY2tldC5lZmZlY3RJZCA9IGVmZmVjdFR5cGU7XG4gICAgcGFja2V0LnBhcnRpY2xlcyA9IGZhbHNlO1xuICAgIHBhY2tldC5hbXBsaWZpZXIgPSAwO1xuICAgIHBhY2tldC5kdXJhdGlvbiA9IDA7XG4gICAgcGFja2V0LmlucHV0VGljayA9IHRoaXMuZW50aXR5LmdldFdvcmxkKCkuY3VycmVudFRpY2s7XG5cbiAgICB0aGlzLmVudGl0eS5zZW5kKHBhY2tldCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGFjdGl2ZSBlZmZlY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gZWZmZWN0VHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBlZmZlY3QgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50aXR5IGhhcyBhbiBhY3RpdmUgZWZmZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZTsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgKi9cbiAgcHVibGljIGhhcyhlZmZlY3RUeXBlOiBFZmZlY3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0cy5oYXMoZWZmZWN0VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBlZmZlY3QgdG8gdGhlIGVudGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGVmZmVjdFR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZWZmZWN0IHRvIGFkZC5cbiAgICogQHBhcmFtIGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaW4gdGlja3MuXG4gICAqIEBwYXJhbSBhbXBsaWZpZXIgLSBUaGUgYW1wbGlmaWVyIG9mIHRoZSBlZmZlY3QuIE9wdGlvbmFsLCBkZWZhdWx0cyB0byAwLlxuICAgKiBAcGFyYW0gc2hvd1BhcnRpY2xlcyAtIFdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgc2hvdyBwYXJ0aWNsZXMuIE9wdGlvbmFsLCBkZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcHVibGljIGFkZChcbiAgICBlZmZlY3RUeXBlOiBFZmZlY3RUeXBlLFxuICAgIGR1cmF0aW9uOiBudW1iZXIsXG4gICAgb3B0aW9ucz86IEVudGl0eUVmZmVjdE9wdGlvbnNcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1BhcnRpY2xlcyA9IG9wdGlvbnM/LnNob3dQYXJ0aWNsZXMgPz8gdHJ1ZTtcbiAgICBjb25zdCBhbXBsaWZpZXIgPSBvcHRpb25zPy5hbXBsaWZpZXIgPz8gMDtcblxuICAgIC8vIEdldCB0aGUgZWZmZWN0IHR5cGUgYnVpbGRlclxuICAgIGNvbnN0IGVmZmVjdEJ1aWxkZXIgPSB0aGlzLmVudGl0eVxuICAgICAgLmdldFdvcmxkKClcbiAgICAgIC5lZmZlY3RQYWxldHRlLmdldEVmZmVjdChlZmZlY3RUeXBlKTtcbiAgICBsZXQgZWZmZWN0ID0gdGhpcy5lZmZlY3RzLmdldChlZmZlY3RUeXBlKTtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gYWN0aXZlIGVmZmVjdCBhbmQgdGhlcmUncyBlZmZlY3QgYnVpbGRlciwgY3JlYXRlIGEgbmV3IGVmZmVjdFxuICAgIGlmICghZWZmZWN0ICYmIGVmZmVjdEJ1aWxkZXIpXG4gICAgICBlZmZlY3QgPSBuZXcgZWZmZWN0QnVpbGRlcihkdXJhdGlvbiwgYW1wbGlmaWVyLCBzaG93UGFydGljbGVzKTtcbiAgICBlbHNlIGlmIChlZmZlY3QpIHtcbiAgICAgIC8vIEFkanVzdCB0aGUgY3VycmVudCBlZmZlY3QgcHJvcGVydGllc1xuICAgICAgZWZmZWN0LmR1cmF0aW9uID0gZWZmZWN0LmR1cmF0aW9uICsgZHVyYXRpb247XG4gICAgICBlZmZlY3QuYW1wbGlmaWVyID0gTWF0aC5tYXgoZWZmZWN0LmFtcGxpZmllciwgYW1wbGlmaWVyID8/IDApO1xuICAgICAgZWZmZWN0LnNob3dQYXJ0aWNsZXMgPSBzaG93UGFydGljbGVzID8/IHRydWU7XG4gICAgfVxuICAgIC8vIGVzbGludCBmaXhcbiAgICBpZiAoIWVmZmVjdCkgcmV0dXJuO1xuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFZmZlY3RBZGRTaWduYWwodGhpcy5lbnRpdHksIGVmZmVjdCk7XG5cbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcblxuICAgIGVmZmVjdC5vbkFkZD8uKHRoaXMuZW50aXR5KTtcbiAgICB0aGlzLmVmZmVjdHMuc2V0KGVmZmVjdFR5cGUsIGVmZmVjdCk7XG5cbiAgICAvLyBJZiB0aGUgZW50aXR5IGlzIG5vdCBhIHBsYXllciwgZXhpdC5cbiAgICBpZiAoIXRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHJldHVybjtcbiAgICAvLyBDcmVhdGUgdGhlIGVmZmVjdCBhZGRpdGlvbiBwYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IE1vYkVmZmVjdFBhY2tldCgpO1xuICAgIHBhY2tldC5ydW50aW1lSWQgPSB0aGlzLmVudGl0eS5ydW50aW1lSWQ7XG4gICAgcGFja2V0LmV2ZW50SWQgPSBNb2JFZmZlY3RFdmVudHMuRWZmZWN0QWRkO1xuICAgIHBhY2tldC5lZmZlY3RJZCA9IGVmZmVjdFR5cGU7XG4gICAgcGFja2V0LnBhcnRpY2xlcyA9IGVmZmVjdC5zaG93UGFydGljbGVzO1xuICAgIHBhY2tldC5hbXBsaWZpZXIgPSBlZmZlY3QuYW1wbGlmaWVyO1xuICAgIHBhY2tldC5kdXJhdGlvbiA9IGVmZmVjdC5kdXJhdGlvbjtcbiAgICBwYWNrZXQuaW5wdXRUaWNrID0gdGhpcy5lbnRpdHkuZ2V0V29ybGQoKS5jdXJyZW50VGljaztcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyLlxuICAgIHRoaXMuZW50aXR5LnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSByYW5kb20gcGFydGljbGUgZWZmZWN0IGZyb20gdGhlIGVudGl0eSdzIGFjdGl2ZSBlZmZlY3RzIGxpc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByYW5kb21seSBzZWxlY3RlZCBwYXJ0aWNsZSBlZmZlY3Qgb3IgYHVuZGVmaW5lZGAgaWYgbm8gcGFydGljbGUgZWZmZWN0cyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXJ0aWNsZUVmZmVjdCgpOiBFZmZlY3Qge1xuICAgIC8vIEZpbHRlciB0aGUgZWZmZWN0cyB0byBvbmx5IGluY2x1ZGUgdGhvc2Ugd2l0aCBzaG93UGFydGljbGVzIHNldCB0byB0cnVlLlxuICAgIGNvbnN0IGVmZmVjdHMgPSBbLi4udGhpcy5lZmZlY3RzLnZhbHVlcygpXS5maWx0ZXIoXG4gICAgICAoZWZmZWN0KSA9PiBlZmZlY3Quc2hvd1BhcnRpY2xlc1xuICAgICk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGVkIGVmZmVjdCBvciB1bmRlZmluZWQgaWYgbm8gcGFydGljbGUgZWZmZWN0cyBhcmUgYXZhaWxhYmxlLlxuICAgIHJldHVybiBlZmZlY3RzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVmZmVjdHMubGVuZ3RoKV0hO1xuICB9XG5cbiAgLypcbiAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNhdmVkIGVmZmVjdHMgZnJvbSB0aGUgZW50aXR5J3MgY29tcG9uZW50cyxcbiAgICogY3JlYXRlcyBuZXcgaW5zdGFuY2VzIG9mIHRoZSBlZmZlY3RzIHVzaW5nIHRoZSBkYXRhLCBhbmQgYWRkcyB0aGVtIHRvIHRoZSBlbnRpdHkncyBlZmZlY3RzIGxpc3QuXG4gICAqIFRoZSBzYXZlZCBlZmZlY3RzIGFyZSBsb2FkZWQgZnJvbSB0aGUgXCJlbnRpdHlfZWZmZWN0c1wiIGNvbXBvbmVudCwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0c1xuICAgKi9cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgLy8gTG9hZCB0aGUgZWZmZWN0cyBmcm9tIHRoZSBzYXZlZCBkYXRhLlxuICAgIGNvbnN0IGVudGl0eUVmZmVjdHMgPSAodGhpcy5lbnRpdHkuY29tcG9uZW50cy5nZXQoXCJlbnRpdHlfZWZmZWN0c1wiKSA/P1xuICAgICAgW10pIGFzIEFycmF5PHVua25vd24+IGFzIEFycmF5PHNhdmVkRWZmZWN0PjtcblxuICAgIGZvciAoY29uc3QgZWZmZWN0RW50cnkgb2YgZW50aXR5RWZmZWN0cykge1xuICAgICAgY29uc3QgeyBlZmZlY3RUeXBlLCBkdXJhdGlvbiwgYW1wbGlmaWVyLCBzaG93UGFydGljbGVzIH0gPSBlZmZlY3RFbnRyeTtcbiAgICAgIGNvbnN0IGVmZmVjdCA9IHRoaXMuZW50aXR5LmdldFdvcmxkKCkuZWZmZWN0UGFsZXR0ZS5nZXRFZmZlY3QoZWZmZWN0VHlwZSk7XG5cbiAgICAgIGlmICghZWZmZWN0KSByZXR1cm47XG4gICAgICB0aGlzLmVmZmVjdHMuc2V0KFxuICAgICAgICBlZmZlY3RUeXBlLFxuICAgICAgICBuZXcgZWZmZWN0KGR1cmF0aW9uLCBhbXBsaWZpZXIsIHNob3dQYXJ0aWNsZXMpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkRlc3Bhd24oKTogdm9pZCB7XG4gICAgdGhpcy5lbnRpdHkuY29tcG9uZW50cy5zZXQoXG4gICAgICBcImVudGl0eV9lZmZlY3RzXCIsXG4gICAgICBbLi4udGhpcy5lZmZlY3RzLnZhbHVlcygpXS5tYXAoKGVmZmVjdCkgPT4gZWZmZWN0LnRvU3RyaW5nKCkpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlFZmZlY3RzVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBBY3RvckZsYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEVudGl0eUludmlzaWJpbGl0eVRyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInZpc2liaWxpdHlcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlczogQXJyYXk8RW50aXR5SWRlbnRpZmllcj4gPSBbXG4gICAgRW50aXR5SWRlbnRpZmllci5QbGF5ZXJcbiAgXTtcblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50aXR5LmZsYWdzLmhhcyhBY3RvckZsYWcuSW52aXNpYmxlKSkge1xuICAgICAgdGhpcy5lbnRpdHkuZmxhZ3Muc2V0KEFjdG9yRmxhZy5JbnZpc2libGUsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0J3MgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHZhbHVlIFdldGhlciBvciBub3QgdGhlIGVudGl0eSB3aWxsIGJlIHZpc2libGUuXG4gICAqL1xuICBwdWJsaWMgc2V0SW52aXNpYmlsaXR5KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5lbnRpdHkuZmxhZ3Muc2V0KEFjdG9yRmxhZy5JbnZpc2libGUsIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlJbnZpc2liaWxpdHlUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIENvbnRhaW5lcklkLFxuICBDb250YWluZXJUeXBlLFxuICBFcXVpcG1lbnRTbG90XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlDb250YWluZXIgfSBmcm9tIFwiLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vLi4vaXRlbVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrRW50cnksIEpTT05MaWtlT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuaW50ZXJmYWNlIEVxdWlwbWVudEVudHJ5IGV4dGVuZHMgSlNPTkxpa2VPYmplY3Qge1xuICBbeDogbnVtYmVyXTogSXRlbVN0YWNrRW50cnk7XG59XG5cbmNsYXNzIEVudGl0eUVxdWlwbWVudFRyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImVxdWlwbWVudFwiO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXI6IEVudGl0eUNvbnRhaW5lcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcihlbnRpdHkpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgRW50aXR5Q29udGFpbmVyKFxuICAgICAgZW50aXR5LFxuICAgICAgQ29udGFpbmVyVHlwZS5Bcm1vcixcbiAgICAgIENvbnRhaW5lcklkLkFybW9yLFxuICAgICAgNFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXF1aXBzIHRoZSBnaXZlbiBpdGVtIHRvIGdpdmVuIHNsb3QgaW4gdGhlIGVudGl0eSBlcXVpcG1lbnQuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBpdGVtIHdoZXJlIHRoZSBpdGVtIHdpbGwgYmUgcGxhY2VkXG4gICAqIEBwYXJhbSBpdGVtU3RhY2sgVGhlIGl0ZW0gdGhhdCB3aWxsIGJlIHBsYWNlZFxuICAgKi9cbiAgcHVibGljIHNldEVxdWlwbWVudChzbG90OiBFcXVpcG1lbnRTbG90LCBpdGVtU3RhY2s6IEl0ZW1TdGFjayk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyLnNldEl0ZW0oc2xvdCwgaXRlbVN0YWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlcXVpcG1lbnQgaXRlbSBhdCB0aGUgZ2l2ZW4gc2xvdC5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gZ2V0IHRoZSBlcXVpcG1lbnRcbiAgICogQHJldHVybnMgVGhlIGl0ZW0gaW4gdGhlIGRlc2lyZWQgc2xvdCBpZiBleGlzdGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRFcXVpcG1lbnQoc2xvdDogRXF1aXBtZW50U2xvdCk6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5nZXRJdGVtKHNsb3QpO1xuICB9XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVudGl0eS5jb21wb25lbnRzLmhhcyhcImVxdWlwbWVudFwiKSkgcmV0dXJuO1xuICAgIGNvbnN0IGVxdWlwbWVudCA9IHRoaXMuZW50aXR5LmNvbXBvbmVudHMuZ2V0KFwiZXF1aXBtZW50XCIpIGFzIEVxdWlwbWVudEVudHJ5O1xuXG4gICAgZm9yIChjb25zdCBzbG90IGluIGVxdWlwbWVudCkge1xuICAgICAgY29uc3QgZW50cnkgPSBlcXVpcG1lbnRbc2xvdF0gYXMgSXRlbVN0YWNrRW50cnk7XG5cbiAgICAgIGNvbnN0IGl0ZW1TdGFjayA9IG5ldyBJdGVtU3RhY2soZW50cnkuaWRlbnRpZmllciwge1xuICAgICAgICBhbW91bnQ6IGVudHJ5LmFtb3VudCxcbiAgICAgICAgYXV4aWxsYXJ5OiBlbnRyeS5hdXhpbGxhcnksXG4gICAgICAgIHdvcmxkOiB0aGlzLmVudGl0eS5nZXRXb3JsZCgpLFxuICAgICAgICBlbnRyeVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldEVxdWlwbWVudChOdW1iZXIucGFyc2VJbnQoc2xvdCksIGl0ZW1TdGFjayk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRGVzcGF3bigpOiB2b2lkIHtcbiAgICBjb25zdCBlcXVpcG1lbnQ6IEVxdWlwbWVudEVudHJ5ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW1TdGFjayBvZiB0aGlzLmNvbnRhaW5lci5zdG9yYWdlKSB7XG4gICAgICBpZiAoIWl0ZW1TdGFjaykgY29udGludWU7XG4gICAgICBlcXVpcG1lbnRbdGhpcy5jb250YWluZXIuc3RvcmFnZS5pbmRleE9mKGl0ZW1TdGFjayldID1cbiAgICAgICAgaXRlbVN0YWNrLmdldERhdGFFbnRyeSgpO1xuICAgIH1cbiAgICB0aGlzLmVudGl0eS5jb21wb25lbnRzLnNldChcImVxdWlwbWVudFwiLCBlcXVpcG1lbnQpO1xuICAgIGNvbnNvbGUuZGlyKHRoaXMuZW50aXR5LmNvbXBvbmVudHMuZ2V0KFwiZXF1aXBtZW50XCIpLCB7XG4gICAgICBkZXB0aDogSW5maW5pdHksXG4gICAgICBjb2xvcnM6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlFcXVpcG1lbnRUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRGF0YUlkLFxuICBEYXRhSXRlbSxcbiAgUHJvcGVydHlTeW5jRGF0YSxcbiAgU2V0QWN0b3JEYXRhUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVVwZGF0ZVNpZ25hbCB9IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcblxuY2xhc3MgTWV0YWRhdGFNYXAgZXh0ZW5kcyBNYXA8QWN0b3JEYXRhSWQsIERhdGFJdGVtPiB7XG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgdGhpcyBtZXRhZGF0YSBzZXQgaXMgYXR0YWNoZWQgdG9cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG1ldGFkYXRhIHNldFxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdGhhdCB0aGlzIG1ldGFkYXRhIHNldCBpcyBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBBY3RvckRhdGFJZCwgdmFsdWU6IERhdGFJdGVtPHVua25vd24+KTogdGhpcyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsKHRoaXMuZW50aXR5LCBrZXksIHZhbHVlKTtcblxuICAgIC8vIElmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZCwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0IG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnNldChrZXksIHNpZ25hbC5kYXRhSXRlbSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgd2hlbiBhIG5ldyB2YWx1ZSBpcyBhZGRlZFxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKGtleTogQWN0b3JEYXRhSWQpOiBib29sZWFuIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBkZWxldGUgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVsZXRlKGtleSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgd2hlbiBhIHZhbHVlIGlzIGRlbGV0ZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGNsZWFyIG1ldGhvZFxuICAgIHN1cGVyLmNsZWFyKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgd2hlbiB0aGUgc2V0IGlzIGNsZWFyZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgU2V0QWN0b3JEYXRhUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFNldEFjdG9yRGF0YVBhY2tldCgpO1xuICAgIHBhY2tldC5ydW50aW1lRW50aXR5SWQgPSB0aGlzLmVudGl0eS5ydW50aW1lSWQ7XG4gICAgcGFja2V0LmlucHV0VGljayA9IHRoaXMuZW50aXR5LmlzUGxheWVyKClcbiAgICAgID8gdGhpcy5lbnRpdHkuaW5wdXRUaWNrXG4gICAgICA6IHRoaXMuZW50aXR5LmRpbWVuc2lvbi53b3JsZC5jdXJyZW50VGljaztcbiAgICBwYWNrZXQuZGF0YSA9IFsuLi50aGlzLmVudGl0eS5tZXRhZGF0YS52YWx1ZXMoKV07XG4gICAgcGFja2V0LnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydHlTeW5jRGF0YShbXSwgW10pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBmbGFncyBzZXQgb24gdGhlIGVudGl0eVxuICAgIGZvciAoY29uc3QgW2ZsYWcsIGVuYWJsZWRdIG9mIHRoaXMuZW50aXR5LmZsYWdzKVxuICAgICAgcGFja2V0LnNldEZsYWcoZmxhZywgZW5hYmxlZCk7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBNZXRhZGF0YU1hcCB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRmxhZyxcbiAgUHJvcGVydHlTeW5jRGF0YSxcbiAgU2V0QWN0b3JEYXRhUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlGbGFnVXBkYXRlU2lnbmFsIH0gZnJvbSBcIi4uLy4uL2V2ZW50c1wiO1xuXG5jbGFzcyBBY3RvckZsYWdNYXAgZXh0ZW5kcyBNYXA8QWN0b3JGbGFnLCBib29sZWFuPiB7XG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgdGhpcyBhY3RvciBmbGFncyBtYXAgaXMgYXR0YWNoZWQgdG9cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFjdG9yIGZsYWdzIG1hcFxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdGhhdCB0aGlzIGFjdG9yIGZsYWdzIG1hcCBpcyBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBBY3RvckZsYWcsIHZhbHVlOiBib29sZWFuKTogdGhpcyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEVudGl0eUZsYWdVcGRhdGVTaWduYWxcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgRW50aXR5RmxhZ1VwZGF0ZVNpZ25hbCh0aGlzLmVudGl0eSwga2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBJZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxsZWQsIHJldHVybiB0aGlzXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldCBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5zZXQoa2V5LCBzaWduYWwudmFsdWUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhY3RvciBkYXRhIHdoZW4gYSBuZXcgdmFsdWUgaXMgYWRkZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShrZXk6IEFjdG9yRmxhZyk6IGJvb2xlYW4ge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGRlbGV0ZSBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWxldGUoa2V5KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSB3aGVuIGEgdmFsdWUgaXMgZGVsZXRlZFxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgY2xlYXIgbWV0aG9kXG4gICAgc3VwZXIuY2xlYXIoKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSB3aGVuIHRoZSBtYXAgaXMgY2xlYXJlZFxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBhY3RvciBkYXRhIG9mIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBTZXRBY3RvckRhdGFQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0QWN0b3JEYXRhUGFja2V0KCk7XG4gICAgcGFja2V0LnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQuaW5wdXRUaWNrID0gdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKVxuICAgICAgPyB0aGlzLmVudGl0eS5pbnB1dFRpY2tcbiAgICAgIDogdGhpcy5lbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuICAgIHBhY2tldC5kYXRhID0gWy4uLnRoaXMuZW50aXR5Lm1ldGFkYXRhLnZhbHVlcygpXTtcbiAgICBwYWNrZXQucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0eVN5bmNEYXRhKFtdLCBbXSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGZsYWdzIHNldCBvbiB0aGUgZW50aXR5XG4gICAgZm9yIChjb25zdCBbZmxhZywgZW5hYmxlZF0gb2YgdGhpcy5lbnRpdHkuZmxhZ3MpXG4gICAgICBwYWNrZXQuc2V0RmxhZyhmbGFnLCBlbmFibGVkKTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5lbnRpdHkuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG59XG5cbmV4cG9ydCB7IEFjdG9yRmxhZ01hcCB9O1xuIiwgImltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlTmFtZSxcbiAgVXBkYXRlQXR0cmlidXRlc1BhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5QXR0cmlidXRlVXBkYXRlU2lnbmFsIH0gZnJvbSBcIi4uLy4uL2V2ZW50c1wiO1xuXG5jbGFzcyBBdHRyaWJ1dGVNYXAgZXh0ZW5kcyBNYXA8QXR0cmlidXRlTmFtZSwgQXR0cmlidXRlPiB7XG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgdGhpcyBtZXRhZGF0YSBzZXQgaXMgYXR0YWNoZWQgdG9cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG1ldGFkYXRhIHNldFxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdGhhdCB0aGlzIG1ldGFkYXRhIHNldCBpcyBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBBdHRyaWJ1dGVOYW1lLCB2YWx1ZTogQXR0cmlidXRlKTogdGhpcyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEVudGl0eUF0dHJpYnV0ZVVwZGF0ZVNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFbnRpdHlBdHRyaWJ1dGVVcGRhdGVTaWduYWwodGhpcy5lbnRpdHksIGtleSwgdmFsdWUpO1xuXG4gICAgLy8gSWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkLCByZXR1cm4gdGhpc1xuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXQgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuc2V0KGtleSwgc2lnbmFsLnZhbHVlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSB3aGVuIGEgbmV3IHZhbHVlIGlzIGFkZGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBBdHRyaWJ1dGVOYW1lKTogYm9vbGVhbiB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgZGVsZXRlIG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhY3RvciBkYXRhIHdoZW4gYSB2YWx1ZSBpcyBkZWxldGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBjbGVhciBtZXRob2RcbiAgICBzdXBlci5jbGVhcigpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhY3RvciBkYXRhIHdoZW4gdGhlIHNldCBpcyBjbGVhcmVkXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IFVwZGF0ZUF0dHJpYnV0ZXNQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgVXBkYXRlQXR0cmlidXRlc1BhY2tldCgpO1xuICAgIHBhY2tldC5ydW50aW1lQWN0b3JJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQuaW5wdXRUaWNrID0gdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKVxuICAgICAgPyB0aGlzLmVudGl0eS5pbnB1dFRpY2tcbiAgICAgIDogdGhpcy5lbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuICAgIHBhY2tldC5hdHRyaWJ1dGVzID0gWy4uLnRoaXMuZW50aXR5LmF0dHJpYnV0ZXMudmFsdWVzKCldO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmVudGl0eS5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXR0cmlidXRlTWFwIH07XG4iLCAiaW1wb3J0IHtcbiAgQWJpbGl0eUluZGV4LFxuICBBYmlsaXR5TGF5ZXJUeXBlLFxuICBBYmlsaXR5U2V0LFxuICBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCxcbiAgVXBkYXRlQWJpbGl0aWVzUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vcGxheWVyXCI7XG5pbXBvcnQgeyBQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIH0gZnJvbSBcIi4uLy4uL2V2ZW50c1wiO1xuXG5jbGFzcyBBYmlsaXR5TWFwIGV4dGVuZHMgTWFwPEFiaWxpdHlJbmRleCwgYm9vbGVhbj4ge1xuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHRoZSBhYmlsaXRpZXMgYXJlIGF0dGFjaGVkIHRvXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBhYmlsaXR5IG1hcFxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCB0aGUgYWJpbGl0aWVzIGFyZSBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBBYmlsaXR5SW5kZXgsIHZhbHVlOiBib29sZWFuKTogdGhpcyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllckFiaWxpdHlVcGRhdGVTaWduYWxcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVyQWJpbGl0eVVwZGF0ZVNpZ25hbCh0aGlzLnBsYXllciwga2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBJZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxsZWQsIHJldHVybiB0aGlzXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldCBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5zZXQoa2V5LCBzaWduYWwudmFsdWUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhYmlsaXRpZXMgd2hlbiBhIG5ldyB2YWx1ZSBpcyBhZGRlZFxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKGtleTogQWJpbGl0eUluZGV4KTogYm9vbGVhbiB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgZGVsZXRlIG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhYmlsaXRpZXMgd2hlbiBhIHZhbHVlIGlzIGRlbGV0ZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGNsZWFyIG1ldGhvZFxuICAgIHN1cGVyLmNsZWFyKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFiaWxpdGllcyB3aGVuIHRoZSBtYXAgaXMgY2xlYXJlZFxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGUgb3JpZ2luYWwgc2V0IG1ldGhvZFxuICAgKiBAcGFyYW0ga2V5IFRoZSBhYmlsaXR5IGluZGV4XG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWVcbiAgICogQHJldHVybnMgVGhlIGFiaWxpdHkgbWFwXG4gICAqL1xuICBwdWJsaWMgc3VwZXJTZXQoa2V5OiBBYmlsaXR5SW5kZXgsIHZhbHVlOiBib29sZWFuKTogdGhpcyB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0IG1ldGhvZFxuICAgIHJldHVybiBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBhYmlsaXRpZXMgb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgVXBkYXRlQWJpbGl0aWVzUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFVwZGF0ZUFiaWxpdGllc1BhY2tldCgpO1xuICAgIHBhY2tldC5wZXJtaXNzaW9uTGV2ZWwgPSB0aGlzLnBsYXllci5wZXJtaXNzaW9uO1xuICAgIHBhY2tldC5jb21tYW5kUGVybWlzc2lvbkxldmVsID0gdGhpcy5wbGF5ZXIucGVybWlzc2lvbiA9PT0gMiA/IDEgOiAwO1xuICAgIHBhY2tldC5lbnRpdHlVbmlxdWVJZCA9IHRoaXMucGxheWVyLnVuaXF1ZUlkO1xuICAgIHBhY2tldC5hYmlsaXRpZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IEFiaWxpdHlMYXllclR5cGUuQmFzZSxcbiAgICAgICAgYWJpbGl0aWVzOiBbLi4udGhpcy5wbGF5ZXIuYWJpbGl0aWVzLmVudHJpZXMoKV0ubWFwKFxuICAgICAgICAgIChbYWJpbGl0eSwgdmFsdWVdKSA9PiBuZXcgQWJpbGl0eVNldChhYmlsaXR5LCB2YWx1ZSlcbiAgICAgICAgKSxcbiAgICAgICAgd2Fsa1NwZWVkOiAwLjEsXG4gICAgICAgIGZseVNwZWVkOiAwLjA1XG4gICAgICB9XG4gICAgXTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5wbGF5ZXIuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbGl2ZVxuICAgIGlmICghdGhpcy5wbGF5ZXIuaXNBbGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IFNldFBsYXllckdhbWVUeXBlUGFja2V0XG4gICAgY29uc3QgZ2FtZW1vZGUgPSBuZXcgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQoKTtcbiAgICBnYW1lbW9kZS5nYW1lbW9kZSA9IHRoaXMucGxheWVyLmdhbWVtb2RlO1xuXG4gICAgLy8gU2VuZCB0aGUgZ2FtZW1vZGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnBsYXllci5zZW5kKGdhbWVtb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBYmlsaXR5TWFwIH07XG4iLCAiaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcbmltcG9ydCB7XG4gIEFiaWxpdHlJbmRleCxcbiAgQmxvY2tQb3NpdGlvbixcbiAgQ2hhbmdlRGltZW5zaW9uUGFja2V0LFxuICBDb250YWluZXJOYW1lLFxuICBDcmVhdGl2ZUNvbnRlbnRQYWNrZXQsXG4gIERhdGFQYWNrZXQsXG4gIERlZmF1bHRBYmlsaXR5VmFsdWVzLFxuICBEaXNjb25uZWN0TWVzc2FnZSxcbiAgRGlzY29ubmVjdFBhY2tldCxcbiAgRGlzY29ubmVjdFJlYXNvbixcbiAgR2FtZW1vZGUsXG4gIE1vdmVNb2RlLFxuICBNb3ZlUGxheWVyUGFja2V0LFxuICBQZXJtaXNzaW9uTGV2ZWwsXG4gIFNlcmlhbGl6ZWRTa2luLFxuICBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCxcbiAgVGVsZXBvcnRDYXVzZSxcbiAgVGV4dFBhY2tldCxcbiAgVGV4dFBhY2tldFR5cGUsXG4gIFRyYW5zZmVyUGFja2V0LFxuICBWZWN0b3IzZlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGxheWVyRW50cnksIFBsYXllclByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERpbWVuc2lvbiwgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi9jb250YWluZXJcIjtcbmltcG9ydCB7IEl0ZW1CdW5kbGVUcmFpdCwgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7XG4gIEVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbCxcbiAgUGxheWVyR2FtZW1vZGVDaGFuZ2VTaWduYWxcbn0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHlcIjtcbmltcG9ydCB7IEFiaWxpdHlNYXAgfSBmcm9tIFwiLi9tYXBzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBQbGF5ZXJDdXJzb3JUcmFpdCwgUGxheWVyVHJhaXQgfSBmcm9tIFwiLi90cmFpdHNcIjtcbmltcG9ydCB7IERldmljZSB9IGZyb20gXCIuL2RldmljZVwiO1xuXG5jb25zdCBEZWZhdWx0UGxheWVyUHJvcGVydGllczogUGxheWVyUHJvcGVydGllcyA9IHtcbiAgdXNlcm5hbWU6IFwiU2VyZW5pdHlKU1wiLFxuICB4dWlkOiBcIjAwMDAwMDAwMDAwMDAwMDBcIixcbiAgdXVpZDogXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgdW5pcXVlSWQ6IDBuLFxuICBkZXZpY2U6IERldmljZS5lbXB0eSgpLFxuICBza2luOiBTZXJpYWxpemVkU2tpbi5lbXB0eSgpXG59O1xuXG5jbGFzcyBQbGF5ZXIgZXh0ZW5kcyBFbnRpdHkge1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmFrbmV0IGNvbm5lY3Rpb24gb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb246IENvbm5lY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB1c2VybmFtZSBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcm5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHhib3ggdXNlciBpZCBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgeHVpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdXVpZCBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXVpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhaXRzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHMgPSBuZXcgTWFwPHN0cmluZywgUGxheWVyVHJhaXQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGFiaWxpdGllcyBvZiB0aGUgcGxheWVyLCBhbmQgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWJpbGl0aWVzID0gbmV3IEFiaWxpdHlNYXAodGhpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgaW5mb3JtYXRpb24gb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRldmljZTogRGV2aWNlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2tpbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2tpbjogU2VyaWFsaXplZFNraW47XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGlucHV0IHRpY2sgb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGlucHV0VGljayA9IDBuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbiBsZXZlbCBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcGVybWlzc2lvbjogUGVybWlzc2lvbkxldmVsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRoYXQgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgdmlld2luZy5cbiAgICovXG4gIHB1YmxpYyBvcGVuZWRDb250YWluZXI6IENvbnRhaW5lciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IGJsb2NrIHRoYXQgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnJlYWtpbmcuXG4gICAqL1xuICBwdWJsaWMgYmxvY2tUYXJnZXQ6IEJsb2NrUG9zaXRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBpdGVtIHRoYXQgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgdXNpbmcuXG4gICAqL1xuICBwdWJsaWMgaXRlbVRhcmdldDogSXRlbVN0YWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgZW50aXR5IHRoYXQgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgbG9va2luZyBhdC5cbiAgICovXG4gIHB1YmxpYyBlbnRpdHlUYXJnZXQ6IEVudGl0eSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2FtZW1vZGUgb2YgdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyBnZXQgZ2FtZW1vZGUoKTogR2FtZW1vZGUge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSBnYW1lbW9kZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50cy5oYXMoXCJnYW1lbW9kZVwiKSlcbiAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBnYW1lbW9kZSBmb3IgdGhlIHBsYXllclxuICAgICAgdGhpcy5jb21wb25lbnRzLnNldChcImdhbWVtb2RlXCIsIEdhbWVtb2RlLlN1cnZpdmFsKTsgLy8gVE9ETzogR2V0IHRoZSBkZWZhdWx0IGdhbWVtb2RlIGZyb20gdGhlIHdvcmxkXG5cbiAgICAvLyBSZXR1cm4gdGhlIGdhbWVtb2RlIG9mIHRoZSBwbGF5ZXJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRzLmdldChcImdhbWVtb2RlXCIpIGFzIEdhbWVtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBnYW1lbW9kZSBvZiB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIHNldCBnYW1lbW9kZSh2YWx1ZTogR2FtZW1vZGUpIHtcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVyR2FtZW1vZGVDaGFuZ2VTaWduYWwodGhpcywgdGhpcy5nYW1lbW9kZSwgdmFsdWUpO1xuXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdGhlIGdhbWVtb2RlIG9mIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmNvbXBvbmVudHMuc2V0KFwiZ2FtZW1vZGVcIiwgdmFsdWUpO1xuXG4gICAgLy8gQ2FsbCB0aGUgb25HYW1lbW9kZUNoYW5nZSBldmVudCBmb3IgdGhlIHBsYXllclxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHRyYWl0Lm9uR2FtZW1vZGVDaGFuZ2U/Lih2YWx1ZSk7XG5cbiAgICAvLyBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYWJpbGl0eSB0byBmbHkgYmFzZWQgb24gdGhlIGdhbWVtb2RlXG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBHYW1lbW9kZS5TdXJ2aXZhbDpcbiAgICAgIGNhc2UgR2FtZW1vZGUuQWR2ZW50dXJlOiB7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGFiaWxpdHkgdG8gZmx5XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguTWF5Rmx5LCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEdhbWVtb2RlLkNyZWF0aXZlOlxuICAgICAgY2FzZSBHYW1lbW9kZS5TcGVjdGF0b3I6IHtcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBhYmlsaXR5IHRvIGZseVxuICAgICAgICB0aGlzLmFiaWxpdGllcy5zZXQoQWJpbGl0eUluZGV4Lk1heUZseSwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyBzZXQgcGxheWVyIGdhbWUgdHlwZSBwYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQoKTtcbiAgICBwYWNrZXQuZ2FtZW1vZGUgPSB2YWx1ZTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5zZW5kKHBhY2tldCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQbGF5ZXJQcm9wZXJ0aWVzPlxuICApIHtcbiAgICBzdXBlcihkaW1lbnNpb24sIEVudGl0eUlkZW50aWZpZXIuUGxheWVyLCBwcm9wZXJ0aWVzKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgIC8vIFNwcmVhZCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIGFuZCB0aGUgcHJvdmlkZWQgcHJvcGVydGllc1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5EZWZhdWx0UGxheWVyUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnVzZXJuYW1lID0gcHJvcHMudXNlcm5hbWU7XG4gICAgdGhpcy54dWlkID0gcHJvcHMueHVpZDtcbiAgICB0aGlzLnV1aWQgPSBwcm9wcy51dWlkO1xuICAgIHRoaXMuZGV2aWNlID0gcHJvcHMuZGV2aWNlO1xuICAgIHRoaXMuc2tpbiA9IHByb3BzLnNraW47XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIHBlcm1pc3Npb24gbGV2ZWwgZnJvbSB0aGUgcGVybWlzc2lvbnMgbWFwXG4gICAgdGhpcy5wZXJtaXNzaW9uID0gdGhpcy5zZXJlbml0eS5wZXJtaXNzaW9ucy5nZXQodGhpcy51dWlkKTtcblxuICAgIC8vIElmIHRoZSBwbGF5ZXIgcHJvcGVydGllcyBjb250YWlucyBhbiBlbnRyeSwgbG9hZCBpdFxuICAgIGlmIChwcm9wZXJ0aWVzPy5lbnRyeSlcbiAgICAgIHRoaXMubG9hZERhdGFFbnRyeShkaW1lbnNpb24ud29ybGQsIHByb3BlcnRpZXMuZW50cnkpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGxheWVyXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHRyYWl0cyBmb3IgdGhlIHBsYXllclxuICAgIGNvbnN0IHRyYWl0cyA9IHRoaXMuZGltZW5zaW9uLndvcmxkLmVudGl0eVBhbGV0dGUuZ2V0UmVnaXN0cnlGb3IoXG4gICAgICB0aGlzLnR5cGUuaWRlbnRpZmllclxuICAgICk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgdHJhaXRzIHRvIHRoZSBwbGF5ZXIsIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRyYWl0cykgaWYgKCF0aGlzLmhhc1RyYWl0KHRyYWl0KSkgdGhpcy5hZGRUcmFpdCh0cmFpdCk7XG5cbiAgICAvLyBBZGQgdGhlIGRlZmF1bHQgYWJpbGl0aWVzIHRvIHRoZSBwbGF5ZXIsIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFthYmlsaXR5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoRGVmYXVsdEFiaWxpdHlWYWx1ZXMpKSB7XG4gICAgICBpZiAoIXRoaXMuYWJpbGl0aWVzLmhhcygrYWJpbGl0eSBhcyBBYmlsaXR5SW5kZXgpKVxuICAgICAgICB0aGlzLmFiaWxpdGllcy5zZXQoK2FiaWxpdHkgYXMgQWJpbGl0eUluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcGFja2V0cyB0byB0aGUgcGxheWVyIChOb3JtYWwgUHJpb3JpdHkpXG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIHNlbmQgdG8gdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIHNlbmQoLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD4pOiB2b2lkIHtcbiAgICAvLyBTZW5kIHRoZSBwYWNrZXRzIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnNlcmVuaXR5Lm5ldHdvcmsuc2VuZE5vcm1hbCh0aGlzLmNvbm5lY3Rpb24sIC4uLnBhY2tldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcGFja2V0cyB0byB0aGUgcGxheWVyIChJbW1lZGlhdGUgUHJpb3JpdHkpXG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIHNlbmQgdG8gdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIHNlbmRJbW1lZGlhdGUoLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD4pOiB2b2lkIHtcbiAgICAvLyBTZW5kIHRoZSBwYWNrZXRzIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnNlcmVuaXR5Lm5ldHdvcmsuc2VuZEltbWVkaWF0ZSh0aGlzLmNvbm5lY3Rpb24sIC4uLnBhY2tldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgYW4gb3BlcmF0b3JcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcGxheWVyIGlzIGFuIG9wZXJhdG9yXG4gICAqL1xuICBwdWJsaWMgaXNPcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uID09PSBQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBvcGVyYXRvciBzdGF0dXMgdG8gdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIG9wKCk6IHZvaWQge1xuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgcGVybWlzc2lvbiBsZXZlbCB0byBvcGVyYXRvclxuICAgIHRoaXMucGVybWlzc2lvbiA9IFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgcGVybWlzc2lvbiBsZXZlbCB0byBvcGVyYXRvciBpbiB0aGUgcGVybWlzc2lvbnMgbWFwXG4gICAgdGhpcy5zZXJlbml0eS5wZXJtaXNzaW9ucy5zZXQodGhpcy51dWlkLCBQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3IpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBwbGF5ZXIncyBhYmlsaXRpZXNcbiAgICB0aGlzLmFiaWxpdGllcy5zZXQoQWJpbGl0eUluZGV4Lk9wZXJhdG9yQ29tbWFuZHMsIHRydWUpO1xuICAgIHRoaXMuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguVGVsZXBvcnQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgb3BlcmF0b3Igc3RhdHVzIGZyb20gdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGRlb3AoKTogdm9pZCB7XG4gICAgLy8gU2V0IHRoZSBwbGF5ZXIncyBwZXJtaXNzaW9uIGxldmVsIHRvIG1lbWJlclxuICAgIHRoaXMucGVybWlzc2lvbiA9IFBlcm1pc3Npb25MZXZlbC5NZW1iZXI7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIHBlcm1pc3Npb24gbGV2ZWwgdG8gbWVtYmVyIGluIHRoZSBwZXJtaXNzaW9ucyBtYXBcbiAgICB0aGlzLnNlcmVuaXR5LnBlcm1pc3Npb25zLnNldCh0aGlzLnV1aWQsIFBlcm1pc3Npb25MZXZlbC5NZW1iZXIpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBwbGF5ZXIncyBhYmlsaXRpZXNcbiAgICB0aGlzLmFiaWxpdGllcy5zZXQoQWJpbGl0eUluZGV4Lk9wZXJhdG9yQ29tbWFuZHMsIGZhbHNlKTtcbiAgICB0aGlzLmFiaWxpdGllcy5zZXQoQWJpbGl0eUluZGV4LlRlbGVwb3J0LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdCB0aGUgcGxheWVyIGZyb20gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHRoZSBkaXNjb25uZWN0aW9uXG4gICAqIEBwYXJhbSBjb2RlIFRoZSBkaXNjb25uZWN0IHJlYXNvbiBjb2RlXG4gICAqIEBwYXJhbSBoaWRlRGlzY29ubmVjdFNjcmVlbiBXaGV0aGVyIHRvIGhpZGUgdGhlIGRpc2Nvbm5lY3Qgc2NyZWVuXG4gICAqL1xuICBwdWJsaWMgZGlzY29ubmVjdChcbiAgICByZWFzb246IHN0cmluZyxcbiAgICBjb2RlPzogRGlzY29ubmVjdFJlYXNvbixcbiAgICBoaWRlRGlzY29ubmVjdFNjcmVlbj86IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBkaXNjb25uZWN0IHBhY2tldCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVhc29uXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IERpc2Nvbm5lY3RQYWNrZXQoKTtcbiAgICBwYWNrZXQubWVzc2FnZSA9IG5ldyBEaXNjb25uZWN0TWVzc2FnZShyZWFzb24sIHJlYXNvbik7XG4gICAgcGFja2V0LnJlYXNvbiA9IGNvZGUgPz8gRGlzY29ubmVjdFJlYXNvbi5LaWNrZWQ7XG4gICAgcGFja2V0LmhpZGVEaXNjb25uZWN0U2NyZWVuID0gaGlkZURpc2Nvbm5lY3RTY3JlZW4gPz8gZmFsc2U7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgIHRoaXMuc2VuZEltbWVkaWF0ZShwYWNrZXQpO1xuXG4gICAgLy8gRGVzcGF3biB0aGUgcGxheWVyIGZyb20gdGhlIHdvcmxkXG4gICAgdGhpcy5kZXNwYXduKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIHNlbnQuXG4gICAqL1xuICBwdWJsaWMgc2VuZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ29uc3RydWN0IHRoZSB0ZXh0IHBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgVGV4dFBhY2tldCgpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwYWNrZXQgZGF0YS5cbiAgICBwYWNrZXQudHlwZSA9IFRleHRQYWNrZXRUeXBlLlJhdztcbiAgICBwYWNrZXQubmVlZHNUcmFuc2xhdGlvbiA9IGZhbHNlO1xuICAgIHBhY2tldC5zb3VyY2UgPSBudWxsO1xuICAgIHBhY2tldC5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBwYWNrZXQucGFyYW1ldGVycyA9IG51bGw7XG4gICAgcGFja2V0Lnh1aWQgPSBcIlwiO1xuICAgIHBhY2tldC5wbGF0Zm9ybUNoYXRJZCA9IFwiXCI7XG4gICAgcGFja2V0LmZpbHRlcmVkID0gXCJcIjtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldC5cbiAgICB0aGlzLnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjb250YWluZXIgZnJvbSB0aGUgcGxheWVyLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIGdldC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb250YWluZXIoXG4gICAgbmFtZTogQ29udGFpbmVyTmFtZSxcbiAgICBkeW5hbWljSWQ/OiBudW1iZXJcbiAgKTogQ29udGFpbmVyIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN1cGVyIGluc3RhbmNlIHdpbGwgZmV0Y2ggdGhlIGNvbnRhaW5lclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHN1cGVyLmdldENvbnRhaW5lcihuYW1lLCBkeW5hbWljSWQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBudWxsIGFuZCB0aGUgbmFtZSBpcyBkeW5hbWljXG4gICAgaWYgKGNvbnRhaW5lciA9PT0gbnVsbCAmJiBuYW1lID09PSBDb250YWluZXJOYW1lLkR5bmFtaWMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSBjdXJzb3IgdHJhaXRcbiAgICAgIGlmICghdGhpcy5oYXNUcmFpdChQbGF5ZXJDdXJzb3JUcmFpdCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwbGF5ZXIgZG9lcyBub3QgaGF2ZSBhIGN1cnNvciB0cmFpdC5cIik7XG5cbiAgICAgIC8vIEdldCB0aGUgY3Vyc29yIHRyYWl0XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy5nZXRUcmFpdChQbGF5ZXJDdXJzb3JUcmFpdCk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaXRlbXMgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbnRhaW5lci5zdG9yYWdlKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIHZhbGlkXG4gICAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaGFzIGEgSXRlbUJ1bmRsZVRyYWl0XG4gICAgICAgIGlmIChpdGVtLmhhc1RyYWl0KEl0ZW1CdW5kbGVUcmFpdCkpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGJ1bmRsZSB0cmFpdFxuICAgICAgICAgIGNvbnN0IGJ1bmRsZSA9IGl0ZW0uZ2V0VHJhaXQoSXRlbUJ1bmRsZVRyYWl0KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBidW5kbGUgaGFzIHRoZSBkeW5hbWljIGlkXG4gICAgICAgICAgaWYgKGJ1bmRsZS5keW5hbWljSWQgPT09IGR5bmFtaWNJZCkgcmV0dXJuIGJ1bmRsZS5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgc3VwZXIgaW5zdGFuY2UgZm91bmQgdGhlIGNvbnRhaW5lclxuICAgIGlmIChjb250YWluZXIgIT09IG51bGwpIHJldHVybiBjb250YWluZXI7XG5cbiAgICAvLyBTd2l0Y2ggdGhlIGNvbnRhaW5lciBuYW1lXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgb3BlbmVkIGNvbnRhaW5lciBpZiBpdCBleGlzdHNcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbmVkQ29udGFpbmVyO1xuICAgICAgfVxuXG4gICAgICAvLyBjYXNlIENvbnRhaW5lck5hbWUuQ3JhZnRpbmdJbnB1dDoge1xuICAgICAgLy8gICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyB0aGUgY3JhZnRpbmcgaW5wdXQgY29tcG9uZW50XG4gICAgICAvLyAgIGlmICghdGhpcy5oYXNDb21wb25lbnQoXCJtaW5lY3JhZnQ6Y3JhZnRpbmdfaW5wdXRcIikpXG4gICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBsYXllciBkb2VzIG5vdCBoYXZlIGEgY3JhZnRpbmcgaW5wdXQuXCIpO1xuXG4gICAgICAvLyAgIC8vIEdldCB0aGUgY3JhZnRpbmcgaW5wdXQgY29tcG9uZW50XG4gICAgICAvLyAgIGNvbnN0IGNyYWZ0aW5nSW5wdXQgPSB0aGlzLmdldENvbXBvbmVudChcIm1pbmVjcmFmdDpjcmFmdGluZ19pbnB1dFwiKTtcblxuICAgICAgLy8gICAvLyBSZXR1cm4gdGhlIGNyYWZ0aW5nIGlucHV0IGNvbnRhaW5lclxuICAgICAgLy8gICByZXR1cm4gY3JhZnRpbmdJbnB1dC5jb250YWluZXI7XG4gICAgICAvLyB9XG5cbiAgICAgIGNhc2UgQ29udGFpbmVyTmFtZS5DdXJzb3I6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIGN1cnNvciB0cmFpdFxuICAgICAgICBpZiAoIXRoaXMuaGFzVHJhaXQoUGxheWVyQ3Vyc29yVHJhaXQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwbGF5ZXIgZG9lcyBub3QgaGF2ZSBhIGN1cnNvciB0cmFpdC5cIik7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBjdXJzb3IgdHJhaXRcbiAgICAgICAgY29uc3QgY3Vyc29yID0gdGhpcy5nZXRUcmFpdChQbGF5ZXJDdXJzb3JUcmFpdCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBjdXJzb3IgY29udGFpbmVyXG4gICAgICAgIHJldHVybiBjdXJzb3IuY29udGFpbmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3biB0aGUgcGxheWVyIGluIHRoZSBkaW1lbnNpb25cbiAgICovXG4gIHB1YmxpYyBzcGF3bigpOiB0aGlzIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2QgdG8gc3Bhd24gdGhlIHBsYXllclxuICAgIHN1cGVyLnNwYXduKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFiaWxpdGllcyBvZiB0aGUgcGxheWVyXG4gICAgdGhpcy5hYmlsaXRpZXMudXBkYXRlKCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQ3JlYXRpdmVDb250ZW50UGFja2V0LCBhbmQgbWFwIHRoZSBjcmVhdGl2ZSBjb250ZW50IHRvIHRoZSBwYWNrZXRcbiAgICBjb25zdCBjb250ZW50ID0gbmV3IENyZWF0aXZlQ29udGVudFBhY2tldCgpO1xuICAgIGNvbnRlbnQuaXRlbXMgPSB0aGlzLmdldFdvcmxkKClcbiAgICAgIC5pdGVtUGFsZXR0ZS5nZXRDcmVhdGl2ZUNvbnRlbnQoKVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5ldHdvcms6IGl0ZW0udHlwZS5uZXR3b3JrLFxuICAgICAgICAgIG1ldGFkYXRhOiBpdGVtLm1ldGFkYXRhLFxuICAgICAgICAgIHN0YWNrU2l6ZTogMSxcbiAgICAgICAgICBuZXR3b3JrQmxvY2tJZDpcbiAgICAgICAgICAgIGl0ZW0udHlwZS5ibG9jaz8ucGVybXV0YXRpb25zW2l0ZW0ubWV0YWRhdGFdPy5uZXR3b3JrID8/IDAsXG4gICAgICAgICAgZXh0cmFzOiB7XG4gICAgICAgICAgICBjYW5EZXN0cm95OiBbXSxcbiAgICAgICAgICAgIGNhblBsYWNlT246IFtdLFxuICAgICAgICAgICAgbmJ0OiBpdGVtLm5idFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2VyaWFsaXplIHRoZSBhdmFpbGFibGUgY29tbWFuZHMgZm9yIHRoZSBwbGF5ZXJcbiAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMuZ2V0V29ybGQoKS5jb21tYW5kcy5zZXJpYWxpemUoKTtcblxuICAgIC8vIEZpbHRlciB0aGUgY29tbWFuZHMgYnkgdGhlIHBsYXllcidzIHBlcm1pc3Npb24gbGV2ZWxcbiAgICBjb21tYW5kcy5jb21tYW5kcyA9IGNvbW1hbmRzLmNvbW1hbmRzLmZpbHRlcihcbiAgICAgICh4KSA9PiB4LnBlcm1pc3Npb25MZXZlbCA8PSB0aGlzLnBlcm1pc3Npb25cbiAgICApO1xuXG4gICAgLy8gU2VuZCB0aGUgYXZhaWxhYmxlIGNvbW1hbmRzIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5zZW5kKGNvbnRlbnQsIGNvbW1hbmRzKTtcblxuICAgIC8vIFJldHVybiB0aGUgcGxheWVyXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIHRoZSBwbGF5ZXIgdG8gYSBkaWZmZXJlbnQgc2VydmVyLlxuICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byB0cmFuc2ZlciB0aGUgcGxheWVyIHRvLlxuICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byB0cmFuc2ZlciB0aGUgcGxheWVyIHRvLlxuICAgKiBAcGFyYW0gcmVsb2FkIElmIHRoZSB3b3JsZCBzaG91bGQgYmUgcmVsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmZXIoYWRkcmVzczogc3RyaW5nLCBwb3J0OiBudW1iZXIsIHJlbG9hZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IFRyYW5zZmVyUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFRyYW5zZmVyUGFja2V0KCk7XG5cbiAgICAvLyBTZXQgdGhlIHBhY2tldCBwcm9wZXJ0aWVzXG4gICAgcGFja2V0LmFkZHJlc3MgPSBhZGRyZXNzO1xuICAgIHBhY2tldC5wb3J0ID0gcG9ydDtcbiAgICBwYWNrZXQucmVsb2FkV29ybGQgPSByZWxvYWQ7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgIHRoaXMuc2VuZChwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlbGVwb3J0cyB0aGUgcGxheWVyIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gdGVsZXBvcnQgdGhlIHBsYXllciB0by5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHRlbGVwb3J0IHRoZSBwbGF5ZXIgdG8uXG4gICAqL1xuICBwdWJsaWMgdGVsZXBvcnQocG9zaXRpb246IFZlY3RvcjNmLCBkaW1lbnNpb24/OiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIHBvc2l0aW9uXG4gICAgdGhpcy5wb3NpdGlvbi54ID0gcG9zaXRpb24ueDtcbiAgICB0aGlzLnBvc2l0aW9uLnkgPSBwb3NpdGlvbi55O1xuICAgIHRoaXMucG9zaXRpb24ueiA9IHBvc2l0aW9uLno7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGltZW5zaW9uIGlzIHByb3ZpZGVkXG4gICAgaWYgKGRpbWVuc2lvbikge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5kaW1lbnNpb24sXG4gICAgICAgIGRpbWVuc2lvblxuICAgICAgKTtcblxuICAgICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG4gICAgICAvLyBEZXNwYXduIHRoZSBwbGF5ZXIgZnJvbSB0aGUgY3VycmVudCBkaW1lbnNpb25cbiAgICAgIHRoaXMuZGVzcGF3bigpO1xuXG4gICAgICBpZiAoZGltZW5zaW9uLndvcmxkICE9PSB0aGlzLmRpbWVuc2lvbi53b3JsZCkge1xuICAgICAgICAvLyBTYXZlIHRoZSBwbGF5ZXJzIGN1cnJlbnQgZGF0YVxuICAgICAgICB0aGlzLmdldFdvcmxkKCkucHJvdmlkZXIud3JpdGVQbGF5ZXIoXG4gICAgICAgICAgdGhpcy5nZXREYXRhRW50cnkoKSxcbiAgICAgICAgICB0aGlzLmRpbWVuc2lvblxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsYXllciBkYXRhIGZyb20gdGhlIG5ldyB3b3JsZFxuICAgICAgICBjb25zdCBkYXRhID0gZGltZW5zaW9uLndvcmxkLnByb3ZpZGVyLnJlYWRQbGF5ZXIodGhpcy51dWlkLCBkaW1lbnNpb24pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgZGF0YSBleGlzdHNcbiAgICAgICAgaWYgKGRhdGEpIHRoaXMubG9hZERhdGFFbnRyeShkaW1lbnNpb24ud29ybGQsIGRhdGEsIHRydWUpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBDbGVhciB0aGUgcGxheWVyJ3MgZGF0YVxuICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgICAgICAgIHRoaXMudHJhaXRzLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5hYmlsaXRpZXMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLm1ldGFkYXRhLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5mbGFncy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGxheWVyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZGltZW5zaW9uIHR5cGVzIGFyZSBkaWZmZXJlbnRcbiAgICAgIC8vIFRoaXMgYWxsb3dzIGZvciBhIGZhc3RlciBkaW1lbnNpb24gY2hhbmdlIGlmIHRoZSB0eXBlcyBhcmUgdGhlIHNhbWVcbiAgICAgIGlmICh0aGlzLmRpbWVuc2lvbi50eXBlICE9PSBkaW1lbnNpb24udHlwZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgQ2hhbmdlRGltZW5zaW9uUGFja2V0XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBDaGFuZ2VEaW1lbnNpb25QYWNrZXQoKTtcbiAgICAgICAgcGFja2V0LmRpbWVuc2lvbiA9IGRpbWVuc2lvbi50eXBlO1xuICAgICAgICBwYWNrZXQucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgcGFja2V0LnJlc3Bhd24gPSB0cnVlO1xuICAgICAgICBwYWNrZXQuaGFzTG9hZGluZ1NjcmVlbiA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICAgIHRoaXMuc2VuZEltbWVkaWF0ZShwYWNrZXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIG5ldyBkaW1lbnNpb25cbiAgICAgIHRoaXMuZGltZW5zaW9uID0gZGltZW5zaW9uO1xuXG4gICAgICAvLyBTcGF3biB0aGUgcGxheWVyIGluIHRoZSBuZXcgZGltZW5zaW9uXG4gICAgICB0aGlzLnNwYXduKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWVyJ3MgcG9zaXRpb25cbiAgICAgIHJldHVybiB0aGlzLnRlbGVwb3J0KHBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1vdmVQbGF5ZXJQYWNrZXRcbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBNb3ZlUGxheWVyUGFja2V0KCk7XG5cbiAgICAgIC8vIFNldCB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICAgIHBhY2tldC5ydW50aW1lSWQgPSB0aGlzLnJ1bnRpbWVJZDtcbiAgICAgIHBhY2tldC5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgcGFja2V0LnBpdGNoID0gdGhpcy5yb3RhdGlvbi5waXRjaDtcbiAgICAgIHBhY2tldC55YXcgPSB0aGlzLnJvdGF0aW9uLnlhdztcbiAgICAgIHBhY2tldC5oZWFkWWF3ID0gdGhpcy5yb3RhdGlvbi5oZWFkWWF3O1xuICAgICAgcGFja2V0Lm1vZGUgPSBNb3ZlTW9kZS5UZWxlcG9ydDtcbiAgICAgIHBhY2tldC5vbkdyb3VuZCA9IHRoaXMub25Hcm91bmQ7XG4gICAgICBwYWNrZXQucmlkZGVuUnVudGltZUlkID0gMG47XG4gICAgICBwYWNrZXQuY2F1c2UgPSBuZXcgVGVsZXBvcnRDYXVzZSg0LCAwKTtcbiAgICAgIHBhY2tldC5pbnB1dFRpY2sgPSB0aGlzLmlucHV0VGljaztcblxuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMuc2VuZChwYWNrZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwbGF5ZXIncyBkYXRhIGFzIGEgZGF0YWJhc2UgZW50cnlcbiAgICogQHJldHVybnMgVGhlIHBsYXllciBlbnRyeVxuICAgKi9cbiAgcHVibGljIGdldERhdGFFbnRyeSgpOiBQbGF5ZXJFbnRyeSB7XG4gICAgLy8gQ3JlYXRlIHRoZSBwbGF5ZXIgZW50cnkgdG8gc2F2ZVxuICAgIGNvbnN0IGVudHJ5OiBQbGF5ZXJFbnRyeSA9IHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJuYW1lLFxuICAgICAgeHVpZDogdGhpcy54dWlkLFxuICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgdW5pcXVlSWQ6IHRoaXMudW5pcXVlSWQsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLnR5cGUuaWRlbnRpZmllcixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLFxuICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXG4gICAgICBjb21wb25lbnRzOiBbLi4udGhpcy5jb21wb25lbnRzLmVudHJpZXMoKV0sXG4gICAgICB0cmFpdHM6IFsuLi50aGlzLnRyYWl0cy5rZXlzKCldLFxuICAgICAgbWV0YWRhdGE6IFsuLi50aGlzLm1ldGFkYXRhLmVudHJpZXMoKV0sXG4gICAgICBmbGFnczogWy4uLnRoaXMuZmxhZ3MuZW50cmllcygpXSxcbiAgICAgIGF0dHJpYnV0ZXM6IFsuLi50aGlzLmF0dHJpYnV0ZXMuZW50cmllcygpXSxcbiAgICAgIGFiaWxpdGllczogWy4uLnRoaXMuYWJpbGl0aWVzLmVudHJpZXMoKV0sXG4gICAgICBzY29yZWJvYXJkSWRlbnRpdHk6IHRoaXMuc2NvcmVib2FyZElkZW50aXR5LmlkZW50aWZpZXJcbiAgICB9O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBwbGF5ZXIgZW50cnlcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgcGxheWVyIGZyb20gdGhlIHByb3ZpZGVkIHBsYXllciBlbnRyeVxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRoZSBwbGF5ZXIgZGF0YSBpcyBjb21pbmcgZnJvbVxuICAgKiBAcGFyYW0gZW50cnkgVGhlIHBsYXllciBlbnRyeSB0byBsb2FkXG4gICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciB0byBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgcGxheWVyIGRhdGE7IGRlZmF1bHQgaXMgdHJ1ZVxuICAgKi9cbiAgcHVibGljIGxvYWREYXRhRW50cnkoXG4gICAgd29ybGQ6IFdvcmxkLFxuICAgIGVudHJ5OiBQbGF5ZXJFbnRyeSxcbiAgICBvdmVyd3JpdGUgPSB0cnVlXG4gICk6IHZvaWQge1xuICAgIC8vIENoZWNrIHRoYXQgdGhlIHVzZXJuYW1lIG1hdGNoZXMgdGhlIHBsYXllcidzIHVzZXJuYW1lXG4gICAgaWYgKGVudHJ5LnVzZXJuYW1lICE9PSB0aGlzLnVzZXJuYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBsb2FkIHBsYXllciBlbnRyeSBhcyB0aGUgdXNlcm5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBsYXllcidzIHVzZXJuYW1lIVwiXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgdXVpZCBtYXRjaGVzIHRoZSBwbGF5ZXIncyB1dWlkXG4gICAgaWYgKGVudHJ5LnV1aWQgIT09IHRoaXMudXVpZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBwbGF5ZXIgZW50cnkgYXMgdGhlIHV1aWQgZG9lcyBub3QgbWF0Y2ggdGhlIHBsYXllcidzIHV1aWQhXCJcbiAgICAgICk7XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSB4dWlkIG1hdGNoZXMgdGhlIHBsYXllcidzIHh1aWRcbiAgICBpZiAoZW50cnkueHVpZCAhPT0gdGhpcy54dWlkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBsb2FkIHBsYXllciBlbnRyeSBhcyB0aGUgeHVpZCBkb2VzIG5vdCBtYXRjaCB0aGUgcGxheWVyJ3MgeHVpZCFcIlxuICAgICAgKTtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIHVuaXF1ZSBpZCBtYXRjaGVzIHRoZSBwbGF5ZXIncyB1bmlxdWUgaWRcbiAgICBpZiAoZW50cnkudW5pcXVlSWQgIT09IHRoaXMudW5pcXVlSWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgcGxheWVyIGVudHJ5IGFzIHRoZSB1bmlxdWUgaWQgZG9lcyBub3QgbWF0Y2ggdGhlIHBsYXllcidzIHVuaXF1ZSBpZCFcIlxuICAgICAgKTtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgcGxheWVyJ3MgaWRlbnRpZmllclxuICAgIGlmIChlbnRyeS5pZGVudGlmaWVyICE9PSB0aGlzLnR5cGUuaWRlbnRpZmllcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBwbGF5ZXIgZW50cnkgYXMgdGhlIGlkZW50aWZpZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHBsYXllcidzIGlkZW50aWZpZXIhXCJcbiAgICAgICk7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIHBvc2l0aW9uIGFuZCByb3RhdGlvblxuICAgIHRoaXMucG9zaXRpb24uc2V0KGVudHJ5LnBvc2l0aW9uKTtcbiAgICB0aGlzLnJvdGF0aW9uLnNldChlbnRyeS5yb3RhdGlvbik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIHNob3VsZCBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgZGF0YVxuICAgIGlmIChvdmVyd3JpdGUpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50cy5jbGVhcigpO1xuICAgICAgdGhpcy50cmFpdHMuY2xlYXIoKTtcbiAgICAgIHRoaXMuYWJpbGl0aWVzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnRzIHRvIHRoZSBwbGF5ZXIsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeS5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50cy5oYXMoa2V5KSkgdGhpcy5jb21wb25lbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHRyYWl0cyB0byB0aGUgcGxheWVyLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgLy8gQWRkIHRoZSB0cmFpdHMgdG8gdGhlIGVudGl0eSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgZW50cnkudHJhaXRzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFsZXR0ZSBoYXMgdGhlIHRyYWl0XG4gICAgICBjb25zdCB0cmFpdFR5cGUgPSB3b3JsZC5lbnRpdHlQYWxldHRlLnRyYWl0cy5nZXQodHJhaXQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzIGluIHRoZSBwYWxldHRlXG4gICAgICBpZiAoIXRyYWl0VHlwZSkge1xuICAgICAgICB3b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHRyYWl0IFwiJHt0cmFpdH1cIiBmb3IgcGxheWVyIFwiJHt0aGlzLnVzZXJuYW1lfToke3RoaXMudW5pcXVlSWR9XCIgYXMgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGVgXG4gICAgICAgICk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gYWRkIHRoZSB0cmFpdCB0byB0aGUgZW50aXR5XG4gICAgICB0aGlzLmFkZFRyYWl0KHRyYWl0VHlwZSBhcyB0eXBlb2YgRW50aXR5VHJhaXQpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgbWV0YWRhdGEgdG8gdGhlIHBsYXllciwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5Lm1ldGFkYXRhKSB7XG4gICAgICBpZiAoIXRoaXMubWV0YWRhdGEuaGFzKGtleSkpIHRoaXMubWV0YWRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgZmxhZ3MgdG8gdGhlIHBsYXllciwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2ZsYWcsIHZhbHVlXSBvZiBlbnRyeS5mbGFncykge1xuICAgICAgaWYgKCF0aGlzLmZsYWdzLmhhcyhmbGFnKSkgdGhpcy5mbGFncy5zZXQoZmxhZywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlcyB0byB0aGUgcGxheWVyLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCBbYXR0cmlidXRlLCB2YWx1ZV0gb2YgZW50cnkuYXR0cmlidXRlcykge1xuICAgICAgaWYgKCF0aGlzLmF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZSkpXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5zZXQoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBhYmlsaXRpZXMgdG8gdGhlIHBsYXllciwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2FiaWxpdHksIHZhbHVlXSBvZiBlbnRyeS5hYmlsaXRpZXMpIHtcbiAgICAgIGlmICghdGhpcy5hYmlsaXRpZXMuaGFzKGFiaWxpdHkpKSB0aGlzLmFiaWxpdGllcy5zZXQoYWJpbGl0eSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXIgfTtcbiIsICJpbXBvcnQge1xuICBEZXZpY2VPUyxcbiAgSW5wdXRNb2RlLFxuICBJbnRlcmFjdGlvbk1vZGUsXG4gIE1lbW9yeVRpZXIsXG4gIFBsYXlNb2RlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5jbGFzcyBEZXZpY2Uge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRldmljZS5cbiAgICogVGhpcyBpcyBhIHV1aWQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGVsIG9mIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvczogRGV2aWNlT1M7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHZpZXcgZGlzdGFuY2Ugb2YgdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXhWaWV3RGlzdGFuY2U6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1lbW9yeSB0aWVyIG9mIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWVtb3J5VGllcjogTWVtb3J5VGllcjtcblxuICAvKipcbiAgICogVGhlIGlucHV0IG1vZGUgb2YgdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBpbnB1dE1vZGU6IElucHV0TW9kZSA9IElucHV0TW9kZS5Vbmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJhY3Rpb24gbW9kZSBvZiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIGludGVyYWN0aW9uTW9kZTogSW50ZXJhY3Rpb25Nb2RlID0gSW50ZXJhY3Rpb25Nb2RlLkNsYXNzaWM7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5IG1vZGUgb2YgdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBwbGF5TW9kZTogUGxheU1vZGUgPSBQbGF5TW9kZS5Ob3JtYWw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZGV2aWNlIGluZm9ybWF0aW9uIG9iamVjdC5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRldmljZS5cbiAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBvZiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gb3MgVGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIGRldmljZS5cbiAgICogQHBhcmFtIG1heFZpZXdEaXN0YW5jZSBUaGUgbWF4aW11bSB2aWV3IGRpc3RhbmNlIG9mIHRoZSBkZXZpY2UuXG4gICAqIEBwYXJhbSBtZW1vcnlUaWVyIFRoZSBtZW1vcnkgdGllciBvZiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBtb2RlbDogc3RyaW5nLFxuICAgIG9zOiBEZXZpY2VPUyxcbiAgICBtYXhWaWV3RGlzdGFuY2U6IG51bWJlcixcbiAgICBtZW1vcnlUaWVyOiBNZW1vcnlUaWVyXG4gICkge1xuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMub3MgPSBvcztcbiAgICB0aGlzLm1heFZpZXdEaXN0YW5jZSA9IG1heFZpZXdEaXN0YW5jZTtcbiAgICB0aGlzLm1lbW9yeVRpZXIgPSBtZW1vcnlUaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZW1wdHkgZGV2aWNlIG9iamVjdC5cbiAgICogQHJldHVybnMgQW4gZW1wdHkgZGV2aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZW1wdHkoKTogRGV2aWNlIHtcbiAgICByZXR1cm4gbmV3IERldmljZShcIlwiLCBcIlwiLCBEZXZpY2VPUy5VbmRlZmluZWQsIDAsIE1lbW9yeVRpZXIuVW5kZXRlcm1pbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEZXZpY2UgfTtcbiIsICJpbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlFbnVtIH0gZnJvbSBcIi4uL2NvbW1hbmRzXCI7XG5cbmltcG9ydCB7IEN1c3RvbUVudGl0eVR5cGUsIEVudGl0eVR5cGUgfSBmcm9tIFwiLi9pZGVudGl0eVwiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdHMgfSBmcm9tIFwiLlwiO1xuXG5pbXBvcnQgdHlwZSB7IEVudGl0eVRyYWl0LCBQbGF5ZXJUcmFpdCB9IGZyb20gXCIuL3RyYWl0c1wiO1xuXG5jbGFzcyBFbnRpdHlQYWxldHRlIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlcyBvZiBlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzID0gRW50aXR5VHlwZS50eXBlcztcblxuICAvKipcbiAgICogVGhlIHRyYWl0cyByZWdpc3RlcmVkIGluIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0cyA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHR5cGVvZiBFbnRpdHlUcmFpdCB8IHR5cGVvZiBQbGF5ZXJUcmFpdFxuICA+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RyeSBmb3IgdGhlIGVudGl0eSB0cmFpdHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVnaXN0cnkgPSBuZXcgTWFwPFxuICAgIEVudGl0eUlkZW50aWZpZXIsXG4gICAgQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0IHwgdHlwZW9mIFBsYXllclRyYWl0PlxuICA+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gUmVnaXN0ZXIgYWxsIGVudGl0eSB0cmFpdHMuXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBFbnRpdHlUcmFpdHMpIHRoaXMucmVnaXN0ZXJUcmFpdCh0cmFpdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgZW50aXR5IHR5cGVzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCBlbnRpdHkgdHlwZXMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxFbnRpdHlUeXBlPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnR5cGVzLnZhbHVlcygpXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxDdXN0b21UeXBlcygpOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsVHlwZXMoKS5maWx0ZXIoXG4gICAgICAodHlwZSkgPT4gdHlwZSBpbnN0YW5jZW9mIEN1c3RvbUVudGl0eVR5cGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gZW50aXR5IHR5cGUgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGVudGl0eSBpZGVudGlmaWVyIHRvIGdldC5cbiAgICogQHJldHVybnMgVGhlIGVudGl0eSB0eXBlIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZShpZGVudGlmaWVyOiBzdHJpbmcpOiBFbnRpdHlUeXBlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXMuZ2V0KGlkZW50aWZpZXIpIGFzIEVudGl0eVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBlbnRpdHkgdHlwZSBmcm9tIHRoZSBwYWxldHRlIGJ5IGl0cyB1bmlxdWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHVuaXF1ZSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSB0eXBlLlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IHR5cGUgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUeXBlQnlVbmlxdWUodW5pcXVlOiBiaWdpbnQpOiBFbnRpdHlUeXBlIHwgbnVsbCB7XG4gICAgLy8gQ29udmVydCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgdG8gYSBuZXR3b3JrIGlkZW50aWZpZXIuXG4gICAgY29uc3QgbmV0d29yayA9IE51bWJlcih1bmlxdWUgPj4gMTluKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZW50aXR5IHR5cGVzLlxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0aGlzLnR5cGVzLnZhbHVlcygpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgbmV0d29yayBpZGVudGlmaWVyIG1hdGNoZXMuXG4gICAgICBpZiAodHlwZS5uZXR3b3JrID09PSBuZXR3b3JrKSByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgZW50aXR5IHR5cGUgd2FzIG5vdCBmb3VuZC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBlbnRpdHkgdHlwZSB0byB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGVudGl0eSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbnRpdHkgdHlwZSB3YXMgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSh0eXBlOiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSB0eXBlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICBpZiAodGhpcy50eXBlcy5oYXModHlwZS5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0eSB0eXBlLlxuICAgIHRoaXMudHlwZXMuc2V0KHR5cGUuaWRlbnRpZmllciwgdHlwZSk7XG5cbiAgICAvLyBBZGQgdGhlIGVudGl0eSB0eXBlIHRvIHRoZSBlbnRpdHkgZW51bS5cbiAgICBFbnRpdHlFbnVtLm9wdGlvbnMucHVzaCh0eXBlLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVudGl0eSB0eXBlIHdhcyByZWdpc3RlcmVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGVudGl0eSBpZGVudGlmaWVyIHRvIGdldCB0aGUgcmVnaXN0cnkgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgaWRlbnRpZmllci5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpc3RyeUZvcihcbiAgICBpZGVudGlmaWVyOiBFbnRpdHlJZGVudGlmaWVyXG4gICk6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4ge1xuICAgIC8vIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgaWRlbnRpZmllci5cbiAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMucmVnaXN0cnkuZ2V0KGlkZW50aWZpZXIpIHx8IFtdO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZWdpc3RyeS5cbiAgICByZXR1cm4gcmVnaXN0cnkgYXMgQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHRyYWl0IHRvIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0cmFpdCB3YXMgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoXG4gICAgdHJhaXQ6IHR5cGVvZiBFbnRpdHlUcmFpdCB8IHR5cGVvZiBQbGF5ZXJUcmFpdFxuICApOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IHRyYWl0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICBpZiAodGhpcy50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgZW50aXR5IHRyYWl0LlxuICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCB0cmFpdCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHR5cGVzIG9mIHRoZSB0cmFpdC5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHJhaXQudHlwZXMgPz8gW10pIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBoYXMgdGhlIGVudGl0eSBpZGVudGlmaWVyLlxuICAgICAgaWYgKCF0aGlzLnJlZ2lzdHJ5Lmhhcyh0eXBlIGFzIEVudGl0eUlkZW50aWZpZXIpKVxuICAgICAgICAvLyBTZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgZW50aXR5IGlkZW50aWZpZXIuXG4gICAgICAgIHRoaXMucmVnaXN0cnkuc2V0KHR5cGUgYXMgRW50aXR5SWRlbnRpZmllciwgW10pO1xuXG4gICAgICAvLyBHZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgZW50aXR5IGlkZW50aWZpZXIuXG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMucmVnaXN0cnkuZ2V0KHR5cGUgYXMgRW50aXR5SWRlbnRpZmllcik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBleGlzdHMuXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICByZWdpc3RyeS5wdXNoKHRyYWl0KTtcblxuICAgICAgICAvLyBTZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgZW50aXR5IGlkZW50aWZpZXIuXG4gICAgICAgIHRoaXMucmVnaXN0cnkuc2V0KHR5cGUgYXMgRW50aXR5SWRlbnRpZmllciwgcmVnaXN0cnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlbnRpdHkgdHJhaXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRyYWl0LlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0cmFpdCB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWl0KGlkZW50aWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMuXG4gICAgaWYgKCF0aGlzLnRyYWl0cy5oYXMoaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEdldCB0aGUgdHJhaXQuXG4gICAgY29uc3QgdHJhaXQgPSB0aGlzLnRyYWl0cy5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzLlxuICAgIGlmICghdHJhaXQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdHlwZXMgb2YgdGhlIHRyYWl0LlxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0cmFpdC50eXBlcyA/PyBbXSkge1xuICAgICAgLy8gR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGVudGl0eSBpZGVudGlmaWVyLlxuICAgICAgY29uc3QgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5LmdldCh0eXBlIGFzIEVudGl0eUlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcmVnaXN0cnkgZXhpc3RzLlxuICAgICAgaWYgKHJlZ2lzdHJ5KSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICAgIHRoaXMucmVnaXN0cnkuc2V0KFxuICAgICAgICAgIHR5cGUgYXMgRW50aXR5SWRlbnRpZmllcixcbiAgICAgICAgICByZWdpc3RyeS5maWx0ZXIoKGMpID0+IGMgIT09IHRyYWl0KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICB0aGlzLnRyYWl0cy5kZWxldGUoaWRlbnRpZmllcik7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhaXQgd2FzIHJlbW92ZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0cmFpdHMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxUcmFpdHMoKTogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0IHwgdHlwZW9mIFBsYXllclRyYWl0PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRyYWl0cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRyYWl0LlxuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdChcbiAgICBpZGVudGlmaWVyOiBzdHJpbmdcbiAgKTogdHlwZW9mIEVudGl0eVRyYWl0IHwgdHlwZW9mIFBsYXllclRyYWl0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldChpZGVudGlmaWVyKSB8fCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eVBhbGV0dGUgfTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wbGF5ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyYWl0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWFwc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGFsZXR0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udGFpbmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZXZpY2VcIjtcblxuaW1wb3J0ICogYXMgVHJhaXRzIGZyb20gXCIuL3RyYWl0c1wiO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBhbGwgZW50aXR5IHRyYWl0c1xuICovXG5jb25zdCBFbnRpdHlUcmFpdHMgPSBBcnJheTx0eXBlb2YgVHJhaXRzLkVudGl0eVRyYWl0PigpO1xuXG4vLyBJdGVyYXRlIG92ZXIgZWFjaCB0cmFpdFxuZm9yIChjb25zdCBrZXkgaW4gVHJhaXRzKSB7XG4gIC8vIEdldCB0aGUgZW50aXR5IHRyYWl0XG4gIGNvbnN0IHRyYWl0ID0gVHJhaXRzW2tleSBhcyBrZXlvZiB0eXBlb2YgVHJhaXRzXTtcblxuICAvLyBQdXNoIHRoZSBlbnRpdHkgdHJhaXQgdG8gdGhlIGxpc3RcbiAgRW50aXR5VHJhaXRzLnB1c2godHJhaXQpO1xufVxuXG5leHBvcnQgeyBFbnRpdHlUcmFpdHMgfTtcbiIsICJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IHtcbiAgQ29udGFpbmVyTmFtZSxcbiAgSXRlbVN0YWNrUmVxdWVzdEFjdGlvbixcbiAgSXRlbVN0YWNrUmVxdWVzdFBhY2tldCxcbiAgUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgRW50aXR5SW52ZW50b3J5VHJhaXQsIFBsYXllckN1cnNvclRyYWl0IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG5jbGFzcyBJdGVtU3RhY2tSZXF1ZXN0SGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuSXRlbVN0YWNrUmVxdWVzdDtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogSXRlbVN0YWNrUmVxdWVzdFBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LnBsYXllcnMuZ2V0KGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIHJlcXVlc3RzLlxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiBwYWNrZXQucmVxdWVzdHMpIHtcbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYWN0aW9ucy5cbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHJlcXVlc3QuYWN0aW9ucykge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGEgdGFrZSBvciBwbGFjZSBhY3Rpb24uXG4gICAgICAgIGlmIChhY3Rpb24udGFrZU9yUGxhY2UpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHJlcXVlc3QuXG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGFjdGlvbi50YWtlT3JQbGFjZTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIHR5cGUgYW5kIGRlc3RpbmF0aW9uIHR5cGUuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29udGFpbmVyID0gcmVxdWVzdC5zb3VyY2UuY29udGFpbmVyO1xuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGFpbmVyID0gcmVxdWVzdC5kZXN0aW5hdGlvbi5jb250YWluZXI7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VTbG90ID0gcmVxdWVzdC5zb3VyY2Uuc2xvdDtcbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblNsb3QgPSByZXF1ZXN0LmRlc3RpbmF0aW9uLnNsb3Q7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gcmVxdWVzdC5hbW91bnQgPz8gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzb3VyY2UgdHlwZSBpcyBhIGNyZWF0aXZlIG91dHB1dC5cbiAgICAgICAgICBpZiAoc291cmNlQ29udGFpbmVyLmlkZW50aWZpZXIgPT09IENvbnRhaW5lck5hbWUuQ3JlYXRpdmVPdXRwdXQpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIC8vIEZldGNoIHRoZSBzb3VyY2UgY29udGFpbmVyIGZyb20gdGhlIHBsYXllci5cbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBwbGF5ZXIuZ2V0Q29udGFpbmVyKFxuICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmlkZW50aWZpZXIsXG4gICAgICAgICAgICBzb3VyY2VDb250YWluZXIuZHluYW1pY0lkZW50aWZpZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNvdXJjZSBjb250YWluZXIgZXhpc3RzLlxuICAgICAgICAgIGlmICghc291cmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBzb3VyY2UgdHlwZTogJHtDb250YWluZXJOYW1lW3NvdXJjZUNvbnRhaW5lci5pZGVudGlmaWVyXX1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRmV0Y2ggdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBmcm9tIHRoZSBwbGF5ZXIuXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBwbGF5ZXIuZ2V0Q29udGFpbmVyKFxuICAgICAgICAgICAgZGVzdGluYXRpb25Db250YWluZXIuaWRlbnRpZmllcixcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29udGFpbmVyLmR5bmFtaWNJZGVudGlmaWVyXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgZXhpc3RzLlxuICAgICAgICAgIGlmICghZGVzdGluYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGRlc3RpbmF0aW9uIHR5cGU6ICR7Q29udGFpbmVyTmFtZVtkZXN0aW5hdGlvbkNvbnRhaW5lci5pZGVudGlmaWVyXX1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgaXRlbS5cbiAgICAgICAgICBjb25zdCBzb3VyY2VJdGVtID0gc291cmNlLmdldEl0ZW0oc291cmNlU2xvdCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc291cmNlIGl0ZW0gZXhpc3RzLlxuICAgICAgICAgIGlmICghc291cmNlSXRlbSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzb3VyY2UgaXRlbS5cIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIGl0ZW0uXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb25JdGVtID0gZGVzdGluYXRpb24uZ2V0SXRlbShkZXN0aW5hdGlvblNsb3QpO1xuXG4gICAgICAgICAgaWYgKGFtb3VudCA8PSBzb3VyY2VJdGVtLmFtb3VudCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHNvdXJjZS50YWtlSXRlbShzb3VyY2VTbG90LCBhbW91bnQpO1xuICAgICAgICAgICAgaWYgKCFpdGVtKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGl0ZW0uXCIpO1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uSXRlbSkge1xuICAgICAgICAgICAgICBkZXN0aW5hdGlvbkl0ZW0uaW5jcmVtZW50KGl0ZW0uYW1vdW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uLnNldEl0ZW0oZGVzdGluYXRpb25TbG90LCBpdGVtKTtcbiAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnNvciwgdGhpcyBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIHRoZSBwcm90b2NvbC5cbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yID0gcGxheWVyLmdldFRyYWl0KFBsYXllckN1cnNvclRyYWl0KTtcbiAgICAgICAgICAgICAgaWYgKCFjdXJzb3IpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY3Vyc29yLlwiKTtcbiAgICAgICAgICAgICAgaWYgKGN1cnNvci5jb250YWluZXIuZ2V0SXRlbSgwKSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBjdXJzb3IuY29udGFpbmVyLmNsZWFyU2xvdCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb3VudCBwb3NzaWJsZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aW9uLmRyb3ApIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHJlcXVlc3QuXG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGFjdGlvbi5kcm9wO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgYW5kIHNsb3QuXG4gICAgICAgICAgY29uc3Qgc291cmNlID0gcmVxdWVzdC5zb3VyY2U7XG4gICAgICAgICAgY29uc3Qgc2xvdCA9IHNvdXJjZS5zbG90O1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IHJlcXVlc3QuYW1vdW50O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgY29udGFpbmVyLlxuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBsYXllci5nZXRDb250YWluZXIoc291cmNlLmNvbnRhaW5lci5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgZXhpc3RzLlxuICAgICAgICAgIGlmICghY29udGFpbmVyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBjb250YWluZXI6ICR7c291cmNlLmNvbnRhaW5lci5pZGVudGlmaWVyfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBGb3JjZSB0aGUgcGxheWVyIHRvIGRyb3AgdGhlIGl0ZW0uXG4gICAgICAgICAgcGxheWVyLmRyb3BJdGVtKHNsb3QsIGFtb3VudCwgY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24uc3dhcCkge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gYWN0aW9uLnN3YXA7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29udGFpbmVyID0gcmVxdWVzdC5zb3VyY2UuY29udGFpbmVyO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZVNsb3QgPSByZXF1ZXN0LnNvdXJjZS5zbG90O1xuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGFpbmVyID0gcmVxdWVzdC5kZXN0aW5hdGlvbi5jb250YWluZXI7XG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb25TbG90ID0gcmVxdWVzdC5kZXN0aW5hdGlvbi5zbG90O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgY29udGFpbmVyLlxuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHBsYXllci5nZXRDb250YWluZXIoXG4gICAgICAgICAgICBzb3VyY2VDb250YWluZXIuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5keW5hbWljSWRlbnRpZmllclxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc291cmNlIGNvbnRhaW5lciBleGlzdHMuXG4gICAgICAgICAgaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHNvdXJjZSBjb250YWluZXI6ICR7c291cmNlQ29udGFpbmVyLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyLlxuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gcGxheWVyLmdldENvbnRhaW5lcihcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29udGFpbmVyLmlkZW50aWZpZXIsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkNvbnRhaW5lci5keW5hbWljSWRlbnRpZmllclxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyIGV4aXN0cy5cbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBkZXN0aW5hdGlvbiBjb250YWluZXI6ICR7ZGVzdGluYXRpb25Db250YWluZXIuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgaXRlbS5cbiAgICAgICAgICBjb25zdCBzb3VyY2VJdGVtID0gc291cmNlLmdldEl0ZW0oc291cmNlU2xvdCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc291cmNlIGl0ZW0gZXhpc3RzLlxuICAgICAgICAgIGlmICghc291cmNlSXRlbSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzb3VyY2UgaXRlbS5cIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIGl0ZW0uXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb25JdGVtID0gZGVzdGluYXRpb24uZ2V0SXRlbShkZXN0aW5hdGlvblNsb3QpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGl0ZW0gZXhpc3RzLlxuICAgICAgICAgIGlmICghZGVzdGluYXRpb25JdGVtKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRlc3RpbmF0aW9uIGl0ZW0uXCIpO1xuXG4gICAgICAgICAgLy8gU3dhcCB0aGUgaXRlbXMuXG4gICAgICAgICAgc291cmNlLnN3YXBJdGVtcyhzb3VyY2VTbG90LCBkZXN0aW5hdGlvblNsb3QsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgYSBkZXN0cm95IG9yIGNvbnN1bWUgYWN0aW9uLlxuICAgICAgICBpZiAoYWN0aW9uLmRlc3Ryb3lPckNvbnN1bWUpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHJlcXVlc3QuXG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGFjdGlvbi5kZXN0cm95T3JDb25zdW1lO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UuXG4gICAgICAgICAgY29uc3Qgc291cmNlID0gcmVxdWVzdC5zb3VyY2U7XG4gICAgICAgICAgaWYgKCFzb3VyY2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNvdXJjZSBpcyB0aGUgY3Vyc29yLlxuICAgICAgICAgIGlmIChzb3VyY2UuY29udGFpbmVyLmlkZW50aWZpZXIgPT09IENvbnRhaW5lck5hbWUuQ3Vyc29yKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnNvciBjb21wb25lbnQuXG4gICAgICAgICAgICBjb25zdCBjdXJzb3IgPSBwbGF5ZXIuZ2V0VHJhaXQoUGxheWVyQ3Vyc29yVHJhaXQpO1xuXG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgY3Vyc29yLlxuICAgICAgICAgICAgY3Vyc29yLmNvbnRhaW5lci5jbGVhclNsb3QoMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IGNvbXBvbmVudFxuICAgICAgICAgICAgY29uc3QgaW52ZW50b3J5ID0gcGxheWVyLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNvdXJjZS5cbiAgICAgICAgICAgIGludmVudG9yeS5jb250YWluZXIuY2xlYXJTbG90KHNvdXJjZS5zbG90KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aW9uLmNyYWZ0UmVjaXBlKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBpdGVtIGluc3RhbmNlIGFjdGlvbi5cbiAgICAgICAgICBjb25zdCBpdGVtSW5zdGFuY2VBY3Rpb24gPSByZXF1ZXN0XG4gICAgICAgICAgICAuYWN0aW9uc1sxXSBhcyBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaW5zdGFuY2UgYWN0aW9uIGV4aXN0cy5cbiAgICAgICAgICBpZiAoIWl0ZW1JbnN0YW5jZUFjdGlvbi5yZXN1bHRzRGVwcmVjYXRlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaXRlbSBpbnN0YW5jZSBhY3Rpb24uXCIpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBpdGVtcyBiZWluZyBjcmFmdGVkLlxuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gaXRlbUluc3RhbmNlQWN0aW9uLnJlc3VsdHNEZXByZWNhdGVkLnJlc3VsdGFudHM7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIGFjdGlvbi5cbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkFjdGlvbiA9IHJlcXVlc3QuYWN0aW9ucy5hdChcbiAgICAgICAgICAgIC0xXG4gICAgICAgICAgKSBhcyBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGFjdGlvbiBleGlzdHMuXG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbkFjdGlvbi50YWtlT3JQbGFjZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGVzdGluYXRpb24gYWN0aW9uLlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24uXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBwbGF5ZXIuZ2V0Q29udGFpbmVyKFxuICAgICAgICAgICAgZGVzdGluYXRpb25BY3Rpb24udGFrZU9yUGxhY2UuZGVzdGluYXRpb24uY29udGFpbmVyLmlkZW50aWZpZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGV4aXN0cy5cbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBkZXN0aW5hdGlvbjogJHtkZXN0aW5hdGlvbkFjdGlvbi50YWtlT3JQbGFjZS5kZXN0aW5hdGlvbi5jb250YWluZXIuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBpdGVtcyB0byB0aGUgZGVzdGluYXRpb24uXG4gICAgICAgICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIGRlc2NyaXB0b3JzKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGFuIGl0ZW0gc3RhY2suXG4gICAgICAgICAgICBjb25zdCBpdGVtU3RhY2sgPSBJdGVtU3RhY2suZnJvbU5ldHdvcmtJbnN0YW5jZShkZXNjcmlwdG9yKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gc3RhY2sgZXhpc3RzXG4gICAgICAgICAgICBpZiAoIWl0ZW1TdGFjaylcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIGNvbnZlcnQgbmV0d29yayBkZXNjcmlwdG9yIHRvIGl0ZW0gc3RhY2suXCJcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAgICAgICAgICBpdGVtU3RhY2suc2V0QW1vdW50KGl0ZW1TdGFjay5hbW91bnQgKiBhY3Rpb24uY3JhZnRSZWNpcGUuYW1vdW50KTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIHN0YWNrIHRvIHRoZSBkZXN0aW5hdGlvbi5cbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZEl0ZW0oaXRlbVN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aW9uLmNyYWZ0Q3JlYXRpdmUpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIHJlcXVlc3QuXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb25BY3Rpb24gPSByZXF1ZXN0XG4gICAgICAgICAgICAuYWN0aW9uc1syXSBhcyBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGV4aXN0cy5cbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uQWN0aW9uLnRha2VPclBsYWNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbi5cIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uLlxuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25BY3Rpb24udGFrZU9yUGxhY2UuZGVzdGluYXRpb247XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gZGVzdGluYXRpb25BY3Rpb24udGFrZU9yUGxhY2UuYW1vdW50O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBjb250YWluZXIuXG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGxheWVyLmdldENvbnRhaW5lcihcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbnRhaW5lci5pZGVudGlmaWVyXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgZXhpc3RzLlxuICAgICAgICAgIGlmICghY29udGFpbmVyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBjb250YWluZXI6ICR7ZGVzdGluYXRpb24uY29udGFpbmVyLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICBjb25zdCBjcmFmdCA9IGFjdGlvbi5jcmFmdENyZWF0aXZlO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB3b3JsZCBvZiB0aGUgcGxheWVyLCBhbmQgdGhlIGNyZWF0aXZlIGl0ZW0uXG4gICAgICAgICAgY29uc3Qgd29ybGQgPSBwbGF5ZXIuZGltZW5zaW9uLndvcmxkO1xuICAgICAgICAgIGNvbnN0IGNyZWF0aXZlSXRlbSA9IHdvcmxkLml0ZW1QYWxldHRlLmdldENyZWF0aXZlQ29udGVudEJ5SW5kZXgoXG4gICAgICAgICAgICBjcmFmdC5jcmVhdGl2ZUluZGV4XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjcmVhdGl2ZSBpdGVtIGV4aXN0c1xuICAgICAgICAgIGlmICghY3JlYXRpdmVJdGVtKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgUmVjZWl2ZWQgaW52YWxpZCBjcmVhdGl2ZSBpdGVtOiAke2NyYWZ0LmNyZWF0aXZlSW5kZXh9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaXRlbSBzdGFjay5cbiAgICAgICAgICBjb25zdCBpdGVtU3RhY2sgPSBuZXcgSXRlbVN0YWNrKGNyZWF0aXZlSXRlbS50eXBlLCB7IGFtb3VudCwgd29ybGQgfSk7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIGl0ZW0gc3RhY2sgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgICAgIGNvbnRhaW5lci5zZXRJdGVtKGRlc3RpbmF0aW9uLnNsb3QsIGl0ZW1TdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbVN0YWNrUmVxdWVzdEhhbmRsZXIgfTtcbiIsICJpbXBvcnQge1xuICBDbGllbnREYXRhLFxuICBEaXNjb25uZWN0UmVhc29uLFxuICBJZGVudGl0eURhdGEsXG4gIExvZ2luUGFja2V0LFxuICBMb2dpblRva2VuRGF0YSxcbiAgTG9naW5Ub2tlbnMsXG4gIFBhY2tldCxcbiAgUGxheVN0YXR1cyxcbiAgUGxheVN0YXR1c1BhY2tldCxcbiAgUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQsXG4gIFNlcmlhbGl6ZWRTa2luXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcbmltcG9ydCB7IGNyZWF0ZURlY29kZXIgfSBmcm9tIFwiZmFzdC1qd3RcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgRGV2aWNlLCBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBQbGF5ZXJQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQbGF5ZXJKb2luU2lnbmFsIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuXG5jbGFzcyBMb2dpbkhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkxvZ2luO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoKTtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogTG9naW5QYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBEZWNvZGUgdGhlIHRva2VucyBnaXZlbiBieSB0aGUgY2xpZW50LlxuICAgIC8vIFRoaXMgY29udGFpbnMgdGhlIGNsaWVudCBkYXRhLCBpZGVudGl0eSBkYXRhLCBhbmQgcHVibGljIGtleS5cbiAgICAvLyBBbG9uZyB3aXRoIHRoZSBwbGF5ZXJzIFhVSUQsIGRpc3BsYXkgbmFtZSwgYW5kIHV1aWQuXG4gICAgY29uc3QgdG9rZW5zID0gTG9naW5IYW5kbGVyLmRlY29kZShwYWNrZXQudG9rZW5zKTtcblxuICAgIC8vIEdldCB0aGUgY2xpZW50cyB4dWlkIGFuZCB1c2VybmFtZS5cbiAgICBjb25zdCB4dWlkID0gdG9rZW5zLmlkZW50aXR5RGF0YS5YVUlEO1xuICAgIGNvbnN0IHV1aWQgPSB0b2tlbnMuaWRlbnRpdHlEYXRhLmlkZW50aXR5O1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdG9rZW5zLmlkZW50aXR5RGF0YS5kaXNwbGF5TmFtZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB4dWlkIGlzIHNtYWxsZXIgdGhhbiAxNiBjaGFyYWN0ZXJzLlxuICAgIC8vIElmIHNvIHRoZW4gdGhlIHh1aWQgaXMgaW52YWxpZC5cbiAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBiZXN0IHdheSB0byBjaGVjayBpZiB0aGUgeHVpZCBpcyB2YWxpZCwgYnV0IGl0IHdvcmtzIGZvciBub3cuXG4gICAgLy8gUG9zc2libHkgYWRkIGEgeHVpZCByZXNvbHZlciBpbiB0aGUgZnV0dXJlLCBidXQgbWF5IGxlYXZlIHRoYXQgdXAgdG8gcGx1Z2lucy5cbiAgICBpZiAoeHVpZC5sZW5ndGggPCAxNikge1xuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgcGxheWVyLlxuICAgICAgcmV0dXJuIHRoaXMubmV0d29yay5kaXNjb25uZWN0Q29ubmVjdGlvbihcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgXCJGYWlsZWQgdG8gY29ubmVjdCBkdWUgdG8gaGF2aW5nIGFuIGludmFsaWQgeHVpZC4gTWFrZSBzdXJlIHlvdSBhcmUgY29ubmVjdGVkIHRvIFhib3ggTGl2ZSBiZWZvcmUgam9pbmluZyB0aGUgc2VydmVyLlwiLFxuICAgICAgICBEaXNjb25uZWN0UmVhc29uLkludmFsaWRUZW5hbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IGNvbm5lY3RlZC5cbiAgICAvLyBBbmQgaWYgc28sIGRpc2Nvbm5lY3QgdGhlIHBsYXllciB0aGUgcGxheWVyIGN1cnJlbnRseSBjb25uZWN0ZWQuXG4gICAgaWYgKHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlYdWlkKHh1aWQpKSB7XG4gICAgICAvLyBHZXQgdGhlIHBsYXllciB0byBkaXNjb25uZWN0LlxuICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeVh1aWQoeHVpZCkgYXMgUGxheWVyO1xuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBwbGF5ZXIuXG4gICAgICBwbGF5ZXIuZGlzY29ubmVjdChcbiAgICAgICAgXCJZb3UgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIgYmVjYXVzZSB5b3UgbG9nZ2VkIGluIGZyb20gYW5vdGhlciBsb2NhdGlvbi5cIixcbiAgICAgICAgRGlzY29ubmVjdFJlYXNvbi5Mb2dnZWRJbk90aGVyTG9jYXRpb25cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IHdvcmxkLCBhbmQgY2hlY2sgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgIC8vIElmIHNvLCB0aGVuIGRpc2Nvbm5lY3QgdGhlIHBsYXllci5cbiAgICBjb25zdCB3b3JsZCA9IHRoaXMuc2VyZW5pdHkuZ2V0V29ybGQoKTtcbiAgICBpZiAoIXdvcmxkKVxuICAgICAgcmV0dXJuIHRoaXMubmV0d29yay5kaXNjb25uZWN0Q29ubmVjdGlvbihcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgXCJUaGVyZSBhcmUgbm8gd29ybGRzIHJlZ2lzdGVyZWQgd2l0aGluIHRoZSBzZXJ2ZXIgcHJvY2Vzcy5cIixcbiAgICAgICAgRGlzY29ubmVjdFJlYXNvbi5Xb3JsZENvcnJ1cHRpb25cbiAgICAgICk7XG5cbiAgICAvLyBHZXQgdGhlIGRlZmF1bHQgZGltZW5zaW9uLCBhbmQgY2hlY2sgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgIC8vIElmIHNvLCB0aGVuIGRpc2Nvbm5lY3QgdGhlIHBsYXllci5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB3b3JsZC5nZXREaW1lbnNpb24oKTtcbiAgICBpZiAoIWRpbWVuc2lvbilcbiAgICAgIHJldHVybiB0aGlzLm5ldHdvcmsuZGlzY29ubmVjdENvbm5lY3Rpb24oXG4gICAgICAgIGNvbm5lY3Rpb24sXG4gICAgICAgIFwiVGhlcmUgYXJlIG5vIGRpbWVuc2lvbnMgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlIHdvcmxkIGluc3RhbmNlLlwiLFxuICAgICAgICBEaXNjb25uZWN0UmVhc29uLldvcmxkQ29ycnVwdGlvblxuICAgICAgKTtcblxuICAgIC8vIC8vIEdldCB0aGUgcGVybWlzc2lvbiBsZXZlbCBvZiB0aGUgcGxheWVyLlxuICAgIC8vIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLnNlcmVuaXR5LnBlcm1pc3Npb25zLmdldCh4dWlkLCB1c2VybmFtZSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgRGV2aWNlIGluc3RhbmNlLlxuICAgIGNvbnN0IGRldmljZSA9IG5ldyBEZXZpY2UoXG4gICAgICB0b2tlbnMuY2xpZW50RGF0YS5EZXZpY2VJZCxcbiAgICAgIHRva2Vucy5jbGllbnREYXRhLkRldmljZU1vZGVsLFxuICAgICAgdG9rZW5zLmNsaWVudERhdGEuRGV2aWNlT1MsXG4gICAgICB0b2tlbnMuY2xpZW50RGF0YS5NYXhWaWV3RGlzdGFuY2UsXG4gICAgICB0b2tlbnMuY2xpZW50RGF0YS5NZW1vcnlUaWVyXG4gICAgKTtcblxuICAgIC8vIFJlYWQgdGhlIHBsYXllciBkYXRhIGZyb20gdGhlIHdvcmxkIHByb3ZpZGVyLlxuICAgIGNvbnN0IGRhdGEgPSB3b3JsZC5wcm92aWRlci5yZWFkUGxheWVyKHV1aWQsIGRpbWVuc2lvbik7XG5cbiAgICAvLyBHZXQgdGhlIHNraW4gZnJvbSB0aGUgY2xpZW50IGRhdGEuXG4gICAgY29uc3Qgc2tpbiA9IFNlcmlhbGl6ZWRTa2luLmZyb20odG9rZW5zLmNsaWVudERhdGEpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGxheWVyXG4gICAgY29uc3QgcHJvcGVydGllczogUGFydGlhbDxQbGF5ZXJQcm9wZXJ0aWVzPiA9IHtcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgeHVpZCxcbiAgICAgIHV1aWQsXG4gICAgICBkZXZpY2UsXG4gICAgICBza2luXG4gICAgfTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgZGF0YSBleGlzdHNcbiAgICBpZiAoZGF0YSkge1xuICAgICAgLy8gU2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIHBsYXllclxuICAgICAgcHJvcGVydGllcy51bmlxdWVJZCA9IGRhdGEudW5pcXVlSWQ7XG5cbiAgICAgIC8vIEFzc2lnbiB0aGUgcGxheWVyIGVudHJ5IHRvIHRoZSBwcm9wZXJ0aWVzXG4gICAgICBwcm9wZXJ0aWVzLmVudHJ5ID0gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWVyIGluc3RhbmNlLlxuICAgIGNvbnN0IHBsYXllciA9IG5ldyBQbGF5ZXIoZGltZW5zaW9uLCBjb25uZWN0aW9uLCBwcm9wZXJ0aWVzKTtcblxuICAgIC8vIFNldCB0aGUgcGxheWVycyB4dWlkIGFuZCB1c2VybmFtZS5cbiAgICB0aGlzLnNlcmVuaXR5LnBsYXllcnMuc2V0KGNvbm5lY3Rpb24sIHBsYXllcik7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVySm9pblNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJKb2luU2lnbmFsKHBsYXllcikuZW1pdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkLlxuICAgIGlmICghc2lnbmFsKVxuICAgICAgcmV0dXJuIHBsYXllci5kaXNjb25uZWN0KFxuICAgICAgICBcIkZhaWxlZCB0byBqb2luIHRoZSBzZXJ2ZXIuXCIsXG4gICAgICAgIERpc2Nvbm5lY3RSZWFzb24uS2lja2VkXG4gICAgICApO1xuXG4gICAgLy8gVE9ETzogRW5hYmxlIGVuY3J5cHRpb24sIHRoZSBwdWJsaWMga2V5IGlzIGdpdmVuIGluIHRoZSB0b2tlbnNcbiAgICAvLyBUaGlzIGlzIHdpdGggdGhlIENsaWVudFRvU2V2ZXJIYW5kc2hha2UgcGFja2V0ICYgdGhlIFNlcnZlclRvQ2xpZW50SGFuZHNoYWtlIHBhY2tldFxuICAgIC8vIEJ1dCBmb3Igbm93LCB3ZSB3aWxsIGp1c3Qgc2VuZCB0aGUgcGxheWVyIHRoZSBsb2dpbiBzdGF0dXMsIHRoaXMgd2lsbCBza2lwIHRoZSBlbmNyeXB0aW9uXG4gICAgY29uc3QgbG9naW4gPSBuZXcgUGxheVN0YXR1c1BhY2tldCgpO1xuICAgIGxvZ2luLnN0YXR1cyA9IFBsYXlTdGF0dXMuTG9naW5TdWNjZXNzO1xuXG4gICAgY29uc3QgcGFja3MgPSBuZXcgUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQoKTtcbiAgICBwYWNrcy5tdXN0QWNjZXB0ID0gZmFsc2U7IC8vIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VQYWNrcy5tdXN0QWNjZXB0UmVzb3VyY2VQYWNrcztcblxuICAgIHBhY2tzLmhhc0FkZG9ucyA9IGZhbHNlO1xuICAgIHBhY2tzLmhhc1NjcmlwdHMgPSBmYWxzZTtcbiAgICBwYWNrcy5wYWNrcyA9IFtdO1xuICAgIC8vIGZvciAoY29uc3QgcGFjayBvZiB0aGlzLnNlcmVuaXR5LnJlc291cmNlUGFja3MuZ2V0UGFja3MoKSkge1xuICAgIC8vICAgY29uc3QgcGFja0luZm8gPSBuZXcgVGV4dHVyZVBhY2tJbmZvKFxuICAgIC8vICAgICBwYWNrLnV1aWQsXG4gICAgLy8gICAgIHBhY2suY29udGVudEtleSxcbiAgICAvLyAgICAgcGFjay5oYXNTY3JpcHRzLFxuICAgIC8vICAgICBwYWNrLmlzUnR4LFxuICAgIC8vICAgICBwYWNrLm9yaWdpbmFsU2l6ZSxcbiAgICAvLyAgICAgcGFjay5zZWxlY3RlZFN1YnBhY2ssXG4gICAgLy8gICAgIHBhY2sudXVpZCxcbiAgICAvLyAgICAgcGFjay52ZXJzaW9uLFxuICAgIC8vICAgICBmYWxzZVxuICAgIC8vICAgKTtcblxuICAgIC8vICAgcGFja3MucGFja3MucHVzaChwYWNrSW5mbyk7XG4gICAgLy8gfVxuXG4gICAgLy8gTG9nIHRoZSBqb2luIGV2ZW50IHRvIHRoZSBjb25zb2xlXG4gICAgd29ybGQubG9nZ2VyLmluZm8oXG4gICAgICBgwqc4W8KnOSR7cGxheWVyLnVzZXJuYW1lfcKnOF0gRXZlbnQ6wqdyIFBsYXllciBqb2luZWQgdGhlIHNlcnZlci5gXG4gICAgKTtcblxuICAgIC8vIFNlbmQgdGhlIHBsYXllciB0aGUgbG9naW4gc3RhdHVzIHBhY2tldCBhbmQgdGhlIHJlc291cmNlIHBhY2sgaW5mbyBwYWNrZXQuXG4gICAgcGxheWVyLnNlbmQobG9naW4sIHBhY2tzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHRoZSBsb2dpbiB0b2tlbnMgYW5kIHJldHVybnMgdGhlIGRhdGFcbiAgICogQHBhcmFtIHRva2VucyBUaGUgbG9naW4gdG9rZW5zXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIGxvZ2luIHRva2VuIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVjb2RlKHRva2VuczogTG9naW5Ub2tlbnMpOiBMb2dpblRva2VuRGF0YSB7XG4gICAgLy8gQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgdXNlcnMgY2xpZW50LiAoRGV2aWNlLCBnYW1lIHZlcnNpb24sIGV0Yy4pXG4gICAgY29uc3QgY2xpZW50RGF0YTogQ2xpZW50RGF0YSA9IHRoaXMuZGVjb2Rlcih0b2tlbnMuY2xpZW50KTtcblxuICAgIC8vIFBhcnNlIHRoZSBpZGVudGl0eSBjaGFpbiBkYXRhXG4gICAgY29uc3QgY2hhaW5zOiBBcnJheTxzdHJpbmc+ID0gSlNPTi5wYXJzZSh0b2tlbnMuaWRlbnRpdHkpLmNoYWluO1xuXG4gICAgLy8gRGVjb2RlIHRoZSBjaGFpbnNcbiAgICBjb25zdCBkZWNvZGVkQ2hhaW5zID0gY2hhaW5zLm1hcCgoY2hhaW4pID0+IHRoaXMuZGVjb2RlcihjaGFpbikpO1xuXG4gICAgLy8gQ29udGFpbnMgbWFpbmx5IG1ldGFkYXRhLCBidXQgYWxzbyBpbmNsdWRlcyBpbXBvcnRhbnQgWEJMIGRhdGEgKGRpc3BsYXlOYW1lLCB4dWlkLCBpZGVudGl0eSB1dWlkLCBldGMuKVxuICAgIGNvbnN0IGlkZW50aXR5RGF0YTogSWRlbnRpdHlEYXRhID0gZGVjb2RlZENoYWlucy5maW5kKFxuICAgICAgKGNoYWluKSA9PiBjaGFpbi5leHRyYURhdGEgIT09IHVuZGVmaW5lZFxuICAgICk/LmV4dHJhRGF0YTtcblxuICAgIC8vIFB1YmxpYyBrZXkgZm9yIGVuY3J5cHRpb25cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgZW5jcnlwdGlvblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IGRlY29kZWRDaGFpbnMuZmluZChcbiAgICAgIChjaGFpbikgPT4gY2hhaW4uaWRlbnRpdHlQdWJsaWNLZXkgIT09IHVuZGVmaW5lZFxuICAgICk/LmlkZW50aXR5UHVibGljS2V5O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudERhdGEsXG4gICAgICBpZGVudGl0eURhdGEsXG4gICAgICBwdWJsaWNLZXlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCB7IExvZ2luSGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIE1vYkVxdWlwbWVudFBhY2tldCxcbiAgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IsXG4gIFBhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IEVudGl0eUludmVudG9yeVRyYWl0IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuY2xhc3MgTW9iRXF1aXBtZW50SGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuTW9iRXF1aXBtZW50O1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBNb2JFcXVpcG1lbnRQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgaW52ZW50b3J5IHRyYWl0XG4gICAgY29uc3QgaW52ZW50b3J5ID0gcGxheWVyLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3Mgc2VsZWN0ZWQgaXRlbVxuICAgIGludmVudG9yeS5zZWxlY3RlZFNsb3QgPSBwYWNrZXQuc2VsZWN0ZWRTbG90O1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBoZWxkIGl0ZW1cbiAgICBjb25zdCBpdGVtID0gaW52ZW50b3J5LmdldEhlbGRJdGVtKCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgTW9iRXF1aXBtZW50UGFja2V0XG4gICAgY29uc3QgdXBkYXRlID0gbmV3IE1vYkVxdWlwbWVudFBhY2tldCgpO1xuICAgIHVwZGF0ZS5ydW50aW1lRW50aXR5SWQgPSBwbGF5ZXIucnVudGltZUlkO1xuICAgIHVwZGF0ZS5zbG90ID0gcGFja2V0LnNlbGVjdGVkU2xvdDtcbiAgICB1cGRhdGUuc2VsZWN0ZWRTbG90ID0gcGFja2V0LnNlbGVjdGVkU2xvdDtcbiAgICB1cGRhdGUuY29udGFpbmVySWQgPSBpbnZlbnRvcnkuY29udGFpbmVyLmlkZW50aWZpZXI7XG4gICAgdXBkYXRlLml0ZW0gPVxuICAgICAgaXRlbSA9PT0gbnVsbFxuICAgICAgICA/IG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcigwKVxuICAgICAgICA6IEl0ZW1TdGFjay50b05ldHdvcmtTdGFjayhpdGVtKTtcblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIGFsbCBwbGF5ZXJzLCBleGNlcHQgdGhlIHBsYXllciBpbiBjb250ZXh0XG4gICAgcGxheWVyLmRpbWVuc2lvbi5icm9hZGNhc3RFeGNlcHQocGxheWVyLCB1cGRhdGUpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1vYkVxdWlwbWVudEhhbmRsZXIgfTtcbiIsICJpbXBvcnQge1xuICBQbGF5ZXJBY3Rpb25QYWNrZXQsXG4gIFBhY2tldCxcbiAgUGxheWVyQWN0aW9uVHlwZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcblxuY2xhc3MgUGxheWVyQWN0aW9uSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuUGxheWVyQWN0aW9uO1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBQbGF5ZXJBY3Rpb25QYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIFN3aXRjaCB0aGUgYWN0aW9uIHR5cGVcbiAgICBzd2l0Y2ggKHBhY2tldC5hY3Rpb24pIHtcbiAgICAgIC8vIExvZyB1bmltcGxlbWVudGVkIGFjdGlvbiB0eXBlc1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBEZWJ1ZyBsb2cgdGhlIHVuaW1wbGVtZW50ZWQgYWN0aW9uIHR5cGVcbiAgICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFBsYXllckFjdGlvbkhhbmRsZXI6IFVuaW1wbGVtZW50ZWQgUGxheWVyQWN0aW9uVHlwZTogJHtQbGF5ZXJBY3Rpb25UeXBlW3BhY2tldC5hY3Rpb25dfWBcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZXMgd2hlbiBhIHBsYXllciBzdGFydHMgdXNpbmcgYW4gaXRlbSBvbiBhIGJsb2NrIG9yIGVudGl0eVxuICAgICAgY2FzZSBQbGF5ZXJBY3Rpb25UeXBlLlN0YXJ0SXRlbVVzZU9uOiB7XG4gICAgICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgdGFyZ2V0IGl0ZW1cbiAgICAgICAgcGxheWVyLml0ZW1UYXJnZXQgPSBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgUGxheWVyQWN0aW9uVHlwZS5TdG9wSXRlbVVzZU9uOiB7XG4gICAgICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgdGFyZ2V0IGl0ZW0gdG8gbnVsbFxuICAgICAgICBwbGF5ZXIuaXRlbVRhcmdldCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBERVBSRUNBVEVEOiBIYW5kbGVzIHdoZW4gYSBwbGF5ZXIgZGVzdHJveXMgYSBibG9jayBpbiBjcmVhdGl2ZSBtb2RlXG4gICAgICBjYXNlIFBsYXllckFjdGlvblR5cGUuQ3JlYXRpdmVEZXN0cm95QmxvY2s6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckFjdGlvbkhhbmRsZXIgfTtcbiIsICJpbXBvcnQge1xuICBBYmlsaXR5SW5kZXgsXG4gIEFjdG9yRmxhZyxcbiAgQmxvY2tQb3NpdGlvbixcbiAgR2FtZW1vZGUsXG4gIElucHV0RGF0YSxcbiAgSXRlbVN0YWNrUmVxdWVzdEFjdGlvbk1pbmVCbG9jayxcbiAgSXRlbVN0YWNrUmVxdWVzdEFjdGlvblR5cGUsXG4gIExldmVsRXZlbnQsXG4gIExldmVsRXZlbnRQYWNrZXQsXG4gIFBhY2tldCxcbiAgUGxheWVyQWN0aW9uVHlwZSxcbiAgUGxheWVyQXV0aElucHV0UGFja2V0LFxuICBQbGF5ZXJCbG9ja0FjdGlvbkRhdGEsXG4gIFVwZGF0ZUJsb2NrRmxhZ3NUeXBlLFxuICBVcGRhdGVCbG9ja0xheWVyVHlwZSxcbiAgVXBkYXRlQmxvY2tQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtVXNlTWV0aG9kIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQge1xuICBQbGF5ZXJCcmVha0Jsb2NrU2lnbmFsLFxuICBQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbCxcbiAgUGxheWVyU3RvcFVzaW5nSXRlbVNpZ25hbCxcbiAgUGxheWVyVXNlSXRlbVNpZ25hbFxufSBmcm9tIFwiLi4vZXZlbnRzXCI7XG5cbmNsYXNzIFBsYXllckF1dGhJbnB1dEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlBsYXllckF1dGhJbnB1dDtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogUGxheWVyQXV0aElucHV0UGFja2V0LCBjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIHBvc2l0aW9uXG4gICAgcGxheWVyLnBvc2l0aW9uLnggPSBwYWNrZXQucG9zaXRpb24ueDtcbiAgICBwbGF5ZXIucG9zaXRpb24ueSA9IHBhY2tldC5wb3NpdGlvbi55O1xuICAgIHBsYXllci5wb3NpdGlvbi56ID0gcGFja2V0LnBvc2l0aW9uLno7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIHJvdGF0aW9uXG4gICAgcGxheWVyLnJvdGF0aW9uLnBpdGNoID0gcGFja2V0LnJvdGF0aW9uLng7XG4gICAgcGxheWVyLnJvdGF0aW9uLnlhdyA9IHBhY2tldC5yb3RhdGlvbi55O1xuICAgIHBsYXllci5yb3RhdGlvbi5oZWFkWWF3ID0gcGFja2V0LmhlYWRZYXc7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllciBkZXZpY2UgaW5mb3JtYXRpb25cbiAgICBwbGF5ZXIuZGV2aWNlLmlucHV0TW9kZSA9IHBhY2tldC5pbnB1dE1vZGU7XG4gICAgcGxheWVyLmRldmljZS5pbnRlcmFjdGlvbk1vZGUgPSBwYWNrZXQuaW50ZXJhY3Rpb25Nb2RlO1xuICAgIHBsYXllci5kZXZpY2UucGxheU1vZGUgPSBwYWNrZXQucGxheU1vZGU7XG5cbiAgICAvLyBDb252ZXJ0IHRoZSBwbGF5ZXIncyBwb3NpdGlvbiB0byBhIGJsb2NrIHBvc2l0aW9uXG4gICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIucG9zaXRpb24uZmxvb3IoKTtcblxuICAgIC8vIEdldCB0aGUgYmxvY2sgcGVybXV0YXRpb24gYmVsb3cgdGhlIHBsYXllclxuICAgIC8vIEdldHRpbmcgdGhlIHBlcm11dGF0aW9uIHJhdGhlciB0aGFuIHRoZSBibG9jayB3aWxsIHJlZHVjZSBzZXJ2ZXIgbG9hZFxuICAgIC8vIEFzIGdldHRpbmcgdGhlIGJsb2NrIHdpbGwgY29uc3RydWN0IGEgYmxvY2sgaW5zdGFuY2UsIHRoZSBwZXJtdXRhdGlvbiBpcyBhbHJlYWR5IGxvYWRlZFxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gcGxheWVyLmRpbWVuc2lvbi5nZXRQZXJtdXRhdGlvbih7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHk6IHBvc2l0aW9uLnkgLSAyXG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBsYXllcidzIG9uR3JvdW5kIHN0YXR1cyAmIGlucHV0VGlja1xuICAgIHBsYXllci5vbkdyb3VuZCA9IHBlcm11dGF0aW9uLnR5cGUuc29saWQ7XG4gICAgcGxheWVyLmlucHV0VGljayA9IHBhY2tldC5pbnB1dFRpY2s7XG5cbiAgICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpc1xuICAgIHBsYXllci5pc01vdmluZyA9IHRydWU7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGNvbnRhaW5zIGJsb2NrIGFjdGlvbnNcbiAgICBpZiAocGFja2V0LmJsb2NrQWN0aW9ucykge1xuICAgICAgLy8gQ2hlY2sgaWYgYW4gaXRlbSBzdGFjayByZXF1ZXN0IHdhcyBwcm92aWRlZFxuICAgICAgaWYgKHBhY2tldC5pdGVtU3RhY2tSZXF1ZXN0KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb25zIGluY2x1ZGUgbWluaW5nIGEgYmxvY2tcbiAgICAgICAgLy8gSWYgc28sIHRoaXMgaW5kaWNhdGVzIHRoZSBwbGF5ZXIgaXMgdXNpbmcgYSB0b29sIHRvIG1pbmUgYSBibG9ja1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBwYWNrZXQuaXRlbVN0YWNrUmVxdWVzdC5hY3Rpb25zLmZpbmQoXG4gICAgICAgICAgKHgpID0+XG4gICAgICAgICAgICB4LmFjdGlvbiA9PT0gSXRlbVN0YWNrUmVxdWVzdEFjdGlvblR5cGUuU2NyZWVuSFVETWluZUJsb2NrICYmXG4gICAgICAgICAgICB4Lm1pbmVCbG9ja1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgbWluaW5nIGEgYmxvY2ssIGhhbmRsZSB0aGUgYmxvY2sgYWN0aW9uc1xuICAgICAgICBpZiAoYWN0aW9uKVxuICAgICAgICAgIHRoaXMuaGFuZGxlQmxvY2tBY3Rpb25zKFxuICAgICAgICAgICAgcGxheWVyLFxuICAgICAgICAgICAgcGFja2V0LmJsb2NrQWN0aW9ucy5hY3Rpb25zLFxuICAgICAgICAgICAgYWN0aW9uLm1pbmVCbG9jayBhcyBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uTWluZUJsb2NrXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgYmxvY2sgYWN0aW9uc1xuICAgICAgICB0aGlzLmhhbmRsZUJsb2NrQWN0aW9ucyhwbGF5ZXIsIHBhY2tldC5ibG9ja0FjdGlvbnMuYWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSBwbGF5ZXIncyBhY3Rpb25zXG4gICAgdGhpcy5oYW5kbGVBY3RvckFjdGlvbnMocGxheWVyLCBwYWNrZXQuaW5wdXREYXRhLmdldEZsYWdzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYWN0b3IgYWN0aW9ucyBmcm9tIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgcGVyZm9ybWVkIHRoZSBhY3Rpb25zXG4gICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBhY3Rpb25zIHBlcmZvcm1lZCBieSB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlQWN0b3JBY3Rpb25zKHBsYXllcjogUGxheWVyLCBhY3Rpb25zOiBBcnJheTxJbnB1dERhdGE+KTogdm9pZCB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBhY3Rpb25zXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgLy8gSGFuZGxlIHRoZSBhY3Rpb25cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIC8vIEhhbmRsZSB3aGVuIGEgcGxheWVyIHNuZWFrc1xuICAgICAgICBjYXNlIElucHV0RGF0YS5TdGFydFNuZWFraW5nOlxuICAgICAgICBjYXNlIElucHV0RGF0YS5TdG9wU25lYWtpbmc6IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNuZWFraW5nIGZsYWcgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgICAgY29uc3Qgc25lYWtpbmcgPSBwbGF5ZXIuZmxhZ3MuZ2V0KEFjdG9yRmxhZy5TbmVha2luZykgPz8gZmFsc2U7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHNuZWFraW5nIGZsYWcgYmFzZWQgb24gdGhlIGFjdGlvblxuICAgICAgICAgIHBsYXllci5mbGFncy5zZXQoQWN0b3JGbGFnLlNuZWFraW5nLCAhc25lYWtpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHdoZW4gYSBwbGF5ZXIgc3ByaW50c1xuICAgICAgICBjYXNlIElucHV0RGF0YS5TdGFydFNwcmludGluZzpcbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RvcFNwcmludGluZzoge1xuICAgICAgICAgIC8vIEdldCB0aGUgc3ByaW50aW5nIGZsYWcgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgICAgY29uc3Qgc3ByaW50aW5nID0gcGxheWVyLmZsYWdzLmdldChBY3RvckZsYWcuU3ByaW50aW5nKSA/PyBmYWxzZTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgc3ByaW50aW5nIGZsYWcgYmFzZWQgb24gdGhlIGFjdGlvblxuICAgICAgICAgIHBsYXllci5mbGFncy5zZXQoQWN0b3JGbGFnLlNwcmludGluZywgIXNwcmludGluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlbiBhIHBsYXllciBzd2ltc1xuICAgICAgICBjYXNlIElucHV0RGF0YS5TdGFydFN3aW1taW5nOlxuICAgICAgICBjYXNlIElucHV0RGF0YS5TdG9wU3dpbW1pbmc6IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHN3aW1taW5nIGZsYWcgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgICAgY29uc3Qgc3dpbW1pbmcgPSBwbGF5ZXIuZmxhZ3MuZ2V0KEFjdG9yRmxhZy5Td2ltbWluZykgPz8gZmFsc2U7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHN3aW1taW5nIGZsYWcgYmFzZWQgb24gdGhlIGFjdGlvblxuICAgICAgICAgIHBsYXllci5mbGFncy5zZXQoQWN0b3JGbGFnLlN3aW1taW5nLCAhc3dpbW1pbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHdoZW4gYSBwbGF5ZXIgY3Jhd2xzXG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0YXJ0Q3Jhd2xpbmc6XG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0b3BDcmF3bGluZzoge1xuICAgICAgICAgIC8vIEdldCB0aGUgY3Jhd2xpbmcgZmxhZyBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgICAgICBjb25zdCBjcmF3bGluZyA9IHBsYXllci5mbGFncy5nZXQoQWN0b3JGbGFnLkNyYXdsaW5nKSA/PyBmYWxzZTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgY3Jhd2xpbmcgZmxhZyBiYXNlZCBvbiB0aGUgYWN0aW9uXG4gICAgICAgICAgcGxheWVyLmZsYWdzLnNldChBY3RvckZsYWcuQ3Jhd2xpbmcsICFjcmF3bGluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgd2hlbiBhIHBsYXllciBpcyBnbGlkaW5nXG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0YXJ0R2xpZGluZzpcbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RvcEdsaWRpbmc6IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGdsaWRpbmcgZmxhZyBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgICAgICBjb25zdCBnbGlkaW5nID0gcGxheWVyLmZsYWdzLmdldChBY3RvckZsYWcuR2xpZGluZykgPz8gZmFsc2U7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIGdsaWRpbmcgZmxhZyBiYXNlZCBvbiB0aGUgYWN0aW9uXG4gICAgICAgICAgcGxheWVyLmZsYWdzLnNldChBY3RvckZsYWcuR2xpZGluZywgIWdsaWRpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RhcnRGbHlpbmc6XG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0b3BGbHlpbmc6IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGZseWluZyBhYmlsaXR5IGZyb20gdGhlIHBsYXllclxuICAgICAgICAgIGNvbnN0IGZseWluZyA9IHBsYXllci5hYmlsaXRpZXMuZ2V0KEFiaWxpdHlJbmRleC5GbHlpbmcpID8/IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IG1heUZseSA9IHBsYXllci5hYmlsaXRpZXMuZ2V0KEFiaWxpdHlJbmRleC5NYXlGbHkpID8/IGZhbHNlO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBub3QgYWxsb3dlZCB0byBmbHlcbiAgICAgICAgICAvLyBUaGlzIHN0b3BzIHRoZSBIb3Jpb24gZmx5IGV4cGxvaXRcbiAgICAgICAgICBpZiAoIWZseWluZyAmJiAhbWF5Rmx5KSB7XG4gICAgICAgICAgICAvLyBEaXNhYmxlIGZseWluZyBpZiB0aGUgcGxheWVyIGRvZXMgbm90IGhhdmUgdGhlIG1heSBmbHkgYWJpbGl0eVxuICAgICAgICAgICAgcGxheWVyLmFiaWxpdGllcy5zZXQoQWJpbGl0eUluZGV4LkZseWluZywgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIGZseWluZyBhYmlsaXR5IGJhc2VkIG9uIHRoZSBhY3Rpb25cbiAgICAgICAgICAgIHBsYXllci5hYmlsaXRpZXMuc2V0KEFiaWxpdHlJbmRleC5GbHlpbmcsICFmbHlpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJsb2NrIGFjdGlvbnMgZnJvbSB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHBlcmZvcm1lZCB0aGUgYmxvY2sgYWN0aW9uc1xuICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgYmxvY2sgYWN0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGhhbmRsZUJsb2NrQWN0aW9ucyhcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBhY3Rpb25zOiBBcnJheTxQbGF5ZXJCbG9ja0FjdGlvbkRhdGE+LFxuICAgIHJlcXVlc3Q/OiBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uTWluZUJsb2NrXG4gICk6IHZvaWQge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYWN0aW9uc1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGZyb20gdGhlIHBsYXllclxuICAgICAgY29uc3QgZGltZW5zaW9uID0gcGxheWVyLmRpbWVuc2lvbjtcblxuICAgICAgLy8gU3dpdGNoIG9uIHRoZSBhY3Rpb24gdHlwZVxuICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICAvLyBMb2cgdW5pbXBsZW1lbnRlZCBhY3Rpb25zXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBQbGF5ZXJBdXRoSW5wdXRIYW5kbGVyOiBVbmltcGxlbWVudGVkIGJsb2NrIGFjdGlvbjogJHtQbGF5ZXJBY3Rpb25UeXBlW2FjdGlvbi50eXBlXX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGxheWVyQWN0aW9uVHlwZS5Db250aW51ZURlc3Ryb3lCbG9jazpcbiAgICAgICAgY2FzZSBQbGF5ZXJBY3Rpb25UeXBlLlN0YXJ0RGVzdHJveUJsb2NrOiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBpbiBjcmVhdGl2ZSBtb2RlXG4gICAgICAgICAgLy8gSWYgc28sIHNraXAgdGhlIGJsb2NrIGJyZWFrXG4gICAgICAgICAgaWYgKHBsYXllci5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuQ3JlYXRpdmUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBhbHJlYWR5IGhhcyBhIGJsb2NrIHRhcmdldFxuICAgICAgICAgIGlmIChwbGF5ZXIuYmxvY2tUYXJnZXQpIHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGJsb2NrIG9uU3RvcEJyZWFrIHRyYWl0IG1ldGhvZHNcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaWdub3JlIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZFxuICAgICAgICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBkaW1lbnNpb25cbiAgICAgICAgICAgICAgLmdldEJsb2NrKHBsYXllci5ibG9ja1RhcmdldClcbiAgICAgICAgICAgICAgLnRyYWl0cy52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgdHJhaXQub25TdG9wQnJlYWs/LihwbGF5ZXIpO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTGV2ZWxFdmVudFBhY2tldCBmb3IgdGhlIGJsb2NrIGJyZWFrXG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxFdmVudFBhY2tldCgpO1xuICAgICAgICAgICAgcGFja2V0LmV2ZW50ID0gTGV2ZWxFdmVudC5TdG9wQmxvY2tDcmFja2luZztcbiAgICAgICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZihwbGF5ZXIuYmxvY2tUYXJnZXQpO1xuICAgICAgICAgICAgcGFja2V0LmRhdGEgPSAwO1xuXG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uXG4gICAgICAgICAgICBkaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBwbGF5ZXJzIGJsb2NrIHRhcmdldFxuICAgICAgICAgICAgcGxheWVyLmJsb2NrVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIGZyb20gdGhlIGFjdGlvbiBwb3NpdGlvblxuICAgICAgICAgIGNvbnN0IGJsb2NrID0gZGltZW5zaW9uLmdldEJsb2NrKGFjdGlvbi5wb3NpdGlvbik7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaXMgYWlyLCBpZiBzbywgdGhlIGNsaWVudCBoYXMgYSBnaG9zdCBibG9ja1xuICAgICAgICAgIGlmIChibG9jay5pc0FpcigpKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIHBlcm11dGF0aW9uIGZyb20gdGhlIGRpbWVuc2lvblxuICAgICAgICAgICAgY29uc3QgcGVybXV0YXRpb24gPSBibG9jay5wZXJtdXRhdGlvbjtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBibG9jayBwZXJtdXRhdGlvbiB0byB0aGUgY2xpZW50XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQoKTtcbiAgICAgICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZihibG9jay5wb3NpdGlvbik7XG4gICAgICAgICAgICBwYWNrZXQubGF5ZXIgPSBVcGRhdGVCbG9ja0xheWVyVHlwZS5Ob3JtYWw7XG4gICAgICAgICAgICBwYWNrZXQuZmxhZ3MgPSBVcGRhdGVCbG9ja0ZsYWdzVHlwZS5OZXR3b3JrO1xuICAgICAgICAgICAgcGFja2V0Lm5ldHdvcmtCbG9ja0lkID0gcGVybXV0YXRpb24ubmV0d29yaztcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDYWxsIHRoZSBibG9jayBvblN0YXJ0QnJlYWsgdHJhaXQgbWV0aG9kc1xuICAgICAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgYmxvY2sudHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgYnJlYWsgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0cmFpdC5vblN0YXJ0QnJlYWs/LihwbGF5ZXIpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgICAgICAgIC8vIEFzIHRoZSB0cmFpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgYnJlYWtcbiAgICAgICAgICAgIGNhbmNlbGVkID0gIXN1Y2Nlc3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIGJyZWFrIHdhcyBjYW5jZWxlZCwgc2tpcCB0aGUgYmxvY2sgYnJlYWtcbiAgICAgICAgICBpZiAoY2FuY2VsZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwbGF5ZXJzIHRhcmdldGVkIGJsb2NrIHRvIHRoZSBibG9ja1xuICAgICAgICAgIHBsYXllci5ibG9ja1RhcmdldCA9IGJsb2NrLnBvc2l0aW9uO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGhlbGQgaXRlbSwgYW5kIGNhbGN1bGF0ZSB0aGUgYnJlYWsgdGltZVxuICAgICAgICAgIGNvbnN0IGhlbGRJdGVtID0gcGxheWVyLmdldEhlbGRJdGVtKCk7XG4gICAgICAgICAgY29uc3QgYnJlYWtUaW1lID0gYmxvY2suZ2V0QnJlYWtUaW1lKGhlbGRJdGVtKTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBMZXZlbEV2ZW50UGFja2V0IGZvciB0aGUgYmxvY2sgYnJlYWtcbiAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxFdmVudFBhY2tldCgpO1xuICAgICAgICAgIHBhY2tldC5ldmVudCA9IExldmVsRXZlbnQuU3RhcnRCbG9ja0NyYWNraW5nO1xuICAgICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZihibG9jay5wb3NpdGlvbik7XG4gICAgICAgICAgcGFja2V0LmRhdGEgPSA2NTUzNSAvIGJyZWFrVGltZTtcblxuICAgICAgICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICAgICAgICBkaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIHdhcyBob2xkaW5nIGFuIGl0ZW1cbiAgICAgICAgICBpZiAoaGVsZEl0ZW0pIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgdXNlIG1ldGhvZCBmb3IgdGhlIHRyYWl0XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSBJdGVtVXNlTWV0aG9kLkJyZWFrO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyU3RhcnRVc2luZ0l0ZW1TaWduYWxcbiAgICAgICAgICAgIGxldCBjYW5jZWxlZCA9ICFuZXcgUGxheWVyU3RhcnRVc2luZ0l0ZW1TaWduYWwoXG4gICAgICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICAgICAgaGVsZEl0ZW0sXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgKS5lbWl0KCk7XG5cbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGl0ZW0gb25TdGFydFVzZSB0cmFpdCBtZXRob2RzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGhlbGRJdGVtLnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnQgdXNlIHdhcyBzdWNjZXNzZnVsXG4gICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0cmFpdC5vblN0YXJ0VXNlPy4ocGxheWVyLCB7IG1ldGhvZCB9KTtcblxuICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgICAgICAgICAgLy8gQXMgdGhlIHRyYWl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWV0aG9kXG4gICAgICAgICAgICAgIGlmIChzdWNjZXNzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgdXNlXG4gICAgICAgICAgICAgIGNhbmNlbGVkID0gIXN1Y2Nlc3M7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSB1c2Ugd2FzIGNhbmNlbGVkLCBza2lwIHRoZSBpdGVtIHVzZVxuICAgICAgICAgICAgaWYgKGNhbmNlbGVkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBwbGF5ZXJzIGl0ZW0gdXNlIHRpbWVcbiAgICAgICAgICAgIHBsYXllci5pdGVtVGFyZ2V0ID0gaGVsZEl0ZW07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFBsYXllckFjdGlvblR5cGUuQWJvcnREZXN0cm95QmxvY2s6IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGFscmVhZHkgaGFzIGEgYmxvY2sgdGFyZ2V0XG4gICAgICAgICAgaWYgKHBsYXllci5ibG9ja1RhcmdldCkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgYmxvY2sgb25TdG9wQnJlYWsgdHJhaXQgbWV0aG9kc1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBpZ25vcmUgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGRpbWVuc2lvblxuICAgICAgICAgICAgICAuZ2V0QmxvY2socGxheWVyLmJsb2NrVGFyZ2V0KVxuICAgICAgICAgICAgICAudHJhaXRzLnZhbHVlcygpKVxuICAgICAgICAgICAgICB0cmFpdC5vblN0b3BCcmVhaz8uKHBsYXllcik7XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBMZXZlbEV2ZW50UGFja2V0IGZvciB0aGUgYmxvY2sgYnJlYWtcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMZXZlbEV2ZW50UGFja2V0KCk7XG4gICAgICAgICAgICBwYWNrZXQuZXZlbnQgPSBMZXZlbEV2ZW50LlN0b3BCbG9ja0NyYWNraW5nO1xuICAgICAgICAgICAgcGFja2V0LnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKHBsYXllci5ibG9ja1RhcmdldCk7XG4gICAgICAgICAgICBwYWNrZXQuZGF0YSA9IDA7XG5cbiAgICAgICAgICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICAgICAgICAgIGRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHBsYXllcnMgYmxvY2sgdGFyZ2V0XG4gICAgICAgICAgICBwbGF5ZXIuYmxvY2tUYXJnZXQgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgd2FzIGhvbGRpbmcgYW4gaXRlbVxuICAgICAgICAgIGlmIChwbGF5ZXIuaXRlbVRhcmdldCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllclN0b3BVc2luZ0l0ZW1TaWduYWxcbiAgICAgICAgICAgIG5ldyBQbGF5ZXJTdG9wVXNpbmdJdGVtU2lnbmFsKHBsYXllciwgcGxheWVyLml0ZW1UYXJnZXQpLmVtaXQoKTtcblxuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgaXRlbSBvblN0b3BVc2UgdHJhaXQgbWV0aG9kc1xuICAgICAgICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBwbGF5ZXIuaXRlbVRhcmdldC50cmFpdHMudmFsdWVzKCkpXG4gICAgICAgICAgICAgIHRyYWl0Lm9uU3RvcFVzZT8uKHBsYXllciwgeyBtZXRob2Q6IEl0ZW1Vc2VNZXRob2QuQnJlYWsgfSk7XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBwbGF5ZXJzIGl0ZW0gdXNlIHRpbWVcbiAgICAgICAgICAgIHBsYXllci5pdGVtVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGxheWVyQWN0aW9uVHlwZS5QcmVkaWN0RGVzdHJveUJsb2NrOiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBibG9jayBmcm9tIHRoZSBhY3Rpb24gcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBibG9jayA9IGRpbWVuc2lvbi5nZXRCbG9jayhhY3Rpb24ucG9zaXRpb24pO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllckJyZWFrQmxvY2tTaWduYWxcbiAgICAgICAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVyQnJlYWtCbG9ja1NpZ25hbChcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgcGxheWVyLFxuICAgICAgICAgICAgcGxheWVyLmdldEhlbGRJdGVtKClcbiAgICAgICAgICApLmVtaXQoKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgZG9lcyBub3QgaGF2ZSBhIGJsb2NrIHRhcmdldFxuICAgICAgICAgIC8vIEFuZCBpZiB0aGUgcGxheWVyIGlzIG5vdCBpbiBjcmVhdGl2ZSBtb2RlOyBhbHNvIGNoZWNrIGlmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGVkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKCFwbGF5ZXIuYmxvY2tUYXJnZXQgJiYgcGxheWVyLmdhbWVtb2RlICE9PSBHYW1lbW9kZS5DcmVhdGl2ZSkgfHxcbiAgICAgICAgICAgICFzaWduYWxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBVcGRhdGVCbG9ja1BhY2tldCBmb3IgdGhlIGJsb2NrIHVwZGF0ZVxuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IFVwZGF0ZUJsb2NrUGFja2V0KCk7XG4gICAgICAgICAgICBwYWNrZXQucG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLnRvVmVjdG9yM2YoYmxvY2sucG9zaXRpb24pO1xuICAgICAgICAgICAgcGFja2V0LmxheWVyID0gVXBkYXRlQmxvY2tMYXllclR5cGUuTm9ybWFsO1xuICAgICAgICAgICAgcGFja2V0LmZsYWdzID0gVXBkYXRlQmxvY2tGbGFnc1R5cGUuTmV0d29yaztcbiAgICAgICAgICAgIHBhY2tldC5uZXR3b3JrQmxvY2tJZCA9IGJsb2NrLnBlcm11dGF0aW9uLm5ldHdvcms7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICAgICAgICBwbGF5ZXIuc2VuZChwYWNrZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBCcmVhayB0aGUgYmxvY2tcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBibG9jay5kZXN0cm95KHBsYXllcik7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayB3YXMgbm90IGRlc3Ryb3llZCwgdXBkYXRlIHRoZSBibG9ja1xuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBVcGRhdGVCbG9ja1BhY2tldCBmb3IgdGhlIGJsb2NrIHVwZGF0ZVxuICAgICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQoKTtcbiAgICAgICAgICAgICAgcGFja2V0LnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKGJsb2NrLnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgcGFja2V0LmxheWVyID0gVXBkYXRlQmxvY2tMYXllclR5cGUuTm9ybWFsO1xuICAgICAgICAgICAgICBwYWNrZXQuZmxhZ3MgPSBVcGRhdGVCbG9ja0ZsYWdzVHlwZS5OZXR3b3JrO1xuICAgICAgICAgICAgICBwYWNrZXQubmV0d29ya0Jsb2NrSWQgPSBibG9jay5wZXJtdXRhdGlvbi5uZXR3b3JrO1xuXG4gICAgICAgICAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICAgICAgICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBtaW5lIGJsb2NrIHJlcXVlc3Qgd2FzIHByb3ZpZGVkXG4gICAgICAgICAgLy8gSWYgbm90LCBza2lwIHRoZSBibG9jayBicmVha1xuICAgICAgICAgIGlmICghcmVxdWVzdCB8fCAhcGxheWVyLml0ZW1UYXJnZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBpdGVtIHN0YWNrIGZyb20gdGhlIHBsYXllclxuICAgICAgICAgIGNvbnN0IHN0YWNrID0gcGxheWVyLml0ZW1UYXJnZXQ7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHVzZSBtZXRob2QgZm9yIHRoZSB0cmFpdCwgcHJlZGljdGVkIGR1cmFiaWxpdHksIGFuZCB0YXJnZXQgYmxvY2tcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBJdGVtVXNlTWV0aG9kLlVzZTtcbiAgICAgICAgICBjb25zdCBwcmVkaWN0ZWREdXJhYmlsaXR5ID0gcmVxdWVzdC5wcmVkaWN0ZWREdXJhYmlsaXR5O1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJsb2NrID0gYmxvY2s7XG5cbiAgICAgICAgICAvLyBDYWxsIHRoZSBpdGVtIG9uVXNlIHRyYWl0IG1ldGhvZHNcbiAgICAgICAgICBzdGFjay51c2UocGxheWVyLCB7IG1ldGhvZCwgcHJlZGljdGVkRHVyYWJpbGl0eSwgdGFyZ2V0QmxvY2sgfSk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyVXNlSXRlbVNpZ25hbFxuICAgICAgICAgIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsKHBsYXllciwgc3RhY2ssIG1ldGhvZCkuZW1pdCgpO1xuXG4gICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyQXV0aElucHV0SGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIFJlcXVlc3RDaHVua1JhZGl1c1BhY2tldCxcbiAgUGFja2V0LFxuICBDaHVua1JhZGl1c1VwZGF0ZVBhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbmNsYXNzIFJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlJlcXVlc3RDaHVua1JhZGl1cztcblxuICBwdWJsaWMgaGFuZGxlKFxuICAgIHBhY2tldDogUmVxdWVzdENodW5rUmFkaXVzUGFja2V0LFxuICAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkucGxheWVycy5nZXQoY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBtYXggdmlldyBkaXN0YW5jZVxuICAgIGNvbnN0IG1heFZpZXdEaXN0YW5jZSA9IHBsYXllci5kaW1lbnNpb24udmlld0Rpc3RhbmNlO1xuXG4gICAgLy8gR2V0IHRoZSByZXF1ZXN0ZWQgdmlldyBkaXN0YW5jZVxuICAgIGNvbnN0IHZpZXdEaXN0YW5jZSA9IHBhY2tldC5yYWRpdXM7XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGNodW5rIHJlbmRlcmluZyB0cmFpdFxuICAgIGNvbnN0IHRyYWl0ID0gcGxheWVyLmdldFRyYWl0KFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgdmlldyBkaXN0YW5jZVxuICAgIGNvbnN0IGRpc3RhbmNlID1cbiAgICAgIHZpZXdEaXN0YW5jZSA+IG1heFZpZXdEaXN0YW5jZSA/IG1heFZpZXdEaXN0YW5jZSA6IHZpZXdEaXN0YW5jZTtcblxuICAgIC8vIFNldCB0aGUgdmlldyBkaXN0YW5jZSwgdmVyaWZ5aW5nIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIHBsYXllcidzIG1heCB2aWV3IGRpc3RhbmNlXG4gICAgdHJhaXQudmlld0Rpc3RhbmNlID1cbiAgICAgIGRpc3RhbmNlID4gcGxheWVyLmRldmljZS5tYXhWaWV3RGlzdGFuY2VcbiAgICAgICAgPyBwbGF5ZXIuZGV2aWNlLm1heFZpZXdEaXN0YW5jZVxuICAgICAgICA6IGRpc3RhbmNlO1xuXG4gICAgLy8gU2VuZCB0aGUgY2h1bmsgcmFkaXVzIHVwZGF0ZWQgcGFja2V0XG4gICAgY29uc3QgdXBkYXRlID0gbmV3IENodW5rUmFkaXVzVXBkYXRlUGFja2V0KCk7XG4gICAgdXBkYXRlLnJhZGl1cyA9IHRyYWl0LnZpZXdEaXN0YW5jZTtcblxuICAgIC8vIFNlbmQgdGhlIHVwZGF0ZSB0byB0aGUgcGxheWVyXG4gICAgcGxheWVyLnNlbmRJbW1lZGlhdGUodXBkYXRlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBSZXF1ZXN0Q2h1bmtSYWRpdXNIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgRGlzY29ubmVjdFJlYXNvbixcbiAgTmV0d29ya1NldHRpbmdzUGFja2V0LFxuICBQYWNrZXQsXG4gIFBST1RPQ09MX1ZFUlNJT04sXG4gIHR5cGUgUmVxdWVzdE5ldHdvcmtTZXR0aW5nc1BhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmNsYXNzIFJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5SZXF1ZXN0TmV0d29ya1NldHRpbmdzO1xuXG4gIHB1YmxpYyBoYW5kbGUoXG4gICAgcGFja2V0OiBSZXF1ZXN0TmV0d29ya1NldHRpbmdzUGFja2V0LFxuICAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaXMgdGhlIHNlcnZlcnMgcHJvdG9jb2wgaXMgZ3JlYXRlciB0aGFuIHRoZSBjbGllbnRzIHByb3RvY29sLlxuICAgIC8vIFRoaXMgd291bGQgbWVhbiB0aGUgY2xpZW50IG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG4gICAgLy8gQWxzbyBjaGVjayBpZiB0aGUgc2VydmVycyBwcm90b2NvbCBpcyBsZXNzIHRoYW4gdGhlIGNsaWVudHMgcHJvdG9jb2wuXG4gICAgLy8gVGhpcyB3b3VsZCBtZWFuIHRoZSBzZXJ2ZXIgbmVlZHMgdG8gYmUgdXBkYXRlZC5cbiAgICBpZiAoUFJPVE9DT0xfVkVSU0lPTiA+IHBhY2tldC5wcm90b2NvbCkge1xuICAgICAgLy8gU2VuZCB0aGUgY2xpZW50IHRoZSBzZXJ2ZXJzIHByb3RvY29sIHZlcnNpb24uXG4gICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmRpc2Nvbm5lY3RDb25uZWN0aW9uKFxuICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICBcIk91dGRhdGVkIGNsaWVudCEgUGxlYXNlIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgTWluZWNyYWZ0IEJlZHJvY2suXCIsXG4gICAgICAgIERpc2Nvbm5lY3RSZWFzb24uT3V0ZGF0ZWRDbGllbnRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChQUk9UT0NPTF9WRVJTSU9OIDwgcGFja2V0LnByb3RvY29sKSB7XG4gICAgICAvLyBTZW5kIHRoZSBjbGllbnQgdGhlIHNlcnZlcnMgcHJvdG9jb2wgdmVyc2lvbi5cbiAgICAgIHJldHVybiB0aGlzLm5ldHdvcmsuZGlzY29ubmVjdENvbm5lY3Rpb24oXG4gICAgICAgIGNvbm5lY3Rpb24sXG4gICAgICAgIFwiT3V0ZGF0ZWQgc2VydmVyISBQbGVhc2Ugd2FpdCBmb3IgdGhlIHNlcnZlciB0byBiZSB1cGRhdGVkLlwiLFxuICAgICAgICBEaXNjb25uZWN0UmVhc29uLk91dGRhdGVkU2VydmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE9uY2Ugd2UgaGF2ZSBkZXRlcm1pbmVkIHRoYXQgdGhlIGNsaWVudCBpcyB1c2luZyB0aGUgY29ycmVjdCBwcm90b2NvbCB2ZXJzaW9uLFxuICAgIC8vIFdlIGNhbiBzZW5kIHRoZSBjbGllbnQgdGhlIG5ldHdvcmsgc2V0dGluZ3MuXG4gICAgLy8gV2lsbCB3aWxsIGFzc2lnbiB0aGUgdmFsdWVzIGZyb20gdGhlIG5ldHdvcmsgaW5zdGFuY2UgdG8gdGhlIHNldHRpbmdzIHBhY2tldC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBOZXR3b3JrU2V0dGluZ3NQYWNrZXQoKTtcbiAgICBzZXR0aW5ncy5jb21wcmVzc2lvblRocmVzaG9sZCA9XG4gICAgICB0aGlzLnNlcmVuaXR5LnByb3BlcnRpZXMuY29tcHJlc3Npb25UaHJlc2hvbGQ7XG4gICAgc2V0dGluZ3MuY29tcHJlc3Npb25NZXRob2QgPSB0aGlzLnNlcmVuaXR5LnByb3BlcnRpZXMuY29tcHJlc3Npb25NZXRob2Q7XG4gICAgc2V0dGluZ3MuY2xpZW50VGhyb3R0bGUgPSBmYWxzZTtcbiAgICBzZXR0aW5ncy5jbGllbnRUaHJlc2hvbGQgPSAwO1xuICAgIHNldHRpbmdzLmNsaWVudFNjYWxhciA9IDA7XG5cbiAgICAvLyBTZW5kIHRoZSBzZXR0aW5ncyBwYWNrZXQgdG8gdGhlIGNsaWVudC5cbiAgICB0aGlzLm5ldHdvcmsuc2VuZE5vcm1hbChjb25uZWN0aW9uLCBzZXR0aW5ncyk7XG5cbiAgICAvLyBXZSBjYW4gbm93IGVuYWJsZSBjb21wcmVzc2lvbiBmb3IgdGhlIHNlc3Npb24uXG4gICAgLy8gRm9yIHRoaXMgcG9pbnQgb24sIHNvbWUgcGFja2V0cyB3aWxsIGJlIGNvbXByZXNzZWQuXG4gICAgdGhpcy5uZXR3b3JrLnNldENvbXByZXNzaW9uKGNvbm5lY3Rpb24sIHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgQXZhaWxhYmxlQWN0b3JJZGVudGlmaWVyc1BhY2tldCxcbiAgRGlmZmljdWx0eSxcbiAgTUlORUNSQUZUX1ZFUlNJT04sXG4gIFBhY2tldCxcbiAgUGxheVN0YXR1cyxcbiAgUGxheVN0YXR1c1BhY2tldCxcbiAgUmVzb3VyY2VQYWNrQ2xpZW50UmVzcG9uc2VQYWNrZXQsXG4gIFJlc291cmNlUGFja1Jlc3BvbnNlLFxuICBSZXNvdXJjZVBhY2tTdGFja1BhY2tldCxcbiAgU3RhcnRHYW1lUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcbmltcG9ydCB7IENvbXBvdW5kVGFnLCBUYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvbmJ0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IEN1c3RvbUJsb2NrVHlwZSB9IGZyb20gXCIuLi9ibG9ja1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuY2xhc3MgUmVzb3VyY2VQYWNrQ2xpZW50UmVzcG9uc2VIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5SZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZTtcblxuICBwdWJsaWMgaGFuZGxlKFxuICAgIHBhY2tldDogUmVzb3VyY2VQYWNrQ2xpZW50UmVzcG9uc2VQYWNrZXQsXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgcGxheWVycyBjdXJyZW50IHdvcmxkXG4gICAgY29uc3Qgd29ybGQgPSBwbGF5ZXIuZGltZW5zaW9uLndvcmxkO1xuXG4gICAgc3dpdGNoIChwYWNrZXQucmVzcG9uc2UpIHtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRGVidWcgdGhlIHVuaGFuZGxlZCBSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZVxuICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgVW5oYW5kbGVkIFJlc291cmNlUGFja0NsaWVudFJlc3BvbnNlOiAke1Jlc291cmNlUGFja1Jlc3BvbnNlW3BhY2tldC5yZXNwb25zZV19YFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBSZXNvdXJjZVBhY2tSZXNwb25zZS5IYXZlQWxsUGFja3M6IHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFJlc291cmNlUGFja1N0YWNrUGFja2V0XG4gICAgICAgIGNvbnN0IHN0YWNrID0gbmV3IFJlc291cmNlUGFja1N0YWNrUGFja2V0KCk7XG4gICAgICAgIHN0YWNrLm11c3RBY2NlcHQgPSBmYWxzZTsgLy8gdGhpcy5zZXJlbml0eS5yZXNvdXJjZVBhY2tzLm11c3RBY2NlcHRSZXNvdXJjZVBhY2tzO1xuICAgICAgICBzdGFjay5iZWhhdmlvclBhY2tzID0gW107XG4gICAgICAgIHN0YWNrLmdhbWVWZXJzaW9uID0gTUlORUNSQUZUX1ZFUlNJT047XG4gICAgICAgIHN0YWNrLmV4cGVyaW1lbnRzID0gW107XG4gICAgICAgIHN0YWNrLmV4cGVyaW1lbnRzUHJldmlvdXNseVRvZ2dsZWQgPSBmYWxzZTtcbiAgICAgICAgc3RhY2suaGFzRWRpdG9yUGFja3MgPSBmYWxzZTtcblxuICAgICAgICBzdGFjay50ZXh0dXJlUGFja3MgPSBbXTtcbiAgICAgICAgLy8gZm9yIChjb25zdCBwYWNrIG9mIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VQYWNrcy5nZXRQYWNrcygpKSB7XG4gICAgICAgIC8vICAgY29uc3QgcGFja0luZm8gPSBuZXcgUmVzb3VyY2VJZFZlcnNpb25zKFxuICAgICAgICAvLyAgICAgcGFjay5uYW1lLFxuICAgICAgICAvLyAgICAgcGFjay51dWlkLFxuICAgICAgICAvLyAgICAgcGFjay52ZXJzaW9uXG4gICAgICAgIC8vICAgKTtcblxuICAgICAgICAvLyAgIHN0YWNrLnRleHR1cmVQYWNrcy5wdXNoKHBhY2tJbmZvKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIFNlbmQgdGhlIFJlc291cmNlUGFja1N0YWNrUGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgcmV0dXJuIHBsYXllci5zZW5kKHN0YWNrKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBSZXNvdXJjZVBhY2tSZXNwb25zZS5Db21wbGV0ZWQ6IHtcbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IFN0YXJ0R2FtZVBhY2tldCgpO1xuICAgICAgICBwYWNrZXQuZW50aXR5SWQgPSBwbGF5ZXIudW5pcXVlSWQ7XG4gICAgICAgIHBhY2tldC5ydW50aW1lRW50aXR5SWQgPSBwbGF5ZXIucnVudGltZUlkO1xuICAgICAgICBwYWNrZXQucGxheWVyR2FtZW1vZGUgPSBwbGF5ZXIuZ2FtZW1vZGU7XG4gICAgICAgIHBhY2tldC5wbGF5ZXJQb3NpdGlvbiA9IHBsYXllci5wb3NpdGlvbjtcbiAgICAgICAgcGFja2V0LnBpdGNoID0gcGxheWVyLnJvdGF0aW9uLnBpdGNoO1xuICAgICAgICBwYWNrZXQueWF3ID0gcGxheWVyLnJvdGF0aW9uLnlhdztcbiAgICAgICAgcGFja2V0LnNlZWQgPSBCaWdJbnQocGxheWVyLmRpbWVuc2lvbi5nZW5lcmF0b3IucHJvcGVydGllcy5zZWVkKTtcbiAgICAgICAgcGFja2V0LmJpb21lVHlwZSA9IDA7XG4gICAgICAgIHBhY2tldC5iaW9tZU5hbWUgPSBcInBsYWluc1wiO1xuICAgICAgICBwYWNrZXQuZGltZW5zaW9uID0gcGxheWVyLmRpbWVuc2lvbi50eXBlO1xuICAgICAgICBwYWNrZXQuZ2VuZXJhdG9yID0gMTtcbiAgICAgICAgcGFja2V0LndvcmxkR2FtZW1vZGUgPSAwO1xuICAgICAgICBwYWNrZXQuaGFyZGNvcmUgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmRpZmZpY3VsdHkgPSBEaWZmaWN1bHR5LkVhc3k7XG4gICAgICAgIHBhY2tldC5zcGF3blBvc2l0aW9uID0gcGxheWVyLmRpbWVuc2lvbi5zcGF3blBvc2l0aW9uO1xuICAgICAgICBwYWNrZXQuYWNoaWV2ZW1lbnRzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBwYWNrZXQuZWRpdG9yV29ybGRUeXBlID0gMDtcbiAgICAgICAgcGFja2V0LmNyZWF0ZWRJbkVkaW9yID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5leHBvcnRlZEZyb21FZGlvciA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuZGF5Q3ljbGVTdG9wVGltZSA9IHBsYXllci5kaW1lbnNpb24ud29ybGQuZGF5VGltZTtcbiAgICAgICAgcGFja2V0LmVkdU9mZmVyID0gMDtcbiAgICAgICAgcGFja2V0LmVkdUZlYXR1cmVzID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LmVkdVByb2R1Y3RVdWlkID0gXCJcIjtcbiAgICAgICAgcGFja2V0LnJhaW5MZXZlbCA9IDA7XG4gICAgICAgIHBhY2tldC5saWdodG5pbmdMZXZlbCA9IDA7XG4gICAgICAgIHBhY2tldC5jb25maXJtZWRQbGF0Zm9ybUxvY2tlZENvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0Lm11bHRpcGxheWVyR2FtZSA9IHRydWU7XG4gICAgICAgIHBhY2tldC5icm9hZGNhc3RUb0xhbiA9IHRydWU7XG4gICAgICAgIHBhY2tldC54YmxCcm9hZGNhc3RNb2RlID0gNjtcbiAgICAgICAgcGFja2V0LnBsYXRmb3JtQnJvYWRjYXN0TW9kZSA9IDY7XG4gICAgICAgIHBhY2tldC5jb21tYW5kc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICBwYWNrZXQudGV4dHVyZVBhY2tzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmdhbWVydWxlcyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImNvbW1hbmRibG9ja291dHB1dFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZG9kYXlsaWdodGN5Y2xlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb2VudGl0eWRyb3BzXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb2ZpcmV0aWNrXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJyZWNpcGVzdW5sb2NrXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb2xpbWl0ZWRjcmFmdGluZ1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvbW9ibG9vdFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZG9tb2JzcGF3bmluZ1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZG90aWxlZHJvcHNcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvd2VhdGhlcmN5Y2xlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkcm93bmluZ2RhbWFnZVwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZmFsbGRhbWFnZVwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZmlyZWRhbWFnZVwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwia2VlcGludmVudG9yeVwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIm1vYmdyaWVmaW5nXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJwdnBcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3djb29yZGluYXRlc1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmF0dXJhbHJlZ2VuZXJhdGlvblwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwidG50ZXhwbG9kZXNcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNlbmRjb21tYW5kZmVlZGJhY2tcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIm1heGNvbW1hbmRjaGFpbmxlbmd0aFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAyLFxuICAgICAgICAgICAgdmFsdWU6IDY1XzUzNVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb2luc29tbmlhXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJjb21tYW5kYmxvY2tzZW5hYmxlZFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwicmFuZG9tdGlja3NwZWVkXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDIsXG4gICAgICAgICAgICB2YWx1ZTogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb2ltbWVkaWF0ZXJlc3Bhd25cIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG93ZGVhdGhtZXNzYWdlc1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZnVuY3Rpb25jb21tYW5kbGltaXRcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMixcbiAgICAgICAgICAgIHZhbHVlOiAxMF8wMDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwic3Bhd25yYWRpdXNcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMixcbiAgICAgICAgICAgIHZhbHVlOiAxMFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG93dGFnc1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZnJlZXplZGFtYWdlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJyZXNwYXduYmxvY2tzZXhwbG9kZVwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwic2hvd2JvcmRlcmVmZmVjdFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwicGxheWVyc3NsZWVwaW5ncGVyY2VudGFnZVwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAyLFxuICAgICAgICAgICAgdmFsdWU6IDEwMFxuICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICAgICAgcGFja2V0LmV4cGVyaW1lbnRzID0gW107XG4gICAgICAgIHBhY2tldC5leHBlcmltZW50c1ByZXZpb3VzbHlUb2dnbGVkID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5ib251c0NoZXN0ID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5tYXBFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5wZXJtaXNzaW9uTGV2ZWwgPSBwbGF5ZXIucGVybWlzc2lvbjtcbiAgICAgICAgcGFja2V0LnNlcnZlckNodW5rVGlja1JhbmdlID0gcGxheWVyLmRpbWVuc2lvbi5zaW11bGF0aW9uRGlzdGFuY2UgPj4gNDtcbiAgICAgICAgcGFja2V0Lmhhc0xvY2tlZEJlaGF2aW9yUGFjayA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuaGFzTG9ja2VkUmVzb3VyY2VQYWNrID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5pc0Zyb21Mb2NrZWRXb3JsZFRlbXBsYXRlID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC51c2VNc2FHYW1lcnRhZ3NPbmx5ID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5pc0Zyb21Xb3JsZFRlbXBsYXRlID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5pc1dvcmxkVGVtcGxhdGVPcHRpb25Mb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0Lm9ubHlTcGF3blYxVmlsbGFnZXJzID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5wZXJzb25hRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmN1c3RvbVNraW5zRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmVtb3RlQ2hhdE11dGVkID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5nYW1lVmVyc2lvbiA9IE1JTkVDUkFGVF9WRVJTSU9OO1xuICAgICAgICBwYWNrZXQubGltaXRlZFdvcmxkV2lkdGggPSAxNjtcbiAgICAgICAgcGFja2V0LmxpbWl0ZWRXb3JsZExlbmd0aCA9IDE2O1xuICAgICAgICBwYWNrZXQuaXNOZXdOZXRoZXIgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmVkdVJlc291cmNlVXJpQnV0dG9uTmFtZSA9IFwiXCI7XG4gICAgICAgIHBhY2tldC5lZHVSZXNvdXJjZVVyaUxpbmsgPSBcIlwiO1xuICAgICAgICBwYWNrZXQuZXhwZXJpbWVudGFsR2FtZXBsYXlPdmVycmlkZSA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuY2hhdFJlc3RyaWN0aW9uTGV2ZWwgPSAwO1xuICAgICAgICBwYWNrZXQuZGlzYWJsZVBsYXllckludGVyYWN0aW9ucyA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuc2VydmVySWRlbnRmaWVyID0gXCJTZXJlbml0eUpTXCI7XG4gICAgICAgIHBhY2tldC53b3JsZElkZW50aWZpZXIgPSBwbGF5ZXIuZGltZW5zaW9uLndvcmxkLmlkZW50aWZpZXI7XG4gICAgICAgIHBhY2tldC5zY2VuYXJpb0lkZW50aWZpZXIgPSBcIlNlcmVuaXR5SlNcIjtcbiAgICAgICAgcGFja2V0LmxldmVsSWQgPSBcIlNlcmVuaXR5SlNcIjtcbiAgICAgICAgcGFja2V0LndvcmxkTmFtZSA9IHBsYXllci5kaW1lbnNpb24ud29ybGQuaWRlbnRpZmllcjtcbiAgICAgICAgcGFja2V0LnByZW1pdW1Xb3JsZFRlbXBsYXRlSWQgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuICAgICAgICBwYWNrZXQuaXNUcmlhbCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQubW92ZW1lbnRBdXRob3JpdHkgPSAxO1xuICAgICAgICBwYWNrZXQucmV3aW5kSGlzdG9yeVNpemUgPSAwO1xuICAgICAgICBwYWNrZXQuc2VydmVyQXV0aG9yaXRhdGl2ZUJsb2NrQnJlYWtpbmcgPSB0cnVlO1xuICAgICAgICBwYWNrZXQuY3VycmVudFRpY2sgPSBwbGF5ZXIuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuICAgICAgICBwYWNrZXQuZW5jaGFudG1lbnRTZWVkID0gMDtcblxuICAgICAgICAvLyBNYXAgdGhlIGN1c3RvbSBibG9ja3MgdG8gdGhlIHBhY2tldFxuICAgICAgICBwYWNrZXQuYmxvY2tQcm9wZXJ0aWVzID0gd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgLmdldEFsbEN1c3RvbVR5cGVzKClcbiAgICAgICAgICAubWFwKChibG9jaykgPT4gQ3VzdG9tQmxvY2tUeXBlLnRvQmxvY2tQcm9wZXJ0eShibG9jaykpO1xuXG4gICAgICAgIC8vIE1hcCB0aGUgY3VzdG9tIGl0ZW1zIHRvIHRoZSBwYWNrZXRcbiAgICAgICAgcGFja2V0Lml0ZW1zID0gd29ybGQuaXRlbVBhbGV0dGVcbiAgICAgICAgICAuZ2V0QWxsVHlwZXMoKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IEl0ZW1UeXBlLnRvSXRlbURhdGEoaXRlbSkpO1xuXG4gICAgICAgIHBhY2tldC5tdWx0aXBsYXllckNvcnJlbGF0aW9uSWQgPSBcIjxyYWtuZXQ+YTU1NS03ZWNlLTJmMWMtOGY2OVwiO1xuICAgICAgICBwYWNrZXQuc2VydmVyQXV0aG9yaXRhdGl2ZUludmVudG9yeSA9IHRydWU7XG4gICAgICAgIHBhY2tldC5lbmdpbmUgPSBcIipcIjtcbiAgICAgICAgcGFja2V0LnByb3BlcnR5RGF0YTEgPSAweDBhO1xuICAgICAgICBwYWNrZXQucHJvcGVydHlEYXRhMiA9IDB4MDA7XG4gICAgICAgIHBhY2tldC5wcm9wZXJ0eURhdGEzID0gMHgwMDtcbiAgICAgICAgcGFja2V0LmJsb2NrUGFsZXR0ZUNoZWNrc3VtID0gMG47XG4gICAgICAgIHBhY2tldC53b3JsZFRlbXBsYXRlSWQgPSBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XG4gICAgICAgIHBhY2tldC5jbGllbnRTaWRlR2VuZXJhdGlvbiA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuYmxvY2tOZXR3b3JrSWRzQXJlSGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LnNlcnZlckNvbnRyb2xsZWRTb3VuZHMgPSB0cnVlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgYXZhaWxhYmxlIGFjdG9yIGlkZW50aWZpZXJzXG4gICAgICAgIGNvbnN0IGFjdG9ycyA9IG5ldyBBdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0KCk7XG4gICAgICAgIGFjdG9ycy5kYXRhID0gbmV3IENvbXBvdW5kVGFnKCk7XG5cbiAgICAgICAgLy8gTWFwIHRoZSBlbnRpdGllcyB0byB0aGUgcGFja2V0XG4gICAgICAgIGNvbnN0IGVudGl0aWVzID0gd29ybGQuZW50aXR5UGFsZXR0ZVxuICAgICAgICAgIC5nZXRBbGxUeXBlcygpXG4gICAgICAgICAgLm1hcCgoZW50aXR5KSA9PiBFbnRpdHlUeXBlLnRvTmJ0KGVudGl0eSkpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsaXN0IHRhZyBmb3IgdGhlIGVudGl0aWVzXG4gICAgICAgIGFjdG9ycy5kYXRhLmNyZWF0ZUxpc3RUYWcoXCJpZGxpc3RcIiwgVGFnLkNvbXBvdW5kLCBlbnRpdGllcyk7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBsYXlTdGF0dXNQYWNrZXQoKTtcbiAgICAgICAgc3RhdHVzLnN0YXR1cyA9IFBsYXlTdGF0dXMuUGxheWVyU3Bhd247XG5cbiAgICAgICAgcGxheWVyLnNlbmRJbW1lZGlhdGUocGFja2V0LCBzdGF0dXMsIGFjdG9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFJlc291cmNlUGFja0NsaWVudFJlc3BvbnNlSGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIFBhY2tldCxcbiAgU2V0TG9jYWxQbGF5ZXJBc0luaXRpYWxpemVkUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuXG5jbGFzcyBTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5TZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWQ7XG5cbiAgcHVibGljIGhhbmRsZShcbiAgICBfcGFja2V0OiBTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRQYWNrZXQsXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBieSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBTcGF3biB0aGUgcGxheWVyXG4gICAgcGxheWVyLnNwYXduKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2V0TG9jYWxQbGF5ZXJBc0luaXRpYWxpemVkSGFuZGxlciB9O1xuIiwgImltcG9ydCB7IFBhY2tldCwgVGV4dFBhY2tldCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgUGxheWVyQ2hhdFNpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcblxuY2xhc3MgVGV4dEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlRleHQ7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IFRleHRQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBieSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkucGxheWVycy5nZXQoY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJDaGF0U2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllckNoYXRTaWduYWwocGxheWVyLCBwYWNrZXQubWVzc2FnZSk7XG5cbiAgICAvLyBJZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxlZCwgcmV0dXJuXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIHBhY2tldCB0byB0aGUgc2lnbmFsIG1lc3NhZ2VcbiAgICBwYWNrZXQubWVzc2FnZSA9IHNpZ25hbC5tZXNzYWdlO1xuXG4gICAgLy8gQ2FsbCB0aGUgYmxvY2sgb25TdGFydEJyZWFrIHRyYWl0IG1ldGhvZHNcbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHBsYXllci50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBicmVhayB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRyYWl0Lm9uQ2hhdD8uKHBhY2tldC5tZXNzYWdlKTtcblxuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQsIGNvbnRpbnVlXG4gICAgICAvLyBBcyB0aGUgdHJhaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtZXRob2RcbiAgICAgIGlmIChzdWNjZXNzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGZhbHNlLCBjYW5jZWwgdGhlIGJyZWFrXG4gICAgICBjYW5jZWxlZCA9ICFzdWNjZXNzO1xuICAgIH1cblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IGlmIGl0IHdhcyBub3QgY2FuY2VsZWRcbiAgICBpZiAoIWNhbmNlbGVkKSB7XG4gICAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgd29ybGRcbiAgICAgIHBsYXllci5kaW1lbnNpb24ud29ybGQuYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAgIC8vIExvZyB0aGUgY2hhdCB0byB0aGUgY29uc29sZVxuICAgICAgcGxheWVyLmRpbWVuc2lvbi53b3JsZC5sb2dnZXIuaW5mbyhcbiAgICAgICAgYMKnOFvCpzkke3BsYXllci51c2VybmFtZX3CpzhdIENoYXQ6wqdyICR7cGFja2V0Lm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgVGV4dEhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBDb21tYW5kUmVxdWVzdFBhY2tldCwgUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBDb21tYW5kRXhlY3V0aW9uU3RhdGUgfSBmcm9tIFwiLi4vY29tbWFuZHNcIjtcblxuY2xhc3MgQ29tbWFuZFJlcXVlc3RIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5Db21tYW5kUmVxdWVzdDtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogQ29tbWFuZFJlcXVlc3RQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBieSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIGZyb20gdGhlIHBsYXllclxuICAgIGNvbnN0IHdvcmxkID0gcGxheWVyLmRpbWVuc2lvbi53b3JsZDtcblxuICAgIC8vIEZpbHRlciB0aGUgY29tbWFuZFxuICAgIGNvbnN0IG5hbWUgPSBwYWNrZXQuY29tbWFuZC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgPyBwYWNrZXQuY29tbWFuZC5zbGljZSgxKVxuICAgICAgOiBwYWNrZXQuY29tbWFuZDtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBDb21tYW5kRXhlY3V0aW9uU3RhdGUgaW5zdGFuY2VcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBDb21tYW5kRXhlY3V0aW9uU3RhdGUoXG4gICAgICB3b3JsZC5jb21tYW5kcy5nZXRBbGwoKSxcbiAgICAgIG5hbWUsXG4gICAgICBwbGF5ZXJcbiAgICApO1xuXG4gICAgLy8gQ2FsbCB0aGUgZW50aXR5IG9uQ29tbWFuZCB0cmFpdCBtZXRob2RzXG4gICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBwbGF5ZXIudHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRyYWl0Lm9uQ29tbWFuZD8uKHN0YXRlKTtcblxuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQsIGNvbnRpbnVlXG4gICAgICAvLyBBcyB0aGUgdHJhaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtZXRob2RcbiAgICAgIGlmIChzdWNjZXNzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGZhbHNlLCBjYW5jZWwgdGhlIGNvbW1hbmRcbiAgICAgIGNhbmNlbGVkID0gIXN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGNvbW1hbmQgd2FzIGNhbmNlbGVkLCByZXR1cm5cbiAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICBpZiAoKHN0YXRlLmNvbW1hbmQ/LnJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA/PyA0KSArIDEgPiBwbGF5ZXIucGVybWlzc2lvbilcbiAgICAgIHJldHVybiBwbGF5ZXIuc2VuZE1lc3NhZ2UoXG4gICAgICAgIGDCp2NZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoaXMgY29tbWFuZC5gXG4gICAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBleGVjdXRlIHRoZSBjb21tYW5kXG4gICAgICBjb25zdCByZXN1bHQgPSBzdGF0ZS5leGVjdXRlKCk7XG5cbiAgICAgIC8vIExvZyB0aGUgY29tbWFuZCB0byB0aGUgY29uc29sZVxuICAgICAgd29ybGQubG9nZ2VyLmluZm8oXG4gICAgICAgIGDCpzhbwqc5JHtwbGF5ZXIudXNlcm5hbWV9wqc4XSBDb21tYW5kOsKnciAke3BhY2tldC5jb21tYW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIFNlbmQgdGhlIHJlc3VsdCBtZXNzYWdlIHRvIHRoZSBwbGF5ZXIsIGlmIGFueS5cbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSkgcGxheWVyLnNlbmRNZXNzYWdlKGDCpzcke3Jlc3VsdC5tZXNzYWdlfcKncmApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgICBwbGF5ZXIuc2VuZE1lc3NhZ2UoYMKnY1R5cGUgRXJyb3I6ICR7KHJlYXNvbiBhcyBFcnJvcikubWVzc2FnZX3Cp3JgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsYXllci5zZW5kTWVzc2FnZShgwqdjU3ludGF4IEVycm9yOiAkeyhyZWFzb24gYXMgRXJyb3IpLm1lc3NhZ2V9wqdyYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IENvbW1hbmRSZXF1ZXN0SGFuZGxlciB9O1xuIiwgImltcG9ydCB7IEludGVyYWN0QWN0aW9uLCBJbnRlcmFjdFBhY2tldCwgUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuY2xhc3MgSW50ZXJhY3RIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5JbnRlcmFjdDtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogSW50ZXJhY3RQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgZGltZW5zaW9uXG4gICAgY29uc3QgZGltZW5zaW9uID0gcGxheWVyLmRpbWVuc2lvbjtcblxuICAgIC8vIFN3aXRjaCBvbiB0aGUgYWN0aW9uIHR5cGVcbiAgICBzd2l0Y2ggKHBhY2tldC5hY3Rpb24pIHtcbiAgICAgIC8vIExvZyB1bmltcGxlbWVudGVkIGFjdGlvbnNcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGRpbWVuc2lvbi53b3JsZC5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYEludGVyYWN0SGFuZGxlcjogVW5pbXBsZW1lbnRlZCBhY3Rpb24gJHtbSW50ZXJhY3RBY3Rpb25bcGFja2V0LmFjdGlvbl1dfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyBmaXJlcyB3aGVuIGEgcGxheWVyIGxvb2tzIGF0IGFuIGVudGl0eVxuICAgICAgLy8gSWYgdGhlIHJ1bnRpbWUgaWQgaXMgMCwgdGhlIHBsYXllciBpcyBubyBsb25nZXIgbG9va2luZyBhdCB0aGUgZW50aXR5XG4gICAgICBjYXNlIEludGVyYWN0QWN0aW9uLkludGVyYWN0VXBkYXRlOiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBydW50aW1lIGlkIGlzIDBcbiAgICAgICAgaWYgKHBhY2tldC5hY3RvclJ1bnRpbWVJZCA9PT0gMG4pXG4gICAgICAgICAgcmV0dXJuIHZvaWQgKHBsYXllci5lbnRpdHlUYXJnZXQgPSBudWxsKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHRhcmdldCBlbnRpdHkgZnJvbSB0aGUgZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IGRpbWVuc2lvbi5nZXRFbnRpdHkocGFja2V0LmFjdG9yUnVudGltZUlkLCB0cnVlKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGV4aXN0c1xuICAgICAgICBpZiAoIWVudGl0eSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgdGFyZ2V0IGVudGl0eVxuICAgICAgICByZXR1cm4gdm9pZCAocGxheWVyLmVudGl0eVRhcmdldCA9IGVudGl0eSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBhY3Rpb24gb2NjdXJzIHdoZW4gdGhlIHBsYXllciBpcyBvcGVuaW5nIHRoZWlyIGludmVudG9yeVxuICAgICAgY2FzZSBJbnRlcmFjdEFjdGlvbi5PcGVuSW52ZW50b3J5OiB7XG4gICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0IGVudGl0eSBmcm9tIHRoZSBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgZW50aXR5ID0gZGltZW5zaW9uLmdldEVudGl0eShwYWNrZXQuYWN0b3JSdW50aW1lSWQsIHRydWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGEgaW52ZW50b3J5IHRyYWl0XG4gICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKVxuICAgICAgICAgIHJldHVybiBjb25zb2xlLmxvZyhcIkVudGl0eSBkb2VzIG5vdCBoYXZlIGFuIGludmVudG9yeSB0cmFpdFwiKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGludmVudG9yeSB0cmFpdCBmcm9tIHRoZSBlbnRpdHlcbiAgICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgICAgLy8gU2hvdyB0aGUgY29udGFpbmVyIHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5zaG93KHBsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEludGVyYWN0SGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIERhdGFQYWNrZXQsXG4gIFBhY2tldCxcbiAgUGxheVN0YXR1cyxcbiAgUGxheVN0YXR1c1BhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG5jbGFzcyBSZXNwYXduSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuUmVzcGF3bjtcblxuICBwdWJsaWMgaGFuZGxlKF9wYWNrZXQ6IERhdGFQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBieSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkucGxheWVycy5nZXQoY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5U3RhdHVzUGFja2V0XG4gICAgY29uc3Qgc3RhdHVzID0gbmV3IFBsYXlTdGF0dXNQYWNrZXQoKTtcbiAgICBzdGF0dXMuc3RhdHVzID0gUGxheVN0YXR1cy5QbGF5ZXJTcGF3bjtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgcGxheWVyLnNlbmRJbW1lZGlhdGUoc3RhdHVzKTtcblxuICAgIC8vIEdldCB0aGUgcGxheWVycyBoZWFsdGggdHJhaXRcbiAgICBjb25zdCBoZWFsdGggPSBwbGF5ZXIuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgLy8gU2V0IHRoZSBwbGF5ZXJzIGhlYWx0aCB0byB0aGUgbWF4IHZhbHVlXG4gICAgaGVhbHRoLmN1cnJlbnRWYWx1ZSA9IGhlYWx0aC5kZWZhdWx0VmFsdWU7XG5cbiAgICBwbGF5ZXIuc3Bhd24oKTtcbiAgfVxufVxuXG5leHBvcnQgeyBSZXNwYXduSGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIE1vZGFsRm9ybUNhbmNlbGVkUmVhc29uLFxuICBNb2RhbEZvcm1SZXNwb25zZVBhY2tldCxcbiAgUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuLi9mb3Jtc1wiO1xuXG5jbGFzcyBNb2RhbEZvcm1SZXNwb25zZUhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0Lk1vZGFsRm9ybVJlc3BvbnNlO1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBNb2RhbEZvcm1SZXNwb25zZVBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb24uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgcGVuZGluZyBmb3JtLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBGb3JtLnBlbmRpbmcuZ2V0KHBhY2tldC5pZCk7XG5cbiAgICAvLyBJZiB0aGUgZm9ybSBpcyBub3QgZm91bmQsIHRocm93IGFuIGVycm9yLlxuICAgIGlmICghcGVuZGluZylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBmb3JtIHdpdGggaWQgJHtwYWNrZXQuaWR9LCBicm9hZGNhc3RlZCB0byAke3BsYXllci51c2VybmFtZX1gXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBpbiB0aGUgcGVuZGluZyBmb3JtLlxuICAgIGNvbnN0IHBhcnRpY2lwYW50ID0gcGVuZGluZy5nZXQocGxheWVyLnVuaXF1ZUlkKTtcblxuICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgbm90IGZvdW5kLCB0aHJvdyBhbiBlcnJvci5cbiAgICBpZiAoIXBhcnRpY2lwYW50KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIHBhcnRpY2lwYW50IHdpdGggaWQgJHtwbGF5ZXIudW5pcXVlSWR9LCBicm9hZGNhc3RlZCB0byAke3BsYXllci51c2VybmFtZX1gXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZvcm0gd2FzIGNhbmNlbGxlZC5cbiAgICBpZiAocGFja2V0LmNhbmNlbGVkKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGZvcm0gd2l0aCBhbiBlcnJvci5cbiAgICAgIHBhcnRpY2lwYW50LnJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBGb3JtIHdhcyBjYW5jZWxlZCBieSB0aGUgcGxheWVyLiBSZWFzb246ICR7TW9kYWxGb3JtQ2FuY2VsZWRSZWFzb25bcGFja2V0LnJlYXNvbiBhcyBNb2RhbEZvcm1DYW5jZWxlZFJlYXNvbl19YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXJzZSB0aGUgZm9ybSByZXNwb25zZS5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShwYWNrZXQuZGF0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGZvcm0gd2l0aCB0aGUgcmVzcG9uc2UuXG4gICAgICBwYXJ0aWNpcGFudC5yZXN1bHQocmVzcG9uc2UsIG51bGwpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgcGFydGljaXBhbnQgZnJvbSB0aGUgcGVuZGluZyBmb3JtLlxuICAgIHBlbmRpbmcuZGVsZXRlKHBsYXllci51bmlxdWVJZCk7XG5cbiAgICAvLyBJZiB0aGUgcGVuZGluZyBmb3JtIGlzIGVtcHR5LCBkZWxldGUgaXQuXG4gICAgaWYgKHBlbmRpbmcuc2l6ZSA9PT0gMCkgRm9ybS5wZW5kaW5nLmRlbGV0ZShwYWNrZXQuaWQpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1vZGFsRm9ybVJlc3BvbnNlSGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIENsaWVudGJvdW5kQ2xvc2VGb3JtUGFja2V0LFxuICBNb2RhbEZvcm1SZXF1ZXN0UGFja2V0LFxuICBNb2RhbEZvcm1UeXBlLFxuICBTZXJ2ZXJTZXR0aW5nc1Jlc3BvbnNlUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbnR5cGUgRm9ybVJlc3VsdDxUPiA9IChyZXNwb25zZTogVCB8IG51bGwsIGVycm9yOiBFcnJvciB8IG51bGwpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBGb3JtUGFydGljaXBhbnQ8VD4ge1xuICBwbGF5ZXI6IFBsYXllcjtcbiAgcmVzdWx0OiBGb3JtUmVzdWx0PFQ+O1xufVxuXG5jbGFzcyBGb3JtPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBwZW5kaW5nIGZvcm1zIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBzdWJtaXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICBNYXA8YmlnaW50LCBGb3JtUGFydGljaXBhbnQ8bmV2ZXI+PlxuICA+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXh0IGZvcm0gaWQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBuZXcgZm9ybS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybUlkID0gMDtcblxuICAvKipcbiAgICogVGhlIGZvcm0gaWQgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZm9ybUlkID0gKytGb3JtLmZvcm1JZDtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlITogTW9kYWxGb3JtVHlwZTtcblxuICAvKipcbiAgICogU2hvd3MgdGhlIGZvcm0gdG8gYSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0byBzaG93IHRoZSBmb3JtIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgZm9ybSByZXNwb25zZTsgdGhlIHZhbHVlIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHNob3cocGxheWVyOiBQbGF5ZXIsIHJlc3VsdDogRm9ybVJlc3VsdDxUPik6IHRoaXMge1xuICAgIC8vIENoZWNrIGlmIHRoZSBmb3JtIGV4aXN0cyBpbiB0aGUgcGVuZGluZyBmb3Jtcy5cbiAgICAvLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IG1hcC5cbiAgICBpZiAoIUZvcm0ucGVuZGluZy5oYXModGhpcy5mb3JtSWQpKVxuICAgICAgRm9ybS5wZW5kaW5nLnNldCh0aGlzLmZvcm1JZCwgbmV3IE1hcCgpKTtcblxuICAgIC8vIEdldCB0aGUgcGVuZGluZyBmb3JtcyBtYXAuXG4gICAgY29uc3QgcGVuZGluZyA9IEZvcm0ucGVuZGluZy5nZXQodGhpcy5mb3JtSWQpO1xuXG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHBlbmRpbmcgbWFwIGV4aXN0cy5cbiAgICBpZiAoIXBlbmRpbmcpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gR2V0IHRoZSBmb3JtIHBheWxvYWQgZnJvbSB0aGUgY2xhc3MuXG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IE1vZGFsRm9ybVJlcXVlc3RQYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IE1vZGFsRm9ybVJlcXVlc3RQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgcGFja2V0LlxuICAgIHBhY2tldC5pZCA9IHRoaXMuZm9ybUlkO1xuICAgIHBhY2tldC5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyLlxuICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAvLyBBZGQgdGhlIHBsYXllciB0byB0aGUgcGVuZGluZyBmb3JtcyBtYXAuXG4gICAgcGVuZGluZy5zZXQocGxheWVyLnVuaXF1ZUlkLCB7IHBsYXllciwgcmVzdWx0IH0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBmb3JtLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZm9ybSBmb3IgYSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0byBjbG9zZSB0aGUgZm9ybSBmb3IuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQ2xpZW50Ym91bmRDbG9zZUZvcm1QYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgQ2xpZW50Ym91bmRDbG9zZUZvcm1QYWNrZXQoKTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyLlxuICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBmb3JtIGhhcyBhIHBlbmRpbmcgcmVzcG9uc2VcbiAgICBpZiAoIUZvcm0ucGVuZGluZy5oYXModGhpcy5mb3JtSWQpKSByZXR1cm47XG5cbiAgICAvLyBHZXQgdGhlIHBlbmRpbmcgcmVzcG9uc2VzXG4gICAgY29uc3QgcGVuZGluZyA9IEZvcm0ucGVuZGluZy5nZXQodGhpcy5mb3JtSWQpO1xuXG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHBlbmRpbmcgcmVzcG9uc2VzIGV4aXN0XG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgU2VydmVyU2V0dGluZ3NSZXNwb25zZVBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXJ2ZXJTZXR0aW5nc1Jlc3BvbnNlUGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXMgdG8gdGhlIHBhY2tldFxuICAgIHBhY2tldC5mb3JtSWQgPSB0aGlzLmZvcm1JZDtcbiAgICBwYWNrZXQucGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJzXG4gICAgZm9yIChjb25zdCB7IHBsYXllciB9IG9mIHBlbmRpbmcudmFsdWVzKCkpIHBsYXllci5zZW5kKHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ybSB9O1xuIiwgImltcG9ydCB7IE1vZGFsRm9ybVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuL2Zvcm1cIjtcblxuY2xhc3MgTWVzc2FnZUZvcm0gZXh0ZW5kcyBGb3JtPGJvb2xlYW4+IHtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBNb2RhbEZvcm1UeXBlLk1lc3NhZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyB0aXRsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgY29udGVudCE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRleHQgb2YgdGhlIGZpcnN0IGJ1dHRvbi5cbiAgICovXG4gIHB1YmxpYyBidXR0b24xITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgc2Vjb25kIGJ1dHRvbi5cbiAgICovXG4gIHB1YmxpYyBidXR0b24yITogc3RyaW5nO1xufVxuXG5leHBvcnQgeyBNZXNzYWdlRm9ybSB9O1xuIiwgImltcG9ydCB7IE1vZGFsRm9ybVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuL2Zvcm1cIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltYWdlIHRoYXQgY2FuIGJlIHNob3duIG9uIGFuIGFjdGlvbiBmb3JtIGJ1dHRvbi5cbiAqL1xuaW50ZXJmYWNlIEFjdGlvbkZvcm1JbWFnZSB7XG4gIGRhdGE6IHN0cmluZztcbiAgdHlwZTogXCJwYXRoXCIgfCBcInVybFwiO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBidXR0b24gdGhhdCBjYW4gYmUgc2hvd24gb24gYW4gYWN0aW9uIGZvcm0uXG4gKi9cbmludGVyZmFjZSBBY3Rpb25Gb3JtQnV0dG9uIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpbWFnZT86IEFjdGlvbkZvcm1JbWFnZTtcbn1cblxuLyoqXG4gKiBUaGVzZSBmb3JtcyBhbHNvIGNvbnRhaW4gYSB0aXRsZSBhbmQgYSBjb250ZXh0IGFyZWEsIGJ1dCBkZXZlbG9wZXJzIGNhbiBhZGQgYXMgbWFueSBidXR0b25zIGFzIHRoZXkgc28gZGVzaXJlLiBUaGVzZSBidXR0b25zIGNhbiBhbHNvIGhhdmUgdGV4dHVyZXMgdGhhdCBpbmNsdWRlIGVpdGhlciBhIHJlc291cmNlIHBhdGgsIG9yIGEgdXJsIHBhdGguXG4gKlxuICogKipFeGFtcGxlIFVzYWdlKipcblx0YGBgdHNcblx0aW1wb3J0IHsgQWN0aW9uRm9ybSB9IGZyb20gXCJAc2VyZW5pdHlqcy9zZXJ2ZXItdWlcIlxuXHRcblx0Ly8gQ3JlYXRlIGEgbmV3IEFjdGlvbkZvcm0gaW5zdGFuY2UgYW5kIHNldCB0aGUgdGl0bGUsIGNvbnRlbnQsIGFuZCBhZGQgYnV0dG9uc1xuXHRjb25zdCBmb3JtID0gbmV3IEFjdGlvbkZvcm0oKVxuXHRmb3JtLnRpdGxlID0gXCJBY3Rpb25Gb3JtIEV4YW1wbGVcIlxuXHRmb3JtLmNvbnRlbnQgPSBcIlRoaXMgaXMgYSBleGFtcGxlIG9mIGEgYWN0aW9uIGZvcm0uIFRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXNzYWdlIGZvcm0uXCJcblx0XG5cdC8vIEJ1dHRvbiB3aXRoIG5vIGFkZGl0aW9uYWwgZGF0YVxuXHRmb3JtLmJ1dHRvbihcIkJ1dHRvbiAxXCIpXG5cdFxuXHQvLyBCdXR0b24gd2l0aCBhIHRleHR1cmUgcGF0aFxuXHRmb3JtLmJ1dHRvbihcIkJ1dHRvbiAyXCIsIHtcblx0ICB0eXBlOiBcInBhdGhcIixcblx0ICBkYXRhOiBcInRleHR1cmVzL2l0ZW1zL2FwcGxlXCJcblx0fSlcblx0XG5cdC8vIEJ1dHRvbSB3aXRoIGEgdXJsIHBhdGhcblx0Zm9ybS5idXR0b24oXCJCdXR0b24gM1wiLCB7XG5cdCAgdHlwZTogXCJ1cmxcIixcblx0ICBkYXRhOiBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9TZXJlbml0eUpTL3NlcmVuaXR5L2RldmVsb3AvcHVibGljL3NlcmVuaXR5anMtbG9nby5wbmdcIlxuXHR9KVxuXHRcblx0Ly8gU2hvdyB0aGUgZm9ybSB0byB0aGUgcGxheWVyXG5cdGZvcm0uc2hvdyhwbGF5ZXIpXG5cdCAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7fSlcblx0ICAuY2F0Y2goKHJlamVjdGVkKSA9PiB7fSlcblx0YGBgXG4gKi9cbmNsYXNzIEFjdGlvbkZvcm0gZXh0ZW5kcyBGb3JtPG51bWJlcj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IE1vZGFsRm9ybVR5cGUuQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdGl0bGUgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgdGl0bGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIGNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBidXR0b25zIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1dHRvbnM6IEFycmF5PEFjdGlvbkZvcm1CdXR0b24+ID0gW107XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBidXR0b24gdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgYnV0dG9uKHRleHQ6IHN0cmluZywgaW1hZ2U/OiBBY3Rpb25Gb3JtSW1hZ2UpOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSBidXR0b24gdG8gdGhlIGJ1dHRvbnMgYXJyYXlcbiAgICB0aGlzLmJ1dHRvbnMucHVzaCh7IHRleHQsIGltYWdlIH0pO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2VcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBBY3Rpb25Gb3JtLCBBY3Rpb25Gb3JtQnV0dG9uLCBBY3Rpb25Gb3JtSW1hZ2UgfTtcbiIsICJpbXBvcnQgeyBNb2RhbEZvcm1UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEZvcm0gfSBmcm9tIFwiLi9mb3JtXCI7XG5cbi8qKlxuICogVGhlc2UgZm9ybXMgYXJlIHRoZSBtdXN0IGFkdmFuY2VkIHR5cGUgb2YgZm9ybS4gVGhlc2UgYWxsb3cgZGV2ZWxvcGVycyB0byBhZGQgZWxlbWVudHMgdG8gcmVxdWVzdCBpbnB1dCBmcm9tIHRoZSBwbGF5ZXIsIHJhdGhlciB0aGFuIHVzaW5nIGJ1dHRvbnMuIFRoZSBlbGVtZW50cyB1c2VkIGluIE1vZGFsRm9ybXMgYXJlOiBkcm9wZG93biwgaW5wdXQsIGxhYmVsLCBzbGlkZXIsIHN0ZXBTbGlkZXIsIGFuZCB0b2dnbGUuXG4gKlxuICogKipFeGFtcGxlIFVzYWdlKipcblx0YGBgdHNcblx0aW1wb3J0IHsgTW9kYWxGb3JtIH0gZnJvbSBcIkBzZXJlbml0eWpzL3NlcnZlci11aVwiXG5cdFxuXHQvLyBDcmVhdGUgYSBuZXcgTW9kYWxGb3JtIGluc3RhbmNlIGFuZCBzZXQgdGhlIHRpdGxlIGFuZCBhZGQgZWxlbWVudHNcblx0Y29uc3QgZm9ybSA9IG5ldyBNb2RhbEZvcm0oKVxuXHRmb3JtLnRpdGxlID0gXCJNb2RhbEZvcm0gRXhhbXBsZVwiXG5cdFxuXHQvLyBBIGRyb3Bkb3duIGFsbG93cyB0aGUgcGxheWVyIHRvIHNlbGVjdCBmcm9tIGEgbGlzdCBvZiBvcHRpb25zXG5cdGZvcm0uZHJvcGRvd24oXCJEcm9wZG93biBFbGVtZW50XCIsIFtcIk9wdGlvbiAxXCIsIFwiT3B0aW9uIDJcIiwgXCJPcHRpb24gM1wiXSwgMSlcblx0XG5cdC8vIEFuIGlucHV0IGFsbG93cyB0aGUgcGxheWVyIHRvIGVudGVyIHRleHRcblx0Zm9ybS5pbnB1dChcIklucHV0IEVsZW1lbnRcIiwgXCJJbnB1dCBQbGFjZWhvbGRlclwiLCBcIklucHV0IFRleHRcIilcblx0XG5cdC8vIEEgc2xpZGVyIGFsbG93cyB0aGUgcGxheWVyIHRvIHNlbGVjdCBhIHZhbHVlIHdpdGhpbiBhIHJhbmdlXG5cdGZvcm0uc2xpZGVyKFwiU2xpZGVyIEVsZW1lbnRcIiwgMCwgMTAwLCAxMClcblx0XG5cdC8vIEEgc3RlcCBzbGlkZXIgYWxsb3dzIHRoZSBwbGF5ZXIgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIGxpc3Qgb2Ygb3B0aW9uc1xuXHRmb3JtLnN0ZXBTbGlkZXIoXCJTdGVwIFNsaWRlciBFbGVtZW50XCIsIFtcIlN0ZXAgMVwiLCBcIlN0ZXAgMlwiLCBcIlN0ZXAgM1wiXSwgMSlcblx0XG5cdC8vIEEgdG9nZ2xlIGFsbG93cyB0aGUgcGxheWVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIGFuIG9wdGlvblxuXHRmb3JtLnRvZ2dsZShcIlRvZ2dsZSBFbGVtZW50XCIsIHRydWUpXG5cdFxuXHQvLyBBIGxhYmVsIGRpc3BsYXlzIHRleHQgdG8gdGhlIHBsYXllclxuXHRmb3JtLmxhYmVsKFwiTGFiZWwgRWxlbWVudFwiLCBcIkxhYmVsIFRleHRcIilcblx0XG5cdC8vIFNob3cgdGhlIGZvcm0gdG8gdGhlIHBsYXllclxuXHRmb3JtLnNob3cocGxheWVyKVxuXHQgIC50aGVuKChyZXNwb25zZSkgPT4ge30pXG5cdCAgLmNhdGNoKChyZWplY3RlZCkgPT4ge30pXG5cdGBgYFxuICovXG5jbGFzcyBNb2RhbEZvcm08VCA9IHVua25vd24+IGV4dGVuZHMgRm9ybTxBcnJheTxUPj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IE1vZGFsRm9ybVR5cGUuTW9kYWw7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyB0aXRsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGVudDogQXJyYXk8dW5rbm93bj4gPSBbXTtcblxuICAvKipcbiAgICogQWRkcyBhIGRyb3Bkb3duIG1lbnUgdG8gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBkcm9wZG93biBtZW51XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93biBtZW51XG4gICAqIEBwYXJhbSBkZWZhdWx0SW5kZXggVGhlIGRlZmF1bHQgaW5kZXggb2YgdGhlIGRyb3Bkb3duIG1lbnVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBkcm9wZG93bihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgb3B0aW9uczogQXJyYXk8c3RyaW5nPixcbiAgICBkZWZhdWx0SW5kZXggPSAwXG4gICk6IHRoaXMge1xuICAgIHRoaXMuY29udGVudC5wdXNoKHtcbiAgICAgIHR5cGU6IFwiZHJvcGRvd25cIixcbiAgICAgIHRleHQsXG4gICAgICBvcHRpb25zLFxuICAgICAgZGVmYXVsdDogZGVmYXVsdEluZGV4XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGV4dCBpbnB1dCB0byB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIGlucHV0XG4gICAqIEBwYXJhbSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgb2YgdGhlIGlucHV0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgaW5wdXQodGV4dDogc3RyaW5nLCBwbGFjZWhvbGRlciA9IFwiXCIsIGRlZmF1bHRUZXh0ID0gU3RyaW5nKCkpOiB0aGlzIHtcbiAgICB0aGlzLmNvbnRlbnQucHVzaCh7XG4gICAgICB0eXBlOiBcImlucHV0XCIsXG4gICAgICB0ZXh0LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBkZWZhdWx0OiBkZWZhdWx0VGV4dFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGxhYmVsIHRvIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWxcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBsYWJlbCh0ZXh0OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmNvbnRlbnQucHVzaCh7IHR5cGU6IFwibGFiZWxcIiwgdGV4dCB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzbGlkZXIgdG8gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBzbGlkZXJcbiAgICogQHBhcmFtIG1pbiBUaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgc2xpZGVyXG4gICAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHNsaWRlclxuICAgKiBAcGFyYW0gc3RlcCBUaGUgc3RlcCBvZiB0aGUgc2xpZGVyXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNsaWRlclxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHNsaWRlcihcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgbWluOiBudW1iZXIsXG4gICAgbWF4OiBudW1iZXIsXG4gICAgc3RlcCA9IDEsXG4gICAgZGVmYXVsdFZhbHVlID0gbWluXG4gICk6IHRoaXMge1xuICAgIHRoaXMuY29udGVudC5wdXNoKHtcbiAgICAgIHR5cGU6IFwic2xpZGVyXCIsXG4gICAgICB0ZXh0LFxuICAgICAgbWluLFxuICAgICAgbWF4LFxuICAgICAgc3RlcCxcbiAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0ZXAgc2xpZGVyIHRvIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgc3RlcCBzbGlkZXJcbiAgICogQHBhcmFtIHN0ZXBzIFRoZSBzdGVwcyBvZiB0aGUgc3RlcCBzbGlkZXJcbiAgICogQHBhcmFtIGRlZmF1bHRJbmRleCBUaGUgZGVmYXVsdCBpbmRleCBvZiB0aGUgc3RlcCBzbGlkZXJcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGVwU2xpZGVyKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBzdGVwczogQXJyYXk8c3RyaW5nPixcbiAgICBkZWZhdWx0SW5kZXggPSAwXG4gICk6IHRoaXMge1xuICAgIHRoaXMuY29udGVudC5wdXNoKHtcbiAgICAgIHR5cGU6IFwic3RlcF9zbGlkZXJcIixcbiAgICAgIHRleHQsXG4gICAgICBzdGVwcyxcbiAgICAgIGRlZmF1bHQ6IGRlZmF1bHRJbmRleFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRvZ2dsZSBzd2l0Y2ggdG8gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSB0b2dnbGVcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdG9nZ2xlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKHRleHQ6IHN0cmluZywgZGVmYXVsdFZhbHVlID0gZmFsc2UpOiB0aGlzIHtcbiAgICB0aGlzLmNvbnRlbnQucHVzaCh7IHR5cGU6IFwidG9nZ2xlXCIsIHRleHQsIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IE1vZGFsRm9ybSB9O1xuIiwgImltcG9ydCB7XG4gIFJlcXVlc3RQZXJtaXNzaW9uc1BhY2tldCxcbiAgUGFja2V0LFxuICBQZXJtaXNzaW9uRmxhZyxcbiAgQWJpbGl0eUluZGV4XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuXG5jbGFzcyBSZXF1ZXN0UGVybWlzc2lvbnNIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5SZXF1ZXN0UGVybWlzc2lvbnM7XG5cbiAgcHVibGljIGhhbmRsZShcbiAgICBwYWNrZXQ6IFJlcXVlc3RQZXJtaXNzaW9uc1BhY2tldCxcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gR2V0IHRoZSB0YXJnZXQgcGxheWVyIGZyb20gdGhlIGFjdG9yIHVuaXF1ZSBJRFxuICAgIGNvbnN0IHRhcmdldCA9IHBsYXllci5kaW1lbnNpb24uZ2V0RW50aXR5KHBhY2tldC5hY3RvclVuaXF1ZUlkKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgcGxheWVyIGV4aXN0cywgYW5kIGlzIGEgcGxheWVyXG4gICAgaWYgKCF0YXJnZXQgfHwgIXRhcmdldC5pc1BsYXllcigpKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhcmdldCBwbGF5ZXJcIik7XG5cbiAgICAvLyBHZXQgdGhlIHBlcm1pc3Npb24gZmxhZ3NcbiAgICBjb25zdCBjYW5CdWlsZCA9IHBhY2tldC5nZXRGbGFnKFBlcm1pc3Npb25GbGFnLkJ1aWxkKTtcbiAgICBjb25zdCBjYW5NaW5lID0gcGFja2V0LmdldEZsYWcoUGVybWlzc2lvbkZsYWcuTWluZSk7XG4gICAgY29uc3QgY2FuVXNlRG5TID0gcGFja2V0LmdldEZsYWcoUGVybWlzc2lvbkZsYWcuRG9vcnNBbmRTd2l0Y2hlcyk7XG4gICAgY29uc3QgY2FuT3BlbkNvbnRhaW5lcnMgPSBwYWNrZXQuZ2V0RmxhZyhQZXJtaXNzaW9uRmxhZy5PcGVuQ29udGFpbmVycyk7XG4gICAgY29uc3QgY2FuQXR0YWNrUGxheWVycyA9IHBhY2tldC5nZXRGbGFnKFBlcm1pc3Npb25GbGFnLkF0dGFja1BsYXllcnMpO1xuICAgIGNvbnN0IGNhbkF0dGFja01vYnMgPSBwYWNrZXQuZ2V0RmxhZyhQZXJtaXNzaW9uRmxhZy5BdHRhY2tNb2JzKTtcbiAgICBjb25zdCBjYW5Vc2VPQyA9IHBhY2tldC5nZXRGbGFnKFBlcm1pc3Npb25GbGFnLk9wZXJhdG9yQ29tbWFuZHMpO1xuICAgIGNvbnN0IGNhblRlbGVwb3J0ID0gcGFja2V0LmdldEZsYWcoUGVybWlzc2lvbkZsYWcuVGVsZXBvcnQpO1xuXG4gICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9uIGZsYWdzIGZvciB0aGUgdGFyZ2V0IHBsYXllclxuICAgIHRhcmdldC5hYmlsaXRpZXMuc3VwZXJTZXQoQWJpbGl0eUluZGV4LkJ1aWxkLCBjYW5CdWlsZCk7XG4gICAgdGFyZ2V0LmFiaWxpdGllcy5zdXBlclNldChBYmlsaXR5SW5kZXguTWluZSwgY2FuTWluZSk7XG4gICAgdGFyZ2V0LmFiaWxpdGllcy5zdXBlclNldChBYmlsaXR5SW5kZXguRG9vcnNBbmRTd2l0Y2hlcywgY2FuVXNlRG5TKTtcbiAgICB0YXJnZXQuYWJpbGl0aWVzLnN1cGVyU2V0KEFiaWxpdHlJbmRleC5PcGVuQ29udGFpbmVycywgY2FuT3BlbkNvbnRhaW5lcnMpO1xuICAgIHRhcmdldC5hYmlsaXRpZXMuc3VwZXJTZXQoQWJpbGl0eUluZGV4LkF0dGFja1BsYXllcnMsIGNhbkF0dGFja1BsYXllcnMpO1xuICAgIHRhcmdldC5hYmlsaXRpZXMuc3VwZXJTZXQoQWJpbGl0eUluZGV4LkF0dGFja01vYnMsIGNhbkF0dGFja01vYnMpO1xuICAgIHRhcmdldC5hYmlsaXRpZXMuc3VwZXJTZXQoQWJpbGl0eUluZGV4Lk9wZXJhdG9yQ29tbWFuZHMsIGNhblVzZU9DKTtcbiAgICB0YXJnZXQuYWJpbGl0aWVzLnN1cGVyU2V0KEFiaWxpdHlJbmRleC5UZWxlcG9ydCwgY2FuVGVsZXBvcnQpO1xuXG4gICAgLy8gU2VuZCB0aGUgYWJpbGl0aWVzIHRvIHRoZSB0YXJnZXQgcGxheWVyXG4gICAgdGFyZ2V0LmFiaWxpdGllcy51cGRhdGUoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBSZXF1ZXN0UGVybWlzc2lvbnNIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHsgQmxvY2tQaWNrUmVxdWVzdFBhY2tldCwgR2FtZW1vZGUsIFBhY2tldCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgRW50aXR5SW52ZW50b3J5VHJhaXQgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbmNsYXNzIEJsb2NrUGlja1JlcXVlc3RIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5CbG9ja1BpY2tSZXF1ZXN0O1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBCbG9ja1BpY2tSZXF1ZXN0UGFja2V0LCBjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGZyb20gdGhlIHBhY2tldFxuICAgIGNvbnN0IHsgeCwgeSwgeiwgYWRkRGF0YSB9ID0gcGFja2V0O1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBkaW1lbnNpb25cbiAgICBjb25zdCBkaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uO1xuXG4gICAgLy8gR2V0IHRoZSBibG9jayBhdCB0aGUgcG9zaXRpb24gcHJvdmlkZWQgYnkgdGhlIHBhY2tldFxuICAgIGNvbnN0IGJsb2NrID0gZGltZW5zaW9uLmdldEJsb2NrKHsgeCwgeSwgeiB9KTtcblxuICAgIC8vIENhbGwgdGhlIG9uUGljayB0cmFpdCBtZXRob2RzIG9mIHRoZSBibG9ja1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgYmxvY2sudHJhaXRzLnZhbHVlcygpKSB0cmFpdC5vblBpY2s/LihwbGF5ZXIsIGFkZERhdGEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBpbiBjcmVhdGl2ZSBtb2RlXG4gICAgaWYgKHBsYXllci5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuQ3JlYXRpdmUpIHJldHVybjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBpdGVtIHN0YWNrIGZyb20gdGhlIGJsb2NrXG4gICAgY29uc3QgaXRlbVN0YWNrID0gYmxvY2suZ2V0SXRlbVN0YWNrKHtcbiAgICAgIGFtb3VudDogMSxcbiAgICAgIGF1eGlsbGFyeTogYWRkRGF0YSA/IGJsb2NrLnBlcm11dGF0aW9uLmluZGV4IDogMFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgYmxvY2sgZGF0YSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGl0ZW0gc3RhY2tcbiAgICBpZiAoYWRkRGF0YSkge1xuICAgICAgLy8gR2V0IHRoZSBkYXRhIGVudHJ5IG9mIHRoZSBibG9ja1xuICAgICAgY29uc3QgZW50cnkgPSBibG9jay5nZXREYXRhRW50cnkoKTtcblxuICAgICAgLy8gQWRkIHRoZSBlbnRyeSB0byB0aGUgaXRlbSBzdGFjayBjb21wb25lbnRzXG4gICAgICBpdGVtU3RhY2suY29tcG9uZW50cy5zZXQoXCJibG9ja19kYXRhXCIsIGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGludmVudG9yeSBjb250YWluZXJcbiAgICBjb25zdCB7IGNvbnRhaW5lciwgc2VsZWN0ZWRTbG90IH0gPSBwbGF5ZXIuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgLy8gQWRkIHRoZSBpdGVtIHN0YWNrIHRvIHRoZSBwbGF5ZXIncyBpbnZlbnRvcnlcbiAgICBjb250YWluZXIuc2V0SXRlbShzZWxlY3RlZFNsb3QsIGl0ZW1TdGFjayk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tQaWNrUmVxdWVzdEhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBBY3RvckZsYWcsIEVtb3RlUGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IFBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbCwgUGxheWVyU3RvcEVtb3RpbmdTaWduYWwgfSBmcm9tIFwiLi4vZXZlbnRzXCI7XG5cbmNsYXNzIEVtb3RlSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuRW1vdGU7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IEVtb3RlUGFja2V0LCBjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiB0aGUgcGxheWVyXG4gICAgY29uc3QgZGltZW5zaW9uID0gcGxheWVyLmRpbWVuc2lvbjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJTdGFydEVtb3RpbmdTaWduYWxcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVyU3RhcnRFbW90aW5nU2lnbmFsKFxuICAgICAgcGxheWVyLFxuICAgICAgcGFja2V0LmVtb3RlSWQsXG4gICAgICBwYWNrZXQudGlja0xlbmd0aFxuICAgICkuZW1pdCgpO1xuXG4gICAgLy8gUmV0dXJuIGlmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZFxuICAgIGlmICghc2lnbmFsKSByZXR1cm47XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIGVtb3RlIGZsYWdcbiAgICBwbGF5ZXIuZmxhZ3Muc2V0KEFjdG9yRmxhZy5FbW90aW5nLCB0cnVlKTtcblxuICAgIC8vIFNjaGVkdWxlIHRoZSBlbW90ZSB0byBzdG9wIGFmdGVyIHRoZSB0aWNrIGxlbmd0aFxuICAgIGRpbWVuc2lvbi5zY2hlZHVsZShwYWNrZXQudGlja0xlbmd0aCkub24oKCkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllclN0b3BFbW90aW5nU2lnbmFsXG4gICAgICBuZXcgUGxheWVyU3RvcEVtb3RpbmdTaWduYWwocGxheWVyLCBwYWNrZXQuZW1vdGVJZCkuZW1pdCgpO1xuXG4gICAgICAvLyBDbGVhciB0aGUgcGxheWVyJ3MgZW1vdGUgZmxhZ1xuICAgICAgcGxheWVyLmZsYWdzLnNldChBY3RvckZsYWcuRW1vdGluZywgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBlbW90ZSB0byBhbGwgcGxheWVycyBpbiB0aGUgZGltZW5zaW9uXG4gICAgZGltZW5zaW9uLmJyb2FkY2FzdEV4Y2VwdChwbGF5ZXIsIHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW1vdGVIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHsgQW5pbWF0ZUhhbmRsZXIgfSBmcm9tIFwiLi9hbmltYXRlXCI7XG5pbXBvcnQgeyBDb250YWluZXJDbG9zZUhhbmRsZXIgfSBmcm9tIFwiLi9jb250YWluZXItY2xvc2VcIjtcbmltcG9ydCB7IERpc2Nvbm5lY3RIYW5kbGVyIH0gZnJvbSBcIi4vZGlzY29ubmVjdFwiO1xuaW1wb3J0IHsgSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4vaW52ZW50b3J5LXRyYW5zYWN0aW9uXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2tSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuL2l0ZW0tc3RhY2stcmVxdWVzdFwiO1xuaW1wb3J0IHsgTG9naW5IYW5kbGVyIH0gZnJvbSBcIi4vbG9naW5cIjtcbmltcG9ydCB7IE1vYkVxdWlwbWVudEhhbmRsZXIgfSBmcm9tIFwiLi9tb2ItZXF1aXBtZW50XCI7XG5pbXBvcnQgeyBQbGF5ZXJBY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4vcGxheWVyLWFjdGlvblwiO1xuaW1wb3J0IHsgUGxheWVyQXV0aElucHV0SGFuZGxlciB9IGZyb20gXCIuL3BsYXllci1hdXRoLWlucHV0XCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q2h1bmtSYWRpdXNIYW5kbGVyIH0gZnJvbSBcIi4vcmVxdWVzdC1jaHVuay1yYWRpdXNcIjtcbmltcG9ydCB7IFJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyIH0gZnJvbSBcIi4vcmVxdWVzdC1uZXR3b3JrLXNldHRpbmdzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZUhhbmRsZXIgfSBmcm9tIFwiLi9yZXNvdXJjZS1wYWNrLXJlc3BvbnNlXCI7XG5pbXBvcnQgeyBTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRIYW5kbGVyIH0gZnJvbSBcIi4vc2V0LWxvY2FsLXBsYXllci1hcy1pbml0aWFsaXplZFwiO1xuaW1wb3J0IHsgVGV4dEhhbmRsZXIgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBDb21tYW5kUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiLi9jb21tYW5kLXJlcXVlc3RcIjtcbmltcG9ydCB7IEludGVyYWN0SGFuZGxlciB9IGZyb20gXCIuL2ludGVyYWN0XCI7XG5pbXBvcnQgeyBSZXNwYXduSGFuZGxlciB9IGZyb20gXCIuL3Jlc3Bhd25cIjtcbmltcG9ydCB7IE1vZGFsRm9ybVJlc3BvbnNlSGFuZGxlciB9IGZyb20gXCIuL21vZGFsLWZvcm0tcmVzcG9uc2VcIjtcbmltcG9ydCB7IFJlcXVlc3RQZXJtaXNzaW9uc0hhbmRsZXIgfSBmcm9tIFwiLi9yZXF1ZXN0LXBlcm1pc3Npb25zXCI7XG5pbXBvcnQgeyBCbG9ja1BpY2tSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuL2Jsb2NrLXBpY2stcmVxdWVzdFwiO1xuaW1wb3J0IHsgRW1vdGVIYW5kbGVyIH0gZnJvbSBcIi4vZW1vdGVcIjtcblxuY29uc3QgSGFuZGxlcnMgPSBbXG4gIFJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyLFxuICBMb2dpbkhhbmRsZXIsXG4gIFJlc291cmNlUGFja0NsaWVudFJlc3BvbnNlSGFuZGxlcixcbiAgUGxheWVyQXV0aElucHV0SGFuZGxlcixcbiAgU2V0TG9jYWxQbGF5ZXJBc0luaXRpYWxpemVkSGFuZGxlcixcbiAgRGlzY29ubmVjdEhhbmRsZXIsXG4gIENvbnRhaW5lckNsb3NlSGFuZGxlcixcbiAgTW9iRXF1aXBtZW50SGFuZGxlcixcbiAgSXRlbVN0YWNrUmVxdWVzdEhhbmRsZXIsXG4gIFJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIsXG4gIEFuaW1hdGVIYW5kbGVyLFxuICBJbnZlbnRvcnlUcmFuc2FjdGlvbkhhbmRsZXIsXG4gIFBsYXllckFjdGlvbkhhbmRsZXIsXG4gIFRleHRIYW5kbGVyLFxuICBDb21tYW5kUmVxdWVzdEhhbmRsZXIsXG4gIEludGVyYWN0SGFuZGxlcixcbiAgUmVzcGF3bkhhbmRsZXIsXG4gIE1vZGFsRm9ybVJlc3BvbnNlSGFuZGxlcixcbiAgUmVxdWVzdFBlcm1pc3Npb25zSGFuZGxlcixcbiAgQmxvY2tQaWNrUmVxdWVzdEhhbmRsZXIsXG4gIEVtb3RlSGFuZGxlclxuXTtcblxuZXhwb3J0IHsgSGFuZGxlcnMgfTtcbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRW50cnkge1xuICB1dWlkOiBzdHJpbmc7XG4gIGxldmVsOiBQZXJtaXNzaW9uTGV2ZWw7XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uUHJvcGVydGllcyB7XG4gIHBhdGg6IHN0cmluZyB8IG51bGw7XG4gIHBlcm1pc3Npb25zOiBBcnJheTxQZXJtaXNzaW9uRW50cnk+O1xufVxuXG5jb25zdCBEZWZhdWx0UGVybWlzc2lvblByb3BlcnRpZXM6IFBlcm1pc3Npb25Qcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBudWxsLFxuICBwZXJtaXNzaW9uczogW11cbn07XG5cbmNsYXNzIFBlcm1pc3Npb25zIGV4dGVuZHMgTWFwPHN0cmluZywgUGVybWlzc2lvbkxldmVsPiB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwZXJtaXNzaW9ucyBmaWxlOyBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwZXJtaXNzaW9ucyBtYXAuXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIHBlcm1pc3Npb25zIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHBlcm1pc3Npb25zOiBQYXJ0aWFsPFBlcm1pc3Npb25Qcm9wZXJ0aWVzPlxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIFNwcmVhZCB0aGUgcHJvcGVydGllc1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5EZWZhdWx0UGVybWlzc2lvblByb3BlcnRpZXMsIC4uLnBlcm1pc3Npb25zIH07XG5cbiAgICAvLyBBc3NpZ24gdGhlIHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHByb3BzLnBlcm1pc3Npb25zKSB7XG4gICAgICB0aGlzLnNldChwZXJtaXNzaW9uLnV1aWQsIHBlcm1pc3Npb24ubGV2ZWwpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgcGF0aCBpZiBpdCBleGlzdHNcbiAgICBpZiAocHJvcHMucGF0aCkgdGhpcy5wYXRoID0gcHJvcHMucGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBQZXJtaXNzaW9uTGV2ZWwge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGdldCBtZXRob2RcbiAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSkgPz8gUGVybWlzc2lvbkxldmVsLk1lbWJlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBQZXJtaXNzaW9uTGV2ZWwpOiB0aGlzIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXQgbWV0aG9kXG4gICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgLy8gU2F2ZSB0aGUgcGVybWlzc2lvbnMgdG8gdGhlIGZpbGVcbiAgICBpZiAodGhpcy5wYXRoKSB7XG4gICAgICAvLyBNYXAgdGhlIHBlcm1pc3Npb25zXG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzKCkpLm1hcCgoW3V1aWQsIGxldmVsXSkgPT4gKHtcbiAgICAgICAgdXVpZCxcbiAgICAgICAgbGV2ZWxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIHBlcm1pc3Npb25zIHRvIHRoZSBmaWxlXG4gICAgICB3cml0ZUZpbGVTeW5jKHRoaXMucGF0aCwgSlNPTi5zdHJpbmdpZnkocGVybWlzc2lvbnMsIG51bGwsIDIpKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIG1hcFxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwZXJtaXNzaW9ucyBtYXAgZnJvbSBhIHBhdGguXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIHBlcm1pc3Npb25zIGZpbGUuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21QYXRoKHNlcmVuaXR5OiBTZXJlbml0eSwgcGF0aDogc3RyaW5nKTogUGVybWlzc2lvbnMge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgpKSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBlcm1pc3Npb25zLmpzb24gZmlsZVxuICAgICAgd3JpdGVGaWxlU3luYyhyZXNvbHZlKHBhdGgpLCBKU09OLnN0cmluZ2lmeShbXSkpO1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHBlcm1pc3Npb25zIGZpbGVcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IEpTT04ucGFyc2UoXG4gICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoKSwgXCJ1dGYtOFwiKVxuICAgICkgYXMgQXJyYXk8UGVybWlzc2lvbkVudHJ5PjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBwZXJtaXNzaW9ucyBtYXBcbiAgICBjb25zdCBtYXAgPSBuZXcgUGVybWlzc2lvbnMoc2VyZW5pdHksIHsgcGF0aCwgcGVybWlzc2lvbnMgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG1hcFxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGVybWlzc2lvbnMsIFBlcm1pc3Npb25FbnRyeSB9O1xuIiwgImltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5pbXBvcnQgeyBMb290RW50cnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY2xhc3MgTG9vdFBvb2wge1xuICBwcml2YXRlIGVudHJpZXM6IEFycmF5PExvb3RFbnRyeT4gPSBbXTtcbiAgcHVibGljIHJvbGxzOiBudW1iZXIgPSAxO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRyaWVzOiBBcnJheTxMb290RW50cnk+LCByb2xsczogbnVtYmVyKSB7XG4gICAgdGhpcy5lbnRyaWVzID0gZW50cmllcztcbiAgICB0aGlzLnJvbGxzID0gcm9sbHM7XG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgdGhlIHBvb2wgdG8gZ2V0IHRoZSBsb290IGl0ZW1zLlxuICAgKiBAcmV0dXJucyBUaGUgbG9vdCBpdGVtcyBmcm9tIHRoZSBwb29sIHJvbGwuXG4gICAqL1xuICBwdWJsaWMgcm9sbCgpOiBBcnJheTxJdGVtU3RhY2s+IHtcbiAgICBjb25zdCByZXN1bHRzOiBBcnJheTxJdGVtU3RhY2s+ID0gW107XG4gICAgY29uc3QgdG90YWxXZWlnaHQgPSB0aGlzLmVudHJpZXNcbiAgICAgIC5tYXAoKHsgd2VpZ2h0IH0pID0+IHdlaWdodClcbiAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGMgKyBhKTtcblxuICAgIGZvciAobGV0IF8gPSAwOyBfIDwgdGhpcy5yb2xsczsgXysrKSB7XG4gICAgICBjb25zdCByYW5kb21XZWlnaHQgPSBNYXRoLnJhbmRvbSgpICogdG90YWxXZWlnaHQ7XG4gICAgICBsZXQgYWNjdW11bGF0aXZlID0gMDtcblxuICAgICAgZm9yIChjb25zdCB7IHdlaWdodCwgaXRlbVN0YWNrLCBmdW5jdGlvbjogY2FsbGJhY2sgfSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgICAgYWNjdW11bGF0aXZlICs9IHdlaWdodDtcbiAgICAgICAgaWYgKHJhbmRvbVdlaWdodCA8IGFjY3VtdWxhdGl2ZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChjYWxsYmFjaz8uKGl0ZW1TdGFjaykgPz8gaXRlbVN0YWNrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGxvb3QgZW50cnkgdG8gdGhlIGxvb3QgcG9vbC5cbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0aGF0IHdpbGwgYmUgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkRW50cnkoZW50cnk6IExvb3RFbnRyeSk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIGxvb3QgcG9vbC5cbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0aGF0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogTG9vdEVudHJ5KTogdGhpcyB7XG4gICAgdGhpcy5lbnRyaWVzLnNwbGljZSh0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSksIDEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IExvb3RQb29sIH07XG4iLCAiaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgTG9vdFBvb2wgfSBmcm9tIFwiLi9wb29sXCI7XG5cbmNsYXNzIExvb3RUYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9vbHM6IFNldDxMb290UG9vbD4gPSBuZXcgU2V0KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBvb2xzOiBBcnJheTxMb290UG9vbD4gfCBTZXQ8TG9vdFBvb2w+KSB7XG4gICAgdGhpcy5wb29scyA9IG5ldyBTZXQocG9vbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwb29sIHRvIHRoZSBsb290IHRhYmxlLlxuICAgKiBAcGFyYW0gcG9vbCBUaGUgbG9vdCBwb29sIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgYWRkUG9vbChwb29sOiBMb290UG9vbCk6IHRoaXMge1xuICAgIHRoaXMucG9vbHMuYWRkKHBvb2wpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBwb29sIGZyb20gdGhlIGxvb3QgdGFibGVcbiAgICogQHBhcmFtIHBvb2wgVGhlIHBvb2wgdGhhdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUG9vbChwb29sOiBMb290UG9vbCk6IHRoaXMge1xuICAgIHRoaXMucG9vbHMuZGVsZXRlKHBvb2wpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgcmFuZG9tIGxvb3QgZnJvbSB0aGUgbG9vdCBwb29scy5cbiAgICogQHJldHVybnMgVGhlIGxvb3QgcmVzdWx0YW50IG9mIHRoZSByb2xsIG9mIGV2ZXJ5IHBvb2wuXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9vdCgpOiBBcnJheTxJdGVtU3RhY2s+IHtcbiAgICBjb25zdCBsb290OiBBcnJheTxJdGVtU3RhY2s+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHBvb2wgb2YgdGhpcy5wb29scykge1xuICAgICAgbG9vdC5wdXNoKC4uLnBvb2wucm9sbCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvb3Q7XG4gIH1cbn1cblxuZXhwb3J0IHsgTG9vdFRhYmxlIH07XG4iXSwKICAibWFwcGluZ3MiOiAibW9CQUFBLElBQUFBLEdBQUEsR0FBQUMsR0FBQUQsR0FBQSxpQkFBQUUsR0FBQSxlQUFBQyxHQUFBLGVBQUFDLEdBQUEsaUJBQUFDLEdBQUEsa0JBQUFDLEdBQUEsaUJBQUFDLEdBQUEsVUFBQUMsR0FBQSxnQ0FBQUMsR0FBQSxtQkFBQUMsR0FBQSx3QkFBQUMsR0FBQSxjQUFBQyxHQUFBLG9CQUFBQyxFQUFBLHdCQUFBQyxHQUFBLHNCQUFBQyxHQUFBLGlCQUFBQyxHQUFBLHFCQUFBQyxFQUFBLGlCQUFBQyxHQUFBLGtCQUFBQyxHQUFBLGVBQUFDLEVBQUEsZ0JBQUFDLEdBQUEsY0FBQUMsRUFBQSxzQkFBQUMsR0FBQSx1QkFBQUMsR0FBQSw0QkFB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dEMsWUFBS3BCLFFBQVFrQixLQUFLRSxDQUFBQSxFQUNYLElBQ1QsQ0FNT0MsWUFBWUQsRUFBd0IsQ0FDekMsWUFBS3BCLFFBQVFzQixPQUFPLEtBQUt0QixRQUFRdUIsUUFBUUgsQ0FBQUEsRUFBUSxDQUFBLEVBQzFDLElBQ1QsQ0FDRixFQ2xEQSxJQUFNSSxHQUFOLEtBQU1BLENBQU4sTUFBTUEsQ0FBQUEsRUFBQUEsa0JBQ2FDLE1BQXVCLElBQUlDLElBRTVDLFlBQW1CRCxFQUF3QyxDQUN6RCxLQUFLQSxNQUFRLElBQUlDLElBQUlELENBQUFBLENBQ3ZCLENBTU9FLFFBQVFDLEVBQXNCLENBQ25DLFlBQUtILE1BQU1JLElBQUlELENBQUFBLEVBQ1IsSUFDVCxDQU1PRSxXQUFXRixFQUFzQixDQUN0QyxZQUFLSCxNQUFNTSxPQUFPSCxDQUFBQSxFQUNYLElBQ1QsQ0FNT0ksU0FBNEIsQ0FDakMsSUFBTUMsRUFBeUIsQ0FBQSxFQUUvQixRQUFXTCxLQUFRLEtBQUtILE1BQ3RCUSxFQUFLQyxLQUFJLEdBQUlOLEVBQUtPLEtBQUksQ0FBQSxFQUV4QixPQUFPRixDQUNULENBQ0YiLAogICJuYW1lcyI6IFsic3JjX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiQWJpbGl0eUVudW0iLCAiQWJpbGl0eU1hcCIsICJBY3Rpb25Gb3JtIiwgIkFjdG9yRmxhZ01hcCIsICJBZG1pbkNvbW1hbmRzIiwgIkF0dHJpYnV0ZU1hcCIsICJCbG9jayIsICJCbG9ja0NhcmRpbmFsRGlyZWN0aW9uVHJhaXQiLCAiQmxvY2tDb250YWluZXIiLCAiQmxvY2tEaXJlY3Rpb25UcmFpdCIsICJCbG9ja0VudW0iLCAiQmxvY2tJZGVudGlmaWVyIiwgIkJsb2NrSW52ZW50b3J5VHJhaXQiLCAiQmxvY2tPcGVuQml0VHJhaXQiLCAiQmxvY2tQYWxldHRlIiwgIkJsb2NrUGVybXV0YXRpb24iLCAiQmxvY2tTdG9yYWdlIiwgIkJsb2NrVG9vbFR5cGUiLCAiQmxvY2tUcmFpdCIsICJCbG9ja1RyYWl0cyIsICJCbG9ja1R5cGUiLCAiQmxvY2tVcGRhdGVTaWduYWwiLCAiQmxvY2tVcHBlckJpdFRyYWl0IiwgIkJsb2NrVXBzaWRlRG93bkJpdFRyYWl0IiwgIkJsb2NrV2VpcmRvRGlyZWN0aW9uVHJhaXQiLCAiQm9vbGVhbkVudW0iLCAiQ2FyZGluYWxEaXJlY3Rpb24iLCAiQ2h1bmsiLCAiQ2h1bmtSZWFkeVNpZ25hbCIsICJDb21tYW5kIiwgIkNvbW1hbmRBcmd1bWVudFBvaW50ZXIiLCAiQ29tbWFuZEV4ZWN1dGlvblN0YXRlIiwgIkNvbW1hbmRSZWdpc3RyeSIsICJDb21tYW5kcyIsICJDb21tb25Db21tYW5kcyIsICJDb25zb2xlSW50ZXJmYWNlIiwgIkNvbnRhaW5lciIsICJDcmVhdGl2ZUl0ZW0iLCAiQ3VzdG9tQmxvY2tUeXBlIiwgIkN1c3RvbUVudGl0eVR5cGUiLCAiQ3VzdG9tRW51bSIsICJDdXN0b21JdGVtVHlwZSIsICJEZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcyIsICJEZWZhdWx0SXRlbVN0YWNrUHJvcGVydGllcyIsICJEZWZhdWx0V29ybGRQcm92aWRlclByb3BlcnRpZXMiLCAiRGV2aWNlIiwgIkRpbWVuc2lvbiIsICJFZmZlY3RBZGRTaWduYWwiLCAiRWZmZWN0UmVtb3ZlU2lnbmFsIiwgIkVudGl0eSIsICJFbnRpdHlBaXJTdXBwbHlUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVVcGRhdGVTaWduYWwiLCAiRW50aXR5Q29sbGlzaW9uIiwgIkVudGl0eUNvbnRhaW5lciIsICJFbnRpdHlEZXNwYXduZWRTaWduYWwiLCAiRW50aXR5RGllU2lnbmFsIiwgIkVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbCIsICJFbnRpdHlFZmZlY3RzVHJhaXQiLCAiRW50aXR5RW51bSIsICJFbnRpdHlFcXVpcG1lbnRUcmFpdCIsICJFbnRpdHlGbGFnVXBkYXRlU2lnbmFsIiwgIkVudGl0eUdyYXZpdHlUcmFpdCIsICJFbnRpdHlIZWFsdGhDaGFuZ2VkU2lnbmFsIiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgIkVudGl0eUhpdFNpZ25hbCIsICJFbnRpdHlIdXJ0U2lnbmFsIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiRW50aXR5SW50ZXJhY3RNZXRob2QiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiRW50aXR5SW52aXNpYmlsaXR5VHJhaXQiLCAiRW50aXR5SXRlbVN0YWNrVHJhaXQiLCAiRW50aXR5TWV0YWRhdGFVcGRhdGVTaWduYWwiLCAiRW50aXR5TW92ZW1lbnRUcmFpdCIsICJFbnRpdHlOYW1lVGFnVHJhaXQiLCAiRW50aXR5UGFsZXR0ZSIsICJFbnRpdHlQaHlzaWNzVHJhaXQiLCAiRW50aXR5U3Bhd25lZFNpZ25hbCIsICJFbnRpdHlUcmFpdCIsICJFbnRpdHlUcmFpdHMiLCAiRW50aXR5VHlwZSIsICJFbnVtIiwgIkV2ZW50U2lnbmFsIiwgIkZvcm0iLCAiR2FtZW1vZGVFbnVtIiwgIkhhbmRsZXJzIiwgIkludGVnZXJFbnVtIiwgIkludGVybmFsUHJvdmlkZXIiLCAiSXRlbUJ1bmRsZVRyYWl0IiwgIkl0ZW1DYXRlZ29yeSIsICJJdGVtRHJvcCIsICJJdGVtRW5jaGFudGFibGVUcmFpdCIsICJJdGVtRW51bSIsICJJdGVtRXF1aXBwYWJsZVRyYWl0IiwgIkl0ZW1Hcm91cCIsICJJdGVtSWRlbnRpZmllciIsICJJdGVtUGFsZXR0ZSIsICJJdGVtU3RhY2siLCAiSXRlbVRvb2xUaWVyIiwgIkl0ZW1Ub29sVHlwZSIsICJJdGVtVHJhaXQiLCAiSXRlbVRyYWl0cyIsICJJdGVtVHlwZSIsICJJdGVtVXNlTWV0aG9kIiwgIkxldmVsREJQcm92aWRlciIsICJMb290UG9vbCIsICJMb290VGFibGUiLCAiTWVzc2FnZUZvcm0iLCAiTWV0YWRhdGFNYXAiLCAiTW9kYWxGb3JtIiwgIk5ldHdvcmsiLCAiTmV0d29ya0JvdW5kIiwgIk5ldHdvcmtIYW5kbGVyIiwgIlBsYXllciIsICJQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIiwgIlBsYXllckJyZWFrQmxvY2tTaWduYWwiLCAiUGxheWVyQ2hhdFNpZ25hbCIsICJQbGF5ZXJDaHVua1JlbmRlcmluZ1RyYWl0IiwgIlBsYXllckN1cnNvclRyYWl0IiwgIlBsYXllckRyb3BJdGVtU2lnbmFsIiwgIlBsYXllckVudGl0eVJlbmRlcmluZ1RyYWl0IiwgIlBsYXllckV4aGF1c3Rpb25UcmFpdCIsICJQbGF5ZXJHYW1lbW9kZUNoYW5nZVNpZ25hbCIsICJQbGF5ZXJIdW5nZXJUcmFpdCIsICJQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbCIsICJQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHlTaWduYWwiLCAiUGxheWVySm9pblNpZ25hbCIsICJQbGF5ZXJMZWF2ZVNpZ25hbCIsICJQbGF5ZXJMaXN0VHJhaXQiLCAiUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsIiwgIlBsYXllclBsYWNlQmxvY2tTaWduYWwiLCAiUGxheWVyU2F0dXJhdGlvblRyYWl0IiwgIlBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbCIsICJQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbCIsICJQbGF5ZXJTdG9wRW1vdGluZ1NpZ25hbCIsICJQbGF5ZXJTdG9wVXNpbmdJdGVtU2lnbmFsIiwgIlBsYXllclRyYWl0IiwgIlBsYXllclVzZUl0ZW1TaWduYWwiLCAiUG9zaXRpb25FbnVtIiwgIlNlcmVuaXR5IiwgIlNlcnZlckV2ZW50IiwgIlNvZnRFbnVtIiwgIlN0cmluZ0VudW0iLCAiU3ViQ2h1bmsiLCAiU3VwZXJmbGF0R2VuZXJhdG9yIiwgIlN1cGVyZmxhdFdvcmtlciIsICJUYWdFbnVtIiwgIlRhcmdldEVudW0iLCAiVGVycmFpbkdlbmVyYXRvciIsICJUZXJyYWluV29ya2VyIiwgIlRpY2tTY2hlZHVsZSIsICJWYWxpZEVudW0iLCAiVmVydGljYWxIYWxmVHJhaXQiLCAiVm9pZEdlbmVyYXRvciIsICJXb3JrZXIiLCAiV29ybGQiLCAiV29ybGRFbnVtIiwgIldvcmxkRXZlbnQiLCAiV29ybGRJbml0aWFsaXplU2lnbmFsIiwgIldvcmxkUHJvdmlkZXIiLCAiV29ybGRUaWNrU2lnbmFsIiwgImhhc2giLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9yYWtuZXQiLCAiaW1wb3J0X2VtaXR0ZXIiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfZW1pdHRlciIsICJpbXBvcnRfcmFrbmV0IiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X3Byb3RvY29sIiwgIk5ldHdvcmtCb3VuZCIsICJCbG9ja0lkZW50aWZpZXIiLCAiRW50aXR5SWRlbnRpZmllciIsICJJdGVtSWRlbnRpZmllciIsICJJdGVtQ2F0ZWdvcnkiLCAiSXRlbUdyb3VwIiwgIkl0ZW1Ub29sVGllciIsICJJdGVtVG9vbFR5cGUiLCAiQmxvY2tUb29sVHlwZSIsICJJdGVtVXNlTWV0aG9kIiwgImltcG9ydF9wcm90b2NvbCIsICJFbnRpdHlJbnRlcmFjdE1ldGhvZCIsICJJdGVtVXNlT25FbnRpdHlJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUiLCAiSW50ZXJhY3QiLCAiQXR0YWNrIiwgIkNhcmRpbmFsRGlyZWN0aW9uIiwgIldvcmxkRXZlbnQiLCAiU2VydmVyRXZlbnQiLCAiRGVmYXVsdFByb3BlcnRpZXMiLCAiY29tcHJlc3Npb24iLCAiZW5jcnlwdGlvbiIsICJOZXR3b3JrIiwgIkVtaXR0ZXIiLCAic2VyZW5pdHkiLCAicmFrbmV0IiwgInByb3BlcnRpZXMiLCAibG9nZ2VyIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJjb25uZWN0aW9ucyIsICJNYXAiLCAiaGFuZGxlcnMiLCAiU2V0IiwgIlNlcnZlciIsICJhZGRyZXNzIiwgInBvcnQiLCAib24iLCAib25FbmNhcHN1bGF0ZWQiLCAiYmluZCIsICJvbkNvbm5lY3QiLCAib25EaXNjb25uZWN0IiwgImhhbmRsZXIiLCAicmVnaXN0ZXJIYW5kbGVyIiwgImFkZCIsICJ1bnJlZ2lzdGVySGFuZGxlciIsICJkZWxldGUiLCAiY29ubmVjdGlvbiIsICJoYXMiLCAiZGlzY29ubmVjdCIsICJvYmplY3QiLCAic2V0IiwgImRlYnVnIiwgInJpbmZvIiwgInBhY2tldCIsICJEaXNjb25uZWN0UGFja2V0IiwgInJlYXNvbiIsICJEaXNjb25uZWN0UmVhc29uIiwgIkRpc2Nvbm5lY3RlZCIsICJoaWRlRGlzY29ubmVjdFNjcmVlbiIsICJwYXlsb2FkIiwgIkJ1ZmZlciIsICJmcm9tIiwgIkNvbXByZXNzaW9uTWV0aG9kIiwgIk5vbmUiLCAiRnJhbWVyIiwgImZyYW1lIiwgInNlcmlhbGl6ZSIsICJwbGF5ZXJzIiwgImRhdGEiLCAiZ2V0IiwgIkVycm9yIiwgImJ1ZmZlciIsICJkZWNyeXB0ZWQiLCAic3ViYXJyYXkiLCAiYWxnb3JpdGhtIiwgInJlYWRVaW50OCIsICJOb3RQcmVzZW50IiwgImluZmxhdGVkIiwgIlpsaWIiLCAiaW5mbGF0ZVpsaWIiLCAiU25hcHB5IiwgImluZmxhdGVTbmFwcHkiLCAiZnJhbWVzIiwgInVuZnJhbWUiLCAibGVuZ3RoIiwgInBhY2tldHNQZXJGcmFtZSIsICJ3YXJuIiwgInBhY2tldElkIiwgImdldFBhY2tldElkIiwgInBhY2tldFR5cGUiLCAiUGFja2V0cyIsICJkZXNlcmlhbGl6ZSIsICJldmVudCIsICJib3VuZCIsICJOZXR3b3JrQm91bmQiLCAibmV0d29yayIsICJlbWl0IiwgImFsbCIsICJBcnJheSIsICJmaWx0ZXIiLCAiUGFja2V0IiwgImhhbmRsZSIsICJlcnJvciIsICJpbmZsYXRlUmF3U3luYyIsICJfYnVmZmVyIiwgInNlbmQiLCAicHJpb3JpdHkiLCAiUHJpb3JpdHkiLCAiTm9ybWFsIiwgInBhY2tldHMiLCAiQ2xpZW50IiwgImdldElkIiwgInB1c2giLCAiZnJhbWVkIiwgImRlZmxhdGVkIiwgImJ5dGVMZW5ndGgiLCAiY29tcHJlc3Npb25UaHJlc2hvbGQiLCAiY29uY2F0IiwgImNvbXByZXNzaW9uTWV0aG9kIiwgImRlZmxhdGVabGliIiwgImVuY3J5cHRlZCIsICJGcmFtZSIsICJyZWxpYWJpbGl0eSIsICJSZWxpYWJpbGl0eSIsICJSZWxpYWJsZSIsICJvcmRlckNoYW5uZWwiLCAic2VuZEZyYW1lIiwgInNlbmROb3JtYWwiLCAic2VuZEltbWVkaWF0ZSIsICJJbW1lZGlhdGUiLCAiZGVmbGF0ZVJhd1N5bmMiLCAic2V0Q29tcHJlc3Npb24iLCAiZW5hYmxlZCIsICJzZXRFbmNyeXB0aW9uIiwgImRpc2Nvbm5lY3RDb25uZWN0aW9uIiwgIm1lc3NhZ2UiLCAiRGlzY29ubmVjdE1lc3NhZ2UiLCAiU3RyaW5nIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJzZXJlbml0eSIsICJuZXR3b3JrIiwgImhhbmRsZSIsICJfcGFja2V0IiwgIl9jb25uZWN0aW9uIiwgIkVycm9yIiwgImltcG9ydF9wcm90b2NvbCIsICJBbmltYXRlSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIkFuaW1hdGUiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgInBsYXllcnMiLCAiZ2V0IiwgImRpc2Nvbm5lY3QiLCAiZGltZW5zaW9uIiwgImJyb2FkY2FzdEV4Y2VwdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiQ29udGFpbmVyQ2xvc2VIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiQ29udGFpbmVyQ2xvc2UiLCAiaGFuZGxlIiwgIl8iLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAib3BlbmVkQ29udGFpbmVyIiwgImNsb3NlIiwgImltcG9ydF9wcm90b2NvbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgImNvbnN0cnVjdG9yIiwgIndvcmxkIiwgImVtaXQiLCAic2VydmVyIiwgInNlcmVuaXR5IiwgIldvcmxkSW5pdGlhbGl6ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiV29ybGRJbml0aWFsaXplIiwgIldvcmxkVGlja1NpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiV29ybGRUaWNrIiwgImN1cnJlbnRUaWNrIiwgImRlbHRhVGljayIsICJ3b3JsZCIsICJDaHVua1JlYWR5U2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJDaHVua1JlYWR5IiwgImNodW5rIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJFbnRpdHlTcGF3bmVkU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJFbnRpdHlTcGF3bmVkIiwgImVudGl0eSIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiRW50aXR5RGVzcGF3bmVkU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJFbnRpdHlEZXNwYXduZWQiLCAiZW50aXR5IiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJFbnRpdHlGbGFnVXBkYXRlU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJFbnRpdHlGbGFnVXBkYXRlIiwgImVudGl0eSIsICJmbGFnIiwgInZhbHVlIiwgImdldFdvcmxkIiwgIkVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJFbnRpdHlNZXRhZGF0YVVwZGF0ZSIsICJlbnRpdHkiLCAia2V5IiwgImRhdGFJdGVtIiwgImdldFdvcmxkIiwgIkVudGl0eUF0dHJpYnV0ZVVwZGF0ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5QXR0cmlidXRlVXBkYXRlIiwgImVudGl0eSIsICJhdHRyaWJ1dGUiLCAidmFsdWUiLCAiZ2V0V29ybGQiLCAiUGxheWVySm9pblNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVySm9pbiIsICJwbGF5ZXIiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgIlBsYXllckxlYXZlU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJMZWF2ZSIsICJwbGF5ZXIiLCAicmVhc29uIiwgIm1lc3NhZ2UiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgIlBsYXllckNoYXRTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllckNoYXQiLCAicGxheWVyIiwgIm1lc3NhZ2UiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgIkJsb2NrVXBkYXRlU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJCbG9ja1VwZGF0ZSIsICJibG9jayIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiUGxheWVyUGxhY2VCbG9ja1NpZ25hbCIsICJCbG9ja1VwZGF0ZVNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyUGxhY2VCbG9jayIsICJmYWNlIiwgImZhY2VMb2NhdGlvbiIsICJwZXJtdXRhdGlvbkJlaW5nUGxhY2VkIiwgInBsYXllciIsICJibG9jayIsICJQbGF5ZXJCcmVha0Jsb2NrU2lnbmFsIiwgIkJsb2NrVXBkYXRlU2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJCcmVha0Jsb2NrIiwgInBsYXllciIsICJpdGVtU3RhY2siLCAiYmxvY2siLCAiUGxheWVyRHJvcEl0ZW1TaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllckRyb3BJdGVtIiwgInBsYXllciIsICJpdGVtU3RhY2siLCAiYW1vdW50IiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJBYmlsaXR5VXBkYXRlIiwgInBsYXllciIsICJhYmlsaXR5IiwgInZhbHVlIiwgImdldFdvcmxkIiwgIlBsYXllclN0YXJ0VXNpbmdJdGVtU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJTdGFydFVzaW5nSXRlbSIsICJwbGF5ZXIiLCAiaXRlbVN0YWNrIiwgInVzZU1ldGhvZCIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiUGxheWVyU3RvcFVzaW5nSXRlbVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyU3RvcFVzaW5nSXRlbSIsICJwbGF5ZXIiLCAiaXRlbVN0YWNrIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJQbGF5ZXJVc2VJdGVtU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJVc2VJdGVtIiwgInBsYXllciIsICJpdGVtU3RhY2siLCAidXNlTWV0aG9kIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJQbGF5ZXJTdGFydEVtb3RpbmdTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllclN0YXJ0RW1vdGluZyIsICJwbGF5ZXIiLCAiZW1vdGUiLCAidGlja0xlbmd0aCIsICJnZXRXb3JsZCIsICJQbGF5ZXJTdG9wRW1vdGluZ1NpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyU3RvcEVtb3RpbmciLCAicGxheWVyIiwgImVtb3RlIiwgImdldFdvcmxkIiwgIkVmZmVjdEFkZFNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRWZmZWN0QWRkIiwgImVudGl0eSIsICJlZmZlY3QiLCAiZ2V0V29ybGQiLCAiRWZmZWN0UmVtb3ZlU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJFZmZlY3RSZW1vdmUiLCAiZW50aXR5IiwgImVmZmVjdCIsICJnZXRXb3JsZCIsICJQbGF5ZXJHYW1lbW9kZUNoYW5nZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyR2FtZW1vZGVDaGFuZ2UiLCAicGxheWVyIiwgImZyb21HYW1lbW9kZSIsICJ0b0dhbWVtb2RlIiwgImdldFdvcmxkIiwgIkVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5RGltZW5zaW9uQ2hhbmdlIiwgImVudGl0eSIsICJmcm9tRGltZW5zaW9uIiwgInRvRGltZW5zaW9uIiwgImdldFdvcmxkIiwgIlBsYXllckludGVyYWN0V2l0aEJsb2NrU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJJbnRlcmFjdFdpdGhCbG9jayIsICJzb3VyY2UiLCAiYmxvY2siLCAiYmVmb3JlSXRlbVN0YWNrIiwgIml0ZW1TdGFjayIsICJnZXRXb3JsZCIsICJQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHlTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllckludGVyYWN0V2l0aEVudGl0eSIsICJzb3VyY2UiLCAidGFyZ2V0IiwgIml0ZW1TdGFjayIsICJiZWZvcmVJdGVtU3RhY2siLCAiZ2V0V29ybGQiLCAiUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJPcGVuZWRDb250YWluZXIiLCAicGxheWVyIiwgImNvbnRhaW5lciIsICJnZXRXb3JsZCIsICJFbnRpdHlIaXRTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIkVudGl0eUhpdCIsICJoaXRFbnRpdHkiLCAiZGFtYWdpbmdFbnRpdHkiLCAiZ2V0V29ybGQiLCAiRW50aXR5SHVydFNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5SHVydCIsICJodXJ0RW50aXR5IiwgImRhbWFnaW5nRW50aXR5IiwgImRhbWFnZSIsICJjYXVzZSIsICJnZXRXb3JsZCIsICJFbnRpdHlIZWFsdGhDaGFuZ2VkU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJIZWFsdGhDaGFuZ2VkIiwgImVudGl0eSIsICJmcm9tSGVhbHRoIiwgInRvSGVhbHRoIiwgImdldFdvcmxkIiwgIkVudGl0eURpZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5RGllIiwgImVudGl0eSIsICJkYW1hZ2luZ0VudGl0eSIsICJkYW1hZ2VDYXVzZSIsICJnZXRXb3JsZCIsICJEaXNjb25uZWN0SGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIkRpc2Nvbm5lY3QiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgIlBsYXllckxlYXZlU2lnbmFsIiwgInJlYXNvbiIsICJtZXNzYWdlIiwgIlN0cmluZyIsICJlbWl0IiwgImRlc3Bhd24iLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgInByb3ZpZGVyIiwgIndyaXRlUGxheWVyIiwgImdldERhdGFFbnRyeSIsICJsb2dnZXIiLCAiaW5mbyIsICJ1c2VybmFtZSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X2RhdGEiLCAiaW1wb3J0X25idCIsICJFbnRpdHlUeXBlIiwgInR5cGVzIiwgIk1hcCIsICJuZXR3b3JrIiwgImlkZW50aWZpZXIiLCAiY29tcG9uZW50cyIsICJyZWdpc3RlciIsICJjb21wb25lbnQiLCAiaW5jbHVkZXMiLCAiRXJyb3IiLCAicHVzaCIsICJ1bnJlZ2lzdGVyIiwgInNwbGljZSIsICJpbmRleE9mIiwgImdldCIsICJnZXRBbGwiLCAidmFsdWVzIiwgInRvTmJ0IiwgInR5cGUiLCAicm9vdCIsICJDb21wb3VuZFRhZyIsICJjcmVhdGVTdHJpbmdUYWciLCAiY3JlYXRlQnl0ZVRhZyIsICJjcmVhdGVJbnRUYWciLCAidHlwZSIsICJFTlRJVFlfVFlQRVMiLCAiZW50aXR5VHlwZSIsICJFbnRpdHlUeXBlIiwgImlkZW50aWZpZXIiLCAiY29tcG9uZW50cyIsICJ0eXBlcyIsICJzZXQiLCAiQ3VzdG9tRW50aXR5VHlwZSIsICJFbnRpdHlUeXBlIiwgImlkZW50aWZpZXIiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2RhdGEiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9kYXRhIiwgIkRlZmF1bHRCbG9ja1R5cGVQcm9wZXJ0aWVzIiwgImxvZ2dhYmxlIiwgImFpciIsICJsaXF1aWQiLCAic29saWQiLCAiaGFyZG5lc3MiLCAiZnJpY3Rpb24iLCAiY29sb3IiLCAiY29tcG9uZW50cyIsICJ0YWdzIiwgImRyb3BzIiwgInBlcm11dGF0aW9ucyIsICJCbG9ja1R5cGUiLCAidHlwZXMiLCAiTWFwIiwgImlkZW50aWZpZXIiLCAiY3VzdG9tIiwgInByb3BlcnRpZXMiLCAicHJvcHMiLCAiZ2V0UGVybXV0YXRpb24iLCAic3RhdGUiLCAicGVybXV0YXRpb24iLCAibWF0Y2hlcyIsICJnZXQiLCAidHlwZSIsICJCbG9ja0lkZW50aWZpZXIiLCAiQWlyIiwgImdldEFsbCIsICJ2YWx1ZXMiLCAiaW1wb3J0X25idCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgImltcG9ydF9uYnQiLCAiSEFTSF9PRkZTRVQiLCAiaGFzaCIsICJpZGVudGlmaWVyIiwgInN0YXRlIiwgImtleXMiLCAiT2JqZWN0IiwgInZhbHVlcyIsICJyb290IiwgIkNvbXBvdW5kVGFnIiwgImFkZFRhZyIsICJTdHJpbmdUYWciLCAic3RhdGVzIiwgImluZGV4IiwgImtleSIsICJlbnRyaWVzIiwgInZhbHVlIiwgIkludFRhZyIsICJCeXRlVGFnIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAid3JpdGUiLCAiZWxlbWVudCIsICJnZXRCdWZmZXIiLCAiQmxvY2tQZXJtdXRhdGlvbiIsICJwZXJtdXRhdGlvbnMiLCAiTWFwIiwgIm5ldHdvcmsiLCAiaW5kZXgiLCAic3RhdGUiLCAidHlwZSIsICJsZW5ndGgiLCAibWF0Y2hlcyIsICJrZXkiLCAicmVzb2x2ZSIsICJpZGVudGlmaWVyIiwgIkJsb2NrVHlwZSIsICJ0eXBlcyIsICJnZXQiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkFpciIsICJwZXJtdXRhdGlvbiIsICJmaW5kIiwgInZhbHVlIiwgInF1ZXJ5IiwgImNyZWF0ZSIsICJoYXNoIiwgInNldCIsICJwdXNoIiwgInRvTmJ0IiwgIm5idCIsICJDb21wb3VuZFRhZyIsICJuYW1lIiwgIlN0cmluZ1RhZyIsICJzdGF0ZXMiLCAia2V5cyIsICJPYmplY3QiLCAidmFsdWVzIiwgImVudHJpZXMiLCAiYWRkVGFnIiwgIkludFRhZyIsICJCeXRlVGFnIiwgImZyb21OYnQiLCAiZ2V0VGFnIiwgInZhbHVlT2YiLCAiSXRlbURyb3AiLCAidHlwZSIsICJtaW4iLCAibWF4IiwgInByb2JhYmlsaXR5IiwgInJvbGwiLCAiTWF0aCIsICJyYW5kb20iLCAiZmxvb3IiLCAidHlwZSIsICJCTE9DS19UWVBFUyIsICJCbG9ja1R5cGUiLCAidHlwZXMiLCAiaGFzIiwgImlkZW50aWZpZXIiLCAiRXJyb3IiLCAiZHJvcCIsICJCTE9DS19EUk9QUyIsICJmaW5kIiwgIm1ldGFkYXRhIiwgIkJMT0NLX01FVEFEQVRBIiwgIm1ldGEiLCAiaGFyZG5lc3MiLCAiZnJpY3Rpb24iLCAibWFwQ29sb3IiLCAiaW5zdGFuY2UiLCAibG9nZ2FibGUiLCAiYWlyIiwgImxpcXVpZCIsICJzb2xpZCIsICJjb2xvciIsICJjb21wb25lbnRzIiwgInRhZ3MiLCAiZW50cnkiLCAiZHJvcHMiLCAibWluIiwgIm1heCIsICJjaGFuY2UiLCAiaXRlbURyb3AiLCAiSXRlbURyb3AiLCAicHVzaCIsICJzZXQiLCAicGVybXV0YXRpb24iLCAiQkxPQ0tfUEVSTVVUQVRJT05TIiwgImdldCIsICJCbG9ja1Blcm11dGF0aW9uIiwgImhhc2giLCAic3RhdGUiLCAicGVybXV0YXRpb25zIiwgImltcG9ydF9uYnQiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkN1c3RvbUJsb2NrVHlwZSIsICJCbG9ja1R5cGUiLCAibmV0d29ya0lkIiwgImN1c3RvbSIsICJpZGVudGlmaWVyIiwgInByb3BlcnRpZXMiLCAidG9OYnQiLCAidHlwZSIsICJyb290IiwgIkNvbXBvdW5kVGFnIiwgInZhbmlsbGFCbG9ja0RhdGEiLCAiY3JlYXRlQ29tcG91bmRUYWciLCAiY3JlYXRlSW50VGFnIiwgImNyZWF0ZVN0cmluZ1RhZyIsICJJdGVtQ2F0ZWdvcnkiLCAiTmF0dXJlIiwgInRvQmxvY2tQcm9wZXJ0eSIsICJCbG9ja1Byb3BlcnR5IiwgInRyYWl0c19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkJsb2NrQ2FyZGluYWxEaXJlY3Rpb25UcmFpdCIsICJCbG9ja0RpcmVjdGlvblRyYWl0IiwgIkJsb2NrSW52ZW50b3J5VHJhaXQiLCAiQmxvY2tPcGVuQml0VHJhaXQiLCAiQmxvY2tUcmFpdCIsICJCbG9ja1VwcGVyQml0VHJhaXQiLCAiQmxvY2tVcHNpZGVEb3duQml0VHJhaXQiLCAiQmxvY2tXZWlyZG9EaXJlY3Rpb25UcmFpdCIsICJWZXJ0aWNhbEhhbGZUcmFpdCIsICJUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgImNvbnN0cnVjdG9yIiwgImNsb25lIiwgIl9hcmd1bWVudHMiLCAiRXJyb3IiLCAiQmxvY2tUcmFpdCIsICJUcmFpdCIsICJ0eXBlcyIsICJibG9jayIsICJhZGRUcmFpdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiQmxvY2tJbnZlbnRvcnlUcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkNoZXN0IiwgIm9wZW5lZCIsICJjb250YWluZXIiLCAiY29udGFpbmVyVHlwZSIsICJjb250YWluZXJJZCIsICJpbnZlbnRvcnlTaXplIiwgImJsb2NrIiwgImdldFR5cGUiLCAiQ29udGFpbmVyVHlwZSIsICJDb250YWluZXIiLCAiQ29udGFpbmVySWQiLCAiTm9uZSIsICJCbG9ja0NvbnRhaW5lciIsICJjb21wb25lbnRzIiwgImhhcyIsICJpbnZlbnRvcnkiLCAiZ2V0IiwgInNsb3QiLCAiZW50cnkiLCAiaXRlbXMiLCAic3RhY2siLCAiSXRlbVN0YWNrIiwgImFtb3VudCIsICJhdXhpbGxhcnkiLCAid29ybGQiLCAiZGltZW5zaW9uIiwgInNldEl0ZW0iLCAib25JbnRlcmFjdCIsICJwbGF5ZXIiLCAiaXNTbmVha2luZyIsICJhYmlsaXRpZXMiLCAiQWJpbGl0eUluZGV4IiwgIk9wZW5Db250YWluZXJzIiwgInNob3ciLCAib25CcmVhayIsICJpdGVtIiwgInN0b3JhZ2UiLCAieCIsICJ5IiwgInoiLCAicG9zaXRpb24iLCAic3Bhd25JdGVtIiwgIlZlY3RvcjNmIiwgInNldE1vdGlvbiIsICJvbkNvbnRhaW5lclVwZGF0ZSIsICJzaXplIiwgImkiLCAiZ2V0SXRlbSIsICJnZXREYXRhRW50cnkiLCAicHVzaCIsICJzZXQiLCAib25UaWNrIiwgIm9jY3VwYW50cyIsICJldmVudCIsICJCbG9ja0V2ZW50UGFja2V0IiwgInR5cGUiLCAiQmxvY2tFdmVudFR5cGUiLCAiQ2hhbmdlU3RhdGUiLCAiZGF0YSIsICJzb3VuZCIsICJMZXZlbFNvdW5kRXZlbnRQYWNrZXQiLCAiQmxvY2tQb3NpdGlvbiIsICJ0b1ZlY3RvcjNmIiwgInBlcm11dGF0aW9uIiwgIm5ldHdvcmsiLCAiYWN0b3JJZGVudGlmaWVyIiwgIlN0cmluZyIsICJpc0JhYnlNb2IiLCAiaXNHbG9iYWwiLCAiVHJhcHBlZENoZXN0IiwgIkxldmVsU291bmRFdmVudCIsICJDaGVzdE9wZW4iLCAiYnJvYWRjYXN0IiwgInBhY2tldCIsICJDaGVzdENsb3NlZCIsICJCbG9ja1dlaXJkb0RpcmVjdGlvblRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvblBsYWNlIiwgInBsYXllciIsICJkaXJlY3Rpb24iLCAiZ2V0Q2FyZGluYWxEaXJlY3Rpb24iLCAic2V0RGlyZWN0aW9uIiwgInR5cGUiLCAiYmxvY2siLCAiZ2V0VHlwZSIsICJuZXdTdGF0ZSIsICJwZXJtdXRhdGlvbiIsICJzdGF0ZSIsICJ3ZWlyZG9fZGlyZWN0aW9uIiwgImdldFBlcm11dGF0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgIkJsb2NrVXBzaWRlRG93bkJpdFRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvblBsYWNlIiwgIl8iLCAiY2xpY2tQb3NpdGlvbiIsICJ5IiwgInNldFVwc2lkZURvd24iLCAidXBzaWRlRG93biIsICJ0eXBlIiwgImJsb2NrIiwgImdldFR5cGUiLCAibmV3U3RhdGUiLCAicGVybXV0YXRpb24iLCAic3RhdGUiLCAidXBzaWRlX2Rvd25fYml0IiwgImdldFBlcm11dGF0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgImltcG9ydF9wcm90b2NvbCIsICJCbG9ja09wZW5CaXRUcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAib25JbnRlcmFjdCIsICJwbGF5ZXIiLCAiYWJpbGl0aWVzIiwgImdldCIsICJBYmlsaXR5SW5kZXgiLCAiRG9vcnNBbmRTd2l0Y2hlcyIsICJvcGVuQml0IiwgImJsb2NrIiwgInBlcm11dGF0aW9uIiwgInN0YXRlIiwgIm9wZW5fYml0IiwgInNldEJpdCIsICJpc1NuZWFraW5nIiwgIm9wZW4iLCAic2lsZW50IiwgInR5cGUiLCAiZ2V0VHlwZSIsICJ1cHBlckJsb2NrQml0IiwgImFib3ZlIiwgImJlbG93IiwgImFib3ZlTmV3U3RhdGUiLCAiYWJvdmVQZXJtdXRhdGlvbiIsICJnZXRQZXJtdXRhdGlvbiIsICJzZXRQZXJtdXRhdGlvbiIsICJiZWxvd05ld1N0YXRlIiwgImJlbG93UGVybXV0YXRpb24iLCAibmV3U3RhdGUiLCAicGFja2V0IiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJkYXRhIiwgIm5ldHdvcmsiLCAiZXZlbnQiLCAiTGV2ZWxTb3VuZEV2ZW50IiwgIkRvb3JPcGVuIiwgIkRvb3JDbG9zZSIsICJwb3NpdGlvbiIsICJCbG9ja1Bvc2l0aW9uIiwgInRvVmVjdG9yM2YiLCAiYWN0b3JJZGVudGlmaWVyIiwgIlN0cmluZyIsICJpc0JhYnlNb2IiLCAiaXNHbG9iYWwiLCAiaW5jbHVkZXMiLCAiVHJhcGRvb3JPcGVuIiwgIlRyYXBkb29yQ2xvc2UiLCAiRmVuY2VHYXRlT3BlbiIsICJGZW5jZUdhdGVDbG9zZSIsICJkaW1lbnNpb24iLCAiYnJvYWRjYXN0IiwgIkJsb2NrVXBwZXJCaXRUcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAib25QbGFjZSIsICJhYm92ZSIsICJibG9jayIsICJuZXdTdGF0ZSIsICJwZXJtdXRhdGlvbiIsICJzdGF0ZSIsICJ1cHBlcl9ibG9ja19iaXQiLCAiZ2V0VHlwZSIsICJnZXRQZXJtdXRhdGlvbiIsICJzZXRQZXJtdXRhdGlvbiIsICJWZXJ0aWNhbEhhbGZUcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAib25QbGFjZSIsICJfcGxheWVyIiwgImNsaWNrUG9zaXRpb24iLCAieSIsICJzZXRWZXJ0aWNhbEhhbGYiLCAib25JbnRlcmFjdCIsICJwbGF5ZXIiLCAiaXRlbVN0YWNrIiwgImdldEhlbGRJdGVtIiwgInR5cGUiLCAiYmxvY2siLCAiZ2V0VHlwZSIsICJ0b3BCaXQiLCAibmV3U3RhdGUiLCAicGVybXV0YXRpb24iLCAic3RhdGUiLCAiZ2V0UGVybXV0YXRpb24iLCAic2V0UGVybXV0YXRpb24iLCAiQmxvY2tDYXJkaW5hbERpcmVjdGlvblRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvblBsYWNlIiwgInBsYXllciIsICJnZXRDYXJkaW5hbERpcmVjdGlvbiIsICJkaXJlY3Rpb24iLCAiQ2FyZGluYWxEaXJlY3Rpb24iLCAiTm9ydGgiLCAic2V0RGlyZWN0aW9uIiwgIlNvdXRoIiwgIkVhc3QiLCAiV2VzdCIsICJ0eXBlIiwgImJsb2NrIiwgImdldFR5cGUiLCAibmV3U3RhdGUiLCAicGVybXV0YXRpb24iLCAic3RhdGUiLCAidG9Mb3dlckNhc2UiLCAiZ2V0UGVybXV0YXRpb24iLCAic2V0UGVybXV0YXRpb24iLCAiQmxvY2tEaXJlY3Rpb25UcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAib25QbGFjZSIsICJwbGF5ZXIiLCAiZ2V0Q2FyZGluYWxEaXJlY3Rpb24iLCAiZGlyZWN0aW9uIiwgIkNhcmRpbmFsRGlyZWN0aW9uIiwgIk5vcnRoIiwgInNldERpcmVjdGlvbiIsICJTb3V0aCIsICJFYXN0IiwgIldlc3QiLCAidHlwZSIsICJibG9jayIsICJnZXRUeXBlIiwgIm5ld1N0YXRlIiwgInBlcm11dGF0aW9uIiwgInN0YXRlIiwgImdldFBlcm11dGF0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgIkJsb2NrUGFsZXR0ZSIsICJ0eXBlcyIsICJCbG9ja1R5cGUiLCAicGVybXV0YXRpb25zIiwgIkJsb2NrUGVybXV0YXRpb24iLCAidHJhaXRzIiwgIk1hcCIsICJyZWdpc3RyeSIsICJ0cmFpdCIsICJCbG9ja1RyYWl0cyIsICJyZWdpc3RlclRyYWl0IiwgImdldEFsbFR5cGVzIiwgInZhbHVlcyIsICJnZXRBbGxDdXN0b21UeXBlcyIsICJmaWx0ZXIiLCAidHlwZSIsICJDdXN0b21CbG9ja1R5cGUiLCAiZ2V0QWxsUGVybXV0YXRpb25zIiwgInJlc29sdmVUeXBlIiwgImlkZW50aWZpZXIiLCAiZ2V0IiwgInJlc29sdmVQZXJtdXRhdGlvbiIsICJzdGF0ZSIsICJCbG9ja0lkZW50aWZpZXIiLCAiQWlyIiwgInBlcm11dGF0aW9uIiwgImZpbmQiLCAia2V5IiwgInZhbHVlIiwgInF1ZXJ5IiwgInJlZ2lzdGVyVHlwZSIsICJoYXMiLCAic2V0IiwgIkJsb2NrRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAicmVnaXN0ZXJQZXJtdXRhdGlvbiIsICJuZXR3b3JrIiwgImdldFJlZ2lzdHJ5IiwgInJlbW92ZVRyYWl0IiwgImRlbGV0ZSIsICJnZXRBbGxUcmFpdHMiLCAiZ2V0VHJhaXQiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9uYnQiLCAiaW1wb3J0X3Byb3RvY29sIiwgIk5idE1hcCIsICJNYXAiLCAiYmxvY2siLCAiYWRkIiwgInZhbHVlIiwgInNldCIsICJuYW1lIiwgInVwZGF0ZSIsICJrZXkiLCAiZGVsZXRlIiwgInJlc3VsdCIsICJjbGVhciIsICJwYWNrZXQiLCAiQmxvY2tBY3RvckRhdGFQYWNrZXQiLCAicG9zaXRpb24iLCAibmJ0IiwgIkNvbXBvdW5kVGFnIiwgInNldFRhZyIsICJkaW1lbnNpb24iLCAiYnJvYWRjYXN0IiwgIkJsb2NrIiwgInNlcmVuaXR5IiwgImRpbWVuc2lvbiIsICJwb3NpdGlvbiIsICJjb21wb25lbnRzIiwgIk1hcCIsICJ0cmFpdHMiLCAibmJ0IiwgIk5idE1hcCIsICJwZXJtdXRhdGlvbiIsICJwcm9wZXJ0aWVzIiwgIndvcmxkIiwgImVudHJ5IiwgImxvYWREYXRhRW50cnkiLCAiaXNBaXIiLCAidHlwZSIsICJhaXIiLCAiaXNMaXF1aWQiLCAibGlxdWlkIiwgImlzU29saWQiLCAic29saWQiLCAiZ2V0Q2h1bmsiLCAiY3giLCAieCIsICJjeiIsICJ6IiwgImdldFBlcm11dGF0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgImNsZWFyIiwgImJsb2NrcyIsICJkZWxldGUiLCAiQmxvY2tQb3NpdGlvbiIsICJoYXNoIiwgImdldFdvcmxkIiwgImJsb2NrUGFsZXR0ZSIsICJnZXRSZWdpc3RyeSIsICJpZGVudGlmaWVyIiwgInRyYWl0IiwgImdldFRyYWl0IiwgInB1c2giLCAia2V5IiwgIk9iamVjdCIsICJrZXlzIiwgInN0YXRlIiwgImdldEFsbFRyYWl0cyIsICJhZGRUcmFpdCIsICJwYWNrZXQiLCAiVXBkYXRlQmxvY2tQYWNrZXQiLCAibmV0d29ya0Jsb2NrSWQiLCAibmV0d29yayIsICJmbGFncyIsICJVcGRhdGVCbG9ja0ZsYWdzVHlwZSIsICJOZXR3b3JrIiwgImxheWVyIiwgIlVwZGF0ZUJsb2NrTGF5ZXJUeXBlIiwgIk5vcm1hbCIsICJicm9hZGNhc3QiLCAic2l6ZSIsICJzZXQiLCAic2V0VHlwZSIsICJnZXRUeXBlIiwgImhhc0NvbXBvbmVudCIsICJoYXMiLCAiZ2V0Q29tcG9uZW50IiwgImdldCIsICJyZW1vdmVDb21wb25lbnQiLCAiYWRkQ29tcG9uZW50IiwgImNvbXBvbmVudCIsICJzZXRDb21wb25lbnQiLCAiaGFzVHJhaXQiLCAicmVtb3ZlVHJhaXQiLCAib25SZW1vdmUiLCAibG9nZ2VyIiwgIndhcm4iLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiQmxvY2tUcmFpdCIsICJvbkFkZCIsICJpbnN0YW5jZSIsICJyZWFzb24iLCAiZXJyb3IiLCAiZ2V0VG9vbFR5cGUiLCAiQmxvY2tUb29sVHlwZSIsICJOb25lIiwgImlzVG9vbENvbXBhdGlibGUiLCAiX2l0ZW1TdGFjayIsICJoYXJkbmVzcyIsICJnZXRCcmVha1RpbWUiLCAiaXRlbVN0YWNrIiwgIk1hdGgiLCAiY2VpbCIsICJnZXRJdGVtU3RhY2siLCAiaXRlbVBhbGV0dGUiLCAicmVzb2x2ZVR5cGUiLCAiSXRlbVN0YWNrIiwgImFib3ZlIiwgInN0ZXBzIiwgImdldEJsb2NrIiwgInkiLCAiYmVsb3ciLCAibm9ydGgiLCAic291dGgiLCAiZWFzdCIsICJ3ZXN0IiwgImZhY2UiLCAiQmxvY2tGYWNlIiwgIlRvcCIsICJCb3R0b20iLCAiTm9ydGgiLCAiU291dGgiLCAiRWFzdCIsICJXZXN0IiwgImludGVyYWN0IiwgInBsYXllciIsICJQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbCIsICJnZXRIZWxkSXRlbSIsICJlbWl0IiwgInZhbHVlcyIsICJvbkludGVyYWN0IiwgImRlc3Ryb3kiLCAiY2FuY2VsZWQiLCAic3VjY2VzcyIsICJvbkJyZWFrIiwgInVuZGVmaW5lZCIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJTdXJ2aXZhbCIsICJkcm9wIiwgImRyb3BzIiwgIkJsb2NrSWRlbnRpZmllciIsICJBaXIiLCAiYW1vdW50IiwgInJvbGwiLCAiaXRlbUVudGl0eSIsICJzcGF3bkl0ZW0iLCAiVmVjdG9yM2YiLCAidmVsb2NpdHkiLCAicmFuZG9tIiwgImFkZE1vdGlvbiIsICJMZXZlbEV2ZW50UGFja2V0IiwgImV2ZW50IiwgIkxldmVsRXZlbnQiLCAiUGFydGljbGVzRGVzdHJveUJsb2NrIiwgInRvVmVjdG9yM2YiLCAiZGF0YSIsICJCbG9ja1Blcm11dGF0aW9uIiwgInJlc29sdmUiLCAiZ2V0RGF0YUVudHJ5IiwgImVudHJpZXMiLCAib3ZlcndyaXRlIiwgInZhbHVlIiwgInRyYWl0VHlwZSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkNvbnRhaW5lciIsICJ0eXBlIiwgImlkZW50aWZpZXIiLCAic2l6ZSIsICJzdG9yYWdlIiwgIm9jY3VwYW50cyIsICJTZXQiLCAiZW1wdHlTbG90c0NvdW50IiwgIkFycmF5IiwgImZyb20iLCAibGVuZ3RoIiwgImNhbGN1bGF0ZUVtcHR5U2xvdENvdW50IiwgImZpbHRlciIsICJpdGVtIiwgImdldEl0ZW0iLCAic2xvdCIsICJzZXRJdGVtIiwgImFtb3VudCIsICJjbGVhclNsb3QiLCAiY29udGFpbmVyIiwgInVwZGF0ZSIsICJhZGRJdGVtIiwgImZpbmRJbmRleCIsICJtYXhBbW91bnQiLCAiZXF1YWxzIiwgIm1heGVkIiwgInN0YWNrYWJsZSIsICJleGlzdGluZ0l0ZW0iLCAiTWF0aCIsICJtaW4iLCAiaW5jcmVtZW50IiwgImRlY3JlbWVudCIsICJlbXB0eVNsb3QiLCAiaW5kZXhPZiIsICJuZXdJdGVtIiwgIkl0ZW1TdGFjayIsICJyZW1vdmVJdGVtIiwgInJlbW92ZWQiLCAidGFrZUl0ZW0iLCAia2V5IiwgInZhbHVlIiwgImNvbXBvbmVudHMiLCAic2V0IiwgInRyYWl0IiwgInRyYWl0cyIsICJ2YWx1ZXMiLCAiY2xvbmUiLCAidGFnIiwgIm5idCIsICJhZGQiLCAic3dhcEl0ZW1zIiwgIm90aGVyU2xvdCIsICJvdGhlckNvbnRhaW5lciIsICJ0YXJnZXRDb250YWluZXIiLCAib3RoZXJJdGVtIiwgInBhY2tldCIsICJJbnZlbnRvcnlTbG90UGFja2V0IiwgImNvbnRhaW5lcklkIiwgIk5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yIiwgImZ1bGxDb250YWluZXJOYW1lIiwgIkZ1bGxDb250YWluZXJOYW1lIiwgInN0b3JhZ2VJdGVtIiwgInBsYXllciIsICJzZW5kIiwgImNsZWFyIiwgImkiLCAiSW52ZW50b3J5Q29udGVudFBhY2tldCIsICJpdGVtcyIsICJtYXAiLCAidG9OZXR3b3JrU3RhY2siLCAic2hvdyIsICJvcGVuZWRDb250YWluZXIiLCAiY2xvc2UiLCAib25Db250YWluZXJPcGVuIiwgImhhcyIsICJFcnJvciIsICJDb250YWluZXJDbG9zZVBhY2tldCIsICJDb250YWluZXJUeXBlIiwgIk5vbmUiLCAic2VydmVySW5pdGlhdGVkIiwgImRlbGV0ZSIsICJvbkNvbnRhaW5lckNsb3NlIiwgIkJsb2NrQ29udGFpbmVyIiwgIkNvbnRhaW5lciIsICJibG9jayIsICJ0eXBlIiwgImlkZW50aWZpZXIiLCAic2l6ZSIsICJzZXRJdGVtIiwgInNsb3QiLCAiaXRlbVN0YWNrIiwgIndvcmxkIiwgImdldFdvcmxkIiwgImluaXRpYWxpemUiLCAidXBkYXRlIiwgInBsYXllciIsICJ0cmFpdCIsICJ0cmFpdHMiLCAidmFsdWVzIiwgIm9uQ29udGFpbmVyVXBkYXRlIiwgInJlYXNvbiIsICJ4IiwgInkiLCAieiIsICJwb3NpdGlvbiIsICJsb2dnZXIiLCAiZXJyb3IiLCAiZ2V0VHlwZSIsICJkaW1lbnNpb24iLCAiZGVsZXRlIiwgInNob3ciLCAiUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsIiwgImVtaXQiLCAicGFja2V0IiwgIkNvbnRhaW5lck9wZW5QYWNrZXQiLCAidW5pcXVlSWQiLCAiQ29udGFpbmVyVHlwZSIsICJzZW5kIiwgIkJsb2NrVHJhaXRzIiwgIkFycmF5IiwgImtleSIsICJUcmFpdHMiLCAidHJhaXQiLCAicHVzaCIsICJEZWZhdWx0SXRlbVR5cGVQcm9wZXJ0aWVzIiwgInN0YWNrYWJsZSIsICJtYXhBbW91bnQiLCAidG9vbCIsICJJdGVtVG9vbFR5cGUiLCAiTm9uZSIsICJ0aWVyIiwgIkl0ZW1Ub29sVGllciIsICJ0YWdzIiwgImJsb2NrIiwgIkl0ZW1UeXBlIiwgInR5cGVzIiwgIk1hcCIsICJpZGVudGlmaWVyIiwgIm5ldHdvcmsiLCAicHJvcGVydGllcyIsICJwcm9wcyIsICJpc1Rvb2wiLCAiZ2V0IiwgImdldEJ5TmV0d29yayIsICJ2YWx1ZXMiLCAiZmluZCIsICJpdGVtIiwgImdldEFsbCIsICJyZXNvbHZlIiwgInR5cGUiLCAidG9JdGVtRGF0YSIsICJuYW1lIiwgIm5ldHdvcmtJZCIsICJjb21wb25lbnRCYXNlZCIsICJ0b05ldHdvcmtJbnN0YW5jZSIsICJzdGFja1NpemUiLCAibWV0YWRhdGEiLCAibmV0d29ya0Jsb2NrSWQiLCAiZ2V0UGVybXV0YXRpb24iLCAiZXh0cmFzIiwgImNhbkRlc3Ryb3kiLCAiY2FuUGxhY2VPbiIsICJuYnQiLCAiaW1wb3J0X25idCIsICJDcmVhdGl2ZUl0ZW0iLCAiaXRlbXMiLCAiTWFwIiwgInR5cGUiLCAibWV0YWRhdGEiLCAibmJ0IiwgIkNvbXBvdW5kVGFnIiwgInJlZ2lzdGVyIiwgImluZGV4IiwgInNpemUiLCAic2V0IiwgImRhdGFTdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgIklURU1EQVRBIiwgImRhdGEiLCAiSXRlbURhdGEiLCAicmVhZCIsICJpdGVtIiwgIm1ldGEiLCAiSVRFTV9UWVBFUyIsICJmaW5kIiwgInR5cGUiLCAiaWRlbnRpZmllciIsICJuYW1lIiwgInRvb2wiLCAiVE9PTF9UWVBFUyIsICJ0eXBlcyIsICJpbmNsdWRlcyIsICJpbmRleCIsICJpbmRleE9mIiwgImxldmVsIiwgInVuZGVmaW5lZCIsICJJdGVtVG9vbFRpZXIiLCAiTm9uZSIsICJibG9ja1R5cGUiLCAiQmxvY2tUeXBlIiwgImdldCIsICJJdGVtVHlwZSIsICJuZXR3b3JrSWQiLCAic3RhY2thYmxlIiwgIm1heEFtb3VudCIsICJuZXR3b3JrIiwgInRpZXIiLCAidGFncyIsICJibG9jayIsICJzZXQiLCAiY3JlYXRpdmVTdHJlYW0iLCAiQ1JFQVRJVkVfQ09OVEVOVCIsICJjcmVhdGl2ZSIsICJDcmVhdGl2ZUl0ZW1zIiwgImVudHJpZXMiLCAidmFsdWVzIiwgIm1ldGFkYXRhIiwgIm5idCIsICJleHRyYXMiLCAiQ3JlYXRpdmVJdGVtIiwgIml0ZW1zIiwgIkN1c3RvbUl0ZW1UeXBlIiwgIkl0ZW1UeXBlIiwgIm5ldHdvcmtJZCIsICJjdXN0b20iLCAiaWRlbnRpZmllciIsICJwcm9wZXJ0aWVzIiwgIkNyZWF0aXZlSXRlbSIsICJyZWdpc3RlciIsICJFbnVtIiwgImVudW1zIiwgIk1hcCIsICJpZGVudGlmaWVyIiwgInR5cGUiLCAic3ltYm9sIiwgImRlZmF1bHQiLCAib3B0aW9uYWwiLCAicmVzdWx0IiwgIl9hcmd1bWVudHMiLCAidmFsaWRhdGUiLCAiX2Vycm9yIiwgIkVycm9yIiwgImV4dHJhY3QiLCAiX3BvaW50ZXIiLCAiVmFsaWRFbnVtIiwgIkVudW0iLCAidHlwZSIsICJTdHJpbmdFbnVtIiwgIlZhbGlkRW51bSIsICJpZGVudGlmaWVyIiwgInN5bWJvbCIsICJ0eXBlIiwgIm9wdGlvbnMiLCAic3RyaWN0IiwgInJlc3VsdCIsICJ2YWxpZGF0ZSIsICJfZXJyb3IiLCAiVHlwZUVycm9yIiwgImV4dHJhY3QiLCAicG9pbnRlciIsICJwZWVrIiwgIm5leHQiLCAiSW50ZWdlckVudW0iLCAiVmFsaWRFbnVtIiwgImlkZW50aWZpZXIiLCAic3ltYm9sIiwgInR5cGUiLCAicmVzdWx0IiwgInZhbGlkYXRlIiwgIl9lcnJvciIsICJUeXBlRXJyb3IiLCAiZXh0cmFjdCIsICJwb2ludGVyIiwgInBlZWsiLCAibmV4dCIsICJUYXJnZXRFbnVtIiwgIlZhbGlkRW51bSIsICJpZGVudGlmaWVyIiwgInN5bWJvbCIsICJ0eXBlIiwgInJlc3VsdCIsICJ2YWxpZGF0ZSIsICJlcnJvciIsICJFcnJvciIsICJleHRyYWN0IiwgInBvaW50ZXIiLCAidGFyZ2V0IiwgIm5leHQiLCAib3JpZ2luIiwgInN0YXRlIiwgIkVudGl0eSIsICJkaW1lbnNpb24iLCAic3RhcnRzV2l0aCIsICJnZXRQbGF5ZXJzIiwgInNvbWUiLCAieCIsICJ1c2VybmFtZSIsICJzbGljZSIsICJxdWVyeSIsICJsZW5ndGgiLCAiZW5kc1dpdGgiLCAicXVlcmllcyIsICJzcGxpdCIsICJmbGF0TWFwIiwgImRhdGEiLCAia2V5IiwgInZhbHVlIiwgInBsYXllcnMiLCAiZmlsdGVyIiwgInBsYXllciIsICJuYW1lIiwgIm5lZ2F0ZSIsICJ0YWciLCAiaGFzVGFnIiwgIlR5cGVFcnJvciIsICJlbnRpdGllcyIsICJnZXRFbnRpdGllcyIsICJlbnRpdHkiLCAiaGFzVHJhaXQiLCAiRW50aXR5TmFtZVRhZ1RyYWl0IiwgInRyYWl0IiwgImdldFRyYWl0IiwgImdldE5hbWVUYWciLCAicGFyc2VkIiwgImluY2x1ZGVzIiwgIlBsYXllciIsICJNYXRoIiwgImZsb29yIiwgInJhbmRvbSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiUG9zaXRpb25FbnVtIiwgIlZhbGlkRW51bSIsICJuYW1lIiwgInN5bWJvbCIsICJ0eXBlIiwgInJlc3VsdCIsICJ2YWxpZGF0ZSIsICJlcnJvciIsICJFcnJvciIsICJleHRyYWN0IiwgInBvaW50ZXIiLCAieCIsICJuZXh0IiwgIk51bWJlciIsICJpc05hTiIsICJzdGFydHNXaXRoIiwgInkiLCAieiIsICJ4c3RlcHMiLCAic2xpY2UiLCAieXN0ZXBzIiwgInpzdGVwcyIsICJzdGF0ZSIsICJvcmlnaW4iLCAiRW50aXR5IiwgImVudGl0eSIsICJleCIsICJleSIsICJleiIsICJwb3NpdGlvbiIsICJueCIsICJueSIsICJueiIsICJWZWN0b3IzZiIsICJTb2Z0RW51bSIsICJFbnVtIiwgInR5cGUiLCAiQ3VzdG9tRW51bSIsICJTb2Z0RW51bSIsICJpZGVudGlmaWVyIiwgInN5bWJvbCIsICJ0eXBlIiwgIm9wdGlvbnMiLCAic3RyaWN0IiwgInJlc3VsdCIsICJ2YWxpZGF0ZSIsICJlcnJvciIsICJUeXBlRXJyb3IiLCAiam9pbiIsICJpbmNsdWRlcyIsICJleHRyYWN0IiwgInBvaW50ZXIiLCAicGVlayIsICJuZXh0IiwgIkJvb2xlYW5FbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgInN0cmljdCIsICJyZXN1bHQiLCAidG9TdHJpbmciLCAidmFsaWRhdGUiLCAiZXJyb3IiLCAiVHlwZUVycm9yIiwgImpvaW4iLCAiZXh0cmFjdCIsICJwb2ludGVyIiwgInBlZWsiLCAibmV4dCIsICJHYW1lbW9kZUVudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiaW1wb3J0X3Byb3RvY29sIiwgImlkZW50aWZpZXJzIiwgIk9iamVjdCIsICJ2YWx1ZXMiLCAiQWJpbGl0eUluZGV4IiwgImZpbHRlciIsICJpZCIsICJBYmlsaXR5RW51bSIsICJDdXN0b21FbnVtIiwgIm5hbWUiLCAib3B0aW9ucyIsICJpZGVudGlmaWVycyIsICJCbG9ja1R5cGUiLCAiZ2V0QWxsIiwgIm1hcCIsICJibG9jayIsICJpZGVudGlmaWVyIiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAiQmxvY2tFbnVtIiwgIkN1c3RvbUVudW0iLCAib3B0aW9ucyIsICJpZGVudGlmaWVycyIsICJFbnRpdHlUeXBlIiwgImdldEFsbCIsICJtYXAiLCAiZW50aXR5IiwgImlkZW50aWZpZXIiLCAic3RhcnRzV2l0aCIsICJzbGljZSIsICJFbnRpdHlFbnVtIiwgIkN1c3RvbUVudW0iLCAib3B0aW9ucyIsICJpZGVudGlmaWVycyIsICJJdGVtVHlwZSIsICJnZXRBbGwiLCAibWFwIiwgIml0ZW0iLCAiaWRlbnRpZmllciIsICJzdGFydHNXaXRoIiwgInNsaWNlIiwgIkl0ZW1FbnVtIiwgIkN1c3RvbUVudW0iLCAib3B0aW9ucyIsICJUYWdFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIldvcmxkRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJDb21tYW5kIiwgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAicmVnaXN0cnkiLCAiY2FsbGJhY2siLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9wcm90b2NvbCIsICJDb21tYW5kUmVnaXN0cnkiLCAib3ZlcmxvYWRzIiwgIk1hcCIsICJkZWJ1ZyIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJOb3JtYWwiLCAib3ZlcmxvYWQiLCAib3B0aW9ucyIsICJjYWxsYmFjayIsICJzZXQiLCAiQ29tbWFuZHMiLCAiY29tbWFuZHMiLCAiTWFwIiwgImdldEFsbCIsICJ2YWx1ZXMiLCAiZ2V0IiwgIm5hbWUiLCAic3RhcnRzV2l0aCIsICJzbGljZSIsICJzcGxpdCIsICJyZWdpc3RlciIsICJkZXNjcmlwdGlvbiIsICJyZWdpc3RyeSIsICJjYWxsYmFjayIsICJyZWdJbnN0YW5jZSIsICJDb21tYW5kUmVnaXN0cnkiLCAiZXhlY0NhbGxiYWNrIiwgImNvbW1hbmQiLCAiQ29tbWFuZCIsICJzZXQiLCAidW5yZWdpc3RlciIsICJkZWxldGUiLCAic2VyaWFsaXplIiwgInBhY2tldCIsICJBdmFpbGFibGVDb21tYW5kc1BhY2tldCIsICJkeW5hbWljRW51bXMiLCAibWFwIiwgInBlcm1pc3Npb25MZXZlbCIsICJzdWJjb21tYW5kcyIsICJmbGFncyIsICJkZWJ1ZyIsICJhbGlhcyIsICJvdmVybG9hZHMiLCAia2V5cyIsICJvdmVybG9hZCIsICJjaGFpbmluZyIsICJwYXJhbWV0ZXJzIiwgIk9iamVjdCIsICJlbnRyaWVzIiwgInZhbHVlIiwgImVubSIsICJBcnJheSIsICJpc0FycmF5IiwgInN5bWJvbCIsICJ0eXBlIiwgIlNvZnRFbnVtIiwgIm9wdGlvbnMiLCAibGVuZ3RoIiwgInB1c2giLCAib3B0aW9uYWwiLCAiY2hhaW5lZFN1YmNvbW1hbmRWYWx1ZXMiLCAiZW51bUNvbnN0cmFpbnRzIiwgImVudW1WYWx1ZXMiLCAiZW51bXMiLCAicG9zdEZpeGVzIiwgIkNvbW1hbmRBcmd1bWVudFBvaW50ZXIiLCAiYXJndW1lbnRzIiwgInN0YXRlIiwgIm9mZnNldCIsICJhcmd1bWVudHNfIiwgInBlZWsiLCAibmV4dCIsICJDb21tYW5kRXhlY3V0aW9uU3RhdGUiLCAic3BsaXQiLCAiY29tbWFuZCIsICJvcmlnaW4iLCAiY29tbWFuZHMiLCAic291cmNlIiwgInBhcnNlIiwgIm5hbWUiLCAic2hpZnQiLCAiZmluZCIsICJleGVjdXRlIiwgIlR5cGVFcnJvciIsICJnbG9iYWxDb250ZXh0IiwgIm92ZXJsb2FkIiwgImNhbGxiYWNrIiwgInJlZ2lzdHJ5IiwgIm92ZXJsb2FkcyIsICJjb250ZXh0IiwgImtleSIsICJ2YWx1ZSIsICJBcnJheSIsICJpc0FycmF5IiwgInR5cGUiLCAib3B0aW9uYWwiLCAibGVuZ3RoIiwgInZhbHVlXyIsICJleHRyYWN0IiwgImRlZmF1bHQiLCAiT2JqZWN0IiwgImFzc2lnbiIsICJrZXlzIiwgIl8iLCAiZW50cmllcyIsICJFbnVtIiwgInJlc3VsdCIsICJ2YWxpZGF0ZSIsICJyZWdleCIsICJtYXRjaCIsICJleGVjIiwgInB1c2giLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJnYW1lbW9kZSIsICJHYW1lbW9kZUVudW0iLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAiY29udGV4dCIsICJ0YXJnZXRzIiwgInZhbGlkYXRlIiwgInJlc3VsdCIsICJvcmlnaW4iLCAiUGxheWVyIiwgImxlbmd0aCIsICJFcnJvciIsICJsb2dzIiwgIkdhbWVtb2RlIiwgIlN1cnZpdmFsIiwgIkNyZWF0aXZlIiwgIkFkdmVudHVyZSIsICJTcGVjdGF0b3IiLCAiVHlwZUVycm9yIiwgInB1c2giLCAidXNlcm5hbWUiLCAibWVzc2FnZSIsICJqb2luIiwgImdhbWVtb2RlX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJhYmlsaXR5IiwgIkFiaWxpdHlFbnVtIiwgImVuYWJsZWQiLCAiQm9vbGVhbkVudW0iLCAiY29udGV4dCIsICJ0YXJnZXRzIiwgInJlc3VsdCIsICJpbmRleCIsICJBYmlsaXR5SW5kZXgiLCAibWVzc2FnZSIsICJlbnRpdHkiLCAiaXNQbGF5ZXIiLCAicHVzaCIsICJ1bmlxdWVJZCIsICJhYmlsaXRpZXMiLCAic2V0IiwgImpvaW4iLCAiYWJpbGl0eV9kZWZhdWx0IiwgImltcG9ydF9wcm90b2NvbCIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAiaXRlbSIsICJJdGVtRW51bSIsICJtZXRhZGF0YSIsICJJbnRlZ2VyRW51bSIsICJhbW91bnQiLCAiY29udGV4dCIsICJ0YXJnZXRzIiwgInJlc3VsdCIsICJpdGVtUmVzdWx0IiwgIml0ZW1JZGVudGlmaWVyIiwgImluY2x1ZGVzIiwgInVuZGVmaW5lZCIsICJpdGVtTWV0YWRhdGEiLCAiaXRlbUFtb3VudCIsICJpdGVtQ291bnQiLCAibGVuZ3RoIiwgIm1lc3NhZ2UiLCAiaGFzVHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiY29udGFpbmVyIiwgImdldFRyYWl0IiwgImNsZWFyIiwgInNsb3QiLCAiaXRlbVN0YWNrIiwgIk9iamVjdCIsICJlbnRyaWVzIiwgInN0b3JhZ2UiLCAidHlwZSIsICJpZGVudGlmaWVyIiwgImF1eGlsbGFyeSIsICJzdGFja0Ftb3VudCIsICJyZW1haW5pbmciLCAiY2xlYXJTbG90IiwgIk51bWJlciIsICJwYXJzZUludCIsICJzZXRBbW91bnQiLCAiTWF0aCIsICJtYXgiLCAibWluIiwgImNsZWFyX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJmcm9tIiwgIlBvc2l0aW9uRW51bSIsICJ0byIsICJibG9jayIsICJCbG9ja0VudW0iLCAiY29udGV4dCIsICJyZXN1bHQiLCAiaWRlbnRpZmllciIsICJpbmNsdWRlcyIsICJmbG9vciIsICJkaW1lbnNpb24iLCAib3JpZ2luIiwgIkVudGl0eSIsICJ0eXBlIiwgImJsb2NrUGFsZXR0ZSIsICJyZXNvbHZlVHlwZSIsICJmaWxsIiwgImdldFBlcm11dGF0aW9uIiwgImZpbGxfZGVmYXVsdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgInRhcmdldCIsICJUYXJnZXRFbnVtIiwgIml0ZW0iLCAiSXRlbUVudW0iLCAiYW1vdW50IiwgIkludGVnZXJFbnVtIiwgIm1ldGFkYXRhIiwgImNvbnRleHQiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAiaXRlbVJlc3VsdCIsICJpdGVtSWRlbnRpZmllciIsICJpbmNsdWRlcyIsICJhdXhpbGxhcnkiLCAiaXNQbGF5ZXIiLCAiaXRlbVN0YWNrIiwgIkl0ZW1TdGFjayIsICJnZXRXb3JsZCIsICJjb250YWluZXIiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiYWRkSXRlbSIsICJtZXNzYWdlIiwgImxlbmd0aCIsICJnaXZlX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJyZWFzb24iLCAiU3RyaW5nRW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgImxlbmd0aCIsICJFcnJvciIsICJQbGF5ZXIiLCAiZGlzY29ubmVjdCIsICJEaXNjb25uZWN0UmVhc29uIiwgIktpY2tlZCIsICJraWNrX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJwb3NpdGlvbiIsICJQb3NpdGlvbkVudW0iLCAiYmxvY2siLCAiQmxvY2tFbnVtIiwgImNvbnRleHQiLCAicmVzdWx0IiwgImlkZW50aWZpZXIiLCAiaW5jbHVkZXMiLCAiZmxvb3IiLCAib3JpZ2luIiwgIkVudGl0eSIsICJkaW1lbnNpb24iLCAiZ2V0QmxvY2siLCAidHlwZSIsICJibG9ja1BhbGV0dGUiLCAicmVzb2x2ZVR5cGUiLCAic2V0VHlwZSIsICJtZXNzYWdlIiwgIngiLCAieSIsICJ6IiwgInNldGJsb2NrX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJvcGVyYXRpb24iLCAiVGFnRW51bSIsICJ0YWciLCAiU3RyaW5nRW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgIm1lc3NhZ2UiLCAiZW50aXR5IiwgImFkZFRhZyIsICJwdXNoIiwgInVuaXF1ZUlkIiwgInJlbW92ZVRhZyIsICJ0YWdzIiwgImdldFRhZ3MiLCAibGVuZ3RoIiwgImpvaW4iLCAidGFnX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9lbWl0dGVyIiwgImVmZmVjdHNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJCbGluZG5lc3NFZmZlY3QiLCAiRGFya25lc3NFZmZlY3QiLCAiRWZmZWN0IiwgIkZhdGFsUG9pc29uRWZmZWN0IiwgIkluc3RhbnREYW1hZ2VFZmZlY3QiLCAiSW5zdGFudEhlYWx0aEVmZmVjdCIsICJJbnZpc2liaWxpdHlFZmZlY3QiLCAiTmF1c2Vhc0VmZmVjdCIsICJOaWdodFZpc2lvbkVmZmVjdCIsICJQb2lzb25FZmZlY3QiLCAiUmVnZW5lcmF0aW9uRWZmZWN0IiwgIlNsb3duZXNzRWZmZWN0IiwgIlNwZWVkRWZmZWN0IiwgIldhdGVyQnJlYXRoaW5nRWZmZWN0IiwgIldpdGhlckVmZmVjdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRWZmZWN0IiwgInR5cGUiLCAiaW5zdGFudCIsICJjb2xvciIsICJDb2xvciIsICJkdXJhdGlvbiIsICJhbXBsaWZpZXIiLCAic2hvd1BhcnRpY2xlcyIsICJPYmplY3QiLCAiZ2V0UHJvdG90eXBlT2YiLCAidG9TdHJpbmciLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiZWZmZWN0VHlwZSIsICJpc0V4cGlyZWQiLCAiaW1wb3J0X3Byb3RvY29sIiwgIlJlZ2VuZXJhdGlvbkVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIlJlZ2VuZXJhdGlvbiIsICJjb2xvciIsICJDb2xvciIsICJvblRpY2siLCAiZW50aXR5IiwgImVudGl0eUhlYWx0aCIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJ0aWNrc1BlclNlY29uZCIsICJNYXRoIiwgIm1heCIsICJhbXBsaWZpZXIiLCAiTnVtYmVyIiwgImdldFdvcmxkIiwgImN1cnJlbnRUaWNrIiwgInNldCIsICJjdXJyZW50VmFsdWUiLCAiaW1wb3J0X3Byb3RvY29sIiwgIlBvaXNvbkVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIlBvaXNvbiIsICJpbnN0YW50IiwgImNvbG9yIiwgIkNvbG9yIiwgIm9uVGljayIsICJlbnRpdHkiLCAidGlja3NQZXJTZWNvbmQiLCAiTWF0aCIsICJmbG9vciIsICJtYXgiLCAicG93IiwgImFtcGxpZmllciIsICJtaW4iLCAiTnVtYmVyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJpc1BsYXllciIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJlbnRpdHlIZWFsdGgiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SGVhbHRoVHJhaXQiLCAiY3VycmVudFZhbHVlIiwgImFwcGx5RGFtYWdlIiwgInVuZGVmaW5lZCIsICJBY3RvckRhbWFnZUNhdXNlIiwgIk1hZ2ljIiwgImltcG9ydF9wcm90b2NvbCIsICJOaWdodFZpc2lvbkVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIk5pZ2h0VmlzaW9uIiwgImNvbG9yIiwgIkNvbG9yIiwgImltcG9ydF9wcm90b2NvbCIsICJJbnN0YW50RGFtYWdlRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiSW5zdGFudERhbWFnZSIsICJpbnN0YW50IiwgIm9uQWRkIiwgImVudGl0eSIsICJpc1BsYXllciIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJoZWFsdGhUcmFpdCIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJhcHBseURhbWFnZSIsICJhbXBsaWZpZXIiLCAidW5kZWZpbmVkIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiTWFnaWMiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkluc3RhbnRIZWFsdGhFZmZlY3QiLCAiRWZmZWN0IiwgInR5cGUiLCAiRWZmZWN0VHlwZSIsICJJbnN0YW50SGVhbHRoIiwgImluc3RhbnQiLCAib25BZGQiLCAiZW50aXR5IiwgImhlYWx0aFRyYWl0IiwgImdldFRyYWl0IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImN1cnJlbnRIZWFsdGgiLCAiY3VycmVudFZhbHVlIiwgImVmZmVjdGl2ZU1heCIsICJzZXQiLCAiTWF0aCIsICJtaW4iLCAiYW1wbGlmaWVyIiwgImltcG9ydF9wcm90b2NvbCIsICJCbGluZG5lc3NFZmZlY3QiLCAiRWZmZWN0IiwgInR5cGUiLCAiRWZmZWN0VHlwZSIsICJCbGluZG5lc3MiLCAiY29sb3IiLCAiQ29sb3IiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkRhcmtuZXNzRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiRGFya25lc3MiLCAiY29sb3IiLCAiQ29sb3IiLCAiaW1wb3J0X3Byb3RvY29sIiwgIk5hdXNlYXNFZmZlY3QiLCAiRWZmZWN0IiwgInR5cGUiLCAiRWZmZWN0VHlwZSIsICJOYXVzZWEiLCAiY29sb3IiLCAiQ29sb3IiLCAiaW1wb3J0X3Byb3RvY29sIiwgIlNwZWVkRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiU3BlZWQiLCAiY29sb3IiLCAiQ29sb3IiLCAib25BZGQiLCAiZW50aXR5IiwgIm1vdmVtZW50VHJhaXQiLCAiZ2V0VHJhaXQiLCAiRW50aXR5TW92ZW1lbnRUcmFpdCIsICJzZXQiLCAiY3VycmVudFZhbHVlIiwgImFtcGxpZmllciIsICJvblJlbW92ZSIsICJkZWZhdWx0VmFsdWUiLCAiaW1wb3J0X3Byb3RvY29sIiwgIldpdGhlckVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIldpdGhlciIsICJjb2xvciIsICJDb2xvciIsICJvblRpY2siLCAiZW50aXR5IiwgInRpY2tzUGVyU2Vjb25kIiwgIk1hdGgiLCAibWF4IiwgInBvdyIsICJhbXBsaWZpZXIiLCAiTnVtYmVyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJpc1BsYXllciIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJhcHBseURhbWFnZSIsICJ1bmRlZmluZWQiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJNYWdpYyIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRmF0YWxQb2lzb25FZmZlY3QiLCAiRWZmZWN0IiwgInR5cGUiLCAiRWZmZWN0VHlwZSIsICJGYXRhbFBvaXNvbiIsICJjb2xvciIsICJDb2xvciIsICJvblRpY2siLCAiZW50aXR5IiwgInRpY2tzUGVyU2Vjb25kIiwgIk1hdGgiLCAiZmxvb3IiLCAibWF4IiwgInBvdyIsICJhbXBsaWZpZXIiLCAibWluIiwgIk51bWJlciIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiY3VycmVudFRpY2siLCAiaXNQbGF5ZXIiLCAiZ2FtZW1vZGUiLCAiR2FtZW1vZGUiLCAiQ3JlYXRpdmUiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SGVhbHRoVHJhaXQiLCAiYXBwbHlEYW1hZ2UiLCAidW5kZWZpbmVkIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiTWFnaWMiLCAiaW1wb3J0X3Byb3RvY29sIiwgIlNsb3duZXNzRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiU2xvd25lc3MiLCAiY29sb3IiLCAiQ29sb3IiLCAib25BZGQiLCAiZW50aXR5IiwgIm1vdmVtZW50VHJhaXQiLCAiZ2V0VHJhaXQiLCAiRW50aXR5TW92ZW1lbnRUcmFpdCIsICJzZXQiLCAiY3VycmVudFZhbHVlIiwgImFtcGxpZmllciIsICJvblJlbW92ZSIsICJkZWZhdWx0VmFsdWUiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkludmlzaWJpbGl0eUVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIkludmlzaWJpbGl0eSIsICJjb2xvciIsICJDb2xvciIsICJvbkFkZCIsICJlbnRpdHkiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SW52aXNpYmlsaXR5VHJhaXQiLCAic2V0SW52aXNpYmlsaXR5IiwgIm9uUmVtb3ZlIiwgImltcG9ydF9wcm90b2NvbCIsICJXYXRlckJyZWF0aGluZ0VmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIldhdGVyQnJlYXRoaW5nIiwgImNvbG9yIiwgIkNvbG9yIiwgIkVmZmVjdFBhbGxldGUiLCAiZWZmZWN0cyIsICJNYXAiLCAiZWZmZWN0IiwgIkVudGl0eUVmZmVjdHMiLCAicmVnaXN0ZXJFZmZlY3QiLCAic2V0IiwgInR5cGUiLCAiZ2V0RWZmZWN0IiwgImdldCIsICJnZXRBbGxFZmZlY3RzIiwgInZhbHVlcyIsICJyZW1vdmVFZmZlY3QiLCAiZGVsZXRlIiwgIkVudGl0eUVmZmVjdHMiLCAia2V5IiwgIkVmZmVjdHMiLCAiZWZmZWN0IiwgInB1c2giLCAiaW1wb3J0X3Byb3RvY29sIiwgIlRpY2tTY2hlZHVsZSIsICJzY2hlZHVsZWRUaWNrIiwgImNvbXBsZXRlVGljayIsICJjYWxsYmFja3MiLCAiU2V0IiwgIndvcmxkT3JEaW1lbnNpb24iLCAiQmlnSW50IiwgImN1cnJlbnRUaWNrIiwgIkRpbWVuc2lvbiIsICJ3b3JsZCIsICJleGVjdXRlIiwgImNhbGxiYWNrIiwgIm9uIiwgImFkZCIsICJjYW5jZWwiLCAiY2xlYXIiLCAiRGVmYXVsdERpbWVuc2lvblByb3BlcnRpZXMiLCAiaWRlbnRpZmllciIsICJ0eXBlIiwgIkRpbWVuc2lvblR5cGUiLCAiT3ZlcndvcmxkIiwgImdlbmVyYXRvciIsICJ2aWV3RGlzdGFuY2UiLCAic2ltdWxhdGlvbkRpc3RhbmNlIiwgInNwYXduUG9zaXRpb24iLCAiRGltZW5zaW9uIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAid29ybGQiLCAiZW50aXRpZXMiLCAiTWFwIiwgImJsb2NrcyIsICJ2YWx1ZSIsICJwb3NpdGlvbiIsICJWZWN0b3IzZiIsICJmcm9tQXJyYXkiLCAieSIsICJibG9jayIsICJnZXRUb3Btb3N0QmxvY2siLCAieCIsICJ6IiwgImdldEdlbmVyYXRvciIsICJFcnJvciIsICJzZWVkIiwgImluZGV4T2YiLCAiZGltZW5zaW9ucyIsICJ2YWx1ZXMiLCAib25UaWNrIiwgImRlbHRhVGljayIsICJnZXRQbGF5ZXJzIiwgImxlbmd0aCIsICJwbGF5ZXJQb3NpdGlvbnMiLCAibWFwIiwgInBsYXllciIsICJlbnRpdHkiLCAic29tZSIsICJkaXN0YW5jZSIsICJ0cmFpdCIsICJ0cmFpdHMiLCAicmVhc29uIiwgImxvZ2dlciIsICJlcnJvciIsICJ1bmlxdWVJZCIsICJkZWxldGUiLCAiaGFzVHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiY29udGFpbmVyIiwgImdldFRyYWl0IiwgIml0ZW0iLCAic3RvcmFnZSIsICJnZXRXb3JsZCIsICJnZXRDaHVuayIsICJjeCIsICJjeiIsICJwcm92aWRlciIsICJyZWFkQ2h1bmsiLCAic2V0Q2h1bmsiLCAiY2h1bmsiLCAiUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCIsICJjaHVua3MiLCAiaGFzIiwgImhhc2giLCAic2VuZCIsICJ3cml0ZUNodW5rIiwgImdldEJsb2NrIiwgImJsb2NrUG9zaXRpb24iLCAiQmxvY2tQb3NpdGlvbiIsICJmcm9tIiwgImdldCIsICJwZXJtdXRhdGlvbiIsICJnZXRQZXJtdXRhdGlvbiIsICJCbG9jayIsICJibG9ja1BhbGV0dGUiLCAiZ2V0UmVnaXN0cnkiLCAiY29tcG9uZW50cyIsICJwdXNoIiwgImtleSIsICJPYmplY3QiLCAia2V5cyIsICJzdGF0ZSIsICJnZXRBbGxUcmFpdHMiLCAiYWRkVHJhaXQiLCAic2l6ZSIsICJzZXQiLCAidG9wTGV2ZWwiLCAiZ2V0VG9wbW9zdExldmVsIiwgInNlbmRNZXNzYWdlIiwgIm1lc3NhZ2UiLCAicGFja2V0IiwgIlRleHRQYWNrZXQiLCAiVGV4dFBhY2tldFR5cGUiLCAiUmF3IiwgIm5lZWRzVHJhbnNsYXRpb24iLCAic291cmNlIiwgInBhcmFtZXRlcnMiLCAieHVpZCIsICJwbGF0Zm9ybUNoYXRJZCIsICJmaWx0ZXJlZCIsICJicm9hZGNhc3QiLCAiZmlsdGVyIiwgImlzUGxheWVyIiwgImdldEVudGl0eSIsICJpZCIsICJydW50aW1lSWQiLCAiZmluZCIsICJnZXRFbnRpdGllcyIsICJmaWxsIiwgInRvIiwgIm1pblgiLCAiTWF0aCIsICJtaW4iLCAibWluWSIsICJtaW5aIiwgIm1heFgiLCAibWF4IiwgIm1heFkiLCAibWF4WiIsICJ1cGRhdGVkQ2h1bmtzIiwgIlNldCIsICJzZXRQZXJtdXRhdGlvbiIsICJhZGQiLCAiZGlydHkiLCAic3Bhd25FbnRpdHkiLCAiRW50aXR5IiwgIkVudGl0eUdyYXZpdHlUcmFpdCIsICJFbnRpdHlQaHlzaWNzVHJhaXQiLCAiRW50aXR5TW92ZW1lbnRUcmFpdCIsICJzcGF3biIsICJzcGF3bkl0ZW0iLCAiaXRlbVN0YWNrIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiSXRlbSIsICJFbnRpdHlJdGVtU3RhY2tUcmFpdCIsICJleGVjdXRlQ29tbWFuZCIsICJjb21tYW5kIiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAiQ29tbWFuZEV4ZWN1dGlvblN0YXRlIiwgImNvbW1hbmRzIiwgImdldEFsbCIsICJleGVjdXRlIiwgInNjaGVkdWxlIiwgInRpY2tzIiwgIlRpY2tTY2hlZHVsZSIsICJzY2hlZHVsZXMiLCAicGFja2V0cyIsICJicm9hZGNhc3RJbW1lZGlhdGUiLCAic2VuZEltbWVkaWF0ZSIsICJicm9hZGNhc3RFeGNlcHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiU2NvcmVib2FyZElkZW50aXR5IiwgIklERU5USUZJRVIiLCAiaWRlbnRpZmllciIsICJ0eXBlIiwgImRpc3BsYXlOYW1lIiwgImVudGl0eSIsICJ2YWx1ZSIsICJFbnRpdHkiLCAiaXNQbGF5ZXIiLCAiU2NvcmVib2FyZElkZW50aXR5VHlwZSIsICJQbGF5ZXIiLCAidXNlcm5hbWUiLCAicnVudGltZUlkIiwgIkZha2VQbGF5ZXIiLCAiU2NvcmVib2FyZE9iamVjdGl2ZSIsICJ3b3JsZCIsICJzY29yZWJvYXJkIiwgInBhcnRpY2lwYW50cyIsICJNYXAiLCAib2JqZWN0aXZlTmFtZSIsICJkaXNwbGF5TmFtZSIsICJoYXNQYXJ0aWNpcGFudCIsICJwYXJ0aWNpcGFudCIsICJpZGVudGl0eSIsICJTY29yZWJvYXJkSWRlbnRpdHkiLCAiRW50aXR5IiwgImVudGl0eSIsICJnZXRQYXJ0aWNpcGFudCIsICJnZXRQYXJ0aWNpcGFudHMiLCAia2V5cyIsICJhZGRQYXJ0aWNpcGFudCIsICJpbml0aWFsU2NvcmUiLCAiRXJyb3IiLCAic2NvcmVib2FyZElkZW50aXR5IiwgInNldCIsICJyZW1vdmVQYXJ0aWNpcGFudCIsICJkZWxldGUiLCAicGFja2V0IiwgIlNldFNjb3JlUGFja2V0IiwgInR5cGUiLCAiU2NvcmVib2FyZEFjdGlvblR5cGUiLCAiUmVtb3ZlIiwgImVudHJpZXMiLCAic2NvcmVib2FyZElkIiwgImlkZW50aWZpZXIiLCAic2NvcmUiLCAiaWRlbnRpdHlUeXBlIiwgImFjdG9yVW5pcXVlSWQiLCAiY3VzdG9tTmFtZSIsICJicm9hZGNhc3QiLCAic2V0U2NvcmUiLCAiQ2hhbmdlIiwgInVuaXF1ZUlkIiwgImFkZFNjb3JlIiwgIm5ld1Njb3JlIiwgImdldCIsICJnZXRTY29yZSIsICJjbGVhclNjb3JlcyIsICJtYXAiLCAiY2xlYXIiLCAiU2NvcmVib2FyZCIsICJ3b3JsZCIsICJvYmplY3RpdmVzIiwgIlNldCIsICJzbG90cyIsICJNYXAiLCAiZ2V0T2JqZWN0aXZlIiwgIm5hbWUiLCAib2JqZWN0aXZlIiwgIm9iamVjdGl2ZU5hbWUiLCAiYWRkT2JqZWN0aXZlIiwgImRpc3BsYXkiLCAiRXJyb3IiLCAiU2NvcmVib2FyZE9iamVjdGl2ZSIsICJhZGQiLCAicmVtb3ZlT2JqZWN0aXZlIiwgImRPYmplY3RpdmUiLCAiZGVsZXRlIiwgImdldE9iamVjdGl2ZUF0RGlzcGxheVNsb3QiLCAic2xvdCIsICJnZXQiLCAic2V0T2JqZWN0aXZlQXREaXNwbGF5U2xvdCIsICJvcHRpb25zIiwgInNvcnRPcmRlciIsICJwbGF5ZXIiLCAiU2V0RGlzcGxheU9iamVjdGl2ZVBhY2tldCIsICJkaXNwbGF5U2xvdCIsICJkaXNwbGF5TmFtZSIsICJjcml0ZXJpYU5hbWUiLCAic2NvcmVzIiwgIlNldFNjb3JlUGFja2V0IiwgInR5cGUiLCAiU2NvcmVib2FyZEFjdGlvblR5cGUiLCAiQ2hhbmdlIiwgImVudHJpZXMiLCAicGFydGljaXBhbnRzIiwgIm1hcCIsICJpZGVudGl0eSIsICJzY29yZSIsICJzY29yZWJvYXJkSWQiLCAiaWRlbnRpZmllciIsICJpZGVudGl0eVR5cGUiLCAiYWN0b3JVbmlxdWVJZCIsICJlbnRpdHkiLCAidW5pcXVlSWQiLCAiY3VzdG9tTmFtZSIsICJzZW5kIiwgImJyb2FkY2FzdCIsICJzZXQiLCAiY2xlYXJPYmplY3RpdmVBdERpc3BsYXlTbG90IiwgInBhY2tldCIsICJSZW1vdmVPYmplY3RpdmVQYWNrZXQiLCAiRGVmYXVsdFdvcmxkUHJvcGVydGllcyIsICJpZGVudGlmaWVyIiwgInNlZWQiLCAiTWF0aCIsICJmbG9vciIsICJyYW5kb20iLCAic2F2ZUludGVydmFsIiwgImRpbWVuc2lvbnMiLCAidHlwZSIsICJEaW1lbnNpb25UeXBlIiwgIk92ZXJ3b3JsZCIsICJnZW5lcmF0b3IiLCAidmlld0Rpc3RhbmNlIiwgInNpbXVsYXRpb25EaXN0YW5jZSIsICJzcGF3blBvc2l0aW9uIiwgIldvcmxkIiwgIkVtaXR0ZXIiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJwcm92aWRlciIsICJNYXAiLCAibG9nZ2VyIiwgImVudGl0eVBhbGV0dGUiLCAiRW50aXR5UGFsZXR0ZSIsICJlZmZlY3RQYWxldHRlIiwgIkVmZmVjdFBhbGxldGUiLCAiYmxvY2tQYWxldHRlIiwgIkJsb2NrUGFsZXR0ZSIsICJpdGVtUGFsZXR0ZSIsICJJdGVtUGFsZXR0ZSIsICJjb21tYW5kcyIsICJDb21tYW5kcyIsICJzY2hlZHVsZXMiLCAiU2V0IiwgInNjb3JlYm9hcmQiLCAiU2NvcmVib2FyZCIsICJjdXJyZW50VGljayIsICJkYXlUaW1lIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiR3JlZW5CcmlnaHQiLCAiY29tbWFuZCIsICJBZG1pbkNvbW1hbmRzIiwgIkNvbW1vbkNvbW1hbmRzIiwgImVudHJ5IiwgImNyZWF0ZURpbWVuc2lvbiIsICJvblRpY2siLCAiZGVsdGFUaWNrIiwgImdldFBsYXllcnMiLCAibGVuZ3RoIiwgIldvcmxkVGlja1NpZ25hbCIsICJCaWdJbnQiLCAiZW1pdCIsICJkaW1lbnNpb24iLCAidmFsdWVzIiwgInJlYXNvbiIsICJlcnJvciIsICJwYWNrZXQiLCAiU2V0VGltZVBhY2tldCIsICJ0aW1lIiwgImJyb2FkY2FzdCIsICJzaXplIiwgInNjaGVkdWxlIiwgImNvbXBsZXRlVGljayIsICJleGVjdXRlIiwgImRlbGV0ZSIsICJvblNhdmUiLCAiZGltZW5zaW9uUHJvcGVydGllcyIsICJEZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcyIsICJoYXMiLCAiRGltZW5zaW9uIiwgInNldCIsICJkZWJ1ZyIsICJzZW5kTWVzc2FnZSIsICJtZXNzYWdlIiwgIlRleHRQYWNrZXQiLCAiVGV4dFBhY2tldFR5cGUiLCAiUmF3IiwgIm5lZWRzVHJhbnNsYXRpb24iLCAic291cmNlIiwgInBhcmFtZXRlcnMiLCAieHVpZCIsICJwbGF0Zm9ybUNoYXRJZCIsICJmaWx0ZXJlZCIsICJnZXREaW1lbnNpb24iLCAidW5kZWZpbmVkIiwgIm5leHQiLCAidmFsdWUiLCAiZ2V0IiwgImdldERpbWVuc2lvbnMiLCAiZmxhdE1hcCIsICJnZXRFbnRpdGllcyIsICJ0aWNrcyIsICJUaWNrU2NoZWR1bGUiLCAiYWRkIiwgInBhY2tldHMiLCAicGxheWVyIiwgInNlbmQiLCAiYnJvYWRjYXN0SW1tZWRpYXRlIiwgInNlbmRJbW1lZGlhdGUiLCAiYnJvYWRjYXN0RXhjZXB0IiwgIm90aGVyIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X25idCIsICJCbG9ja1N0b3JhZ2UiLCAiTUFYX1giLCAiTUFYX1kiLCAiTUFYX1oiLCAiTUFYX1NJWkUiLCAicGFsZXR0ZSIsICJibG9ja3MiLCAiYWlyIiwgInBlcm11dGF0aW9uIiwgIkJsb2NrUGVybXV0YXRpb24iLCAicmVzb2x2ZSIsICJCbG9ja0lkZW50aWZpZXIiLCAiQWlyIiwgIm5ldHdvcmsiLCAiQXJyYXkiLCAiZnJvbSIsICJsZW5ndGgiLCAiaXNFbXB0eSIsICJnZXRTdGF0ZSIsICJieCIsICJieSIsICJieiIsICJpbmRleCIsICJnZXRJbmRleCIsICJwYWxldHRlSW5kZXgiLCAic2V0U3RhdGUiLCAic3RhdGUiLCAiaW5kZXhPZiIsICJwdXNoIiwgInNlcmlhbGl6ZSIsICJzdG9yYWdlIiwgInN0cmVhbSIsICJuYnQiLCAiYml0c1BlckJsb2NrIiwgIk1hdGgiLCAiY2VpbCIsICJsb2cyIiwgIndyaXRlQnl0ZSIsICJibG9ja3NQZXJXb3JkIiwgImZsb29yIiwgIndvcmRDb3VudCIsICJ3IiwgIndvcmQiLCAiYmxvY2siLCAib2Zmc2V0IiwgIndyaXRlSW50MzIiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAid3JpdGVaaWdaYWciLCAicGVybXV0YXRpb25zIiwgImdldCIsICJFcnJvciIsICJkYXRhIiwgInRvTmJ0IiwgIkNvbXBvdW5kVGFnIiwgIndyaXRlIiwgImRlc2VyaWFsaXplIiwgInBhbGV0dGVBbmRGbGFnIiwgInJlYWRCeXRlIiwgIl9pc1J1bnRpbWUiLCAid29yZHMiLCAicmVhZEludDMyIiwgInBhbGV0dGVTaXplIiwgInJlYWRaaWdaYWciLCAicmVhZCIsICJmcm9tTmJ0IiwgInZhbHVlT2YiLCAicG9zaXRpb24iLCAieCIsICJ5IiwgInoiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJTdWJDaHVuayIsICJ2ZXJzaW9uIiwgImxheWVycyIsICJpbmRleCIsICJpc0VtcHR5IiwgInN0b3JhZ2UiLCAiZ2V0TGF5ZXIiLCAiaW5kZXhfIiwgIkJsb2NrU3RvcmFnZSIsICJnZXRTdGF0ZSIsICJieCIsICJieSIsICJieiIsICJsYXllciIsICJzZXRTdGF0ZSIsICJzdGF0ZSIsICJzZXJpYWxpemUiLCAic3ViY2h1bmsiLCAic3RyZWFtIiwgIm5idCIsICJ3cml0ZVVpbnQ4IiwgImxlbmd0aCIsICJFcnJvciIsICJ3cml0ZUludDgiLCAiZGVzZXJpYWxpemUiLCAicmVhZFVpbnQ4IiwgImNvdW50IiwgInJlYWRJbnQ4IiwgInB1c2giLCAiZnJvbSIsICJidWZmZXIiLCAiQmluYXJ5U3RyZWFtIiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkNodW5rIiwgIk1BWF9TVUJfQ0hVTktTIiwgInR5cGUiLCAieCIsICJ6IiwgImhhc2giLCAic3ViY2h1bmtzIiwgImNhY2hlIiwgImRpcnR5IiwgInJlYWR5IiwgIkNodW5rQ29vcmRzIiwgIkFycmF5IiwgImZyb20iLCAibGVuZ3RoIiwgImdldFBlcm11dGF0aW9uIiwgInBvc2l0aW9uIiwgInkiLCAieWYiLCAiRGltZW5zaW9uVHlwZSIsICJPdmVyd29ybGQiLCAic3RhdGUiLCAiZ2V0U3ViQ2h1bmsiLCAiZ2V0U3RhdGUiLCAiQmxvY2tQZXJtdXRhdGlvbiIsICJwZXJtdXRhdGlvbnMiLCAiZ2V0IiwgInNldFBlcm11dGF0aW9uIiwgInBlcm11dGF0aW9uIiwgInN1YmNodW5rIiwgIm5ldHdvcmsiLCAic2V0U3RhdGUiLCAiZ2V0VG9wbW9zdExldmVsIiwgImlkZW50aWZpZXIiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkFpciIsICJzb2xpZCIsICJnZXRCb3R0b21tb3N0TGV2ZWwiLCAiaW5kZXgiLCAibmRleCIsICJTdWJDaHVuayIsICJnZXRTdWJDaHVua1NlbmRDb3VudCIsICJjb3VudCIsICJpc0VtcHR5IiwgInNlcmlhbGl6ZSIsICJjaHVuayIsICJuYnQiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJ3cml0ZUJ5dGUiLCAid3JpdGVWYXJJbnQiLCAiZ2V0QnVmZmVyIiwgImRlc2VyaWFsaXplIiwgImJ1ZmZlciIsICJoZWFkZXIiLCAiYmluYXJ5IiwgIm9mZnNldCIsICJyZWFkQnl0ZSIsICJyZWFkVmFySW50IiwgIkRlZmF1bHRXb3JsZFByb3ZpZGVyUHJvcGVydGllcyIsICJwYXRoIiwgIldvcmxkUHJvdmlkZXIiLCAiaWRlbnRpZmllciIsICJjb25zdHJ1Y3RvciIsICJ3b3JsZCIsICJfcGFyYW1ldGVycyIsICJvblN0YXJ0dXAiLCAib25TaHV0ZG93biIsICJvblNhdmUiLCAicmVhZENodW5rIiwgIl9jeCIsICJfY3oiLCAiX2RpbWVuc2lvbiIsICJFcnJvciIsICJ3cml0ZUNodW5rIiwgIl9jaHVuayIsICJyZWFkQXZhaWxhYmxlRW50aXRpZXMiLCAid3JpdGVBdmFpbGFibGVFbnRpdGllcyIsICJfZW50aXRpZXMiLCAicmVhZEVudGl0eSIsICJfdW5pcXVlSWQiLCAid3JpdGVFbnRpdHkiLCAiX2VudGl0eSIsICJyZWFkUGxheWVyIiwgIl91dWlkIiwgIndyaXRlUGxheWVyIiwgIl9wbGF5ZXIiLCAicmVhZEF2YWlsYWJsZUJsb2NrcyIsICJ3cml0ZUF2YWlsYWJsZUJsb2NrcyIsICJfYmxvY2tzIiwgInJlYWRCbG9jayIsICJfaGFzaCIsICJ3cml0ZUJsb2NrIiwgIl9ibG9jayIsICJyZWFkUHJvcGVydHkiLCAiX2tleSIsICJ3cml0ZVByb3BlcnR5IiwgIl92YWx1ZSIsICJpbml0aWFsaXplIiwgIl9zZXJlbml0eSIsICJfcHJvcGVydGllcyIsICJjcmVhdGUiLCAiX3dvcmxkUHJvcGVydGllcyIsICJpbXBvcnRfcHJvdG9jb2wiLCAiSW50ZXJuYWxQcm92aWRlciIsICJXb3JsZFByb3ZpZGVyIiwgImlkZW50aWZpZXIiLCAiY2h1bmtzIiwgIk1hcCIsICJlbnRpdGllcyIsICJwbGF5ZXJzIiwgInByb3BlcnRpZXMiLCAicmVhZENodW5rIiwgImN4IiwgImN6IiwgImRpbWVuc2lvbiIsICJoYXMiLCAic2V0IiwgImdldCIsICJDaHVua0Nvb3JkcyIsICJoYXNoIiwgIngiLCAieiIsICJnZW5lcmF0b3IiLCAiYXBwbHkiLCAid3JpdGVDaHVuayIsICJjaHVuayIsICJnZXRBdmFpbGFibGVFbnRpdGllcyIsICJtYXAiLCAidW5pcXVlSWQiLCAicmVhZEVudGl0eSIsICJFcnJvciIsICJ3cml0ZUVudGl0eSIsICJlbnRpdHkiLCAicmVhZFBsYXllciIsICJ1dWlkIiwgIndyaXRlUGxheWVyIiwgInBsYXllciIsICJyZWFkUHJvcGVydHkiLCAia2V5IiwgInByb3BlcnR5IiwgInZhbHVlIiwgImVxdWFscyIsICJ0b1N0cmluZyIsICJ3cml0ZVByb3BlcnR5IiwgImluaXRpYWxpemUiLCAiY3JlYXRlIiwgInNlcmVuaXR5IiwgIl9wcm9wZXJ0aWVzIiwgIndvcmxkUHJvcGVydGllcyIsICJwcm92aWRlciIsICJ3b3JsZCIsICJXb3JsZCIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2xldmVsZGIiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkxldmVsREJQcm92aWRlciIsICJXb3JsZFByb3ZpZGVyIiwgImlkZW50aWZpZXIiLCAicGF0aCIsICJkYiIsICJjaHVua3MiLCAiTWFwIiwgIkxldmVsZGIiLCAib3BlbiIsICJyZXNvbHZlIiwgIm9uU2h1dGRvd24iLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImRpbWVuc2lvbnMiLCAidmFsdWVzIiwgImdlbmVyYXRvciIsICJ3b3JrZXIiLCAidGVybWluYXRlIiwgIm9uU2F2ZSIsICJjbG9zZSIsICJvblN0YXJ0dXAiLCAiZW50aXRpZXMiLCAicmVhZEF2YWlsYWJsZUVudGl0aWVzIiwgImJsb2NrcyIsICJyZWFkQXZhaWxhYmxlQmxvY2tzIiwgImxlbmd0aCIsICJ1bmlxdWVJZCIsICJlbnRyeSIsICJyZWFkRW50aXR5IiwgIkVudGl0eSIsICJzcGF3biIsICJoYXNoIiwgInJlYWRCbG9jayIsICJwZXJtdXRhdGlvbiIsICJibG9ja1BhbGV0dGUiLCAiZ2V0QWxsUGVybXV0YXRpb25zIiwgImZpbmQiLCAibmV0d29yayIsICJibG9jayIsICJCbG9jayIsICJCbG9ja1Bvc2l0aW9uIiwgInBvc2l0aW9uIiwgInNldCIsICJtYXAiLCAicHJvcGVydGllcyIsICJ3cml0ZUZpbGVTeW5jIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImNodW5rIiwgImRpcnR5IiwgIndyaXRlQ2h1bmsiLCAidW5pcXVlSWRzIiwgImVudGl0eSIsICJpc1BsYXllciIsICJ3cml0ZVBsYXllciIsICJnZXREYXRhRW50cnkiLCAid3JpdGVFbnRpdHkiLCAicHVzaCIsICJ3cml0ZUF2YWlsYWJsZUVudGl0aWVzIiwgImhhc2hlcyIsICJ3cml0ZUJsb2NrIiwgIndyaXRlQXZhaWxhYmxlQmxvY2tzIiwgImxvZ2dlciIsICJpbmZvIiwgInNpemUiLCAicmVhZENodW5rIiwgImN4IiwgImN6IiwgImhhcyIsICJnZXQiLCAiQ2h1bmtDb29yZHMiLCAieCIsICJ6IiwgImhhc0NodW5rIiwgInN1YmNodW5rcyIsICJBcnJheSIsICJjeSIsICJyZWFkU3ViQ2h1bmsiLCAiQ2h1bmsiLCAidHlwZSIsICJhcHBseSIsICJyZWFkeSIsICJDaHVua1JlYWR5U2lnbmFsIiwgImVtaXQiLCAiaXNFbXB0eSIsICJ3cml0ZUNodW5rVmVyc2lvbiIsICJzdWJjaHVuayIsICJnZXRTdWJDaHVuayIsICJ3cml0ZVN1YkNodW5rIiwgInZlcnNpb24iLCAia2V5IiwgImJ1aWxkQ2h1bmtWZXJzaW9uS2V5IiwgImluZGV4T2YiLCAicHV0IiwgIkJ1ZmZlciIsICJmcm9tIiwgImJ1aWxkU3ViQ2h1bmtLZXkiLCAiU3ViQ2h1bmsiLCAiaW5kZXgiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJzZXJpYWxpemUiLCAiZ2V0QnVmZmVyIiwgImJ1aWxkQWN0b3JMaXN0S2V5IiwgInJlYWRJbnQ2NCIsICJFbmRpYW5uZXNzIiwgIkxpdHRsZSIsICJjdXJzb3JBdEVuZCIsICJ3cml0ZUludDY0IiwgImluY2x1ZGVzIiwgIkVycm9yIiwgImJ1aWxkQWN0b3JEYXRhS2V5IiwgImJ1ZmZlciIsICJwYXJzZSIsICJ0b1N0cmluZyIsICJfIiwgInZhbHVlIiwgImVuZHNXaXRoIiwgIkJpZ0ludCIsICJzbGljZSIsICJJbmZpbml0eSIsICJOdW1iZXIiLCAiTmFOIiwgImRhdGEiLCAiaXNOYU4iLCAicmVhZFBsYXllciIsICJ1dWlkIiwgInBsYXllciIsICJidWlsZEJsb2NrRGF0YUxpc3RLZXkiLCAicmVhZFppZ1pvbmciLCAid3JpdGVaaWdab25nIiwgInVuaGFzaCIsICJidWlsZEJsb2NrRGF0YUtleSIsICJyZWFkUHJvcGVydHkiLCAid3JpdGVQcm9wZXJ0eSIsICJpbml0aWFsaXplIiwgInNlcmVuaXR5IiwgImV4aXN0c1N5bmMiLCAibWtkaXJTeW5jIiwgImRpcmVjdG9yaWVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJyZWdpc3RlcldvcmxkIiwgImNyZWF0ZSIsICJkaXJlY3RvcnkiLCAid29ybGRQYXRoIiwgIm5hbWUiLCAicmVhZEZpbGVTeW5jIiwgIldvcmxkIiwgInByb3ZpZGVyIiwgIldvcmxkSW5pdGlhbGl6ZVNpZ25hbCIsICJzeCIsICJzcGF3blBvc2l0aW9uIiwgInN6IiwgInZpZXdEaXN0YW5jZSIsICJhbW91bnQiLCAiY2FjaGUiLCAic3VjY2VzcyIsICJ3b3JsZFByb3BlcnRpZXMiLCAid3JpdGVJbnQzMiIsICJ3cml0ZUJ5dGUiLCAid3JpdGVCdWZmZXIiLCAid3JpdGVaaWdaYWciLCAieSIsICJEZWZhdWx0VGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMiLCAic2VlZCIsICJNYXRoIiwgImZsb29yIiwgInJhbmRvbSIsICJUZXJyYWluR2VuZXJhdG9yIiwgImlkZW50aWZpZXIiLCAiX3dvcmtlciIsICJjb25zdHJ1Y3RvciIsICJkaW1lbnNpb24iLCAid29ybGQiLCAicHJvcGVydGllcyIsICJxdWV1ZSIsICJNYXAiLCAid29ya2VyIiwgImluaXRpYWxpemUiLCAib24iLCAiY2h1bmsiLCAicHJvY2VzcyIsICJhcHBseSIsICJfY3giLCAiX2N6IiwgIkVycm9yIiwgImhhbmRvZmYiLCAic2V0IiwgImhhc2giLCAieCIsICJjeCIsICJ6IiwgImN6IiwgInR5cGUiLCAicG9zdE1lc3NhZ2UiLCAicXVldWVkIiwgImdldCIsICJzdWIiLCAic3ViY2h1bmtzIiwgInN1YmNodW5rIiwgImdldFN1YkNodW5rIiwgImluZGV4T2YiLCAibGF5IiwgImxheWVycyIsICJsYXllciIsICJnZXRMYXllciIsICJpbmRleCIsICJibG9jayIsICJibG9ja3MiLCAiZW50cmllcyIsICJwYWxldHRlIiwgInJlYWR5IiwgIkNodW5rUmVhZHlTaWduYWwiLCAiZW1pdCIsICJkZWxldGUiLCAiaW1wb3J0X25vZGVfd29ya2VyX3RocmVhZHMiLCAiVGVycmFpbldvcmtlciIsICJwYXRoIiwgIl9fZmlsZW5hbWUiLCAicHJvcGVydGllcyIsICJnZW5lcmF0b3IiLCAiaXNNYWluVGhyZWFkIiwgIkVycm9yIiwgImFwcGx5IiwgIl9jeCIsICJfY3oiLCAiX3R5cGUiLCAiaWRlbnRpZmllciIsICJpbml0aWFsaXplIiwgIl9wcm9wZXJ0aWVzIiwgIm5hbWUiLCAiaW1wb3J0X25vZGVfd29ya2VyX3RocmVhZHMiLCAiV29ya2VyIiwgImdlbmVyYXRvciIsICJ3b3JrZXIiLCAiX3dvcmtlciIsICJpbml0aWFsaXplIiwgInByb3BlcnRpZXMiLCAiaXNNYWluVGhyZWFkIiwgIkVycm9yIiwgIldvcmtlclRocmVhZCIsICJwYXRoIiwgIndvcmtlckRhdGEiLCAiaW5zdGFuY2UiLCAicGFyZW50UG9ydCIsICJvbiIsICJkYXRhIiwgImNodW5rIiwgImFwcGx5IiwgImN4IiwgImN6IiwgInR5cGUiLCAicG9zdE1lc3NhZ2UiLCAiaWRlbnRpZmllciIsICJWb2lkR2VuZXJhdG9yIiwgIlRlcnJhaW5HZW5lcmF0b3IiLCAiaWRlbnRpZmllciIsICJhcHBseSIsICJjeCIsICJjeiIsICJjaHVuayIsICJDaHVuayIsICJkaW1lbnNpb24iLCAidHlwZSIsICJzZXRQZXJtdXRhdGlvbiIsICJ4IiwgInkiLCAieiIsICJCbG9ja1Blcm11dGF0aW9uIiwgInJlc29sdmUiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkJlZHJvY2siLCAiU3VwZXJmbGF0R2VuZXJhdG9yIiwgIlRlcnJhaW5HZW5lcmF0b3IiLCAiaWRlbnRpZmllciIsICJhcHBseSIsICJjeCIsICJjeiIsICJjaHVuayIsICJDaHVuayIsICJkaW1lbnNpb24iLCAidHlwZSIsICJyZWFkeSIsICJoYW5kb2ZmIiwgIlN1cGVyZmxhdFdvcmtlciIsICJUZXJyYWluV29ya2VyIiwgInBhdGgiLCAiX19maWxlbmFtZSIsICJiZWRyb2NrIiwgIkJsb2NrUGVybXV0YXRpb24iLCAicmVzb2x2ZSIsICJCbG9ja0lkZW50aWZpZXIiLCAiQmVkcm9jayIsICJkaXJ0IiwgIkRpcnQiLCAiZ3Jhc3MiLCAiR3Jhc3NCbG9jayIsICJhcHBseSIsICJjeCIsICJjeiIsICJ0eXBlIiwgImNodW5rIiwgIkNodW5rIiwgIngiLCAieiIsICJ5IiwgInBvc2l0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJwb3NpdGlvbiIsICJQb3NpdGlvbkVudW0iLCAiY29udGV4dCIsICJvcmlnaW4iLCAiRGltZW5zaW9uIiwgIm1lc3NhZ2UiLCAicmVzdWx0IiwgInRlbGVwb3J0IiwgInRhcmdldCIsICJUYXJnZXRFbnVtIiwgImRlc3RpbmF0aW9uIiwgInRhcmdldHMiLCAibGVuZ3RoIiwgIkVycm9yIiwgInRwX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJhZGRyZXNzIiwgIlN0cmluZ0VudW0iLCAicG9ydCIsICJJbnRlZ2VyRW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgImxlbmd0aCIsICJFcnJvciIsICJtZXNzYWdlIiwgImlzUGxheWVyIiwgInB1c2giLCAidW5pcXVlSWQiLCAidHJhbnNmZXIiLCAidXNlcm5hbWUiLCAiam9pbiIsICJ0cmFuc2Zlcl9kZWZhdWx0IiwgImltcG9ydF9wcm90b2NvbCIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiZW50aXR5IiwgIkVudGl0eUVudW0iLCAiY29udGV4dCIsICJvcmlnaW4iLCAiRW50aXR5IiwgIkVycm9yIiwgImlkZW50aWZpZXIiLCAicmVzdWx0IiwgImluY2x1ZGVzIiwgIngiLCAieSIsICJ6IiwgInBvc2l0aW9uIiwgImZsb29yIiwgImRpbWVuc2lvbiIsICJzcGF3bkVudGl0eSIsICJWZWN0b3IzZiIsICJtZXNzYWdlIiwgIlBvc2l0aW9uRW51bSIsICJzdW1tb25fZGVmYXVsdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiSUdOT1JFRF9HQU1FTU9ERVMiLCAiU2V0IiwgIkdhbWVtb2RlIiwgIkNyZWF0aXZlIiwgIkNyZWF0aXZlU3BlY3RhdG9yIiwgIlNwZWN0YXRvciIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAiY29udGV4dCIsICJ2YWxpZGF0ZSIsICJ0YXJnZXRzIiwgInJlc3VsdCIsICJsZW5ndGgiLCAiRXJyb3IiLCAibWVzc2FnZSIsICJQbGF5ZXIiLCAiaGFzIiwgImdhbWVtb2RlIiwgInB1c2giLCAidXNlcm5hbWUiLCAia2lsbCIsICJ1bmRlZmluZWQiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJOb25lIiwgImlzUGxheWVyIiwgInVuaXF1ZUlkIiwgImpvaW4iLCAia2lsbF9kZWZhdWx0IiwgImltcG9ydF9wcm90b2NvbCIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAic2VyZW5pdHkiLCAic3RvcCIsICJzdG9wX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJXb3JsZEVudW0iLCAiZGltZW5zaW9uIiwgIlN0cmluZ0VudW0iLCAiY29udGV4dCIsICJzZXJlbml0eSIsICJvcmlnaW4iLCAiZ2V0V29ybGQiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAibGVuZ3RoIiwgIkVycm9yIiwgImdldERpbWVuc2lvbiIsICJtZXNzYWdlIiwgInRlbGVwb3J0IiwgInBvc2l0aW9uIiwgInB1c2giLCAiaXNQbGF5ZXIiLCAidXNlcm5hbWUiLCAidW5pcXVlSWQiLCAicHJvcGVydGllcyIsICJpZGVudGlmaWVyIiwgImpvaW4iLCAid29ybGRfZGVmYXVsdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgInRhcmdldCIsICJUYXJnZXRFbnVtIiwgImNvbnRleHQiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAibGVuZ3RoIiwgIkVycm9yIiwgIm1lc3NhZ2UiLCAiaXNQbGF5ZXIiLCAicHVzaCIsICJ1bmlxdWVJZCIsICJpc09wIiwgInVzZXJuYW1lIiwgIm9wIiwgImpvaW4iLCAib3BfZGVmYXVsdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgInRhcmdldCIsICJUYXJnZXRFbnVtIiwgImNvbnRleHQiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAibGVuZ3RoIiwgIkVycm9yIiwgIm1lc3NhZ2UiLCAiaXNQbGF5ZXIiLCAicHVzaCIsICJ1bmlxdWVJZCIsICJpc09wIiwgInVzZXJuYW1lIiwgImRlb3AiLCAiam9pbiIsICJkZW9wX2RlZmF1bHQiLCAiaW1wb3J0X3Byb3RvY29sIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJwcm92aWRlciIsICJvblNhdmUiLCAibWVzc2FnZSIsICJzYXZlX2RlZmF1bHQiLCAiQWRtaW5Db21tYW5kcyIsICJHYW1lbW9kZSIsICJBYmlsaXR5IiwgIkNsZWFyIiwgIkZpbGwiLCAiR2l2ZSIsICJLaWNrIiwgIlNldGJsb2NrIiwgIlRhZyIsICJUcCIsICJUcmFuc2ZlciIsICJTdW1tb24iLCAiS2lsbCIsICJTVE9QIiwgIldPUkxEIiwgIk9QIiwgIkRFT1AiLCAiU0FWRSIsICJpbXBvcnRfcHJvdG9jb2wiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgIm1lc3NhZ2UiLCAiTUlORUNSQUZUX1ZFUlNJT04iLCAiUFJPVE9DT0xfVkVSU0lPTiIsICJhYm91dF9kZWZhdWx0IiwgIkNvbW1vbkNvbW1hbmRzIiwgIkFib3V0IiwgImltcG9ydF9ub2RlX3JlYWRsaW5lIiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiQ29uc29sZUludGVyZmFjZSIsICJzZXJlbml0eSIsICJpbnRlcmZhY2UiLCAiY3JlYXRlSW50ZXJmYWNlIiwgImlucHV0IiwgInN0ZGluIiwgIm91dHB1dCIsICJzdGRvdXQiLCAidGVybWluYWwiLCAic2V0UmF3TW9kZSIsICJyZXN1bWUiLCAib24iLCAib25MaW5lIiwgImJpbmQiLCAic2V0UHJvbXB0IiwgImxpbmUiLCAiZm9ybWF0IiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAiY29tbWFuZCIsICJmbGFncyIsICJwYXJzZUZsYWdzIiwgImRpbWVuc2lvbkZsYWciLCAiZmluZCIsICJrZXkiLCAid29ybGRGbGFnIiwgIndvcmxkIiwgIndvcmxkcyIsICJnZXQiLCAibG9nZ2VyIiwgImVycm9yIiwgImRpbWVuc2lvbiIsICJnZXREaW1lbnNpb24iLCAiZXhlY3V0ZSIsICJleGVjdXRlQ29tbWFuZCIsICJtZXNzYWdlIiwgImluZm8iLCAicmVhc29uIiwgInN1Y2Nlc3MiLCAiZ2V0V29ybGQiLCAic3BsaXQiLCAibWFwIiwgImZsYWciLCAidmFsdWUiLCAiZW5kc1dpdGgiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJ0cmltIiwgIkl0ZW1QYWxldHRlIiwgInR5cGVzIiwgIkl0ZW1UeXBlIiwgImNyZWF0aXZlQ29udGVudCIsICJDcmVhdGl2ZUl0ZW0iLCAiaXRlbXMiLCAidHJhaXRzIiwgIk1hcCIsICJyZWdpc3RyeSIsICJ0cmFpdCIsICJJdGVtVHJhaXRzIiwgInJlZ2lzdGVyVHJhaXQiLCAiZ2V0QWxsVHlwZXMiLCAidmFsdWVzIiwgImdldFR5cGUiLCAiaWRlbnRpZmllciIsICJnZXQiLCAicmVzb2x2ZVR5cGUiLCAidHlwZSIsICJmaW5kIiwgIml0ZW0iLCAiYmxvY2siLCAicmVnaXN0ZXJUeXBlIiwgImhhcyIsICJzZXQiLCAiSXRlbUVudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImdldFJlZ2lzdHJ5IiwgImdldENyZWF0aXZlQ29udGVudCIsICJnZXRDcmVhdGl2ZUNvbnRlbnRCeUluZGV4IiwgImluZGV4IiwgInJlZ2lzdGVyQ3JlYXRpdmVDb250ZW50IiwgImF1eGlsbGFyeSIsICJzaXplIiwgInVucmVnaXN0ZXJDcmVhdGl2ZUNvbnRlbnQiLCAiZGVsZXRlIiwgImNsZWFyQ3JlYXRpdmVDb250ZW50IiwgImNsZWFyIiwgImdldEFsbFRyYWl0cyIsICJnZXRUcmFpdCIsICJ0cmFpdHNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJJdGVtQnVuZGxlVHJhaXQiLCAiSXRlbUVuY2hhbnRhYmxlVHJhaXQiLCAiSXRlbUVxdWlwcGFibGVUcmFpdCIsICJJdGVtVHJhaXQiLCAiSXRlbVRyYWl0IiwgIlRyYWl0IiwgInR5cGVzIiwgIml0ZW0iLCAiYWRkVHJhaXQiLCAiZXF1YWxzIiwgIm90aGVyIiwgImlkZW50aWZpZXIiLCAiY2xvbmUiLCAiY29tcG9uZW50IiwgImNvbnN0cnVjdG9yIiwgImtleSIsICJ2YWx1ZSIsICJPYmplY3QiLCAiZW50cmllcyIsICJpbXBvcnRfbmJ0IiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfbmJ0IiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiSXRlbVN0YWNrTmJ0TWFwIiwgIk1hcCIsICJpdGVtU3RhY2siLCAiZ2V0IiwgImtleSIsICJhZGQiLCAidmFsdWUiLCAicmVzdWx0IiwgInNldCIsICJuYW1lIiwgInVwZGF0ZSIsICJkZWxldGUiLCAiY2xlYXIiLCAidG9Db21wb3VuZCIsICJyb290IiwgIkNvbXBvdW5kVGFnIiwgIl8iLCAiYWRkVGFnIiwgImZyb21Db21wb3VuZCIsICJ0YWciLCAiZ2V0VGFncyIsICJzZXJpYWxpemUiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJ3cml0ZSIsICJnZXRCdWZmZXIiLCAiZGVzZXJpYWxpemUiLCAiYnVmZmVyIiwgInJlYWQiLCAiY29udGFpbmVyIiwgInNsb3QiLCAic3RvcmFnZSIsICJpbmRleE9mIiwgImFtb3VudCIsICJjbGVhclNsb3QiLCAic2V0SXRlbSIsICJEZWZhdWx0SXRlbVN0YWNrUHJvcGVydGllcyIsICJhbW91bnQiLCAiYXV4aWxsYXJ5IiwgIkl0ZW1TdGFjayIsICJ0eXBlIiwgImNvbXBvbmVudHMiLCAiTWFwIiwgInRyYWl0cyIsICJuYnQiLCAiSXRlbVN0YWNrTmJ0TWFwIiwgInN0YWNrYWJsZSIsICJtYXhBbW91bnQiLCAid29ybGQiLCAiY29udGFpbmVyIiwgImlkZW50aWZpZXIiLCAicHJvcGVydGllcyIsICJJdGVtVHlwZSIsICJnZXQiLCAicHJvcHMiLCAiZW50cnkiLCAibG9hZERhdGFFbnRyeSIsICJpbml0aWFsaXplIiwgIml0ZW1QYWxldHRlIiwgImdldFJlZ2lzdHJ5IiwgInRyYWl0IiwgImhhc1RyYWl0IiwgImFkZFRyYWl0IiwgInVwZGF0ZSIsICJzbG90IiwgInN0b3JhZ2UiLCAiaW5kZXhPZiIsICJjbGVhclNsb3QiLCAic2V0SXRlbSIsICJzZXRBbW91bnQiLCAiZGVjcmVtZW50IiwgImluY3JlbWVudCIsICJ1c2UiLCAicGxheWVyIiwgIm9wdGlvbnMiLCAiY2FuY2VsZWQiLCAidmFsdWVzIiwgInN1Y2Nlc3MiLCAib25Vc2UiLCAidW5kZWZpbmVkIiwgInJlYXNvbiIsICJnZXRXb3JsZCIsICJzZXJlbml0eSIsICJsb2dnZXIiLCAiZXJyb3IiLCAiZGltZW5zaW9uIiwgImRlbGV0ZSIsICJoYXMiLCAiZ2V0VHJhaXQiLCAicmVtb3ZlVHJhaXQiLCAib25SZW1vdmUiLCAid2FybiIsICJJdGVtVHJhaXQiLCAic2V0IiwgIm9uQWRkIiwgImluc3RhbmNlIiwgImVxdWFscyIsICJvdGhlciIsICJzaXplIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImVudHJpZXMiLCAib3RoZXJDb21wb25lbnRzIiwgIm90aGVyVHJhaXQiLCAia2V5IiwgInZhbHVlIiwgIm90aGVyVmFsdWUiLCAic25idCIsICJ2YWx1ZU9mIiwgIm90aGVyU25idCIsICJnZXREYXRhRW50cnkiLCAia2V5cyIsICJzZXJpYWxpemUiLCAidG9TdHJpbmciLCAib3ZlcndyaXRlIiwgIkVycm9yIiwgImNsZWFyIiwgInRyYWl0VHlwZSIsICJkZXNlcmlhbGl6ZSIsICJCdWZmZXIiLCAiZnJvbSIsICJ0b05ldHdvcmtJbnN0YW5jZSIsICJpdGVtIiwgInBlcm11dGF0aW9uIiwgImJsb2NrIiwgInBlcm11dGF0aW9ucyIsICJuZXR3b3JrIiwgInN0YWNrU2l6ZSIsICJtZXRhZGF0YSIsICJuZXR3b3JrQmxvY2tJZCIsICJleHRyYXMiLCAidG9Db21wb3VuZCIsICJjYW5EZXN0cm95IiwgImNhblBsYWNlT24iLCAidG9OZXR3b3JrU3RhY2siLCAic3RhY2tOZXRJZCIsICJmcm9tTmV0d29ya0luc3RhbmNlIiwgImRlc2NyaXB0b3IiLCAiZ2V0QnlOZXR3b3JrIiwgIkl0ZW1CdW5kbGVUcmFpdCIsICJJdGVtVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJJdGVtSWRlbnRpZmllciIsICJCdW5kbGUiLCAiQmx1ZUJ1bmRsZSIsICJCbGFja0J1bmRsZSIsICJCcm93bkJ1bmRsZSIsICJDeWFuQnVuZGxlIiwgIkdyYXlCdW5kbGUiLCAiR3JlZW5CdW5kbGUiLCAiTGlnaHRCbHVlQnVuZGxlIiwgIkxpZ2h0R3JheUJ1bmRsZSIsICJMaW1lQnVuZGxlIiwgIk1hZ2VudGFCdW5kbGUiLCAiT3JhbmdlQnVuZGxlIiwgIlBpbmtCdW5kbGUiLCAiUHVycGxlQnVuZGxlIiwgIlJlZEJ1bmRsZSIsICJXaGl0ZUJ1bmRsZSIsICJZZWxsb3dCdW5kbGUiLCAiY29udGFpbmVyIiwgIml0ZW0iLCAiY29tcG9uZW50cyIsICJoYXMiLCAiaWQiLCAiZ2V0IiwgInRhZyIsICJJbnRUYWciLCAibmJ0IiwgInNldCIsICJNYXRoIiwgImFicyIsICJEYXRlIiwgIm5vdyIsICJmbG9vciIsICJyYW5kb20iLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lclR5cGUiLCAiTm9uZSIsICJDb250YWluZXJJZCIsICJSZWdpc3RyeSIsICJkeW5hbWljSWQiLCAib25Db250YWluZXJPcGVuIiwgInBsYXllciIsICJvY2N1cGFudHMiLCAiYWRkIiwgIm9uQ29udGFpbmVyQ2xvc2UiLCAiZGVsZXRlIiwgIm9uVGljayIsICJjdXJyZW50VGljayIsICJ3b3JsZCIsICJzaXplIiwgInBhY2tldCIsICJJbnZlbnRvcnlDb250ZW50UGFja2V0IiwgImNvbnRhaW5lcklkIiwgInN0b3JhZ2VJdGVtIiwgIkl0ZW1TdGFjayIsICJ0b05ldHdvcmtTdGFjayIsICJmdWxsQ29udGFpbmVyTmFtZSIsICJGdWxsQ29udGFpbmVyTmFtZSIsICJDb250YWluZXJOYW1lIiwgIkR5bmFtaWMiLCAiaXRlbXMiLCAiQXJyYXkiLCAiZnJvbSIsICJzdG9yYWdlIiwgImkiLCAic3RhY2siLCAicHVzaCIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJvY2N1cGFudCIsICJzZW5kIiwgImltcG9ydF9wcm90b2NvbCIsICJJdGVtRXF1aXBwYWJsZVRyYWl0IiwgIkl0ZW1UcmFpdCIsICJpZGVudGlmaWVyIiwgInNsb3QiLCAiRXF1aXBtZW50U2xvdCIsICJDaGVzdCIsICJ0eXBlcyIsICJJdGVtSWRlbnRpZmllciIsICJEaWFtb25kQ2hlc3RwbGF0ZSIsICJvblVzZSIsICJwbGF5ZXIiLCAib3B0aW9ucyIsICJtZXRob2QiLCAiSXRlbVVzZU1ldGhvZCIsICJDbGljayIsICJ1bmRlZmluZWQiLCAicGxheWVyRXF1aXBtZW50IiwgImdldFRyYWl0IiwgIkVudGl0eUVxdWlwbWVudFRyYWl0IiwgInBsYXllckludmVudG9yeSIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJzb3VuZFBhY2tldCIsICJMZXZlbFNvdW5kRXZlbnRQYWNrZXQiLCAiZXZlbnQiLCAiTGV2ZWxTb3VuZEV2ZW50IiwgIkVxdWlwR2VuZXJpYyIsICJwb3NpdGlvbiIsICJhY3RvcklkZW50aWZpZXIiLCAidHlwZSIsICJkYXRhIiwgImlzQmFieU1vYiIsICJpc0dsb2JhbCIsICJzZW5kIiwgImNvbnRhaW5lciIsICJzd2FwSXRlbXMiLCAic2VsZWN0ZWRTbG90IiwgImltcG9ydF9uYnQiLCAiSXRlbUVuY2hhbnRhYmxlVHJhaXQiLCAiSXRlbVRyYWl0IiwgImlkZW50aWZpZXIiLCAiZ2V0RW5jaGFudG1lbnRzIiwgImVuY2giLCAiaXRlbSIsICJuYnQiLCAiZ2V0IiwgImVuY2hhbnRtZW50cyIsICJNYXAiLCAidmFsdWUiLCAic2V0IiwgImlkIiwgImx2bCIsICJnZXRFbmNoYW50bWVudCIsICJoYXNFbmNoYW50bWVudCIsICJhZGRFbmNoYW50bWVudCIsICJsZXZlbCIsICJDb21wb3VuZFRhZyIsICJjcmVhdGVTaG9ydFRhZyIsICJwdXNoIiwgImdldE5idCIsICJvbkFkZCIsICJoYXMiLCAiTGlzdFRhZyIsICJUYWciLCAiQ29tcG91bmQiLCAiYWRkIiwgIm9uUmVtb3ZlIiwgImRlbGV0ZSIsICJJdGVtVHJhaXRzIiwgIkFycmF5IiwgImtleSIsICJUcmFpdHMiLCAidHJhaXQiLCAicHVzaCIsICJ0cmFpdHNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJFbnRpdHlBaXJTdXBwbHlUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJFbnRpdHlDb2xsaXNpb24iLCAiRW50aXR5RWZmZWN0c1RyYWl0IiwgIkVudGl0eUVxdWlwbWVudFRyYWl0IiwgIkVudGl0eUdyYXZpdHlUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJFbnRpdHlJbnZpc2liaWxpdHlUcmFpdCIsICJFbnRpdHlJdGVtU3RhY2tUcmFpdCIsICJFbnRpdHlNb3ZlbWVudFRyYWl0IiwgIkVudGl0eU5hbWVUYWdUcmFpdCIsICJFbnRpdHlQaHlzaWNzVHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCIsICJQbGF5ZXJDdXJzb3JUcmFpdCIsICJQbGF5ZXJFbnRpdHlSZW5kZXJpbmdUcmFpdCIsICJQbGF5ZXJFeGhhdXN0aW9uVHJhaXQiLCAiUGxheWVySHVuZ2VyVHJhaXQiLCAiUGxheWVyTGlzdFRyYWl0IiwgIlBsYXllclNhdHVyYXRpb25UcmFpdCIsICJQbGF5ZXJUcmFpdCIsICJFbnRpdHlUcmFpdCIsICJUcmFpdCIsICJ0eXBlcyIsICJlbnRpdHkiLCAiYWRkVHJhaXQiLCAiY2xvbmUiLCAidHJhaXQiLCAiY29uc3RydWN0b3IiLCAiaWRlbnRpZmllciIsICJrZXkiLCAidmFsdWUiLCAiT2JqZWN0IiwgImVudHJpZXMiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkVudGl0eUF0dHJpYnV0ZVRyYWl0IiwgIkVudGl0eVRyYWl0IiwgImF0dHJpYnV0ZSIsICJlZmZlY3RpdmVNaW4iLCAiZWZmZWN0aXZlTWF4IiwgImRlZmF1bHRWYWx1ZSIsICJjdXJyZW50VmFsdWUiLCAiZ2V0IiwgImN1cnJlbnQiLCAidmFsdWUiLCAic2V0IiwgImVudGl0eSIsICJhdHRyaWJ1dGVzIiwgImluY3JlYXNlIiwgImFtb3VudCIsICJkZWNyZWFzZSIsICJwcm9wZXJ0aWVzIiwgIkF0dHJpYnV0ZSIsICJJbmZpbml0eSIsICJjb21wb25lbnRzIiwgImlkZW50aWZpZXIiLCAib25TcGF3biIsICJoYXMiLCAiZW5hYmxlZCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRW50aXR5TW92ZW1lbnRUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgImF0dHJpYnV0ZSIsICJBdHRyaWJ1dGVOYW1lIiwgIk1vdmVtZW50IiwgImVmZmVjdGl2ZU1pbiIsICJlZmZlY3RpdmVNYXgiLCAiZGVmYXVsdFZhbHVlIiwgIm9uVGljayIsICJlbnRpdHkiLCAiaXNNb3ZpbmciLCAicGFja2V0IiwgIk1vdmVBY3RvckRlbHRhUGFja2V0IiwgInJ1bnRpbWVJZCIsICJmbGFncyIsICJNb3ZlRGVsdGFGbGFncyIsICJBbGwiLCAieCIsICJwb3NpdGlvbiIsICJ5IiwgInoiLCAieWF3IiwgInJvdGF0aW9uIiwgImhlYWRZYXciLCAicGl0Y2giLCAiaXNQbGF5ZXIiLCAiaXNJdGVtIiwgIm9uR3JvdW5kIiwgIk9uR3JvdW5kIiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3RFeGNlcHQiLCAiYnJvYWRjYXN0IiwgImltcG9ydF9wcm90b2NvbCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgImF0dHJpYnV0ZSIsICJBdHRyaWJ1dGVOYW1lIiwgIkhlYWx0aCIsICJlZmZlY3RpdmVNaW4iLCAiZWZmZWN0aXZlTWF4IiwgImRlZmF1bHRWYWx1ZSIsICJhcHBseURhbWFnZSIsICJhbW91bnQiLCAiZGFtYWdlciIsICJjYXVzZSIsICJFbnRpdHlIdXJ0U2lnbmFsIiwgImVudGl0eSIsICJlbWl0IiwgImN1cnJlbnRWYWx1ZSIsICJwYWNrZXQiLCAiQWN0b3JFdmVudFBhY2tldCIsICJhY3RvclJ1bnRpbWVJZCIsICJydW50aW1lSWQiLCAiZXZlbnRJZCIsICJBY3RvckV2ZW50SWRzIiwgIkhVUlRfQU5JTUFUSU9OIiwgImV2ZW50RGF0YSIsICJBY3RvckRhbWFnZUNhdXNlIiwgIk5vbmUiLCAiZGltZW5zaW9uIiwgImJyb2FkY2FzdCIsICJraWxsIiwgInNldCIsICJ2YWx1ZSIsICJFbnRpdHlIZWFsdGhDaGFuZ2VkU2lnbmFsIiwgIm9uSW50ZXJhY3QiLCAicGxheWVyIiwgIm1ldGhvZCIsICJFbnRpdHlJbnRlcmFjdE1ldGhvZCIsICJBdHRhY2siLCAiYWJpbGl0aWVzIiwgImdldCIsICJBYmlsaXR5SW5kZXgiLCAiQXR0YWNrUGxheWVycyIsICJpc1BsYXllciIsICJBdHRhY2tNb2JzIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIkNyZWF0aXZlIiwgImhlYWRZYXciLCAicGl0Y2giLCAicm90YXRpb24iLCAiaGVhZFlhd1JhZCIsICJNYXRoIiwgIlBJIiwgInBpdGNoUmFkIiwgIngiLCAic2luIiwgImNvcyIsICJ5IiwgInoiLCAic2V0TW90aW9uIiwgIlZlY3RvcjNmIiwgIkVudGl0eUF0dGFjayIsICJQbGF5ZXJUcmFpdCIsICJFbnRpdHlUcmFpdCIsICJwbGF5ZXIiLCAiZW50aXR5IiwgImltcG9ydF9wcm90b2NvbCIsICJQbGF5ZXJDaHVua1JlbmRlcmluZ1RyYWl0IiwgIlBsYXllclRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiY2h1bmtzIiwgIlNldCIsICJ2aWV3RGlzdGFuY2UiLCAicGxheWVyIiwgImRpbWVuc2lvbiIsICJzZW5kIiwgImFtb3VudCIsICJsZW5ndGgiLCAiYmF0Y2hlcyIsICJNYXRoIiwgImNlaWwiLCAiaW5kZXgiLCAic3RhcnQiLCAiZW5kIiwgIm1pbiIsICJsZXZlbENodW5rcyIsICJzbGljZSIsICJtYXAiLCAiY2h1bmsiLCAiYWRkIiwgImhhc2giLCAicGFja2V0IiwgIkxldmVsQ2h1bmtQYWNrZXQiLCAieCIsICJ6IiwgInR5cGUiLCAic3ViQ2h1bmtDb3VudCIsICJnZXRTdWJDaHVua1NlbmRDb3VudCIsICJjYWNoZUVuYWJsZWQiLCAiZGF0YSIsICJDaHVuayIsICJzZXJpYWxpemUiLCAic2VudCIsICJoYXMiLCAiZGlzdGFuY2UiLCAiY3giLCAiY3oiLCAiQ2h1bmtDb29yZHMiLCAidW5oYXNoIiwgInB4IiwgInBvc2l0aW9uIiwgInB6IiwgImh5cG90IiwgIm5leHQiLCAiZCIsICJoYXNoZXMiLCAiZHgiLCAiZHoiLCAicHVzaCIsICJjbGVhciIsICJjb29yZHMiLCAiZW1wdHkiLCAiY29vcmQiLCAiZGVsZXRlIiwgIm9uVGljayIsICJpc0FsaXZlIiwgImZpbHRlciIsICJnZXRDaHVuayIsICJyZWFkeSIsICJ1cGRhdGUiLCAiTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0IiwgInJhZGl1cyIsICJjb29yZGluYXRlIiwgImZsb29yIiwgInNhdmVkQ2h1bmtzIiwgIm9uRGVzcGF3biIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9wcm90b2NvbCIsICJFbnRpdHlDb250YWluZXIiLCAiQ29udGFpbmVyIiwgImVudGl0eSIsICJ0eXBlIiwgImlkZW50aWZpZXIiLCAic2l6ZSIsICJzZXRJdGVtIiwgInNsb3QiLCAiaXRlbVN0YWNrIiwgIndvcmxkIiwgImdldFdvcmxkIiwgImluaXRpYWxpemUiLCAiaXNQbGF5ZXIiLCAidXBkYXRlIiwgImNsZWFyU2xvdCIsICJwbGF5ZXIiLCAidHJhaXQiLCAidHJhaXRzIiwgInZhbHVlcyIsICJvbkNvbnRhaW5lclVwZGF0ZSIsICJyZWFzb24iLCAibG9nZ2VyIiwgImVycm9yIiwgInVuaXF1ZUlkIiwgImRpbWVuc2lvbiIsICJkZWxldGUiLCAic2hvdyIsICJQbGF5ZXJPcGVuZWRDb250YWluZXJTaWduYWwiLCAiZW1pdCIsICJwYWNrZXQiLCAiQ29udGFpbmVyT3BlblBhY2tldCIsICJwb3NpdGlvbiIsICJzZW5kIiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiY29udGFpbmVyIiwgImNvbnRhaW5lclR5cGUiLCAiQ29udGFpbmVyVHlwZSIsICJJbnZlbnRvcnkiLCAiY29udGFpbmVySWQiLCAiQ29udGFpbmVySWQiLCAiaW52ZW50b3J5U2l6ZSIsICJzZWxlY3RlZFNsb3QiLCAiZW50aXR5IiwgIkVudGl0eUNvbnRhaW5lciIsICJnZXRIZWxkSXRlbSIsICJnZXRJdGVtIiwgInNldEhlbGRJdGVtIiwgInNsb3QiLCAiaXNQbGF5ZXIiLCAicGFja2V0IiwgIk1vYkVxdWlwbWVudFBhY2tldCIsICJoZWxkSXRlbSIsICJpdGVtRGVzY3JpcHRvciIsICJJdGVtU3RhY2siLCAidG9OZXR3b3JrU3RhY2siLCAiTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IiLCAicnVudGltZUVudGl0eUlkIiwgInJ1bnRpbWVJZCIsICJpdGVtIiwgInNlbmQiLCAib25TcGF3biIsICJjb21wb25lbnRzIiwgImhhcyIsICJpbnZlbnRvcnkiLCAiZ2V0IiwgIml0ZW1zIiwgImVudHJ5IiwgInN0YWNrIiwgImFtb3VudCIsICJhdXhpbGxhcnkiLCAid29ybGQiLCAiZ2V0V29ybGQiLCAic2V0SXRlbSIsICJ1cGRhdGUiLCAib25EZXNwYXduIiwgInNpemUiLCAiaSIsICJnZXREYXRhRW50cnkiLCAicHVzaCIsICJzZXQiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkVudGl0eUl0ZW1TdGFja1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAiYmlydGhUaWNrIiwgIml0ZW1TdGFjayIsICJsaWZlU3BhbiIsICJwaWNrdXBUaWNrIiwgInRhcmdldCIsICJtZXJnaW5nIiwgImVudGl0eSIsICJ0eXBlIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiSXRlbSIsICJFcnJvciIsICJlbnRyeSIsICJjb21wb25lbnRzIiwgImdldCIsICJJdGVtU3RhY2siLCAiSXRlbUlkZW50aWZpZXIiLCAiQWlyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJnZXRMaWZlU3BhbiIsICJzZXRMaWZlU3BhbiIsICJ2YWx1ZSIsICJwaWNrdXAiLCAicGxheWVyIiwgInRlbGVwb3J0IiwgInBvc2l0aW9uIiwgImluY3JlbWVudCIsICJhbW91bnQiLCAicGFja2V0IiwgIkFjdG9yRXZlbnRQYWNrZXQiLCAiZXZlbnRJZCIsICJBY3RvckV2ZW50SWRzIiwgIklURU1fRU5USVRZX01FUkdFIiwgImV2ZW50RGF0YSIsICJhY3RvclJ1bnRpbWVJZCIsICJydW50aW1lSWQiLCAiYnJvYWRjYXN0IiwgImRlY3JlbWVudCIsICJvblRpY2siLCAic2V0IiwgImdldERhdGFFbnRyeSIsICJjdXJyZW50IiwgIm9uR3JvdW5kIiwgImVudGl0aWVzIiwgImdldEVudGl0aWVzIiwgImZpbHRlciIsICJ4IiwgImlzSXRlbSIsICJpbmRleCIsICJlbnRyaWVzIiwgImxlbmd0aCIsICJkaXN0YW5jZSIsICJzdWJ0cmFjdCIsICJNYXRoIiwgImFicyIsICJ5IiwgInoiLCAiY29tcG9uZW50IiwgImdldFRyYWl0IiwgImV4aXN0aW5nSXRlbSIsICJtYXhBbW91bnQiLCAiZXF1YWxzIiwgImRlc3Bhd24iLCAidGFrZSIsICJUYWtlSXRlbUFjdG9yUGFja2V0IiwgIml0ZW1SdW50aW1lSWQiLCAidGFyZ2V0UnVudGltZUlkIiwgInNvdW5kIiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJldmVudCIsICJMZXZlbFNvdW5kRXZlbnQiLCAiUG9wIiwgImFjdG9ySWRlbnRpZmllciIsICJkYXRhIiwgImlzQmFieU1vYiIsICJpc0dsb2JhbCIsICJzZW5kIiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImNvbnRhaW5lciIsICJhZGRJdGVtIiwgInBsYXllcnMiLCAiZ2V0UGxheWVycyIsICJpdGVtIiwgImlzQWxpdmUiLCAiQmlnSW50IiwgIlBsYXllckVudGl0eVJlbmRlcmluZ1RyYWl0IiwgIlBsYXllclRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiZW50aXRpZXMiLCAiU2V0IiwgIm9uVGljayIsICJwbGF5ZXIiLCAiaXNBbGl2ZSIsICJjb21wb25lbnQiLCAiZ2V0VHJhaXQiLCAiUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCIsICJ2aWV3RGlzdGFuY2UiLCAiZGltZW5zaW9uIiwgInVuaXF1ZSIsICJlbnRpdHkiLCAiaGFzIiwgImRpc3RhbmNlIiwgInBvc2l0aW9uIiwgImFkZCIsICJpc1BsYXllciIsICJwYWNrZXQiLCAiQWRkUGxheWVyUGFja2V0IiwgImhlbGRJdGVtIiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImdldEhlbGRJdGVtIiwgInV1aWQiLCAidXNlcm5hbWUiLCAicnVudGltZUlkIiwgInBsYXRmb3JtQ2hhdElkIiwgIlN0cmluZyIsICJ2ZWxvY2l0eSIsICJwaXRjaCIsICJyb3RhdGlvbiIsICJ5YXciLCAiaGVhZFlhdyIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJJdGVtU3RhY2siLCAidG9OZXR3b3JrU3RhY2siLCAiZ2FtZW1vZGUiLCAiZGF0YSIsICJtZXRhZGF0YSIsICJ2YWx1ZXMiLCAicHJvcGVydGllcyIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgInVuaXF1ZUVudGl0eUlkIiwgInVuaXF1ZUlkIiwgInByZW1pc3Npb25MZXZlbCIsICJwZXJtaXNzaW9uIiwgImNvbW1hbmRQZXJtaXNzaW9uIiwgImFiaWxpdGllcyIsICJ0eXBlIiwgIkFiaWxpdHlMYXllclR5cGUiLCAiQmFzZSIsICJlbnRyaWVzIiwgIm1hcCIsICJhYmlsaXR5IiwgInZhbHVlIiwgIkFiaWxpdHlTZXQiLCAid2Fsa1NwZWVkIiwgImZseVNwZWVkIiwgImxpbmtzIiwgImRldmljZUlkIiwgImRldmljZU9TIiwgInNlbmQiLCAiaXNJdGVtIiwgIml0ZW1Db21wb25lbnQiLCAiRW50aXR5SXRlbVN0YWNrVHJhaXQiLCAiQWRkSXRlbUFjdG9yUGFja2V0IiwgIml0ZW0iLCAiaXRlbVN0YWNrIiwgImZyb21GaXNoaW5nIiwgIkFkZEVudGl0eVBhY2tldCIsICJib2R5WWF3IiwgImF0dHJpYnV0ZXMiLCAiZ2V0IiwgIlJlbW92ZUVudGl0eVBhY2tldCIsICJkZWxldGUiLCAib25EZXNwYXduIiwgImNsZWFyIiwgImEiLCAiYiIsICJNYXRoIiwgInNxcnQiLCAicG93IiwgIngiLCAieSIsICJ6IiwgImltcG9ydF9wcm90b2NvbCIsICJQbGF5ZXJMaXN0VHJhaXQiLCAiUGxheWVyVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJwbGF5ZXJzIiwgIlNldCIsICJjbGVhciIsICJyZW1vdmUiLCAiUGxheWVyTGlzdFBhY2tldCIsICJhY3Rpb24iLCAiUGxheWVyTGlzdEFjdGlvbiIsICJSZW1vdmUiLCAicmVjb3JkcyIsICJtYXAiLCAidXVpZCIsICJQbGF5ZXJMaXN0UmVjb3JkIiwgInBsYXllciIsICJzZW5kIiwgIm9uVGljayIsICJpc0FsaXZlIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJnZXRQbGF5ZXJzIiwgImFkZGluZyIsICJmaWx0ZXIiLCAiaGFzIiwgImFkZCIsICJBZGQiLCAidW5pcXVlSWQiLCAieHVpZCIsICJ1c2VybmFtZSIsICJza2luIiwgInBsYXRmb3JtQnVpbGQiLCAicGxhdGZvcm1DaGF0SWRlbnRpZmllciIsICJpc0hvc3QiLCAiaXNWaXNpdG9yIiwgImlzVGVhY2hlciIsICJyZW1vdmluZyIsICJzb21lIiwgIngiLCAibGVuZ3RoIiwgIm1ldGFkYXRhIiwgInVwZGF0ZSIsICJhYmlsaXRpZXMiLCAiZGVsZXRlIiwgIm9uRGVzcGF3biIsICJpbXBvcnRfcHJvdG9jb2wiLCAiUGxheWVyQ3Vyc29yVHJhaXQiLCAiUGxheWVyVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJjb250YWluZXIiLCAiY29udGFpbmVyVHlwZSIsICJDb250YWluZXJUeXBlIiwgIkludmVudG9yeSIsICJjb250YWluZXJJZCIsICJDb250YWluZXJJZCIsICJVaSIsICJpbnZlbnRvcnlTaXplIiwgInNlbGVjdGVkU2xvdCIsICJwbGF5ZXIiLCAiRW50aXR5Q29udGFpbmVyIiwgImltcG9ydF9wcm90b2NvbCIsICJQbGF5ZXJTYXR1cmF0aW9uVHJhaXQiLCAiRW50aXR5QXR0cmlidXRlVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJhdHRyaWJ1dGUiLCAiQXR0cmlidXRlTmFtZSIsICJQbGF5ZXJTYXR1cmF0aW9uIiwgImVmZmVjdGl2ZU1heCIsICJkZWZhdWx0VmFsdWUiLCAiZWZmZWN0aXZlTWluIiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiUGxheWVyRXhoYXVzdGlvblRyYWl0IiwgIkVudGl0eUF0dHJpYnV0ZVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiYXR0cmlidXRlIiwgIkF0dHJpYnV0ZU5hbWUiLCAiUGxheWVyRXhoYXVzdGlvbiIsICJlZmZlY3RpdmVNYXgiLCAiZGVmYXVsdFZhbHVlIiwgImVmZmVjdGl2ZU1pbiIsICJQbGF5ZXJIdW5nZXJUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgInN0YXJ2ZWFibGVHYW1lbW9kZXMiLCAiR2FtZW1vZGUiLCAiQWR2ZW50dXJlIiwgIlN1cnZpdmFsIiwgImVmZmVjdGl2ZU1heCIsICJlZmZlY3RpdmVNaW4iLCAiZGVmYXVsdFZhbHVlIiwgImF0dHJpYnV0ZSIsICJBdHRyaWJ1dGVOYW1lIiwgIlBsYXllckh1bmdlciIsICJleGhhdXN0aW9uVHJhaXQiLCAic2F0dXJhdGlvblRyYWl0IiwgInRpbWVyIiwgImVudGl0eSIsICJpc1BsYXllciIsICJyZW1vdmVUcmFpdCIsICJvblRpY2siLCAiaXNBbGl2ZSIsICJpbmNsdWRlcyIsICJnYW1lbW9kZSIsICJwbGF5ZXJIZWFsdGhUcmFpdCIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJjdXJyZW50VmFsdWUiLCAic2V0IiwgImV4aGF1c3QiLCAiYXBwbHlEYW1hZ2UiLCAidW5kZWZpbmVkIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiU3RhcnZlIiwgIm9uU3Bhd24iLCAiUGxheWVyRXhoYXVzdGlvblRyYWl0IiwgIlBsYXllclNhdHVyYXRpb25UcmFpdCIsICJhbW91bnQiLCAiaW5jcmVhc2UiLCAiZGVjcmVhc2UiLCAiTWF0aCIsICJtYXgiLCAiaXNIdW5ncnkiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkVudGl0eUdyYXZpdHlUcmFpdCIsICJFbnRpdHlUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgIm9uU3Bhd24iLCAiZW50aXR5IiwgImZsYWdzIiwgImhhcyIsICJBY3RvckZsYWciLCAiSGFzR3Jhdml0eSIsICJzZXQiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkVudGl0eUNvbGxpc2lvbiIsICJFbnRpdHlUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgImhlaWdodCIsICJ3aWR0aCIsICJvblNwYXduIiwgImVudGl0eSIsICJmbGFncyIsICJoYXMiLCAiQWN0b3JGbGFnIiwgIkhhc0NvbGxpc2lvbiIsICJzZXQiLCAibWV0YWRhdGEiLCAiQWN0b3JEYXRhSWQiLCAiUmVzZXJ2ZWQwNTQiLCAic2V0SGVpZ2h0IiwgIlJlc2VydmVkMDUzIiwgInNldFdpZHRoIiwgIm9uR2FtZW1vZGVDaGFuZ2UiLCAiaXNQbGF5ZXIiLCAiZ2FtZW1vZGUiLCAiR2FtZW1vZGUiLCAiU3BlY3RhdG9yIiwgImRhdGEiLCAiRGF0YUl0ZW0iLCAiQWN0b3JEYXRhVHlwZSIsICJGbG9hdCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRW50aXR5QWlyU3VwcGx5VHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJvblRpY2siLCAiZW50aXR5IiwgImlzQWxpdmUiLCAiZmxhZ3MiLCAiZ2V0IiwgIkFjdG9yRmxhZyIsICJCcmVhdGhpbmciLCAiY3VycmVudEFpclRpY2tzIiwgImdldEFpclN1cHBseVRpY2tzIiwgImNhbkJyZWF0aGUiLCAic2V0QWlyU3VwcGx5VGlja3MiLCAiaGFzVHJhaXQiLCAiRW50aXR5SGVhbHRoVHJhaXQiLCAiZ2V0VHJhaXQiLCAiYXBwbHlEYW1hZ2UiLCAidW5kZWZpbmVkIiwgImlzU3dpbW1pbmciLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJEcm93bmluZyIsICJTdWZmb2NhdGlvbiIsICJibG9ja0F0SGVhZCIsICJkaW1lbnNpb24iLCAiZ2V0QmxvY2siLCAicG9zaXRpb24iLCAiZmxvb3IiLCAiaXNMaXF1aWQiLCAiaXNTb2xpZCIsICJoYXNFZmZlY3QiLCAiRWZmZWN0VHlwZSIsICJXYXRlckJyZWF0aGluZyIsICJvblNwYXduIiwgImhhcyIsICJzZXQiLCAibWV0YWRhdGEiLCAiQWN0b3JEYXRhSWQiLCAiQWlyU3VwcGx5IiwgImFpclN1cHBseURhdGEiLCAidmFsdWUiLCAidGlja3MiLCAiRGF0YUl0ZW0iLCAiQWN0b3JEYXRhVHlwZSIsICJTaG9ydCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRW50aXR5TmFtZVRhZ1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAib25TcGF3biIsICJlbnRpdHkiLCAibWV0YWRhdGEiLCAiaGFzIiwgIkFjdG9yRGF0YUlkIiwgIk5hbWUiLCAibmFtZXRhZyIsICJpc1BsYXllciIsICJ1c2VybmFtZSIsICJTdHJpbmciLCAic2V0TmFtZVRhZyIsICJOYW1ldGFnQWx3YXlzU2hvdyIsICJzZXRWaXNpYmlsaXR5IiwgIm5hbWUiLCAiZGF0YSIsICJEYXRhSXRlbSIsICJBY3RvckRhdGFUeXBlIiwgInNldCIsICJnZXROYW1lVGFnIiwgImdldCIsICJ2YWx1ZSIsICJnZXRWaXNpYmlsaXR5IiwgInZpc2libGUiLCAiQnl0ZSIsICJmbGFncyIsICJBY3RvckZsYWciLCAiQWx3YXlzU2hvd05hbWUiLCAiRW50aXR5UGh5c2ljc1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAiZ3Jhdml0eSIsICJvblRpY2siLCAiZW50aXR5IiwgImlzQWxpdmUiLCAiaGFzR3Jhdml0eSIsICJoYXNUcmFpdCIsICJFbnRpdHlHcmF2aXR5VHJhaXQiLCAiZGltZW5zaW9uIiwgInZlbG9jaXR5IiwgInBvc2l0aW9uIiwgImhpdGJveFdpZHRoIiwgImhpdGJveEhlaWdodCIsICJpc1plcm8iLCAiaXNNb3ZpbmciLCAieSIsICJuZWdhdGUiLCAiYngiLCAiTWF0aCIsICJmbG9vciIsICJ4IiwgImJ5IiwgImJ6IiwgInoiLCAiZ2V0QmxvY2siLCAiaXNTb2xpZCIsICJhYnMiLCAiYmVsb3ciLCAiZ2V0VHlwZSIsICJmcmljdGlvbiIsICJyb3VuZCIsICJvbkdyb3VuZCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRW50aXR5RWZmZWN0c1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgInR5cGUiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiaWRlbnRpZmllciIsICJlZmZlY3RzIiwgIk1hcCIsICJvblRpY2siLCAiZWZmZWN0IiwgImVudGl0eSIsICJpc0V4cGlyZWQiLCAiZHVyYXRpb24iLCAicmVtb3ZlIiwgInBhcnRpY2xlSW50ZXJ2YWwiLCAic2l6ZSIsICJnZXRXb3JsZCIsICJjdXJyZW50VGljayIsICJnZXRQYXJ0aWNsZUVmZmVjdCIsICJwYWNrZXQiLCAiTGV2ZWxFdmVudFBhY2tldCIsICJldmVudCIsICJMZXZlbEV2ZW50IiwgIlBhcnRpY2xlTGVnYWN5RXZlbnQiLCAiZGF0YSIsICJjb2xvciIsICJ0b0ludCIsICJwb3NpdGlvbiIsICJzdWJ0cmFjdCIsICJWZWN0b3IzZiIsICJkaW1lbnNpb24iLCAiYnJvYWRjYXN0IiwgImVmZmVjdFR5cGUiLCAiaGFzIiwgIkVmZmVjdFJlbW92ZVNpZ25hbCIsICJlbWl0IiwgImdldCIsICJvblJlbW92ZSIsICJkZWxldGUiLCAiaXNQbGF5ZXIiLCAiTW9iRWZmZWN0UGFja2V0IiwgInJ1bnRpbWVJZCIsICJldmVudElkIiwgIk1vYkVmZmVjdEV2ZW50cyIsICJFZmZlY3RSZW1vdmUiLCAiZWZmZWN0SWQiLCAicGFydGljbGVzIiwgImFtcGxpZmllciIsICJpbnB1dFRpY2siLCAic2VuZCIsICJhZGQiLCAib3B0aW9ucyIsICJzaG93UGFydGljbGVzIiwgImVmZmVjdEJ1aWxkZXIiLCAiZWZmZWN0UGFsZXR0ZSIsICJnZXRFZmZlY3QiLCAiTWF0aCIsICJtYXgiLCAiRWZmZWN0QWRkU2lnbmFsIiwgIm9uQWRkIiwgInNldCIsICJFZmZlY3RBZGQiLCAidmFsdWVzIiwgImZpbHRlciIsICJmbG9vciIsICJyYW5kb20iLCAibGVuZ3RoIiwgIm9uU3Bhd24iLCAiZW50aXR5RWZmZWN0cyIsICJjb21wb25lbnRzIiwgImVmZmVjdEVudHJ5IiwgIm9uRGVzcGF3biIsICJtYXAiLCAidG9TdHJpbmciLCAiaW1wb3J0X3Byb3RvY29sIiwgIkVudGl0eUludmlzaWJpbGl0eVRyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAib25TcGF3biIsICJlbnRpdHkiLCAiZmxhZ3MiLCAiaGFzIiwgIkFjdG9yRmxhZyIsICJJbnZpc2libGUiLCAic2V0IiwgInNldEludmlzaWJpbGl0eSIsICJ2YWx1ZSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRW50aXR5RXF1aXBtZW50VHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJjb250YWluZXIiLCAiZW50aXR5IiwgIkVudGl0eUNvbnRhaW5lciIsICJDb250YWluZXJUeXBlIiwgIkFybW9yIiwgIkNvbnRhaW5lcklkIiwgInNldEVxdWlwbWVudCIsICJzbG90IiwgIml0ZW1TdGFjayIsICJzZXRJdGVtIiwgImdldEVxdWlwbWVudCIsICJnZXRJdGVtIiwgIm9uU3Bhd24iLCAiY29tcG9uZW50cyIsICJoYXMiLCAiZXF1aXBtZW50IiwgImdldCIsICJlbnRyeSIsICJJdGVtU3RhY2siLCAiYW1vdW50IiwgImF1eGlsbGFyeSIsICJ3b3JsZCIsICJnZXRXb3JsZCIsICJOdW1iZXIiLCAicGFyc2VJbnQiLCAib25EZXNwYXduIiwgInN0b3JhZ2UiLCAiaW5kZXhPZiIsICJnZXREYXRhRW50cnkiLCAic2V0IiwgImNvbnNvbGUiLCAiZGlyIiwgImRlcHRoIiwgIkluZmluaXR5IiwgImNvbG9ycyIsICJpbXBvcnRfcHJvdG9jb2wiLCAiTWV0YWRhdGFNYXAiLCAiTWFwIiwgImVudGl0eSIsICJzZXQiLCAia2V5IiwgInZhbHVlIiwgInNpZ25hbCIsICJFbnRpdHlNZXRhZGF0YVVwZGF0ZVNpZ25hbCIsICJlbWl0IiwgInJlc3VsdCIsICJkYXRhSXRlbSIsICJ1cGRhdGUiLCAiZGVsZXRlIiwgImNsZWFyIiwgInBhY2tldCIsICJTZXRBY3RvckRhdGFQYWNrZXQiLCAicnVudGltZUVudGl0eUlkIiwgInJ1bnRpbWVJZCIsICJpbnB1dFRpY2siLCAiaXNQbGF5ZXIiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImN1cnJlbnRUaWNrIiwgImRhdGEiLCAibWV0YWRhdGEiLCAidmFsdWVzIiwgInByb3BlcnRpZXMiLCAiUHJvcGVydHlTeW5jRGF0YSIsICJmbGFnIiwgImVuYWJsZWQiLCAiZmxhZ3MiLCAic2V0RmxhZyIsICJicm9hZGNhc3QiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkFjdG9yRmxhZ01hcCIsICJNYXAiLCAiZW50aXR5IiwgInNldCIsICJrZXkiLCAidmFsdWUiLCAic2lnbmFsIiwgIkVudGl0eUZsYWdVcGRhdGVTaWduYWwiLCAiZW1pdCIsICJyZXN1bHQiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJjbGVhciIsICJwYWNrZXQiLCAiU2V0QWN0b3JEYXRhUGFja2V0IiwgInJ1bnRpbWVFbnRpdHlJZCIsICJydW50aW1lSWQiLCAiaW5wdXRUaWNrIiwgImlzUGxheWVyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJkYXRhIiwgIm1ldGFkYXRhIiwgInZhbHVlcyIsICJwcm9wZXJ0aWVzIiwgIlByb3BlcnR5U3luY0RhdGEiLCAiZmxhZyIsICJlbmFibGVkIiwgImZsYWdzIiwgInNldEZsYWciLCAiYnJvYWRjYXN0IiwgImltcG9ydF9wcm90b2NvbCIsICJBdHRyaWJ1dGVNYXAiLCAiTWFwIiwgImVudGl0eSIsICJzZXQiLCAia2V5IiwgInZhbHVlIiwgInNpZ25hbCIsICJFbnRpdHlBdHRyaWJ1dGVVcGRhdGVTaWduYWwiLCAiZW1pdCIsICJyZXN1bHQiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJjbGVhciIsICJwYWNrZXQiLCAiVXBkYXRlQXR0cmlidXRlc1BhY2tldCIsICJydW50aW1lQWN0b3JJZCIsICJydW50aW1lSWQiLCAiaW5wdXRUaWNrIiwgImlzUGxheWVyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJhdHRyaWJ1dGVzIiwgInZhbHVlcyIsICJicm9hZGNhc3QiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkFiaWxpdHlNYXAiLCAiTWFwIiwgInBsYXllciIsICJzZXQiLCAia2V5IiwgInZhbHVlIiwgInNpZ25hbCIsICJQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIiwgImVtaXQiLCAicmVzdWx0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiY2xlYXIiLCAic3VwZXJTZXQiLCAicGFja2V0IiwgIlVwZGF0ZUFiaWxpdGllc1BhY2tldCIsICJwZXJtaXNzaW9uTGV2ZWwiLCAicGVybWlzc2lvbiIsICJjb21tYW5kUGVybWlzc2lvbkxldmVsIiwgImVudGl0eVVuaXF1ZUlkIiwgInVuaXF1ZUlkIiwgImFiaWxpdGllcyIsICJ0eXBlIiwgIkFiaWxpdHlMYXllclR5cGUiLCAiQmFzZSIsICJlbnRyaWVzIiwgIm1hcCIsICJhYmlsaXR5IiwgIkFiaWxpdHlTZXQiLCAid2Fsa1NwZWVkIiwgImZseVNwZWVkIiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3QiLCAiaXNBbGl2ZSIsICJnYW1lbW9kZSIsICJTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCIsICJzZW5kIiwgIkVudGl0eSIsICJydW50aW1lSWQiLCAic2VyZW5pdHkiLCAidHlwZSIsICJ1bmlxdWVJZCIsICJwb3NpdGlvbiIsICJWZWN0b3IzZiIsICJ2ZWxvY2l0eSIsICJyb3RhdGlvbiIsICJSb3RhdGlvbiIsICJ0cmFpdHMiLCAiTWFwIiwgImNvbXBvbmVudHMiLCAibWV0YWRhdGEiLCAiTWV0YWRhdGFNYXAiLCAiZmxhZ3MiLCAiQWN0b3JGbGFnTWFwIiwgImF0dHJpYnV0ZXMiLCAiQXR0cmlidXRlTWFwIiwgInRhZ3MiLCAiU2V0IiwgInNjb3JlYm9hcmRJZGVudGl0eSIsICJkaW1lbnNpb24iLCAiaXNBbGl2ZSIsICJpc01vdmluZyIsICJvbkdyb3VuZCIsICJwcm9wZXJ0aWVzIiwgIndvcmxkIiwgIkVudGl0eVR5cGUiLCAiZW50aXR5UGFsZXR0ZSIsICJnZXRUeXBlIiwgImNyZWF0ZVVuaXF1ZUlkIiwgIm5ldHdvcmsiLCAic2V0IiwgInNwYXduUG9zaXRpb24iLCAiU2NvcmVib2FyZElkZW50aXR5IiwgImlzUGxheWVyIiwgImVudHJ5IiwgImxvYWREYXRhRW50cnkiLCAiaW5pdGlhbGl6ZSIsICJnZXRSZWdpc3RyeUZvciIsICJpZGVudGlmaWVyIiwgImNvbXBvbmVudCIsICJpbmNsdWRlcyIsICJzcGxpdCIsICJ0cmFpdCIsICJnZXRUcmFpdCIsICJwdXNoIiwgImhhc1RyYWl0IiwgImFkZFRyYWl0IiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgImlzSXRlbSIsICJJdGVtIiwgImlzU25lYWtpbmciLCAiZ2V0IiwgIkFjdG9yRmxhZyIsICJTbmVha2luZyIsICJpc1NwcmludGluZyIsICJTcHJpbnRpbmciLCAiaXNTd2ltbWluZyIsICJTd2ltbWluZyIsICJhZGRFZmZlY3QiLCAiZWZmZWN0VHlwZSIsICJkdXJhdGlvbiIsICJvcHRpb25zIiwgIkVudGl0eUVmZmVjdHNUcmFpdCIsICJhZGQiLCAicmVtb3ZlRWZmZWN0IiwgImVmZmVjdFRyYWl0IiwgImhhcyIsICJyZW1vdmUiLCAiaGFzRWZmZWN0IiwgImdldFZpZXdEaXJlY3Rpb24iLCAicGl0Y2hSYWRpYW5zIiwgInBpdGNoIiwgIk1hdGgiLCAiUEkiLCAieWF3UmFkaWFucyIsICJoZWFkWWF3IiwgInNpbiIsICJjb3MiLCAicmVtb3ZlVHJhaXQiLCAib25SZW1vdmUiLCAiZGVsZXRlIiwgImdldFdvcmxkIiwgImxvZ2dlciIsICJ3YXJuIiwgIkVudGl0eVRyYWl0IiwgIm9uQWRkIiwgImluc3RhbmNlIiwgInJlYXNvbiIsICJlcnJvciIsICJnZXRDaHVuayIsICJjeCIsICJ4IiwgImN6IiwgInoiLCAiZ2V0SGVsZEl0ZW0iLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiZ2V0Q2FyZGluYWxEaXJlY3Rpb24iLCAiZmxvb3IiLCAieWF3IiwgIkNhcmRpbmFsRGlyZWN0aW9uIiwgIlNvdXRoIiwgIldlc3QiLCAiTm9ydGgiLCAiRWFzdCIsICJzcGF3biIsICJFbnRpdHlTcGF3bmVkU2lnbmFsIiwgImVtaXQiLCAiZW50aXRpZXMiLCAidmFsdWVzIiwgIm9uU3Bhd24iLCAidXBkYXRlIiwgImRlc3Bhd24iLCAiRW50aXR5RGVzcGF3bmVkU2lnbmFsIiwgIm9uRGVzcGF3biIsICJraWxsIiwgImRhbWFnaW5nRW50aXR5IiwgImRhbWFnZUNhdXNlIiwgIkVudGl0eURpZVNpZ25hbCIsICJjb250YWluZXIiLCAiaW52ZW50b3J5U2l6ZSIsICJzbG90IiwgIml0ZW0iLCAiZ2V0SXRlbSIsICJzcGF3bkl0ZW0iLCAiY2xlYXJTbG90IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImhlYWx0aCIsICJjdXJyZW50VmFsdWUiLCAiZWZmZWN0aXZlTWluIiwgInNjaGVkdWxlIiwgIm9uIiwgImludGVyYWN0IiwgInBsYXllciIsICJtZXRob2QiLCAiRW50aXR5SW50ZXJhY3RNZXRob2QiLCAiSW50ZXJhY3QiLCAiUGxheWVySW50ZXJhY3RXaXRoRW50aXR5U2lnbmFsIiwgIkVudGl0eUhpdFNpZ25hbCIsICJvbkludGVyYWN0IiwgImdldENvbnRhaW5lciIsICJuYW1lIiwgImR5bmFtaWNJZCIsICJzdG9yYWdlIiwgIkl0ZW1CdW5kbGVUcmFpdCIsICJidW5kbGUiLCAiQ29udGFpbmVyTmFtZSIsICJBcm1vciIsICJFbnRpdHlFcXVpcG1lbnRUcmFpdCIsICJFcnJvciIsICJIb3RiYXIiLCAiSW52ZW50b3J5IiwgIkhvdGJhckFuZEludmVudG9yeSIsICJzZXRNb3Rpb24iLCAidmVjdG9yIiwgInkiLCAicGFja2V0IiwgIlNldEFjdG9yTW90aW9uUGFja2V0IiwgIm1vdGlvbiIsICJpbnB1dFRpY2siLCAiY3VycmVudFRpY2siLCAiYnJvYWRjYXN0IiwgImFkZE1vdGlvbiIsICJjbGVhck1vdGlvbiIsICJhcHBseUltcHVsc2UiLCAidGVsZXBvcnQiLCAiRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsIiwgIk1vdmVBY3RvckRlbHRhUGFja2V0IiwgIk1vdmVEZWx0YUZsYWdzIiwgIkFsbCIsICJPbkdyb3VuZCIsICJnZXRTZWxlY3RlZFNsb3QiLCAic2VsZWN0ZWRTbG90IiwgImRyb3BJdGVtIiwgImFtb3VudCIsICJ0YWtlSXRlbSIsICJoZWFkWWF3UmFkIiwgInBpdGNoUmFkIiwgImVudGl0eSIsICJoYXNUYWciLCAidGFnIiwgImdldFRhZ3MiLCAiYWRkVGFnIiwgInJlbW92ZVRhZyIsICJleGVjdXRlQ29tbWFuZCIsICJjb21tYW5kIiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAiQ29tbWFuZEV4ZWN1dGlvblN0YXRlIiwgImNvbW1hbmRzIiwgImdldEFsbCIsICJleGVjdXRlIiwgImdldERhdGFFbnRyeSIsICJlbnRyaWVzIiwgImtleXMiLCAib3ZlcndyaXRlIiwgImNsZWFyIiwgImtleSIsICJ2YWx1ZSIsICJ0cmFpdFR5cGUiLCAidW5pcXVlIiwgIkJpZ0ludCIsICJhYnMiLCAiRGF0ZSIsICJub3ciLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9wcm90b2NvbCIsICJEZXZpY2UiLCAiaWRlbnRpZmllciIsICJtb2RlbCIsICJvcyIsICJtYXhWaWV3RGlzdGFuY2UiLCAibWVtb3J5VGllciIsICJpbnB1dE1vZGUiLCAiSW5wdXRNb2RlIiwgIlVua25vd24iLCAiaW50ZXJhY3Rpb25Nb2RlIiwgIkludGVyYWN0aW9uTW9kZSIsICJDbGFzc2ljIiwgInBsYXlNb2RlIiwgIlBsYXlNb2RlIiwgIk5vcm1hbCIsICJlbXB0eSIsICJEZXZpY2VPUyIsICJVbmRlZmluZWQiLCAiTWVtb3J5VGllciIsICJVbmRldGVybWluZWQiLCAiRGVmYXVsdFBsYXllclByb3BlcnRpZXMiLCAidXNlcm5hbWUiLCAieHVpZCIsICJ1dWlkIiwgInVuaXF1ZUlkIiwgImRldmljZSIsICJEZXZpY2UiLCAiZW1wdHkiLCAic2tpbiIsICJTZXJpYWxpemVkU2tpbiIsICJQbGF5ZXIiLCAiRW50aXR5IiwgImNvbm5lY3Rpb24iLCAidHJhaXRzIiwgIk1hcCIsICJhYmlsaXRpZXMiLCAiQWJpbGl0eU1hcCIsICJpbnB1dFRpY2siLCAicGVybWlzc2lvbiIsICJvcGVuZWRDb250YWluZXIiLCAiYmxvY2tUYXJnZXQiLCAiaXRlbVRhcmdldCIsICJlbnRpdHlUYXJnZXQiLCAiZ2FtZW1vZGUiLCAiY29tcG9uZW50cyIsICJoYXMiLCAic2V0IiwgIkdhbWVtb2RlIiwgIlN1cnZpdmFsIiwgImdldCIsICJ2YWx1ZSIsICJQbGF5ZXJHYW1lbW9kZUNoYW5nZVNpZ25hbCIsICJlbWl0IiwgInRyYWl0IiwgInZhbHVlcyIsICJvbkdhbWVtb2RlQ2hhbmdlIiwgIkFkdmVudHVyZSIsICJBYmlsaXR5SW5kZXgiLCAiTWF5Rmx5IiwgIkNyZWF0aXZlIiwgIlNwZWN0YXRvciIsICJwYWNrZXQiLCAiU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQiLCAic2VuZCIsICJkaW1lbnNpb24iLCAicHJvcGVydGllcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgInByb3BzIiwgInNlcmVuaXR5IiwgInBlcm1pc3Npb25zIiwgImVudHJ5IiwgImxvYWREYXRhRW50cnkiLCAid29ybGQiLCAiaW5pdGlhbGl6ZSIsICJlbnRpdHlQYWxldHRlIiwgImdldFJlZ2lzdHJ5Rm9yIiwgInR5cGUiLCAiaWRlbnRpZmllciIsICJoYXNUcmFpdCIsICJhZGRUcmFpdCIsICJhYmlsaXR5IiwgIk9iamVjdCIsICJlbnRyaWVzIiwgIkRlZmF1bHRBYmlsaXR5VmFsdWVzIiwgInBhY2tldHMiLCAibmV0d29yayIsICJzZW5kTm9ybWFsIiwgInNlbmRJbW1lZGlhdGUiLCAiaXNPcCIsICJQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3AiLCAiT3BlcmF0b3JDb21tYW5kcyIsICJUZWxlcG9ydCIsICJkZW9wIiwgIk1lbWJlciIsICJkaXNjb25uZWN0IiwgInJlYXNvbiIsICJjb2RlIiwgImhpZGVEaXNjb25uZWN0U2NyZWVuIiwgIkRpc2Nvbm5lY3RQYWNrZXQiLCAibWVzc2FnZSIsICJEaXNjb25uZWN0TWVzc2FnZSIsICJEaXNjb25uZWN0UmVhc29uIiwgIktpY2tlZCIsICJkZXNwYXduIiwgInNlbmRNZXNzYWdlIiwgIlRleHRQYWNrZXQiLCAiVGV4dFBhY2tldFR5cGUiLCAiUmF3IiwgIm5lZWRzVHJhbnNsYXRpb24iLCAic291cmNlIiwgInBhcmFtZXRlcnMiLCAicGxhdGZvcm1DaGF0SWQiLCAiZmlsdGVyZWQiLCAiZ2V0Q29udGFpbmVyIiwgIm5hbWUiLCAiZHluYW1pY0lkIiwgImNvbnRhaW5lciIsICJDb250YWluZXJOYW1lIiwgIkR5bmFtaWMiLCAiUGxheWVyQ3Vyc29yVHJhaXQiLCAiRXJyb3IiLCAiZ2V0VHJhaXQiLCAiaXRlbSIsICJzdG9yYWdlIiwgIkl0ZW1CdW5kbGVUcmFpdCIsICJidW5kbGUiLCAiQ3Vyc29yIiwgInNwYXduIiwgInVwZGF0ZSIsICJjb250ZW50IiwgIkNyZWF0aXZlQ29udGVudFBhY2tldCIsICJpdGVtcyIsICJnZXRXb3JsZCIsICJpdGVtUGFsZXR0ZSIsICJnZXRDcmVhdGl2ZUNvbnRlbnQiLCAibWFwIiwgIm1ldGFkYXRhIiwgInN0YWNrU2l6ZSIsICJuZXR3b3JrQmxvY2tJZCIsICJibG9jayIsICJwZXJtdXRhdGlvbnMiLCAiZXh0cmFzIiwgImNhbkRlc3Ryb3kiLCAiY2FuUGxhY2VPbiIsICJuYnQiLCAiY29tbWFuZHMiLCAic2VyaWFsaXplIiwgImZpbHRlciIsICJ4IiwgInBlcm1pc3Npb25MZXZlbCIsICJ0cmFuc2ZlciIsICJhZGRyZXNzIiwgInBvcnQiLCAicmVsb2FkIiwgIlRyYW5zZmVyUGFja2V0IiwgInJlbG9hZFdvcmxkIiwgInRlbGVwb3J0IiwgInBvc2l0aW9uIiwgInkiLCAieiIsICJFbnRpdHlEaW1lbnNpb25DaGFuZ2VTaWduYWwiLCAicHJvdmlkZXIiLCAid3JpdGVQbGF5ZXIiLCAiZ2V0RGF0YUVudHJ5IiwgImRhdGEiLCAicmVhZFBsYXllciIsICJjbGVhciIsICJmbGFncyIsICJDaGFuZ2VEaW1lbnNpb25QYWNrZXQiLCAicmVzcGF3biIsICJoYXNMb2FkaW5nU2NyZWVuIiwgIk1vdmVQbGF5ZXJQYWNrZXQiLCAicnVudGltZUlkIiwgInBpdGNoIiwgInJvdGF0aW9uIiwgInlhdyIsICJoZWFkWWF3IiwgIm1vZGUiLCAiTW92ZU1vZGUiLCAib25Hcm91bmQiLCAicmlkZGVuUnVudGltZUlkIiwgImNhdXNlIiwgIlRlbGVwb3J0Q2F1c2UiLCAia2V5cyIsICJhdHRyaWJ1dGVzIiwgInNjb3JlYm9hcmRJZGVudGl0eSIsICJvdmVyd3JpdGUiLCAia2V5IiwgInRyYWl0VHlwZSIsICJsb2dnZXIiLCAiZXJyb3IiLCAiZmxhZyIsICJhdHRyaWJ1dGUiLCAiRW50aXR5UGFsZXR0ZSIsICJ0eXBlcyIsICJFbnRpdHlUeXBlIiwgInRyYWl0cyIsICJNYXAiLCAicmVnaXN0cnkiLCAidHJhaXQiLCAiRW50aXR5VHJhaXRzIiwgInJlZ2lzdGVyVHJhaXQiLCAiZ2V0QWxsVHlwZXMiLCAidmFsdWVzIiwgImdldEFsbEN1c3RvbVR5cGVzIiwgImZpbHRlciIsICJ0eXBlIiwgIkN1c3RvbUVudGl0eVR5cGUiLCAiZ2V0VHlwZSIsICJpZGVudGlmaWVyIiwgImdldCIsICJnZXRUeXBlQnlVbmlxdWUiLCAidW5pcXVlIiwgIm5ldHdvcmsiLCAiTnVtYmVyIiwgInJlZ2lzdGVyVHlwZSIsICJoYXMiLCAic2V0IiwgIkVudGl0eUVudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImdldFJlZ2lzdHJ5Rm9yIiwgInJlbW92ZVRyYWl0IiwgImMiLCAiZGVsZXRlIiwgImdldEFsbFRyYWl0cyIsICJnZXRUcmFpdCIsICJFbnRpdHlUcmFpdHMiLCAiQXJyYXkiLCAia2V5IiwgIlRyYWl0cyIsICJ0cmFpdCIsICJwdXNoIiwgIkludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIkludmVudG9yeVRyYW5zYWN0aW9uIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJ0cmFuc2FjdGlvbiIsICJ0eXBlIiwgIkNvbXBsZXhJbnZlbnRvcnlUcmFuc2FjdGlvbiIsICJOb3JtYWxUcmFuc2FjdGlvbiIsICJoYW5kbGVOb3JtYWxUcmFuc2FjdGlvbiIsICJhY3Rpb25zIiwgIkl0ZW1Vc2VUcmFuc2FjdGlvbiIsICJpdGVtVXNlIiwgIkVycm9yIiwgImhhbmRsZUl0ZW1Vc2VUcmFuc2FjdGlvbiIsICJJdGVtVXNlT25FbnRpdHlUcmFuc2FjdGlvbiIsICJpdGVtVXNlT25FbnRpdHkiLCAiaGFuZGxlSXRlbVVzZU9uRW50aXR5VHJhbnNhY3Rpb24iLCAiSXRlbVJlbGVhc2VUcmFuc2FjdGlvbiIsICJjb25zb2xlIiwgImxvZyIsICJhY3Rpb24iLCAic291cmNlIiwgImxvZ2dlciIsICJkZWJ1ZyIsICJJbnZlbnRvcnlTb3VyY2VUeXBlIiwgIkNvbnRhaW5lckludmVudG9yeSIsICJXb3JsZEludGVyYWN0aW9uIiwgImFtb3VudCIsICJuZXdJdGVtIiwgInN0YWNrU2l6ZSIsICJpbnZlbnRvcnkiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiaXRlbVN0YWNrIiwgImNvbnRhaW5lciIsICJnZXRJdGVtIiwgInNsb3QiLCAiUGxheWVyRHJvcEl0ZW1TaWduYWwiLCAiZW1pdCIsICJ1cGRhdGUiLCAiZHJvcEl0ZW0iLCAic2VsZWN0ZWRTbG90IiwgImRpbWVuc2lvbiIsICJJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlIiwgIlBsYWNlIiwgImludGVyYWN0aW5nIiwgImdldEJsb2NrIiwgImJsb2NrUG9zaXRpb24iLCAiaW5pdGlhbFRyYW5zYWN0aW9uIiwgImludGVyYWN0IiwgImlzQWlyIiwgIm9wZW5lZENvbnRhaW5lciIsICJpdGVtVGFyZ2V0IiwgInN0YWNrIiwgIm5ldHdvcmsiLCAiaXRlbSIsICJibG9ja1R5cGUiLCAiYmxvY2siLCAiaWRlbnRpZmllciIsICJCbG9ja0lkZW50aWZpZXIiLCAiQWlyIiwgInJlc3VsdCIsICJmYWNlIiwgIm9sZFBlcm11dGF0aW9uIiwgImdldFBlcm11dGF0aW9uIiwgInBlcm11dGF0aW9uIiwgInBlcm11dGF0aW9ucyIsICJhdXhpbGxhcnkiLCAic2lnbmFsIiwgIlBsYXllclBsYWNlQmxvY2tTaWduYWwiLCAiY2xpY2tQb3NpdGlvbiIsICJjb21wb25lbnRzIiwgImhhcyIsICJlbnRyeSIsICJnZXQiLCAibG9hZERhdGFFbnRyeSIsICJnZXRXb3JsZCIsICJzZXRQZXJtdXRhdGlvbiIsICJwbGFjZUNhbmNlbGVkIiwgInRyYWl0IiwgInRyYWl0cyIsICJ2YWx1ZXMiLCAic3VjY2VzcyIsICJvblBsYWNlIiwgInVuZGVmaW5lZCIsICJtZXRob2QiLCAiSXRlbVVzZU1ldGhvZCIsICJ0YXJnZXRCbG9jayIsICJ1c2VTdWNjZXNzIiwgInVzZSIsICJQbGF5ZXJVc2VJdGVtU2lnbmFsIiwgInNvdW5kIiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJldmVudCIsICJMZXZlbFNvdW5kRXZlbnQiLCAicG9zaXRpb24iLCAiQmxvY2tQb3NpdGlvbiIsICJ0b1ZlY3RvcjNmIiwgImRhdGEiLCAiYWN0b3JJZGVudGlmaWVyIiwgIlN0cmluZyIsICJpc0JhYnlNb2IiLCAiaXNHbG9iYWwiLCAiYnJvYWRjYXN0IiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIlN1cnZpdmFsIiwgImRlY3JlbWVudCIsICJpbmNyZW1lbnQiLCAiVXNlIiwgImdldEhlbGRJdGVtIiwgIkNsaWNrIiwgIkRlc3Ryb3kiLCAiZW50aXR5IiwgImdldEVudGl0eSIsICJhY3RvclJ1bnRpbWVJZCIsICJ0YXJnZXRFbnRpdHkiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkl0ZW1TdGFja1JlcXVlc3RIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiSXRlbVN0YWNrUmVxdWVzdCIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAicGxheWVycyIsICJnZXQiLCAiZGlzY29ubmVjdCIsICJyZXF1ZXN0IiwgInJlcXVlc3RzIiwgImFjdGlvbiIsICJhY3Rpb25zIiwgInRha2VPclBsYWNlIiwgInNvdXJjZUNvbnRhaW5lciIsICJzb3VyY2UiLCAiY29udGFpbmVyIiwgImRlc3RpbmF0aW9uQ29udGFpbmVyIiwgImRlc3RpbmF0aW9uIiwgInNvdXJjZVNsb3QiLCAic2xvdCIsICJkZXN0aW5hdGlvblNsb3QiLCAiYW1vdW50IiwgImlkZW50aWZpZXIiLCAiQ29udGFpbmVyTmFtZSIsICJDcmVhdGl2ZU91dHB1dCIsICJnZXRDb250YWluZXIiLCAiZHluYW1pY0lkZW50aWZpZXIiLCAiRXJyb3IiLCAic291cmNlSXRlbSIsICJnZXRJdGVtIiwgImRlc3RpbmF0aW9uSXRlbSIsICJpdGVtIiwgInRha2VJdGVtIiwgImluY3JlbWVudCIsICJzZXRJdGVtIiwgImN1cnNvciIsICJnZXRUcmFpdCIsICJQbGF5ZXJDdXJzb3JUcmFpdCIsICJjbGVhclNsb3QiLCAiZHJvcCIsICJkcm9wSXRlbSIsICJzd2FwIiwgInN3YXBJdGVtcyIsICJkZXN0cm95T3JDb25zdW1lIiwgIkN1cnNvciIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJjcmFmdFJlY2lwZSIsICJpdGVtSW5zdGFuY2VBY3Rpb24iLCAicmVzdWx0c0RlcHJlY2F0ZWQiLCAiZGVzY3JpcHRvcnMiLCAicmVzdWx0YW50cyIsICJkZXN0aW5hdGlvbkFjdGlvbiIsICJhdCIsICJkZXNjcmlwdG9yIiwgIml0ZW1TdGFjayIsICJJdGVtU3RhY2siLCAiZnJvbU5ldHdvcmtJbnN0YW5jZSIsICJzZXRBbW91bnQiLCAiYWRkSXRlbSIsICJjcmFmdENyZWF0aXZlIiwgImNyYWZ0IiwgIndvcmxkIiwgImRpbWVuc2lvbiIsICJjcmVhdGl2ZUl0ZW0iLCAiaXRlbVBhbGV0dGUiLCAiZ2V0Q3JlYXRpdmVDb250ZW50QnlJbmRleCIsICJjcmVhdGl2ZUluZGV4IiwgInR5cGUiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9mYXN0X2p3dCIsICJMb2dpbkhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJMb2dpbiIsICJkZWNvZGVyIiwgImNyZWF0ZURlY29kZXIiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAidG9rZW5zIiwgImRlY29kZSIsICJ4dWlkIiwgImlkZW50aXR5RGF0YSIsICJYVUlEIiwgInV1aWQiLCAiaWRlbnRpdHkiLCAidXNlcm5hbWUiLCAiZGlzcGxheU5hbWUiLCAibGVuZ3RoIiwgIm5ldHdvcmsiLCAiZGlzY29ubmVjdENvbm5lY3Rpb24iLCAiRGlzY29ubmVjdFJlYXNvbiIsICJJbnZhbGlkVGVuYW50IiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5WHVpZCIsICJkaXNjb25uZWN0IiwgIkxvZ2dlZEluT3RoZXJMb2NhdGlvbiIsICJ3b3JsZCIsICJnZXRXb3JsZCIsICJXb3JsZENvcnJ1cHRpb24iLCAiZGltZW5zaW9uIiwgImdldERpbWVuc2lvbiIsICJkZXZpY2UiLCAiRGV2aWNlIiwgImNsaWVudERhdGEiLCAiRGV2aWNlSWQiLCAiRGV2aWNlTW9kZWwiLCAiRGV2aWNlT1MiLCAiTWF4Vmlld0Rpc3RhbmNlIiwgIk1lbW9yeVRpZXIiLCAiZGF0YSIsICJwcm92aWRlciIsICJyZWFkUGxheWVyIiwgInNraW4iLCAiU2VyaWFsaXplZFNraW4iLCAiZnJvbSIsICJwcm9wZXJ0aWVzIiwgInVuaXF1ZUlkIiwgImVudHJ5IiwgInBsYXllciIsICJQbGF5ZXIiLCAicGxheWVycyIsICJzZXQiLCAiUGxheWVySm9pblNpZ25hbCIsICJlbWl0IiwgIktpY2tlZCIsICJsb2dpbiIsICJQbGF5U3RhdHVzUGFja2V0IiwgInN0YXR1cyIsICJQbGF5U3RhdHVzIiwgIkxvZ2luU3VjY2VzcyIsICJwYWNrcyIsICJSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCIsICJtdXN0QWNjZXB0IiwgImhhc0FkZG9ucyIsICJoYXNTY3JpcHRzIiwgImxvZ2dlciIsICJpbmZvIiwgInNlbmQiLCAiY2xpZW50IiwgImRlY29kZWRDaGFpbnMiLCAiSlNPTiIsICJwYXJzZSIsICJjaGFpbiIsICJtYXAiLCAiZmluZCIsICJleHRyYURhdGEiLCAidW5kZWZpbmVkIiwgInB1YmxpY0tleSIsICJpZGVudGl0eVB1YmxpY0tleSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiTW9iRXF1aXBtZW50SGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIk1vYkVxdWlwbWVudCIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAiaW52ZW50b3J5IiwgImdldFRyYWl0IiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgInNlbGVjdGVkU2xvdCIsICJpdGVtIiwgImdldEhlbGRJdGVtIiwgInVwZGF0ZSIsICJNb2JFcXVpcG1lbnRQYWNrZXQiLCAicnVudGltZUVudGl0eUlkIiwgInJ1bnRpbWVJZCIsICJzbG90IiwgImNvbnRhaW5lcklkIiwgImNvbnRhaW5lciIsICJpZGVudGlmaWVyIiwgIk5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yIiwgIkl0ZW1TdGFjayIsICJ0b05ldHdvcmtTdGFjayIsICJkaW1lbnNpb24iLCAiYnJvYWRjYXN0RXhjZXB0IiwgImltcG9ydF9wcm90b2NvbCIsICJQbGF5ZXJBY3Rpb25IYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiUGxheWVyQWN0aW9uIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJhY3Rpb24iLCAibG9nZ2VyIiwgImRlYnVnIiwgIlBsYXllckFjdGlvblR5cGUiLCAiU3RhcnRJdGVtVXNlT24iLCAiaXRlbVRhcmdldCIsICJnZXRIZWxkSXRlbSIsICJTdG9wSXRlbVVzZU9uIiwgIkNyZWF0aXZlRGVzdHJveUJsb2NrIiwgImltcG9ydF9wcm90b2NvbCIsICJQbGF5ZXJBdXRoSW5wdXRIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiUGxheWVyQXV0aElucHV0IiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJwb3NpdGlvbiIsICJ4IiwgInkiLCAieiIsICJyb3RhdGlvbiIsICJwaXRjaCIsICJ5YXciLCAiaGVhZFlhdyIsICJkZXZpY2UiLCAiaW5wdXRNb2RlIiwgImludGVyYWN0aW9uTW9kZSIsICJwbGF5TW9kZSIsICJmbG9vciIsICJwZXJtdXRhdGlvbiIsICJkaW1lbnNpb24iLCAiZ2V0UGVybXV0YXRpb24iLCAib25Hcm91bmQiLCAidHlwZSIsICJzb2xpZCIsICJpbnB1dFRpY2siLCAiaXNNb3ZpbmciLCAiYmxvY2tBY3Rpb25zIiwgIml0ZW1TdGFja1JlcXVlc3QiLCAiYWN0aW9uIiwgImFjdGlvbnMiLCAiZmluZCIsICJJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uVHlwZSIsICJTY3JlZW5IVURNaW5lQmxvY2siLCAibWluZUJsb2NrIiwgImhhbmRsZUJsb2NrQWN0aW9ucyIsICJoYW5kbGVBY3RvckFjdGlvbnMiLCAiaW5wdXREYXRhIiwgImdldEZsYWdzIiwgIklucHV0RGF0YSIsICJTdGFydFNuZWFraW5nIiwgIlN0b3BTbmVha2luZyIsICJzbmVha2luZyIsICJmbGFncyIsICJnZXQiLCAiQWN0b3JGbGFnIiwgIlNuZWFraW5nIiwgInNldCIsICJTdGFydFNwcmludGluZyIsICJTdG9wU3ByaW50aW5nIiwgInNwcmludGluZyIsICJTcHJpbnRpbmciLCAiU3RhcnRTd2ltbWluZyIsICJTdG9wU3dpbW1pbmciLCAic3dpbW1pbmciLCAiU3dpbW1pbmciLCAiU3RhcnRDcmF3bGluZyIsICJTdG9wQ3Jhd2xpbmciLCAiY3Jhd2xpbmciLCAiQ3Jhd2xpbmciLCAiU3RhcnRHbGlkaW5nIiwgIlN0b3BHbGlkaW5nIiwgImdsaWRpbmciLCAiR2xpZGluZyIsICJTdGFydEZseWluZyIsICJTdG9wRmx5aW5nIiwgImZseWluZyIsICJhYmlsaXRpZXMiLCAiQWJpbGl0eUluZGV4IiwgIkZseWluZyIsICJtYXlGbHkiLCAiTWF5Rmx5IiwgInJlcXVlc3QiLCAibG9nZ2VyIiwgImRlYnVnIiwgIlBsYXllckFjdGlvblR5cGUiLCAiQ29udGludWVEZXN0cm95QmxvY2siLCAiU3RhcnREZXN0cm95QmxvY2siLCAiZ2FtZW1vZGUiLCAiR2FtZW1vZGUiLCAiQ3JlYXRpdmUiLCAiYmxvY2tUYXJnZXQiLCAidHJhaXQiLCAiZ2V0QmxvY2siLCAidHJhaXRzIiwgInZhbHVlcyIsICJvblN0b3BCcmVhayIsICJMZXZlbEV2ZW50UGFja2V0IiwgImV2ZW50IiwgIkxldmVsRXZlbnQiLCAiU3RvcEJsb2NrQ3JhY2tpbmciLCAiQmxvY2tQb3NpdGlvbiIsICJ0b1ZlY3RvcjNmIiwgImRhdGEiLCAiYnJvYWRjYXN0IiwgImJsb2NrIiwgImlzQWlyIiwgIlVwZGF0ZUJsb2NrUGFja2V0IiwgImxheWVyIiwgIlVwZGF0ZUJsb2NrTGF5ZXJUeXBlIiwgIk5vcm1hbCIsICJVcGRhdGVCbG9ja0ZsYWdzVHlwZSIsICJOZXR3b3JrIiwgIm5ldHdvcmtCbG9ja0lkIiwgIm5ldHdvcmsiLCAic2VuZCIsICJjYW5jZWxlZCIsICJzdWNjZXNzIiwgIm9uU3RhcnRCcmVhayIsICJ1bmRlZmluZWQiLCAiaGVsZEl0ZW0iLCAiZ2V0SGVsZEl0ZW0iLCAiYnJlYWtUaW1lIiwgImdldEJyZWFrVGltZSIsICJTdGFydEJsb2NrQ3JhY2tpbmciLCAibWV0aG9kIiwgIkl0ZW1Vc2VNZXRob2QiLCAiQnJlYWsiLCAiUGxheWVyU3RhcnRVc2luZ0l0ZW1TaWduYWwiLCAiZW1pdCIsICJvblN0YXJ0VXNlIiwgIml0ZW1UYXJnZXQiLCAiQWJvcnREZXN0cm95QmxvY2siLCAiUGxheWVyU3RvcFVzaW5nSXRlbVNpZ25hbCIsICJvblN0b3BVc2UiLCAiUHJlZGljdERlc3Ryb3lCbG9jayIsICJzaWduYWwiLCAiUGxheWVyQnJlYWtCbG9ja1NpZ25hbCIsICJkZXN0cm95IiwgInN0YWNrIiwgIlVzZSIsICJwcmVkaWN0ZWREdXJhYmlsaXR5IiwgInRhcmdldEJsb2NrIiwgInVzZSIsICJQbGF5ZXJVc2VJdGVtU2lnbmFsIiwgImltcG9ydF9wcm90b2NvbCIsICJSZXF1ZXN0Q2h1bmtSYWRpdXNIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiUmVxdWVzdENodW5rUmFkaXVzIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJwbGF5ZXJzIiwgImdldCIsICJkaXNjb25uZWN0IiwgIm1heFZpZXdEaXN0YW5jZSIsICJkaW1lbnNpb24iLCAidmlld0Rpc3RhbmNlIiwgInJhZGl1cyIsICJ0cmFpdCIsICJnZXRUcmFpdCIsICJQbGF5ZXJDaHVua1JlbmRlcmluZ1RyYWl0IiwgImRpc3RhbmNlIiwgImRldmljZSIsICJ1cGRhdGUiLCAiQ2h1bmtSYWRpdXNVcGRhdGVQYWNrZXQiLCAic2VuZEltbWVkaWF0ZSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiUmVxdWVzdE5ldHdvcmtTZXR0aW5nc0hhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJSZXF1ZXN0TmV0d29ya1NldHRpbmdzIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgIlBST1RPQ09MX1ZFUlNJT04iLCAicHJvdG9jb2wiLCAibmV0d29yayIsICJkaXNjb25uZWN0Q29ubmVjdGlvbiIsICJEaXNjb25uZWN0UmVhc29uIiwgIk91dGRhdGVkQ2xpZW50IiwgIk91dGRhdGVkU2VydmVyIiwgInNldHRpbmdzIiwgIk5ldHdvcmtTZXR0aW5nc1BhY2tldCIsICJjb21wcmVzc2lvblRocmVzaG9sZCIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImNvbXByZXNzaW9uTWV0aG9kIiwgImNsaWVudFRocm90dGxlIiwgImNsaWVudFRocmVzaG9sZCIsICJjbGllbnRTY2FsYXIiLCAic2VuZE5vcm1hbCIsICJzZXRDb21wcmVzc2lvbiIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X25idCIsICJSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZUhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZSIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAid29ybGQiLCAiZGltZW5zaW9uIiwgInJlc3BvbnNlIiwgImxvZ2dlciIsICJkZWJ1ZyIsICJSZXNvdXJjZVBhY2tSZXNwb25zZSIsICJIYXZlQWxsUGFja3MiLCAic3RhY2siLCAiUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQiLCAibXVzdEFjY2VwdCIsICJiZWhhdmlvclBhY2tzIiwgImdhbWVWZXJzaW9uIiwgIk1JTkVDUkFGVF9WRVJTSU9OIiwgImV4cGVyaW1lbnRzIiwgImV4cGVyaW1lbnRzUHJldmlvdXNseVRvZ2dsZWQiLCAiaGFzRWRpdG9yUGFja3MiLCAidGV4dHVyZVBhY2tzIiwgInNlbmQiLCAiQ29tcGxldGVkIiwgIlN0YXJ0R2FtZVBhY2tldCIsICJlbnRpdHlJZCIsICJ1bmlxdWVJZCIsICJydW50aW1lRW50aXR5SWQiLCAicnVudGltZUlkIiwgInBsYXllckdhbWVtb2RlIiwgImdhbWVtb2RlIiwgInBsYXllclBvc2l0aW9uIiwgInBvc2l0aW9uIiwgInBpdGNoIiwgInJvdGF0aW9uIiwgInlhdyIsICJzZWVkIiwgIkJpZ0ludCIsICJnZW5lcmF0b3IiLCAicHJvcGVydGllcyIsICJiaW9tZVR5cGUiLCAiYmlvbWVOYW1lIiwgInR5cGUiLCAid29ybGRHYW1lbW9kZSIsICJoYXJkY29yZSIsICJkaWZmaWN1bHR5IiwgIkRpZmZpY3VsdHkiLCAiRWFzeSIsICJzcGF3blBvc2l0aW9uIiwgImFjaGlldmVtZW50c0Rpc2FibGVkIiwgImVkaXRvcldvcmxkVHlwZSIsICJjcmVhdGVkSW5FZGlvciIsICJleHBvcnRlZEZyb21FZGlvciIsICJkYXlDeWNsZVN0b3BUaW1lIiwgImRheVRpbWUiLCAiZWR1T2ZmZXIiLCAiZWR1RmVhdHVyZXMiLCAiZWR1UHJvZHVjdFV1aWQiLCAicmFpbkxldmVsIiwgImxpZ2h0bmluZ0xldmVsIiwgImNvbmZpcm1lZFBsYXRmb3JtTG9ja2VkQ29udGVudCIsICJtdWx0aXBsYXllckdhbWUiLCAiYnJvYWRjYXN0VG9MYW4iLCAieGJsQnJvYWRjYXN0TW9kZSIsICJwbGF0Zm9ybUJyb2FkY2FzdE1vZGUiLCAiY29tbWFuZHNFbmFibGVkIiwgInRleHR1cmVQYWNrc1JlcXVpcmVkIiwgImdhbWVydWxlcyIsICJuYW1lIiwgImVkaXRhYmxlIiwgInZhbHVlIiwgImJvbnVzQ2hlc3QiLCAibWFwRW5hYmxlZCIsICJwZXJtaXNzaW9uTGV2ZWwiLCAicGVybWlzc2lvbiIsICJzZXJ2ZXJDaHVua1RpY2tSYW5nZSIsICJzaW11bGF0aW9uRGlzdGFuY2UiLCAiaGFzTG9ja2VkQmVoYXZpb3JQYWNrIiwgImhhc0xvY2tlZFJlc291cmNlUGFjayIsICJpc0Zyb21Mb2NrZWRXb3JsZFRlbXBsYXRlIiwgInVzZU1zYUdhbWVydGFnc09ubHkiLCAiaXNGcm9tV29ybGRUZW1wbGF0ZSIsICJpc1dvcmxkVGVtcGxhdGVPcHRpb25Mb2NrZWQiLCAib25seVNwYXduVjFWaWxsYWdlcnMiLCAicGVyc29uYURpc2FibGVkIiwgImN1c3RvbVNraW5zRGlzYWJsZWQiLCAiZW1vdGVDaGF0TXV0ZWQiLCAibGltaXRlZFdvcmxkV2lkdGgiLCAibGltaXRlZFdvcmxkTGVuZ3RoIiwgImlzTmV3TmV0aGVyIiwgImVkdVJlc291cmNlVXJpQnV0dG9uTmFtZSIsICJlZHVSZXNvdXJjZVVyaUxpbmsiLCAiZXhwZXJpbWVudGFsR2FtZXBsYXlPdmVycmlkZSIsICJjaGF0UmVzdHJpY3Rpb25MZXZlbCIsICJkaXNhYmxlUGxheWVySW50ZXJhY3Rpb25zIiwgInNlcnZlcklkZW50ZmllciIsICJ3b3JsZElkZW50aWZpZXIiLCAiaWRlbnRpZmllciIsICJzY2VuYXJpb0lkZW50aWZpZXIiLCAibGV2ZWxJZCIsICJ3b3JsZE5hbWUiLCAicHJlbWl1bVdvcmxkVGVtcGxhdGVJZCIsICJpc1RyaWFsIiwgIm1vdmVtZW50QXV0aG9yaXR5IiwgInJld2luZEhpc3RvcnlTaXplIiwgInNlcnZlckF1dGhvcml0YXRpdmVCbG9ja0JyZWFraW5nIiwgImN1cnJlbnRUaWNrIiwgImVuY2hhbnRtZW50U2VlZCIsICJibG9ja1Byb3BlcnRpZXMiLCAiYmxvY2tQYWxldHRlIiwgImdldEFsbEN1c3RvbVR5cGVzIiwgIm1hcCIsICJibG9jayIsICJDdXN0b21CbG9ja1R5cGUiLCAidG9CbG9ja1Byb3BlcnR5IiwgIml0ZW1zIiwgIml0ZW1QYWxldHRlIiwgImdldEFsbFR5cGVzIiwgIml0ZW0iLCAiSXRlbVR5cGUiLCAidG9JdGVtRGF0YSIsICJtdWx0aXBsYXllckNvcnJlbGF0aW9uSWQiLCAic2VydmVyQXV0aG9yaXRhdGl2ZUludmVudG9yeSIsICJlbmdpbmUiLCAicHJvcGVydHlEYXRhMSIsICJwcm9wZXJ0eURhdGEyIiwgInByb3BlcnR5RGF0YTMiLCAiYmxvY2tQYWxldHRlQ2hlY2tzdW0iLCAid29ybGRUZW1wbGF0ZUlkIiwgImNsaWVudFNpZGVHZW5lcmF0aW9uIiwgImJsb2NrTmV0d29ya0lkc0FyZUhhc2hlcyIsICJzZXJ2ZXJDb250cm9sbGVkU291bmRzIiwgImFjdG9ycyIsICJBdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0IiwgImRhdGEiLCAiQ29tcG91bmRUYWciLCAiZW50aXRpZXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdHkiLCAiRW50aXR5VHlwZSIsICJ0b05idCIsICJjcmVhdGVMaXN0VGFnIiwgIlRhZyIsICJDb21wb3VuZCIsICJzdGF0dXMiLCAiUGxheVN0YXR1c1BhY2tldCIsICJQbGF5U3RhdHVzIiwgIlBsYXllclNwYXduIiwgInNlbmRJbW1lZGlhdGUiLCAiaW1wb3J0X3Byb3RvY29sIiwgIlNldExvY2FsUGxheWVyQXNJbml0aWFsaXplZEhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWQiLCAiaGFuZGxlIiwgIl9wYWNrZXQiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAic3Bhd24iLCAiaW1wb3J0X3Byb3RvY29sIiwgIlRleHRIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiVGV4dCIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAicGxheWVycyIsICJnZXQiLCAiZGlzY29ubmVjdCIsICJzaWduYWwiLCAiUGxheWVyQ2hhdFNpZ25hbCIsICJtZXNzYWdlIiwgImVtaXQiLCAiY2FuY2VsZWQiLCAidHJhaXQiLCAidHJhaXRzIiwgInZhbHVlcyIsICJzdWNjZXNzIiwgIm9uQ2hhdCIsICJ1bmRlZmluZWQiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImJyb2FkY2FzdCIsICJsb2dnZXIiLCAiaW5mbyIsICJ1c2VybmFtZSIsICJpbXBvcnRfcHJvdG9jb2wiLCAiQ29tbWFuZFJlcXVlc3RIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiQ29tbWFuZFJlcXVlc3QiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgIndvcmxkIiwgImRpbWVuc2lvbiIsICJuYW1lIiwgImNvbW1hbmQiLCAic3RhcnRzV2l0aCIsICJzbGljZSIsICJzdGF0ZSIsICJDb21tYW5kRXhlY3V0aW9uU3RhdGUiLCAiY29tbWFuZHMiLCAiZ2V0QWxsIiwgImNhbmNlbGVkIiwgInRyYWl0IiwgInRyYWl0cyIsICJ2YWx1ZXMiLCAic3VjY2VzcyIsICJvbkNvbW1hbmQiLCAidW5kZWZpbmVkIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJwZXJtaXNzaW9uIiwgInNlbmRNZXNzYWdlIiwgInJlc3VsdCIsICJleGVjdXRlIiwgImxvZ2dlciIsICJpbmZvIiwgInVzZXJuYW1lIiwgIm1lc3NhZ2UiLCAicmVhc29uIiwgIlR5cGVFcnJvciIsICJpbXBvcnRfcHJvdG9jb2wiLCAiSW50ZXJhY3RIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiSW50ZXJhY3QiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgImRpbWVuc2lvbiIsICJhY3Rpb24iLCAid29ybGQiLCAibG9nZ2VyIiwgImRlYnVnIiwgIkludGVyYWN0QWN0aW9uIiwgIkludGVyYWN0VXBkYXRlIiwgImFjdG9yUnVudGltZUlkIiwgImVudGl0eVRhcmdldCIsICJlbnRpdHkiLCAiZ2V0RW50aXR5IiwgIk9wZW5JbnZlbnRvcnkiLCAiaGFzVHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiY29uc29sZSIsICJsb2ciLCAiY29udGFpbmVyIiwgImdldFRyYWl0IiwgInNob3ciLCAiaW1wb3J0X3Byb3RvY29sIiwgIlJlc3Bhd25IYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiUmVzcGF3biIsICJoYW5kbGUiLCAiX3BhY2tldCIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJwbGF5ZXJzIiwgImdldCIsICJkaXNjb25uZWN0IiwgInN0YXR1cyIsICJQbGF5U3RhdHVzUGFja2V0IiwgIlBsYXlTdGF0dXMiLCAiUGxheWVyU3Bhd24iLCAic2VuZEltbWVkaWF0ZSIsICJoZWFsdGgiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SGVhbHRoVHJhaXQiLCAiY3VycmVudFZhbHVlIiwgImRlZmF1bHRWYWx1ZSIsICJzcGF3biIsICJpbXBvcnRfcHJvdG9jb2wiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkZvcm0iLCAicGVuZGluZyIsICJNYXAiLCAiZm9ybUlkIiwgInR5cGUiLCAic2hvdyIsICJwbGF5ZXIiLCAicmVzdWx0IiwgImhhcyIsICJzZXQiLCAiZ2V0IiwgInBheWxvYWQiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAicGFja2V0IiwgIk1vZGFsRm9ybVJlcXVlc3RQYWNrZXQiLCAiaWQiLCAic2VuZCIsICJ1bmlxdWVJZCIsICJjbG9zZSIsICJDbGllbnRib3VuZENsb3NlRm9ybVBhY2tldCIsICJ1cGRhdGUiLCAiU2VydmVyU2V0dGluZ3NSZXNwb25zZVBhY2tldCIsICJ2YWx1ZXMiLCAiaW1wb3J0X3Byb3RvY29sIiwgIk1lc3NhZ2VGb3JtIiwgIkZvcm0iLCAidHlwZSIsICJNb2RhbEZvcm1UeXBlIiwgIk1lc3NhZ2UiLCAidGl0bGUiLCAiY29udGVudCIsICJidXR0b24xIiwgImJ1dHRvbjIiLCAiaW1wb3J0X3Byb3RvY29sIiwgIkFjdGlvbkZvcm0iLCAiRm9ybSIsICJ0eXBlIiwgIk1vZGFsRm9ybVR5cGUiLCAiQWN0aW9uIiwgInRpdGxlIiwgImNvbnRlbnQiLCAiYnV0dG9ucyIsICJidXR0b24iLCAidGV4dCIsICJpbWFnZSIsICJwdXNoIiwgImltcG9ydF9wcm90b2NvbCIsICJNb2RhbEZvcm0iLCAiRm9ybSIsICJ0eXBlIiwgIk1vZGFsRm9ybVR5cGUiLCAiTW9kYWwiLCAidGl0bGUiLCAiY29udGVudCIsICJkcm9wZG93biIsICJ0ZXh0IiwgIm9wdGlvbnMiLCAiZGVmYXVsdEluZGV4IiwgInB1c2giLCAiZGVmYXVsdCIsICJpbnB1dCIsICJwbGFjZWhvbGRlciIsICJkZWZhdWx0VGV4dCIsICJTdHJpbmciLCAibGFiZWwiLCAic2xpZGVyIiwgIm1pbiIsICJtYXgiLCAic3RlcCIsICJkZWZhdWx0VmFsdWUiLCAic3RlcFNsaWRlciIsICJzdGVwcyIsICJ0b2dnbGUiLCAiTW9kYWxGb3JtUmVzcG9uc2VIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiTW9kYWxGb3JtUmVzcG9uc2UiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgInBlbmRpbmciLCAiRm9ybSIsICJnZXQiLCAiaWQiLCAiRXJyb3IiLCAidXNlcm5hbWUiLCAicGFydGljaXBhbnQiLCAidW5pcXVlSWQiLCAiY2FuY2VsZWQiLCAicmVzdWx0IiwgIk1vZGFsRm9ybUNhbmNlbGVkUmVhc29uIiwgInJlYXNvbiIsICJyZXNwb25zZSIsICJKU09OIiwgInBhcnNlIiwgImRhdGEiLCAiZGVsZXRlIiwgInNpemUiLCAiaW1wb3J0X3Byb3RvY29sIiwgIlJlcXVlc3RQZXJtaXNzaW9uc0hhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJSZXF1ZXN0UGVybWlzc2lvbnMiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgInRhcmdldCIsICJkaW1lbnNpb24iLCAiZ2V0RW50aXR5IiwgImFjdG9yVW5pcXVlSWQiLCAiaXNQbGF5ZXIiLCAiRXJyb3IiLCAiY2FuQnVpbGQiLCAiZ2V0RmxhZyIsICJQZXJtaXNzaW9uRmxhZyIsICJCdWlsZCIsICJjYW5NaW5lIiwgIk1pbmUiLCAiY2FuVXNlRG5TIiwgIkRvb3JzQW5kU3dpdGNoZXMiLCAiY2FuT3BlbkNvbnRhaW5lcnMiLCAiT3BlbkNvbnRhaW5lcnMiLCAiY2FuQXR0YWNrUGxheWVycyIsICJBdHRhY2tQbGF5ZXJzIiwgImNhbkF0dGFja01vYnMiLCAiQXR0YWNrTW9icyIsICJjYW5Vc2VPQyIsICJPcGVyYXRvckNvbW1hbmRzIiwgImNhblRlbGVwb3J0IiwgIlRlbGVwb3J0IiwgImFiaWxpdGllcyIsICJzdXBlclNldCIsICJBYmlsaXR5SW5kZXgiLCAidXBkYXRlIiwgImltcG9ydF9wcm90b2NvbCIsICJCbG9ja1BpY2tSZXF1ZXN0SGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIkJsb2NrUGlja1JlcXVlc3QiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgIngiLCAieSIsICJ6IiwgImFkZERhdGEiLCAiYmxvY2siLCAiZGltZW5zaW9uIiwgImdldEJsb2NrIiwgInRyYWl0IiwgInRyYWl0cyIsICJ2YWx1ZXMiLCAib25QaWNrIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIkNyZWF0aXZlIiwgIml0ZW1TdGFjayIsICJnZXRJdGVtU3RhY2siLCAiYW1vdW50IiwgImF1eGlsbGFyeSIsICJwZXJtdXRhdGlvbiIsICJpbmRleCIsICJlbnRyeSIsICJnZXREYXRhRW50cnkiLCAiY29tcG9uZW50cyIsICJzZXQiLCAiY29udGFpbmVyIiwgInNlbGVjdGVkU2xvdCIsICJnZXRUcmFpdCIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJzZXRJdGVtIiwgImltcG9ydF9wcm90b2NvbCIsICJFbW90ZUhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJFbW90ZSIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAiZGltZW5zaW9uIiwgIlBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbCIsICJlbW90ZUlkIiwgInRpY2tMZW5ndGgiLCAiZW1pdCIsICJmbGFncyIsICJzZXQiLCAiQWN0b3JGbGFnIiwgIkVtb3RpbmciLCAic2NoZWR1bGUiLCAib24iLCAiUGxheWVyU3RvcEVtb3RpbmdTaWduYWwiLCAiYnJvYWRjYXN0RXhjZXB0IiwgIkhhbmRsZXJzIiwgIlJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyIiwgIkxvZ2luSGFuZGxlciIsICJSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZUhhbmRsZXIiLCAiUGxheWVyQXV0aElucHV0SGFuZGxlciIsICJTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRIYW5kbGVyIiwgIkRpc2Nvbm5lY3RIYW5kbGVyIiwgIkNvbnRhaW5lckNsb3NlSGFuZGxlciIsICJNb2JFcXVpcG1lbnRIYW5kbGVyIiwgIkl0ZW1TdGFja1JlcXVlc3RIYW5kbGVyIiwgIlJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIiLCAiQW5pbWF0ZUhhbmRsZXIiLCAiSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyIiwgIlBsYXllckFjdGlvbkhhbmRsZXIiLCAiVGV4dEhhbmRsZXIiLCAiQ29tbWFuZFJlcXVlc3RIYW5kbGVyIiwgIkludGVyYWN0SGFuZGxlciIsICJSZXNwYXduSGFuZGxlciIsICJNb2RhbEZvcm1SZXNwb25zZUhhbmRsZXIiLCAiUmVxdWVzdFBlcm1pc3Npb25zSGFuZGxlciIsICJCbG9ja1BpY2tSZXF1ZXN0SGFuZGxlciIsICJFbW90ZUhhbmRsZXIiLCAiaW1wb3J0X25vZGVfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfcHJvdG9jb2wiLCAiRGVmYXVsdFBlcm1pc3Npb25Qcm9wZXJ0aWVzIiwgInBhdGgiLCAicGVybWlzc2lvbnMiLCAiUGVybWlzc2lvbnMiLCAiTWFwIiwgInNlcmVuaXR5IiwgInByb3BzIiwgInBlcm1pc3Npb24iLCAic2V0IiwgInV1aWQiLCAibGV2ZWwiLCAiZ2V0IiwgImtleSIsICJQZXJtaXNzaW9uTGV2ZWwiLCAiTWVtYmVyIiwgInZhbHVlIiwgIkFycmF5IiwgImZyb20iLCAiZW50cmllcyIsICJtYXAiLCAid3JpdGVGaWxlU3luYyIsICJKU09OIiwgInN0cmluZ2lmeSIsICJmcm9tUGF0aCIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAicGFyc2UiLCAicmVhZEZpbGVTeW5jIiwgIkRlZmF1bHRTZXJ2ZXJQcm9wZXJ0aWVzIiwgInBvcnQiLCAiYWRkcmVzcyIsICJtb3RkIiwgImNvbXByZXNzaW9uTWV0aG9kIiwgIkNvbXByZXNzaW9uTWV0aG9kIiwgIlpsaWIiLCAiY29tcHJlc3Npb25UaHJlc2hvbGQiLCAicGFja2V0c1BlckZyYW1lIiwgInBlcm1pc3Npb25zIiwgImRlZmF1bHRHZW5lcmF0b3IiLCAiVm9pZEdlbmVyYXRvciIsICJkZWJ1Z0xvZ2dpbmciLCAiU2VyZW5pdHkiLCAiRW1pdHRlciIsICJwcm9wZXJ0aWVzIiwgIm5ldHdvcmsiLCAid29ybGRzIiwgIk1hcCIsICJwcm92aWRlcnMiLCAiZ2VuZXJhdG9ycyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYWdlbnRhIiwgInBsYXllcnMiLCAiY29uc29sZSIsICJDb25zb2xlSW50ZXJmYWNlIiwgImFsaXZlIiwgInRpY2tzIiwgInRwcyIsICJERUJVRyIsICJOZXR3b3JrIiwgIkhhbmRsZXJzIiwgInJha25ldCIsICJtZXNzYWdlIiwgInJlZ2lzdGVyR2VuZXJhdG9yIiwgIlN1cGVyZmxhdEdlbmVyYXRvciIsICJQZXJtaXNzaW9ucyIsICJmcm9tUGF0aCIsICJzdGFydCIsICJsYXN0VGljayIsICJwcm9jZXNzIiwgImhydGltZSIsICJUUFMiLCAidGljayIsICJfX25hbWUiLCAic2Vjb25kcyIsICJuYW5vc2Vjb25kcyIsICJkZWx0YSIsICJSQUtORVRfVFBTIiwgImNvbm5lY3Rpb24iLCAiY29ubmVjdGlvbnMiLCAidmFsdWVzIiwgImRlbHRhVGljayIsICJwdXNoIiwgIkRhdGUiLCAibm93IiwgInRocmVzaG9sZCIsICJmaWx0ZXIiLCAibGVuZ3RoIiwgIndvcmxkIiwgIm9uVGljayIsICJNYXRoIiwgImZsb29yIiwgInNldEltbWVkaWF0ZSIsICJlbWl0IiwgIlNlcnZlckV2ZW50IiwgIlN0YXJ0IiwgImluZm8iLCAiTUlORUNSQUZUX1ZFUlNJT04iLCAiUFJPVE9DT0xfVkVSU0lPTiIsICJzdG9wIiwgImludGVyZmFjZSIsICJjbG9zZSIsICJTdG9wIiwgInBsYXllciIsICJnZXRXb3JsZCIsICJwcm92aWRlciIsICJ3cml0ZVBsYXllciIsICJnZXREYXRhRW50cnkiLCAiZGltZW5zaW9uIiwgImRpc2Nvbm5lY3QiLCAib25TaHV0ZG93biIsICJuZXh0VGljayIsICJzZXRNb3RkIiwgInJlZ2lzdGVyUHJvdmlkZXIiLCAiaGFzIiwgImVycm9yIiwgImlkZW50aWZpZXIiLCAiaW5pdGlhbGl6ZSIsICJEZWZhdWx0V29ybGRQcm92aWRlclByb3BlcnRpZXMiLCAic2V0IiwgImRlYnVnIiwgInJlYXNvbiIsICJnZW5lcmF0b3IiLCAiZ2V0R2VuZXJhdG9yIiwgImdldCIsICJjcmVhdGVXb3JsZCIsICJwcm92aWRlclByb3BlcnRpZXMiLCAiY3JlYXRlIiwgInJlZ2lzdGVyV29ybGQiLCAibmV4dCIsICJ2YWx1ZSIsICJnZXRXb3JsZHMiLCAib25TdGFydHVwIiwgIldvcmxkRW51bSIsICJvcHRpb25zIiwgImdldERpbWVuc2lvbiIsICJkaW1lbnNpb25zIiwgImdldERpbWVuc2lvbnMiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImdldFBsYXllckJ5WHVpZCIsICJ4dWlkIiwgImZpbmQiLCAiZ2V0UGxheWVyQnlVc2VybmFtZSIsICJ1c2VybmFtZSIsICJnZXRQbGF5ZXJCeVV1aWQiLCAidXVpZCIsICJnZXRQbGF5ZXJzIiwgIkxvb3RQb29sIiwgImVudHJpZXMiLCAicm9sbHMiLCAicm9sbCIsICJyZXN1bHRzIiwgInRvdGFsV2VpZ2h0IiwgIm1hcCIsICJ3ZWlnaHQiLCAicmVkdWNlIiwgImEiLCAiYyIsICJfIiwgInJhbmRvbVdlaWdodCIsICJNYXRoIiwgInJhbmRvbSIsICJhY2N1bXVsYXRpdmUiLCAiaXRlbVN0YWNrIiwgImZ1bmN0aW9uIiwgImNhbGxiYWNrIiwgInB1c2giLCAiYWRkRW50cnkiLCAiZW50cnkiLCAicmVtb3ZlRW50cnkiLCAic3BsaWNlIiwgImluZGV4T2YiLCAiTG9vdFRhYmxlIiwgInBvb2xzIiwgIlNldCIsICJhZGRQb29sIiwgInBvb2wiLCAiYWRkIiwgInJlbW92ZVBvb2wiLCAiZGVsZXRlIiwgImdldExvb3QiLCAibG9vdCIsICJwdXNoIiwgInJvbGwiXQp9Cg==