@ultipa-graph/ultipa-driver 6.0.8 → 6.0.10

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/client.js CHANGED
@@ -457,12 +457,12 @@ class GqldbClient {
457
457
  // Convenience API — Graph Operations (6 methods)
458
458
  // ===========================================================================
459
459
  /** Create a new open (schema-less) graph */
460
- async createOpenGraph(name) {
461
- return this.gql(`CREATE GRAPH ${name} {}`);
460
+ async createOpenGraph(name, config) {
461
+ return this.gql(`CREATE GRAPH ${name} {}`, config);
462
462
  }
463
463
  /** Create a new closed (schema-enforced) graph with node and edge label definitions */
464
- async createClosedGraph(name) {
465
- return this.gql(`CREATE GRAPH ${name} {}`);
464
+ async createClosedGraph(name, config) {
465
+ return this.gql(`CREATE GRAPH ${name} {}`, config);
466
466
  }
467
467
  /**
468
468
  * Create a graph if it does not already exist.
@@ -487,311 +487,332 @@ class GqldbClient {
487
487
  return graphs.some(g => g.name === name);
488
488
  }
489
489
  /** Rename a graph */
490
- async alterGraph(graphName, newName) {
491
- return this.gql(`ALTER GRAPH ${graphName} RENAME TO ${newName}`);
490
+ async alterGraph(graphName, newName, config) {
491
+ return this.gql(`ALTER GRAPH ${graphName} RENAME TO ${newName}`, config);
492
492
  }
493
493
  /** Remove all data from a graph while keeping its structure */
494
- async truncate(graphName) {
495
- return this.gql(`TRUNCATE GRAPH ${graphName}`);
494
+ async truncate(graphName, config) {
495
+ return this.gql(`TRUNCATE GRAPH ${graphName}`, config);
496
496
  }
497
497
  // ===========================================================================
498
498
  // Convenience API — Label Operations (16 methods)
499
499
  // ===========================================================================
500
500
  /** Return all labels (node and edge) in the current graph */
501
- async showLabels() {
502
- const resp = await this.gql('SHOW LABELS');
501
+ async showLabels(config) {
502
+ const resp = await this.gql('SHOW LABELS', config);
503
503
  return parseLabelInfoRows(resp);
504
504
  }
505
505
  /** Return all node labels in the current graph */
506
- async showNodeLabels() {
507
- const resp = await this.gql('SHOW NODE LABELS');
508
- return parseLabelInfoRows(resp);
506
+ async showNodeLabels(config) {
507
+ const resp = await this.gql('SHOW NODE LABELS', config);
508
+ return parseLabelInfoRows(resp, 'NODE');
509
509
  }
510
510
  /** Return all edge labels in the current graph */
511
- async showEdgeLabels() {
512
- const resp = await this.gql('SHOW EDGE LABELS');
513
- return parseLabelInfoRows(resp);
511
+ async showEdgeLabels(config) {
512
+ const resp = await this.gql('SHOW EDGE LABELS', config);
513
+ return parseLabelInfoRows(resp, 'EDGE');
514
514
  }
515
515
  /** Return all node types with their properties */
516
- async showNodeTypes() {
517
- const resp = await this.gql('SHOW NODE TYPES');
516
+ async showNodeTypes(config) {
517
+ const resp = await this.gql('SHOW NODE TYPES', config);
518
518
  return parseNodeTypeInfoRows(resp);
519
519
  }
520
520
  /** Return all edge types with their properties */
521
- async showEdgeTypes() {
522
- const resp = await this.gql('SHOW EDGE TYPES');
521
+ async showEdgeTypes(config) {
522
+ const resp = await this.gql('SHOW EDGE TYPES', config);
523
523
  return parseEdgeTypeInfoRows(resp);
524
524
  }
525
- /** Return a specific label by name from the current graph, or null if not found */
526
- async getLabel(name) {
527
- const labels = await this.showLabels();
528
- return labels.find(l => l.name === name) || null;
525
+ /**
526
+ * Return a specific label by name from the current graph, or null if not found.
527
+ * Matches entries where `name` is one of the .labels (supports multi-label groups).
528
+ */
529
+ async getLabel(name, config) {
530
+ const labels = await this.showLabels(config);
531
+ return labels.find(l => l.labels.includes(name)) || null;
529
532
  }
530
533
  /** Return a specific node type by name, or null if not found */
531
- async getNodeLabel(name) {
532
- const types = await this.showNodeTypes();
534
+ async getNodeLabel(name, config) {
535
+ const types = await this.showNodeTypes(config);
533
536
  return types.find(t => t.name === name) || null;
534
537
  }
535
538
  /** Return a specific edge type by name, or null if not found */
536
- async getEdgeLabel(name) {
537
- const types = await this.showEdgeTypes();
539
+ async getEdgeLabel(name, config) {
540
+ const types = await this.showEdgeTypes(config);
538
541
  return types.find(t => t.name === name) || null;
539
542
  }
540
543
  /** Create a node label in the current graph (closed graph) */
541
- async createNodeLabel(name, props = []) {
542
- const currentGraph = this.sessions.getDefaultGraph();
544
+ async createNodeLabel(name, props = [], config) {
545
+ const targetGraph = config?.graphName || this.sessions.getDefaultGraph();
543
546
  const propStr = (0, types_1.buildPropertyDefString)(props);
544
- return this.gql(`ALTER GRAPH ${currentGraph} ADD NODE { ${GqldbClient.quoteLabel(name)} (${propStr}) }`);
547
+ return this.gql(`ALTER GRAPH ${targetGraph} ADD NODE { ${GqldbClient.quoteLabel(name)} (${propStr}) }`, config);
545
548
  }
546
549
  /** Create an edge label in the current graph (closed graph) */
547
- async createEdgeLabel(name, props = []) {
548
- const currentGraph = this.sessions.getDefaultGraph();
550
+ async createEdgeLabel(name, props = [], config) {
551
+ const targetGraph = config?.graphName || this.sessions.getDefaultGraph();
549
552
  const propStr = (0, types_1.buildPropertyDefString)(props);
550
- return this.gql(`ALTER GRAPH ${currentGraph} ADD EDGE { ${GqldbClient.quoteLabel(name)} ()-[${propStr}]->() }`);
553
+ return this.gql(`ALTER GRAPH ${targetGraph} ADD EDGE { ${GqldbClient.quoteLabel(name)} ()-[${propStr}]->() }`, config);
551
554
  }
552
555
  /** Drop a node label from the current graph (closed graph) */
553
- async dropNodeLabel(name) {
554
- const currentGraph = this.sessions.getDefaultGraph();
555
- return this.gql(`ALTER GRAPH ${currentGraph} DROP NODE ${GqldbClient.quoteLabel(name)}`);
556
+ async dropNodeLabel(name, config) {
557
+ const targetGraph = config?.graphName || this.sessions.getDefaultGraph();
558
+ return this.gql(`ALTER GRAPH ${targetGraph} DROP NODE ${GqldbClient.quoteLabel(name)}`, config);
556
559
  }
557
560
  /** Drop one or more edge labels from the current graph (closed graph) */
558
- async dropEdgeLabel(...names) {
559
- const currentGraph = this.sessions.getDefaultGraph();
560
- return this.gql(`ALTER GRAPH ${currentGraph} DROP EDGE ${GqldbClient.quoteLabels(...names)}`);
561
+ async dropEdgeLabel(...namesOrConfig) {
562
+ // Last arg may be a QueryConfig (or undefined); treat non-string as config.
563
+ let config;
564
+ let names;
565
+ if (namesOrConfig.length > 0 && typeof namesOrConfig[namesOrConfig.length - 1] !== 'string') {
566
+ config = namesOrConfig[namesOrConfig.length - 1];
567
+ names = namesOrConfig.slice(0, -1);
568
+ }
569
+ else {
570
+ names = namesOrConfig;
571
+ }
572
+ const targetGraph = config?.graphName || this.sessions.getDefaultGraph();
573
+ return this.gql(`ALTER GRAPH ${targetGraph} DROP EDGE ${GqldbClient.quoteLabels(...names)}`, config);
561
574
  }
562
575
  /**
563
576
  * Create a label if it does not already exist.
564
577
  * Returns true if created, false if it already existed.
565
578
  */
566
- async createLabelIfNotExist(nodeOrEdge, name, props = []) {
567
- const labels = await this.showLabels();
579
+ async createLabelIfNotExist(nodeOrEdge, name, props = [], config) {
580
+ const labels = await this.showLabels(config);
568
581
  const targetType = nodeOrEdge === types_1.DBType.EDGE ? 'EDGE' : 'NODE';
569
- if (labels.some(l => l.name === name && l.type === targetType)) {
582
+ if (labels.some(l => l.labels.includes(name) && l.type === targetType)) {
570
583
  return false;
571
584
  }
572
585
  if (nodeOrEdge === types_1.DBType.NODE) {
573
- await this.createNodeLabel(name, props);
586
+ await this.createNodeLabel(name, props, config);
574
587
  }
575
588
  else {
576
- await this.createEdgeLabel(name, props);
589
+ await this.createEdgeLabel(name, props, config);
577
590
  }
578
591
  return true;
579
592
  }
580
593
  /** Rename a node label */
581
- async alterNodeLabel(oldName, newName) {
582
- return this.gql(`ALTER NODE ${GqldbClient.quoteLabel(oldName)} RENAME TO ${GqldbClient.quoteLabel(newName)}`);
594
+ async alterNodeLabel(oldName, newName, config) {
595
+ return this.gql(`ALTER NODE ${GqldbClient.quoteLabel(oldName)} RENAME TO ${GqldbClient.quoteLabel(newName)}`, config);
583
596
  }
584
597
  /** Rename an edge label */
585
- async alterEdgeLabel(oldName, newName) {
586
- return this.gql(`ALTER EDGE ${GqldbClient.quoteLabel(oldName)} RENAME TO ${GqldbClient.quoteLabel(newName)}`);
598
+ async alterEdgeLabel(oldName, newName, config) {
599
+ return this.gql(`ALTER EDGE ${GqldbClient.quoteLabel(oldName)} RENAME TO ${GqldbClient.quoteLabel(newName)}`, config);
587
600
  }
588
601
  /** Return all available algorithms */
589
- async showAlgos() {
590
- const resp = await this.gql('SHOW ALGOS');
602
+ async showAlgos(config) {
603
+ const resp = await this.gql('SHOW ALGOS', config);
591
604
  return parseAlgoInfoRows(resp);
592
605
  }
593
606
  // ===========================================================================
594
607
  // Convenience API — Property Operations (13 methods)
595
608
  // ===========================================================================
596
609
  /** Return properties for a label (node or edge) in the current graph */
597
- async showProperty(nodeOrEdge, labelName) {
610
+ async showProperty(nodeOrEdge, labelName, config) {
598
611
  if (nodeOrEdge === types_1.DBType.NODE) {
599
- return this.showNodeProperty(labelName);
612
+ return this.showNodeProperty(labelName, config);
600
613
  }
601
- return this.showEdgeProperty(labelName);
614
+ return this.showEdgeProperty(labelName, config);
602
615
  }
603
616
  /** Return properties for a node label */
604
- async showNodeProperty(labelName) {
605
- const nt = await this.getNodeLabel(labelName);
617
+ async showNodeProperty(labelName, config) {
618
+ const nt = await this.getNodeLabel(labelName, config);
606
619
  if (!nt)
607
620
  throw new Error(`Node label "${labelName}" not found`);
608
621
  return nt.properties;
609
622
  }
610
623
  /** Return properties for an edge label */
611
- async showEdgeProperty(labelName) {
612
- const et = await this.getEdgeLabel(labelName);
624
+ async showEdgeProperty(labelName, config) {
625
+ const et = await this.getEdgeLabel(labelName, config);
613
626
  if (!et)
614
627
  throw new Error(`Edge label "${labelName}" not found`);
615
628
  return et.properties;
616
629
  }
617
630
  /** Return a specific property definition for a label, or null if not found */
618
- async getProperty(nodeOrEdge, labelName, propName) {
619
- const props = await this.showProperty(nodeOrEdge, labelName);
631
+ async getProperty(nodeOrEdge, labelName, propName, config) {
632
+ const props = await this.showProperty(nodeOrEdge, labelName, config);
620
633
  return props.find(p => p.name === propName) || null;
621
634
  }
622
635
  /** Return a specific property definition for a node label, or null if not found */
623
- async getNodeProperty(labelName, propName) {
624
- return this.getProperty(types_1.DBType.NODE, labelName, propName);
636
+ async getNodeProperty(labelName, propName, config) {
637
+ return this.getProperty(types_1.DBType.NODE, labelName, propName, config);
625
638
  }
626
639
  /** Return a specific property definition for an edge label, or null if not found */
627
- async getEdgeProperty(labelName, propName) {
628
- return this.getProperty(types_1.DBType.EDGE, labelName, propName);
640
+ async getEdgeProperty(labelName, propName, config) {
641
+ return this.getProperty(types_1.DBType.EDGE, labelName, propName, config);
629
642
  }
630
643
  /** Add properties to a label (node or edge) */
631
- async createProperty(nodeOrEdge, labelName, props) {
644
+ async createProperty(nodeOrEdge, labelName, props, config) {
632
645
  if (nodeOrEdge === types_1.DBType.NODE) {
633
- return this.createNodeProperty(labelName, props);
646
+ return this.createNodeProperty(labelName, props, config);
634
647
  }
635
- return this.createEdgeProperty(labelName, props);
648
+ return this.createEdgeProperty(labelName, props, config);
636
649
  }
637
650
  /** Add properties to a node label */
638
- async createNodeProperty(labelName, props) {
651
+ async createNodeProperty(labelName, props, config) {
639
652
  const propStr = (0, types_1.buildPropertyDefString)(props);
640
- return this.gql(`ALTER NODE ${GqldbClient.quoteLabel(labelName)} ADD PROPERTY ${propStr}`);
653
+ return this.gql(`ALTER NODE ${GqldbClient.quoteLabel(labelName)} ADD PROPERTY ${propStr}`, config);
641
654
  }
642
655
  /** Add properties to an edge label */
643
- async createEdgeProperty(labelName, props) {
656
+ async createEdgeProperty(labelName, props, config) {
644
657
  const propStr = (0, types_1.buildPropertyDefString)(props);
645
- return this.gql(`ALTER EDGE ${GqldbClient.quoteLabel(labelName)} ADD PROPERTY ${propStr}`);
658
+ return this.gql(`ALTER EDGE ${GqldbClient.quoteLabel(labelName)} ADD PROPERTY ${propStr}`, config);
646
659
  }
647
660
  /** Drop properties from a label (node or edge) */
648
- async dropProperty(nodeOrEdge, labelName, ...propNames) {
661
+ async dropProperty(nodeOrEdge, labelName, ...propNamesOrConfig) {
662
+ const { names, config } = splitTrailingConfig(propNamesOrConfig);
649
663
  if (nodeOrEdge === types_1.DBType.NODE) {
650
- return this.dropNodeProperty(labelName, ...propNames);
664
+ return this.dropNodeProperty(labelName, ...names, config);
651
665
  }
652
- return this.dropEdgeProperty(labelName, ...propNames);
666
+ return this.dropEdgeProperty(labelName, ...names, config);
653
667
  }
654
668
  /** Drop properties from a node label */
655
- async dropNodeProperty(labelName, ...propNames) {
656
- return this.gql(`ALTER NODE ${GqldbClient.quoteLabel(labelName)} DROP PROPERTY ${GqldbClient.quoteLabels(...propNames)}`);
669
+ async dropNodeProperty(labelName, ...propNamesOrConfig) {
670
+ const { names, config } = splitTrailingConfig(propNamesOrConfig);
671
+ return this.gql(`ALTER NODE ${GqldbClient.quoteLabel(labelName)} DROP PROPERTY ${GqldbClient.quoteLabels(...names)}`, config);
657
672
  }
658
673
  /** Drop properties from an edge label */
659
- async dropEdgeProperty(labelName, ...propNames) {
660
- return this.gql(`ALTER EDGE ${GqldbClient.quoteLabel(labelName)} DROP PROPERTY ${GqldbClient.quoteLabels(...propNames)}`);
674
+ async dropEdgeProperty(labelName, ...propNamesOrConfig) {
675
+ const { names, config } = splitTrailingConfig(propNamesOrConfig);
676
+ return this.gql(`ALTER EDGE ${GqldbClient.quoteLabel(labelName)} DROP PROPERTY ${GqldbClient.quoteLabels(...names)}`, config);
661
677
  }
662
678
  /**
663
679
  * Create properties on a label if they do not already exist.
664
680
  * Returns true if any properties were created, false if all already existed.
665
681
  */
666
- async createPropertyIfNotExist(nodeOrEdge, labelName, props) {
667
- const existing = await this.showProperty(nodeOrEdge, labelName);
682
+ async createPropertyIfNotExist(nodeOrEdge, labelName, props, config) {
683
+ const existing = await this.showProperty(nodeOrEdge, labelName, config);
668
684
  const existingSet = new Set(existing.map(p => p.name));
669
685
  const newProps = props.filter(p => !existingSet.has(p.name));
670
686
  if (newProps.length === 0)
671
687
  return false;
672
- await this.createProperty(nodeOrEdge, labelName, newProps);
688
+ await this.createProperty(nodeOrEdge, labelName, newProps, config);
673
689
  return true;
674
690
  }
675
691
  // ===========================================================================
676
692
  // Convenience API — Constraint Operations (4 methods)
677
693
  // ===========================================================================
678
694
  /** Create a NOT NULL constraint on a property */
679
- async createNotNullConstraint(nodeOrEdge, labelName, propName) {
695
+ async createNotNullConstraint(nodeOrEdge, labelName, propName, config) {
680
696
  const entityType = (0, types_1.dbTypeToKeyword)(nodeOrEdge);
681
- return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} ADD CONSTRAINT NOT NULL ON ${GqldbClient.quoteLabel(propName)}`);
697
+ return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} ADD CONSTRAINT NOT NULL ON ${GqldbClient.quoteLabel(propName)}`, config);
682
698
  }
683
699
  /** Create a UNIQUE constraint on one or more properties */
684
- async createUniqueConstraint(nodeOrEdge, labelName, ...propNames) {
700
+ async createUniqueConstraint(nodeOrEdge, labelName, ...propNamesOrConfig) {
701
+ const { names, config } = splitTrailingConfig(propNamesOrConfig);
685
702
  const entityType = (0, types_1.dbTypeToKeyword)(nodeOrEdge);
686
- return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} ADD CONSTRAINT UNIQUE ON ${GqldbClient.quoteLabels(...propNames)}`);
703
+ return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} ADD CONSTRAINT UNIQUE ON ${GqldbClient.quoteLabels(...names)}`, config);
687
704
  }
688
705
  /** Remove a NOT NULL constraint from a property */
689
- async dropNotNullConstraint(nodeOrEdge, labelName, propName) {
706
+ async dropNotNullConstraint(nodeOrEdge, labelName, propName, config) {
690
707
  const entityType = (0, types_1.dbTypeToKeyword)(nodeOrEdge);
691
- return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} DROP CONSTRAINT NOT NULL ON ${GqldbClient.quoteLabel(propName)}`);
708
+ return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} DROP CONSTRAINT NOT NULL ON ${GqldbClient.quoteLabel(propName)}`, config);
692
709
  }
693
710
  /** Remove a UNIQUE constraint from one or more properties */
694
- async dropUniqueConstraint(nodeOrEdge, labelName, ...propNames) {
711
+ async dropUniqueConstraint(nodeOrEdge, labelName, ...propNamesOrConfig) {
712
+ const { names, config } = splitTrailingConfig(propNamesOrConfig);
695
713
  const entityType = (0, types_1.dbTypeToKeyword)(nodeOrEdge);
696
- return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} DROP CONSTRAINT UNIQUE ON ${GqldbClient.quoteLabels(...propNames)}`);
714
+ return this.gql(`ALTER ${entityType} ${GqldbClient.quoteLabel(labelName)} DROP CONSTRAINT UNIQUE ON ${GqldbClient.quoteLabels(...names)}`, config);
697
715
  }
698
716
  // ===========================================================================
699
717
  // Convenience API — Index Operations (7 methods)
700
718
  // ===========================================================================
701
719
  /** Return all indexes in the current graph */
702
- async showIndex() {
703
- const resp = await this.gql('SHOW INDEX');
720
+ async showIndex(config) {
721
+ const resp = await this.gql('SHOW INDEX', config);
704
722
  return parseIndexInfoRows(resp);
705
723
  }
706
724
  /** Return all node indexes in the current graph */
707
- async showNodeIndex() {
708
- const resp = await this.gql('SHOW NODE INDEX');
725
+ async showNodeIndex(config) {
726
+ const resp = await this.gql('SHOW NODE INDEX', config);
709
727
  return parseIndexInfoRows(resp);
710
728
  }
711
729
  /** Return all edge indexes in the current graph */
712
- async showEdgeIndex() {
713
- const resp = await this.gql('SHOW EDGE INDEX');
730
+ async showEdgeIndex(config) {
731
+ const resp = await this.gql('SHOW EDGE INDEX', config);
714
732
  return parseIndexInfoRows(resp);
715
733
  }
716
734
  /** Create an index on a node label */
717
- async createNodeIndex(indexName, labelName, props) {
735
+ async createNodeIndex(indexName, labelName, props, config) {
718
736
  const propStr = (0, types_1.buildIndexPropertyString)(props);
719
- return this.gql(`CREATE INDEX ${indexName} ON NODE ${GqldbClient.quoteLabel(labelName)} (${propStr})`);
737
+ return this.gql(`CREATE INDEX ${indexName} ON NODE ${GqldbClient.quoteLabel(labelName)} (${propStr})`, config);
720
738
  }
721
739
  /** Create an index on an edge label */
722
- async createEdgeIndex(indexName, labelName, props) {
740
+ async createEdgeIndex(indexName, labelName, props, config) {
723
741
  const propStr = (0, types_1.buildIndexPropertyString)(props);
724
- return this.gql(`CREATE INDEX ${indexName} ON EDGE ${GqldbClient.quoteLabel(labelName)} (${propStr})`);
742
+ return this.gql(`CREATE INDEX ${indexName} ON EDGE ${GqldbClient.quoteLabel(labelName)} (${propStr})`, config);
725
743
  }
726
744
  /** Drop a node index by name */
727
- async dropNodeIndex(indexName) {
728
- return this.gql(`DROP NODE INDEX ${indexName}`);
745
+ async dropNodeIndex(indexName, config) {
746
+ return this.gql(`DROP NODE INDEX ${indexName}`, config);
729
747
  }
730
748
  /** Drop an edge index by name */
731
- async dropEdgeIndex(indexName) {
732
- return this.gql(`DROP EDGE INDEX ${indexName}`);
749
+ async dropEdgeIndex(indexName, config) {
750
+ return this.gql(`DROP EDGE INDEX ${indexName}`, config);
733
751
  }
734
752
  // ===========================================================================
735
753
  // Convenience API — Fulltext Operations (7 methods)
736
754
  // ===========================================================================
737
755
  /** Return all fulltext indexes in the current graph */
738
- async showFulltext() {
739
- const resp = await this.gql('SHOW FULLTEXT');
756
+ async showFulltext(config) {
757
+ const resp = await this.gql('SHOW FULLTEXT', config);
740
758
  return parseFulltextInfoRows(resp);
741
759
  }
742
760
  /** Return all node fulltext indexes */
743
- async showNodeFulltext() {
744
- const resp = await this.gql('SHOW NODE FULLTEXT');
761
+ async showNodeFulltext(config) {
762
+ const resp = await this.gql('SHOW NODE FULLTEXT', config);
745
763
  return parseFulltextInfoRows(resp);
746
764
  }
747
765
  /** Return all edge fulltext indexes */
748
- async showEdgeFulltext() {
749
- const resp = await this.gql('SHOW EDGE FULLTEXT');
766
+ async showEdgeFulltext(config) {
767
+ const resp = await this.gql('SHOW EDGE FULLTEXT', config);
750
768
  return parseFulltextInfoRows(resp);
751
769
  }
752
770
  /** Create a fulltext index on a node label */
753
- async createNodeFulltext(indexName, labelName, props) {
754
- return this.gql(`CREATE FULLTEXT ${indexName} ON NODE ${GqldbClient.quoteLabel(labelName)} (${GqldbClient.quoteLabels(...props)})`);
771
+ async createNodeFulltext(indexName, labelName, props, config) {
772
+ return this.gql(`CREATE FULLTEXT ${indexName} ON NODE ${GqldbClient.quoteLabel(labelName)} (${GqldbClient.quoteLabels(...props)})`, config);
755
773
  }
756
774
  /** Create a fulltext index on an edge label */
757
- async createEdgeFulltext(indexName, labelName, props) {
758
- return this.gql(`CREATE FULLTEXT ${indexName} ON EDGE ${GqldbClient.quoteLabel(labelName)} (${GqldbClient.quoteLabels(...props)})`);
775
+ async createEdgeFulltext(indexName, labelName, props, config) {
776
+ return this.gql(`CREATE FULLTEXT ${indexName} ON EDGE ${GqldbClient.quoteLabel(labelName)} (${GqldbClient.quoteLabels(...props)})`, config);
759
777
  }
760
778
  /** Drop a node fulltext index by name */
761
- async dropNodeFulltext(indexName) {
762
- return this.gql(`DROP NODE FULLTEXT ${indexName}`);
779
+ async dropNodeFulltext(indexName, config) {
780
+ return this.gql(`DROP NODE FULLTEXT ${indexName}`, config);
763
781
  }
764
782
  /** Drop an edge fulltext index by name */
765
- async dropEdgeFulltext(indexName) {
766
- return this.gql(`DROP EDGE FULLTEXT ${indexName}`);
783
+ async dropEdgeFulltext(indexName, config) {
784
+ return this.gql(`DROP EDGE FULLTEXT ${indexName}`, config);
767
785
  }
768
786
  // ===========================================================================
769
787
  // Convenience API — Task Operations (3 methods)
770
788
  // ===========================================================================
771
789
  /** Return all tasks in the current graph */
772
- async showTasks() {
773
- const resp = await this.gql('SHOW TASKS');
790
+ async showTasks(config) {
791
+ const resp = await this.gql('SHOW TASKS', config);
774
792
  return parseTaskInfoRows(resp);
775
793
  }
776
794
  /** Delete a task by ID */
777
- async deleteTask(taskId) {
778
- return this.gql(`DELETE TASK ${taskId}`);
795
+ async deleteTask(taskId, config) {
796
+ return this.gql(`DELETE TASK ${taskId}`, config);
779
797
  }
780
798
  /** Stop a running task by ID */
781
- async stopTask(taskId) {
782
- return this.gql(`STOP TASK ${taskId}`);
799
+ async stopTask(taskId, config) {
800
+ return this.gql(`STOP TASK ${taskId}`, config);
783
801
  }
784
802
  // ===========================================================================
785
803
  // Convenience API — Data Insert Operations (4 methods)
786
804
  // ===========================================================================
787
- /** Insert nodes using GQL INSERT syntax */
788
805
  /**
789
806
  * Insert nodes using GQL INSERT syntax with RETURN clause.
790
807
  * GQL: INSERT (n0:Label {p1: v1}), (n1:Label {p2: v2}) RETURN n0, n1
808
+ * When config.insertType is InsertType.Overwrite, uses INSERT OVERWRITE syntax.
791
809
  * If NodeData.id is set (non-empty), includes it as _id property in the GQL.
792
810
  * Returns the raw Response containing the inserted nodes in columns n0, n1, etc.
811
+ *
812
+ * @param nodes Nodes to insert.
813
+ * @param config Optional InsertConfig. Supports per-call graphName and insertType.
793
814
  */
794
- async insertNodes(nodes, insertType = types_1.InsertType.Normal) {
815
+ async insertNodes(nodes, config) {
795
816
  if (nodes.length === 0)
796
817
  return new response_1.Response([], [], 0, false, [], 0);
797
818
  nodes.forEach((node, i) => {
@@ -813,20 +834,26 @@ class GqldbClient {
813
834
  const propStr = (0, types_1.buildPropertiesValueString)(props);
814
835
  return propStr ? `(${varName}:${label} ${propStr})` : `(${varName}:${label})`;
815
836
  });
837
+ const insertType = config?.insertType ?? types_1.InsertType.Normal;
816
838
  const insertKeyword = insertType === types_1.InsertType.Overwrite ? 'INSERT OVERWRITE' : 'INSERT';
817
839
  const gqlStr = insertKeyword + ' ' + parts.join(', ') + ' RETURN ' + varNames.join(', ');
818
- return this.gql(gqlStr);
840
+ return this.gql(gqlStr, config);
819
841
  }
820
842
  /**
821
843
  * Insert edges using GQL INSERT syntax with RETURN clause.
822
844
  * Each edge is inserted individually using MATCH + INSERT to resolve node IDs.
823
845
  * GQL: MATCH (src WHERE id(src) = 'from'), (dst WHERE id(dst) = 'to')
824
846
  * INSERT (src)-[e0:Label {p1: v1}]->(dst) RETURN e0
847
+ * When config.insertType is InsertType.Overwrite, uses INSERT OVERWRITE syntax.
825
848
  * Returns a merged Response containing all inserted edges in columns e0, e1, etc.
849
+ *
850
+ * @param edges Edges to insert.
851
+ * @param config Optional InsertConfig. Supports per-call graphName and insertType.
826
852
  */
827
- async insertEdges(edges, insertType = types_1.InsertType.Normal) {
853
+ async insertEdges(edges, config) {
828
854
  if (edges.length === 0)
829
855
  return new response_1.Response([], [], 0, false, [], 0);
856
+ const insertType = config?.insertType ?? types_1.InsertType.Normal;
830
857
  const insertKeyword = insertType === types_1.InsertType.Overwrite ? 'INSERT OVERWRITE' : 'INSERT';
831
858
  const allColumns = [];
832
859
  const allValues = [];
@@ -840,7 +867,7 @@ class GqldbClient {
840
867
  const gqlStr = `MATCH (src WHERE id(src) = '${edge.fromNodeId}'), `
841
868
  + `(dst WHERE id(dst) = '${edge.toNodeId}') `
842
869
  + `${insertKeyword} (src)-${edgePart}->(dst) RETURN ${varName}`;
843
- const resp = await this.gql(gqlStr);
870
+ const resp = await this.gql(gqlStr, config);
844
871
  totalAffected += resp.rowsAffected;
845
872
  allColumns.push(varName);
846
873
  if (resp.rows.length > 0 && resp.rows[0].values.length > 0) {
@@ -854,18 +881,22 @@ class GqldbClient {
854
881
  // Convenience API — System & Process Operations (4 methods)
855
882
  // ===========================================================================
856
883
  /** Return currently running processes (queries) */
857
- async top() {
858
- const resp = await this.gql('TOP');
884
+ async top(config) {
885
+ const resp = await this.gql('TOP', config);
859
886
  return parseProcessInfoRows(resp);
860
887
  }
861
888
  /** Terminate a running query by its query ID */
862
- async kill(queryId) {
863
- return this.gql(`KILL '${queryId}'`);
889
+ async kill(queryId, config) {
890
+ return this.gql(`KILL '${queryId}'`, config);
864
891
  }
865
892
  /** Return statistics for the current graph using db.stats() */
866
- async stats() {
867
- const resp = await this.gql('RETURN db.stats() AS stats');
868
- return parseGraphStats(resp);
893
+ async stats(config) {
894
+ const currentGraph = config?.graphName || this.sessions.getDefaultGraph();
895
+ const resp = await this.gql('RETURN db.stats() AS stats', config);
896
+ const gs = parseGraphStats(resp);
897
+ if (!gs.graphName)
898
+ gs.graphName = currentGraph;
899
+ return gs;
869
900
  }
870
901
  /** Send a ping to the server and return the latency in nanoseconds */
871
902
  async test() {
@@ -874,6 +905,28 @@ class GqldbClient {
874
905
  }
875
906
  exports.GqldbClient = GqldbClient;
876
907
  // =============================================================================
908
+ // Internal Helpers — Trailing Config Splitter
909
+ // =============================================================================
910
+ /**
911
+ * Split a variadic arg list where the last element *may* be a QueryConfig
912
+ * into separate string names and an optional config. Python uses keyword-only
913
+ * `config` in these APIs; the TypeScript equivalent is an optional trailing
914
+ * config object detected by "not a string".
915
+ */
916
+ function splitTrailingConfig(args) {
917
+ if (args.length === 0)
918
+ return { names: [] };
919
+ const last = args[args.length - 1];
920
+ if (last !== undefined && typeof last !== 'string') {
921
+ return { names: args.slice(0, -1), config: last };
922
+ }
923
+ // If last is undefined, strip it as a trailing optional config placeholder.
924
+ if (last === undefined) {
925
+ return { names: args.slice(0, -1) };
926
+ }
927
+ return { names: args };
928
+ }
929
+ // =============================================================================
877
930
  // Internal Helpers — Parsing Response Rows
878
931
  // =============================================================================
879
932
  /** Find the index of a column by name (case-insensitive), or -1 if not found */
@@ -914,15 +967,35 @@ function getNumberVal(row, idx) {
914
967
  return 0;
915
968
  }
916
969
  }
917
- function parseLabelInfoRows(resp) {
970
+ /** Normalize a label column value to a string array.
971
+ *
972
+ * Server returns a list (multi-label support). Accept list of strings,
973
+ * a single string (degraded servers), or null/undefined.
974
+ */
975
+ function parseLabelsValue(val) {
976
+ if (val === null || val === undefined)
977
+ return [];
978
+ if (Array.isArray(val))
979
+ return val.map((x) => String(x));
980
+ return [String(val)];
981
+ }
982
+ function parseLabelInfoRows(resp, forcedType) {
918
983
  if (resp.rows.length === 0)
919
984
  return [];
920
- const labelIdx = findColumnIndex(resp, 'label');
921
- const typeIdx = findColumnIndex(resp, 'type');
922
- return resp.rows.map(row => ({
923
- name: getStringVal(row, labelIdx),
924
- type: getStringVal(row, typeIdx),
925
- }));
985
+ let labelIdx = findColumnIndex(resp, 'label');
986
+ if (labelIdx < 0)
987
+ labelIdx = findColumnIndex(resp, 'name');
988
+ let typeIdx = findColumnIndex(resp, 'type');
989
+ if (typeIdx < 0)
990
+ typeIdx = findColumnIndex(resp, 'element_type');
991
+ return resp.rows.map(row => {
992
+ const rawLabel = labelIdx >= 0 ? row.get(labelIdx) : null;
993
+ const type = forcedType !== undefined ? forcedType : getStringVal(row, typeIdx);
994
+ return {
995
+ labels: parseLabelsValue(rawLabel),
996
+ type,
997
+ };
998
+ });
926
999
  }
927
1000
  function parseNodeTypeInfoRows(resp) {
928
1001
  if (resp.rows.length === 0)
@@ -1089,4 +1162,4 @@ function parseGraphStats(resp) {
1089
1162
  }
1090
1163
  return gs;
1091
1164
  }
1092
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBV29CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBeUNpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBa0MxQiw2Q0FBNkM7QUFDN0MsTUFBYSxXQUFXO0lBQ2QsTUFBTSxDQUFjO0lBQ3BCLE9BQU8sQ0FBaUI7SUFDeEIsUUFBUSxDQUFpQjtJQUN6QixTQUFTLENBQXFCO0lBQzlCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFdkIsd0NBQXdDO0lBQ2hDLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUM1QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBRWpDLG9CQUFvQjtJQUNaLGNBQWMsQ0FBaUI7SUFDL0IsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBZ0I7SUFDN0IsWUFBWSxDQUFlO0lBQzNCLGlCQUFpQixDQUFvQjtJQUU3QyxzREFBc0Q7SUFDOUMsa0JBQWtCO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsWUFBWSxNQUFtQjtRQUM3QixJQUFBLHVCQUFjLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHdCQUFjLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZ0NBQWtCLEVBQUUsQ0FBQztRQUUxQywwQkFBMEI7UUFDMUIsSUFBSSxXQUFvQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEQsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixNQUFNLE9BQU8sR0FBd0I7WUFDbkMsaUNBQWlDLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDeEUsd0JBQXdCLEVBQUUsS0FBSztZQUMvQiwyQkFBMkIsRUFBRSxLQUFLO1lBQ2xDLHFDQUFxQyxFQUFFLENBQUM7U0FDekMsQ0FBQztRQUVGLDRDQUE0QztRQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSwrQkFBb0IsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWhFLDZCQUE2QjtRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpGLCtCQUErQjtRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksc0JBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksb0JBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksb0JBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksbUJBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUkscUJBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksb0JBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSx5QkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLG9DQUFvQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUFJLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQW9CLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQW9CLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUEwQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFxQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFvQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBeUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3BELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsc0JBQXNCO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGtCQUFrQjtJQUNsQiw4RUFBOEU7SUFFOUUsaURBQWlEO0lBQ2pELEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEcsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQy9CLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQixDQUFJLEVBQW9CO1FBQ3JELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkUsTUFBTSxpQkFBaUIsR0FDckIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUN6QyxRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUNwQyxRQUFRLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO2dCQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDdkMsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzdDLDZDQUE2QztnQkFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDcEMsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsTUFBTSxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7Z0JBQ3JELENBQUM7Z0JBQ0QsdUNBQXVDO2dCQUN2QyxJQUFJLFVBQVUsSUFBSSxVQUFVLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQzlDLElBQUksQ0FBQzt3QkFBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQUMsQ0FBQztvQkFBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO2dCQUNELE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxhQUFhO1lBQzVCLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLEtBQUssQ0FBQyxNQUFNO1FBQ1YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsS0FBSyxDQUFDLElBQUk7UUFDUixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxnQkFBZ0I7SUFDaEIsOEVBQThFO0lBRTlFLGdEQUFnRDtJQUNoRCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFvQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELEtBQUssQ0FBQyxTQUFTLENBQ2IsS0FBYSxFQUNiLE1BQW9CLEVBQ3BCLFFBQXVDO1FBRXZDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBYSxFQUFFLE1BQW9CO1FBQy9DLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBb0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxnQkFBZ0I7SUFDaEIsOEVBQThFO0lBRTlFLHlCQUF5QjtJQUN6QixLQUFLLENBQUMsV0FBVyxDQUNmLElBQVksRUFDWixZQUF1QixpQkFBUyxDQUFDLElBQUksRUFDckMsY0FBc0IsRUFBRTtRQUV4QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixLQUFLLENBQUMsU0FBUyxDQUFDLElBQVksRUFBRSxXQUFvQixLQUFLO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxLQUFLLENBQUMsVUFBVTtRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLDhFQUE4RTtJQUU5RSw4QkFBOEI7SUFDOUIsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixTQUFpQixFQUNqQixXQUFvQixLQUFLLEVBQ3pCLFVBQWtCLENBQUM7UUFFbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBcUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFxQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLLENBQUMsZUFBZSxDQUNuQixTQUFpQixFQUNqQixFQUFnQyxFQUNoQyxXQUFvQixLQUFLO1FBRXpCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZUFBZTtJQUNmLDhFQUE4RTtJQUU5RSxnRUFBZ0U7SUFDaEUsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixTQUFpQixFQUNqQixLQUFpQixFQUNqQixNQUEwQjtRQUUxQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLFNBQWlCLEVBQ2pCLEtBQWlCLEVBQ2pCLE1BQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLEtBQUssQ0FBQyxXQUFXLENBQ2YsU0FBaUIsRUFDakIsT0FBa0IsRUFDbEIsTUFBaUIsRUFDakIsS0FBYztRQUVkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxLQUFLLENBQUMsV0FBVyxDQUNmLFNBQWlCLEVBQ2pCLE9BQWtCLEVBQ2xCLEtBQWMsRUFDZCxLQUFjO1FBRWQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsTUFBb0IsRUFDcEIsUUFBdUM7UUFFdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsU0FBaUIsRUFDakIsTUFBaUIsRUFDakIsUUFBZ0IsQ0FBQyxFQUNqQixRQUE4QztRQUU5QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLFNBQWlCLEVBQ2pCLE1BQWlCLEVBQ2pCLFFBQWdCLENBQUMsRUFDakIsUUFBOEM7UUFFOUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGlCQUFpQjtJQUNqQiw4RUFBOEU7SUFFOUUsb0NBQW9DO0lBQ3BDLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBa0IsRUFBRTtRQUNwQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSCxLQUFLLENBQUMsVUFBa0IsRUFBRTtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZ0JBQWdCO0lBQ2hCLDhFQUE4RTtJQUU5RSxvQ0FBb0M7SUFDcEMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixLQUFLLENBQUMsYUFBYSxDQUFDLFlBQXVCLGlCQUFTLENBQUMsR0FBRztRQUN0RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUF1QixpQkFBUyxDQUFDLEdBQUc7UUFDbkQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBb0IsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsS0FBSyxDQUFDLHlCQUF5QixDQUFDLFdBQW1CLEVBQUU7UUFDbkQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELEtBQUssQ0FBQyxPQUFPO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsWUFBb0IsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLDhFQUE4RTtJQUU5RTs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFpQixFQUFFLE9BQTJCO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUNoQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixXQUFXLEVBQUUsQ0FBQztZQUNkLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsT0FBTyxFQUFFLDZFQUE2RTtTQUN2RixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBaUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQWlCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZ0NBQWdDO0lBQ2hDLDhFQUE4RTtJQUU5RSw4QkFBOEI7SUFDOUIsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDeEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGtDQUFrQztJQUNsQyw4RUFBOEU7SUFFOUU7O2dFQUU0RDtJQUNwRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDcEMsT0FBTyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsMkRBQTJEO0lBQ25ELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFlO1FBQzNDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxxREFBcUQ7SUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQWU7UUFDekMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsaURBQWlEO0lBQ2pELDhFQUE4RTtJQUU5RSw0Q0FBNEM7SUFDNUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFZO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUN6QixJQUFZLEVBQ1osWUFBdUIsaUJBQVMsQ0FBQyxJQUFJLEVBQ3JDLGNBQXNCLEVBQUU7UUFFeEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBaUIsRUFBRSxPQUFlO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLFNBQVMsY0FBYyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFpQjtRQUM5QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxrREFBa0Q7SUFDbEQsOEVBQThFO0lBRTlFLDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsVUFBVTtRQUNkLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQyxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEQsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxLQUFLLENBQUMsYUFBYTtRQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxPQUFPLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLGFBQWE7UUFDakIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBWTtRQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNuRCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRUQsOERBQThEO0lBQzlELEtBQUssQ0FBQyxlQUFlLENBQ25CLElBQVksRUFDWixRQUEyQixFQUFFO1FBRTdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBQSw4QkFBc0IsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxZQUFZLGVBQWUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsSUFBWSxFQUNaLFFBQTJCLEVBQUU7UUFFN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLDhCQUFzQixFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLFlBQVksZUFBZSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLE9BQU8sU0FBUyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVk7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxZQUFZLGNBQWMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBZTtRQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLFlBQVksY0FBYyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLFVBQWtCLEVBQ2xCLElBQVksRUFDWixRQUEyQixFQUFFO1FBRTdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsS0FBSyxjQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUVoRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxVQUFVLEtBQUssY0FBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFlLEVBQUUsT0FBZTtRQUNuRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFlLEVBQUUsT0FBZTtRQUNuRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLHFEQUFxRDtJQUNyRCw4RUFBOEU7SUFFOUUsd0VBQXdFO0lBQ3hFLEtBQUssQ0FBQyxZQUFZLENBQ2hCLFVBQWtCLEVBQ2xCLFNBQWlCO1FBRWpCLElBQUksVUFBVSxLQUFLLGNBQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBaUI7UUFDdEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLFNBQVMsYUFBYSxDQUFDLENBQUM7UUFDaEUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWlCO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxTQUFTLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUN2QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLEtBQUssQ0FBQyxXQUFXLENBQ2YsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0I7UUFFaEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN0RCxDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLEtBQUssQ0FBQyxlQUFlLENBQ25CLFNBQWlCLEVBQ2pCLFFBQWdCO1FBRWhCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsb0ZBQW9GO0lBQ3BGLEtBQUssQ0FBQyxlQUFlLENBQ25CLFNBQWlCLEVBQ2pCLFFBQWdCO1FBRWhCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLEtBQUssQ0FBQyxjQUFjLENBQ2xCLFVBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLEtBQXdCO1FBRXhCLElBQUksVUFBVSxLQUFLLGNBQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLEtBQUssQ0FBQyxrQkFBa0IsQ0FDdEIsU0FBaUIsRUFDakIsS0FBd0I7UUFFeEIsTUFBTSxPQUFPLEdBQUcsSUFBQSw4QkFBc0IsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLEtBQUssQ0FBQyxrQkFBa0IsQ0FDdEIsU0FBaUIsRUFDakIsS0FBd0I7UUFFeEIsTUFBTSxPQUFPLEdBQUcsSUFBQSw4QkFBc0IsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELEtBQUssQ0FBQyxZQUFZLENBQ2hCLFVBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLEdBQUcsU0FBbUI7UUFFdEIsSUFBSSxVQUFVLEtBQUssY0FBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsU0FBaUIsRUFDakIsR0FBRyxTQUFtQjtRQUV0QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsU0FBaUIsRUFDakIsR0FBRyxTQUFtQjtRQUV0QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUM1QixVQUFrQixFQUNsQixTQUFpQixFQUNqQixLQUF3QjtRQUV4QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTdELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLHNEQUFzRDtJQUN0RCw4RUFBOEU7SUFFOUUsaURBQWlEO0lBQ2pELEtBQUssQ0FBQyx1QkFBdUIsQ0FDM0IsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0I7UUFFaEIsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFVBQVUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxLQUFLLENBQUMsc0JBQXNCLENBQzFCLFVBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLEdBQUcsU0FBbUI7UUFFdEIsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFVBQVUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoSixDQUFDO0lBRUQsbURBQW1EO0lBQ25ELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0I7UUFFaEIsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFVBQVUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxnQ0FBZ0MsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUksQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLFVBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLEdBQUcsU0FBbUI7UUFFdEIsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFVBQVUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqSixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGlEQUFpRDtJQUNqRCw4RUFBOEU7SUFFOUUsOENBQThDO0lBQzlDLEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxLQUFLLENBQUMsYUFBYTtRQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsS0FBSyxDQUFDLGFBQWE7UUFDakIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLEtBQUssQ0FBQyxlQUFlLENBQ25CLFNBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLEtBQXNCO1FBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUEsZ0NBQXdCLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixTQUFTLFlBQVksV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsS0FBc0I7UUFFdEIsTUFBTSxPQUFPLEdBQUcsSUFBQSxnQ0FBd0IsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLFNBQVMsWUFBWSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBaUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsb0RBQW9EO0lBQ3BELDhFQUE4RTtJQUU5RSx1REFBdUQ7SUFDdkQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xELE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xELE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLLENBQUMsa0JBQWtCLENBQ3RCLFNBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLEtBQWU7UUFFZixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLFNBQVMsWUFBWSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEksQ0FBQztJQUVELCtDQUErQztJQUMvQyxLQUFLLENBQUMsa0JBQWtCLENBQ3RCLFNBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLEtBQWU7UUFFZixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLFNBQVMsWUFBWSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEksQ0FBQztJQUVELHlDQUF5QztJQUN6QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBaUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWlCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGdEQUFnRDtJQUNoRCw4RUFBOEU7SUFFOUUsNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBYztRQUMzQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsdURBQXVEO0lBQ3ZELDhFQUE4RTtJQUU5RSwyQ0FBMkM7SUFDM0M7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQWlCLEVBQUUsYUFBeUIsa0JBQVUsQ0FBQyxNQUFNO1FBQzdFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLG1CQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVyRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDdkYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZCLGlEQUFpRDtZQUNqRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCx3Q0FBd0M7WUFDeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDWixLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGtDQUEwQixFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUcsVUFBVSxLQUFLLGtCQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzFGLE1BQU0sTUFBTSxHQUFHLGFBQWEsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBaUIsRUFBRSxhQUF5QixrQkFBVSxDQUFDLE1BQU07UUFDN0UsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksbUJBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sYUFBYSxHQUFHLFVBQVUsS0FBSyxrQkFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMxRixNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsTUFBTSxTQUFTLEdBQVUsRUFBRSxDQUFDO1FBQzVCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdFLE1BQU0sT0FBTyxHQUFHLElBQUEsa0NBQTBCLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsU0FBUyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQztZQUM5RixNQUFNLE1BQU0sR0FBRywrQkFBK0IsSUFBSSxDQUFDLFVBQVUsTUFBTTtrQkFDL0QseUJBQXlCLElBQUksQ0FBQyxRQUFRLEtBQUs7a0JBQzNDLEdBQUcsYUFBYSxVQUFVLFFBQVEsa0JBQWtCLE9BQU8sRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxhQUFhLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNuQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLG1CQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSw0REFBNEQ7SUFDNUQsOEVBQThFO0lBRTlFLG1EQUFtRDtJQUNuRCxLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzFELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsS0FBSyxDQUFDLElBQUk7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUFsa0NELGtDQWtrQ0M7QUFFRCxnRkFBZ0Y7QUFDaEYsMkNBQTJDO0FBQzNDLGdGQUFnRjtBQUVoRixnRkFBZ0Y7QUFDaEYsU0FBUyxlQUFlLENBQUMsSUFBYyxFQUFFLElBQVk7SUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLO1lBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDO0FBRUQsbUVBQW1FO0FBQ25FLFNBQVMsWUFBWSxDQUFDLEdBQVEsRUFBRSxHQUFXO0lBQ3pDLElBQUksR0FBRyxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2pELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDO0FBRUQsbUVBQW1FO0FBQ25FLFNBQVMsWUFBWSxDQUFDLEdBQVEsRUFBRSxHQUFXO0lBQ3pDLElBQUksR0FBRyxHQUFHLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDOUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLElBQWM7SUFDeEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztRQUNqQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDakMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxJQUFjO0lBQzNDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXRDLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXJELElBQUksT0FBTyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBRW5DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUNoQyxVQUFVLEVBQUUsSUFBQSwyQkFBbUIsRUFBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQzdELENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsSUFBYztJQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUV0QyxJQUFJLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVyRCxJQUFJLE9BQU8sR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUVuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7UUFDaEMsVUFBVSxFQUFFLElBQUEsMkJBQW1CLEVBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztLQUM3RCxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQWM7SUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV0RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7UUFDaEMsV0FBVyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO1FBQ3ZDLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNsQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7S0FDekMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFjO0lBQ3hDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXRDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMxRCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFaEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksR0FBYztZQUN0QixTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7WUFDckMsVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO1lBQ3hDLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztZQUNsQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7WUFDcEMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztZQUN4QyxZQUFZLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7WUFDM0MsVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztTQUNuQyxDQUFDO1FBQ0YsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsSUFBYztJQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUV0QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsU0FBUyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO1FBQ3JDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztRQUN4QyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7UUFDeEMsVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1FBQ3ZDLFFBQVEsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztRQUN4QyxNQUFNLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7UUFDcEMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO1FBQ3hDLFFBQVEsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztLQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQWM7SUFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNuRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdkQsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzVELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1FBQ2hDLElBQUksRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUNoQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7UUFDbEMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztRQUNwQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7UUFDeEMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO1FBQ3hDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztRQUN4QyxZQUFZLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7UUFDekMsYUFBYSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDO1FBQzVDLFdBQVcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLElBQWM7SUFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztRQUNqQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7UUFDckMsU0FBUyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1FBQ3RDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztRQUMxQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7S0FDckMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBYztJQUNyQyxNQUFNLEVBQUUsR0FBZTtRQUNyQixTQUFTLEVBQUUsRUFBRTtRQUNiLFNBQVMsRUFBRSxDQUFDO1FBQ1osU0FBUyxFQUFFLENBQUM7UUFDWixXQUFXLEVBQUUsRUFBRTtRQUNmLGVBQWUsRUFBRSxFQUFFO1FBQ25CLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDO0lBRUYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsSUFBSSxRQUFRLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxJQUFJLFFBQVEsR0FBRyxDQUFDO1FBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUUvQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWhGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUztZQUFFLEVBQUUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFpbiBjbGllbnQgZm9yIEdRTERCIE5vZGUuanMgZHJpdmVyLlxuICovXG5cbmltcG9ydCAqIGFzIGdycGMgZnJvbSAnQGdycGMvZ3JwYy1qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgR3FsZGJDb25maWcsIHZhbGlkYXRlQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgRW1wdHlRdWVyeUVycm9yLCBMb2dpbkZhaWxlZEVycm9yLCBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUmVzcG9uc2UsXG4gIFJvdyxcbiAgSW5zZXJ0Tm9kZXNSZXN1bHQsXG4gIEluc2VydEVkZ2VzUmVzdWx0LFxuICBEZWxldGVSZXN1bHQsXG4gIEV4cG9ydE5vZGVzUmVzdWx0LFxuICBFeHBvcnRFZGdlc1Jlc3VsdCxcbiAgRXhwb3J0Q29uZmlnLFxuICBFeHBvcnRDaHVuayxcbiAgRXhwb3J0U3RhdHMsXG59IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgU2Vzc2lvbiwgU2Vzc2lvbk1hbmFnZXIgfSBmcm9tICcuL3Nlc3Npb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uTWFuYWdlciB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgR3JhcGhJbmZvLFxuICBHcmFwaFR5cGUsXG4gIEhlYWx0aFN0YXR1cyxcbiAgQ2FjaGVTdGF0cyxcbiAgQ2FjaGVUeXBlLFxuICBTdGF0aXN0aWNzLFxuICBDb21wYWN0UmVzdWx0LFxuICBDb21wdXRlVG9wb2xvZ3lSZXN1bHQsXG4gIFN5c3RlbU1ldHJpY3MsXG4gIE5vZGVEYXRhLFxuICBFZGdlRGF0YSxcbiAgQnVsa0NyZWF0ZU5vZGVzT3B0aW9ucyxcbiAgQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucyxcbiAgQnVsa0ltcG9ydE9wdGlvbnMsXG4gIEJ1bGtJbXBvcnRTZXNzaW9uLFxuICBDaGVja3BvaW50UmVzdWx0LFxuICBFbmRCdWxrSW1wb3J0UmVzdWx0LFxuICBBYm9ydEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEJ1bGtJbXBvcnRTdGF0dXMsXG4gIFRyYW5zYWN0aW9uSW5mbyxcbiAgREJUeXBlLFxuICBJbnNlcnRUeXBlLFxuICBMYWJlbEluZm8sXG4gIE5vZGVUeXBlSW5mbyxcbiAgRWRnZVR5cGVJbmZvLFxuICBMYWJlbERlZixcbiAgQ29udlByb3BlcnR5RGVmLFxuICBJbmRleFByb3BlcnR5LFxuICBJbmRleEluZm8sXG4gIEZ1bGx0ZXh0SW5mbyxcbiAgVGFza0luZm8sXG4gIFByb2Nlc3NJbmZvLFxuICBHcmFwaFN0YXRzLFxuICBBbGdvSW5mbyxcbiAgcGFyc2VQcm9wZXJ0eVN0cmluZyxcbiAgYnVpbGRQcm9wZXJ0eURlZlN0cmluZyxcbiAgYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nLFxuICBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyxcbiAgdXNlR3JhcGhQcmVmaXgsXG4gIGRiVHlwZVRvS2V5d29yZCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXJ2aWNlQ2xpZW50cywgcHJvbWlzaWZ5Q2FsbCwgcHJvbWlzaWZ5Q2FsbFdpdGhEZWFkbGluZSB9IGZyb20gJy4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgU2VydmljZUNvbnRleHQsXG4gIFNlcnZpY2VDbGllbnRzLFxuICBTZXNzaW9uU2VydmljZSxcbiAgUXVlcnlTZXJ2aWNlLFxuICBHcmFwaFNlcnZpY2UsXG4gIFRyYW5zYWN0aW9uU2VydmljZSxcbiAgRGF0YVNlcnZpY2UsXG4gIEhlYWx0aFNlcnZpY2UsXG4gIEFkbWluU2VydmljZSxcbiAgQnVsa0ltcG9ydFNlcnZpY2UsXG59IGZyb20gJy4vc2VydmljZXMvaW5kZXgnO1xuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgYSBxdWVyeSAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNvbmZpZyB7XG4gIGdyYXBoTmFtZT86IHN0cmluZztcbiAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHRyYW5zYWN0aW9uSWQ/OiBudW1iZXI7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIE1heCBwYXRocyB0byByZXR1cm4gZnJvbSBwYXRoIHF1ZXJpZXMgKDAgPSB1bmxpbWl0ZWQpICovXG4gIG1heFBhdGhSZXN1bHRzPzogbnVtYmVyO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0IG5vZGVzICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydE5vZGVzQ29uZmlnIHtcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XG4gIGJ1bGtJbXBvcnRTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgZWRnZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0RWRnZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWFsdGggd2F0Y2hlciBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZyBoZWFsdGggdXBkYXRlcy5cbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKiogTWFpbiBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggR1FMREIgKi9cbmV4cG9ydCBjbGFzcyBHcWxkYkNsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBHcWxkYkNvbmZpZztcbiAgcHJpdmF0ZSBjbGllbnRzOiBTZXJ2aWNlQ2xpZW50cztcbiAgcHJpdmF0ZSBzZXNzaW9uczogU2Vzc2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgdHhNYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgLy8gU3RvcmVkIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICBwcml2YXRlIHN0b3JlZFVzZXJuYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBzdG9yZWRQYXNzd29yZDogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkR3JhcGg6IHN0cmluZyA9ICcnO1xuXG4gIC8vIFNlcnZpY2UgaW5zdGFuY2VzXG4gIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFNlc3Npb25TZXJ2aWNlO1xuICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xuICBwcml2YXRlIGdyYXBoU2VydmljZTogR3JhcGhTZXJ2aWNlO1xuICBwcml2YXRlIHRyYW5zYWN0aW9uU2VydmljZTogVHJhbnNhY3Rpb25TZXJ2aWNlO1xuICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcbiAgcHJpdmF0ZSBoZWFsdGhTZXJ2aWNlOiBIZWFsdGhTZXJ2aWNlO1xuICBwcml2YXRlIGFkbWluU2VydmljZTogQWRtaW5TZXJ2aWNlO1xuICBwcml2YXRlIGJ1bGtJbXBvcnRTZXJ2aWNlOiBCdWxrSW1wb3J0U2VydmljZTtcblxuICAvKiogR2V0IHNlc3Npb24gbWV0YWRhdGEgZm9yIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgKi9cbiAgcHJpdmF0ZSBnZXRTZXNzaW9uTWV0YWRhdGEoKTogZ3JwYy5NZXRhZGF0YSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgZ3JwYy5NZXRhZGF0YSgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgICBtZXRhZGF0YS5hZGQoJ3Nlc3Npb24taWQnLCBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogR3FsZGJDb25maWcpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTtcbiAgICB0aGlzLnR4TWFuYWdlciA9IG5ldyBUcmFuc2FjdGlvbk1hbmFnZXIoKTtcblxuICAgIC8vIENyZWF0ZSBnUlBDIGNyZWRlbnRpYWxzXG4gICAgbGV0IGNyZWRlbnRpYWxzOiBncnBjLkNoYW5uZWxDcmVkZW50aWFscztcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2woKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uczogZ3JwYy5DaGFubmVsT3B0aW9ucyA9IHtcbiAgICAgICdncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDQgKiAxMDI0ICogMTAyNCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lX21zJzogMzAwMDAsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZW91dF9tcyc6IDEwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3Blcm1pdF93aXRob3V0X2NhbGxzJzogMSxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgY2xpZW50cyBmb3IgdGhlIGZpcnN0IGhvc3RcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xuICAgIHRoaXMuY2xpZW50cyA9IGNyZWF0ZVNlcnZpY2VDbGllbnRzKGhvc3QsIGNyZWRlbnRpYWxzLCBvcHRpb25zKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gbmV3IFNlcnZpY2VDb250ZXh0KHRoaXMuY29uZmlnLCB0aGlzLnNlc3Npb25zLCB0aGlzLnR4TWFuYWdlciwgdGhpcy5jbGllbnRzKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICAgIC8vIFN0b3JlIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICAgIHRoaXMuc3RvcmVkVXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnN0b3JlZFBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBmbiBhbmQgYXV0by1yZWNvbm5lY3Qgb24gVU5BVVRIRU5USUNBVEVEIGVycm9yLlxuICAgKiBJZiBmbiB0aHJvd3MgYW4gVU5BVVRIRU5USUNBVEVEIGdSUEMgZXJyb3IgYW5kIGNyZWRlbnRpYWxzIGFyZSBzdG9yZWQsXG4gICAqIHJlLWxvZ2luIGFuZCByZXRyeSBmbiBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQXV0b1JlY29ubmVjdDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZ0xvd2VyID0gZT8ubWVzc2FnZSA/IFN0cmluZyhlLm1lc3NhZ2UpLnRvTG93ZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGlzVW5hdXRoZW50aWNhdGVkID1cbiAgICAgICAgKGU/LmNvZGUgPT09IGdycGMuc3RhdHVzLlVOQVVUSEVOVElDQVRFRCkgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3VuYXV0aGVudGljYXRlZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIG5vdCBmb3VuZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIGV4cGlyZWQnKTtcbiAgICAgIGlmIChpc1VuYXV0aGVudGljYXRlZCAmJiB0aGlzLnN0b3JlZFVzZXJuYW1lKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBncmFwaCBjb250ZXh0IGJlZm9yZSByZS1sb2dpblxuICAgICAgICBjb25zdCBzYXZlZEdyYXBoID0gdGhpcy5zdG9yZWRHcmFwaDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKHRoaXMuc3RvcmVkVXNlcm5hbWUsIHRoaXMuc3RvcmVkUGFzc3dvcmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBlOyAvLyBSZXR1cm4gb3JpZ2luYWwgZXJyb3IgaWYgcmUtbG9naW4gZmFpbHNcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0b3JlIGdyYXBoIGNvbnRleHQgYWZ0ZXIgcmUtbG9naW5cbiAgICAgICAgaWYgKHNhdmVkR3JhcGggJiYgc2F2ZWRHcmFwaCAhPT0gJ19fc3lzdGVtX18nKSB7XG4gICAgICAgICAgdHJ5IHsgYXdhaXQgdGhpcy51c2VHcmFwaChzYXZlZEdyYXBoKTsgfSBjYXRjaCB7IC8qIGJlc3QgZWZmb3J0ICovIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oKTsgLy8gUmV0cnkgb25jZVxuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGVybWluYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLmxvZ291dCgpO1xuICB9XG5cbiAgLyoqIENoZWNrIHRoZSBjb25uZWN0aW9uIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBRdWVyeSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqL1xuICBhc3luYyBncWwocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cbiAgYXN5bmMgZ3FsU3RyZWFtKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXG4gICAgY2FsbGJhY2s/OiAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmdxbFN0cmVhbShxdWVyeSwgY29uZmlnLCBjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cbiAgYXN5bmMgZXhwbGFpbihxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZXhwbGFpbihxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIHF1ZXJ5IHdpdGggcHJvZmlsaW5nIGFuZCByZXR1cm4gc3RhdGlzdGljcyAqL1xuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHcmFwaCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgZ3JhcGggKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGgoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSBncmFwaCAqL1xuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmRyb3BHcmFwaChuYW1lLCBpZkV4aXN0cyk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjdXJyZW50IGdyYXBoIGZvciB0aGUgc2Vzc2lvbiAqL1xuICBhc3luYyB1c2VHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdyYXBoU2VydmljZS51c2VHcmFwaChuYW1lKTtcbiAgICB0aGlzLnN0b3JlZEdyYXBoID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBncmFwaHMgKi9cbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmxpc3RHcmFwaHMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBncmFwaCAqL1xuICBhc3luYyBnZXRHcmFwaEluZm8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxHcmFwaEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zYWN0aW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuYmVnaW5UcmFuc2FjdGlvbihncmFwaE5hbWUsIHJlYWRPbmx5LCB0aW1lb3V0KTtcbiAgfVxuXG4gIC8qKiBDb21taXQgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyBjb21taXQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHJvbGxiYWNrKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5yb2xsYmFjayh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyAqL1xuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UubGlzdFRyYW5zYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZm46ICh0eElkOiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uud2l0aFRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgZm4sIHJlYWRPbmx5KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEYXRhIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEluc2VydCBtdWx0aXBsZSBub2RlcyBpbnRvIGEgZ3JhcGggdXNpbmcgZ1JQQyBidWxrIGluc2VydCAqL1xuICBhc3luYyBpbnNlcnROb2Rlc0JhdGNoQXV0byhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgZWRnZXMgaW50byBhIGdyYXBoIHVzaW5nIGdSUEMgYnVsayBpbnNlcnQgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXNCYXRjaEF1dG8oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKGdyYXBoTmFtZSwgZWRnZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRGVsZXRlIG5vZGVzIGZyb20gYSBncmFwaCAqL1xuICBhc3luYyBkZWxldGVOb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlSWRzPzogc3RyaW5nW10sXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgd2hlcmU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5kZWxldGVOb2RlcyhncmFwaE5hbWUsIG5vZGVJZHMsIGxhYmVscywgd2hlcmUpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBlZGdlcyBmcm9tIGEgZ3JhcGggKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlRWRnZXMoZ3JhcGhOYW1lLCBlZGdlSWRzLCBsYWJlbCwgd2hlcmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxuICAgKiBAcGFyYW0gY29uZmlnIEV4cG9ydCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmb3IgZWFjaCBleHBvcnRlZCBjaHVua1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0KFxuICAgIGNvbmZpZzogRXhwb3J0Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKGNodW5rOiBFeHBvcnRDaHVuaykgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnQoY29uZmlnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnROb2Rlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnROb2RlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gZWRnZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydEVkZ2VzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydEVkZ2VzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlYWx0aCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDaGVjayB0aGUgaGVhbHRoIG9mIGEgc2VydmljZSAqL1xuICBhc3luYyBoZWFsdGhDaGVjayhzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8SGVhbHRoU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS5oZWFsdGhDaGVjayhzZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBoZWFsdGggc3RhdHVzIGNoYW5nZXMgdmlhIHNlcnZlci1zaWRlIHN0cmVhbWluZy5cbiAgICogUmV0dXJucyBhIEhlYWx0aFdhdGNoZXIgdGhhdCBlbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgdmFsdWVzLlxuICAgKiBDYWxsIHN0b3AoKSB0byBjYW5jZWwgdGhlIHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgLSBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gd2F0Y2hcbiAgICogQHJldHVybnMgSGVhbHRoV2F0Y2hlciAtIEV2ZW50RW1pdHRlciB3aXRoIHN0b3AoKSBtZXRob2RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3YXRjaGVyID0gY2xpZW50LndhdGNoKCk7XG4gICAqIHdhdGNoZXIub24oJ3N0YXR1cycsIChzdGF0dXM6IEhlYWx0aFN0YXR1cykgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdIZWFsdGggc3RhdHVzOicsIHN0YXR1cyk7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKCdXYXRjaCBlcnJvcjonLCBlcnIpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZW5kJywgKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdXYXRjaCBzdHJlYW0gZW5kZWQnKTtcbiAgICogfSk7XG4gICAqIC8vIExhdGVyLCB0byBzdG9wIHdhdGNoaW5nOlxuICAgKiB3YXRjaGVyLnN0b3AoKTtcbiAgICogYGBgXG4gICAqL1xuICB3YXRjaChzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IEhlYWx0aFdhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2Uud2F0Y2goc2VydmljZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWRtaW4gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUHJlLWFsbG9jYXRlIHBhcnNlciBpbnN0YW5jZXMgKi9cbiAgYXN5bmMgd2FybXVwUGFyc2VyKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FybXVwUGFyc2VyKGNvdW50KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGUgc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRDYWNoZVN0YXRzKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8Q2FjaGVTdGF0cz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRDYWNoZVN0YXRzKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNwZWNpZmllZCBjYWNoZSAqL1xuICBhc3luYyBjbGVhckNhY2hlKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jbGVhckNhY2hlKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGFiYXNlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0U3RhdGlzdGljcyhncmFwaE5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxTdGF0aXN0aWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lKTtcbiAgfVxuXG4gIC8qKiBJbnZhbGlkYXRlIHRoZSBSQkFDIHBlcm1pc3Npb24gY2FjaGUgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN5c3RlbS1sZXZlbCBtZXRyaWNzIChDUFUsIG1lbW9yeSwgZGlzayBJL08sIHN0b3JhZ2UsIG5ldHdvcmspICovXG4gIGFzeW5jIGdldFN5c3RlbU1ldHJpY3MoKTogUHJvbWlzZTxTeXN0ZW1NZXRyaWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN5c3RlbU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIG1hbnVhbCBjb21wYWN0aW9uIG9mIHRoZSBkYXRhYmFzZSBzdG9yYWdlICovXG4gIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTxDb21wYWN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNvbXBhY3QoKTtcbiAgfVxuXG4gIC8qKiBXYWl0IGZvciB0aGUgY29tcHV0aW5nIGVuZ2luZSB0b3BvbG9neSB0byBiZSByZWFkeSAqL1xuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZSwgdGltZW91dE1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCdWxrIEltcG9ydCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGJ1bGsgaW1wb3J0IHNlc3Npb24gZm9yIG9wdGltaXplZCBoaWdoLXRocm91Z2hwdXQgaW5zZXJ0cy5cbiAgICogQHBhcmFtIGdyYXBoTmFtZSBUYXJnZXQgZ3JhcGggbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBidWxrIGltcG9ydCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBzdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBCdWxrSW1wb3J0T3B0aW9ucyk6IFByb21pc2U8QnVsa0ltcG9ydFNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5zdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGVja3BvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQuIFVzZSBlbmRCdWxrSW1wb3J0KCkgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaC5cbiAgICovXG4gIGFzeW5jIGNoZWNrcG9pbnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPENoZWNrcG9pbnRSZXN1bHQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHJlY29yZENvdW50OiAwLFxuICAgICAgbGFzdENoZWNrcG9pbnRDb3VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICdDaGVja3BvaW50IGhhcyBiZWVuIHJlbW92ZWQ7IHVzZSBlbmRCdWxrSW1wb3J0IHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2gnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5kIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGggYSBmaW5hbCBjaGVja3BvaW50LlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEVuZEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5lbmRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGhvdXQgZmluYWwgc3luYy5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBhYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFib3J0QnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgYSBidWxrIGltcG9ydCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtJbXBvcnRTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5nZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgTWV0aG9kcyDigJQgR2V0dGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgZ2V0U2Vzc2lvbigpOiBTZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZXNzaW9uICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuaXNMb2dnZWRJbigpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKi9cbiAgZ2V0Q29uZmlnKCk6IEdxbGRiQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYSBjbHVzdGVyIGRlcGxveW1lbnQgKi9cbiAgZ2V0IGlzQ2x1c3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmlzQ2x1c3RlciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsdXN0ZXIgSUQgKGVtcHR5IHN0cmluZyBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgY2x1c3RlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5jbHVzdGVySWQgfHwgJyc7XG4gIH1cblxuICAvKiogR2V0IHRoZSBwYXJ0aXRpb24gY291bnQgKDAgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IHBhcnRpdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5wYXJ0aXRpb25Db3VudCB8fCAwO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIEhlbHBlcnMg4oCUIE5hbWUgUXVvdGluZ1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogV3JhcCBhIG5hbWUgaW4gYmFja3RpY2tzIGZvciBzYWZlIHVzZSBpbiBHUUwgc3RhdGVtZW50cy5cbiAgICogTGFiZWwgbmFtZXMgYW5kIHByb3BlcnR5IG5hbWVzIHNob3VsZCBiZSBxdW90ZWQ7IGdyYXBoIG5hbWVzLCBpbmRleCBuYW1lcyxcbiAgICogYW5kIGZ1bGx0ZXh0IG5hbWVzIHNob3VsZCBOT1QgYmUgd3JhcHBlZCBpbiBiYWNrdGlja3MuICovXG4gIHByaXZhdGUgc3RhdGljIHF1b3RlTGFiZWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2AnICsgbmFtZSArICdgJztcbiAgfVxuXG4gIC8qKiBXcmFwIGVhY2ggbGFiZWwgbmFtZSBpbiBiYWNrdGlja3MgYW5kIGpvaW4gd2l0aCBcIiwgXCIgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbHMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMubWFwKG4gPT4gJ2AnICsgbiArICdgJykuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKiBKb2luIG5hbWVzIHdpdGggXCIsIFwiIHdpdGhvdXQgYmFja3RpY2sgd3JhcHBpbmcgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgam9pbk5hbWVzKC4uLm5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBHcmFwaCBPcGVyYXRpb25zICg2IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgb3BlbiAoc2NoZW1hLWxlc3MpIGdyYXBoICovXG4gIGFzeW5jIGNyZWF0ZU9wZW5HcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfSB7fWApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBjbG9zZWQgKHNjaGVtYS1lbmZvcmNlZCkgZ3JhcGggd2l0aCBub2RlIGFuZCBlZGdlIGxhYmVsIGRlZmluaXRpb25zICovXG4gIGFzeW5jIGNyZWF0ZUNsb3NlZEdyYXBoKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBHUkFQSCAke25hbWV9IHt9YCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ3JhcGggaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBncmFwaCB3YXMgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGhJZk5vdEV4aXN0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgbXNnID0gKGUubWVzc2FnZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChtc2cuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3QnKSB8fCBtc2cuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgYSBncmFwaCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyAqL1xuICBhc3luYyBoYXNHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBncmFwaHMgPSBhd2FpdCB0aGlzLmxpc3RHcmFwaHMoKTtcbiAgICByZXR1cm4gZ3JhcGhzLnNvbWUoZyA9PiBnLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIGdyYXBoICovXG4gIGFzeW5jIGFsdGVyR3JhcGgoZ3JhcGhOYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7Z3JhcGhOYW1lfSBSRU5BTUUgVE8gJHtuZXdOYW1lfWApO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhbGwgZGF0YSBmcm9tIGEgZ3JhcGggd2hpbGUga2VlcGluZyBpdHMgc3RydWN0dXJlICovXG4gIGFzeW5jIHRydW5jYXRlKGdyYXBoTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgVFJVTkNBVEUgR1JBUEggJHtncmFwaE5hbWV9YCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBMYWJlbCBPcGVyYXRpb25zICgxNiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBsYWJlbHMgKG5vZGUgYW5kIGVkZ2UpIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dMYWJlbHMoKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBMQUJFTFMnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBsYWJlbHMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd05vZGVMYWJlbHMoKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIExBQkVMUycpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGxhYmVscyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RWRnZUxhYmVscygpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgTEFCRUxTJyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgdHlwZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIHNob3dOb2RlVHlwZXMoKTogUHJvbWlzZTxOb2RlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIFRZUEVTJyk7XG4gICAgcmV0dXJuIHBhcnNlTm9kZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgdHlwZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIHNob3dFZGdlVHlwZXMoKTogUHJvbWlzZTxFZGdlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIFRZUEVTJyk7XG4gICAgcmV0dXJuIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBsYWJlbCBieSBuYW1lIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGgsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldExhYmVsKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TGFiZWxJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IGxhYmVscyA9IGF3YWl0IHRoaXMuc2hvd0xhYmVscygpO1xuICAgIHJldHVybiBsYWJlbHMuZmluZChsID0+IGwubmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBub2RlIHR5cGUgYnkgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0Tm9kZUxhYmVsKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Tm9kZVR5cGVJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5zaG93Tm9kZVR5cGVzKCk7XG4gICAgcmV0dXJuIHR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgZWRnZSB0eXBlIGJ5IG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldEVkZ2VMYWJlbChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEVkZ2VUeXBlSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuc2hvd0VkZ2VUeXBlcygpO1xuICAgIHJldHVybiB0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5vZGUgbGFiZWwgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUxhYmVsKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke2N1cnJlbnRHcmFwaH0gQUREIE5PREUgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgke3Byb3BTdHJ9KSB9YCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGVkZ2UgbGFiZWwgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUxhYmVsKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke2N1cnJlbnRHcmFwaH0gQUREIEVER0UgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgpLVske3Byb3BTdHJ9XS0+KCkgfWApO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGxhYmVsIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgZHJvcE5vZGVMYWJlbChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7Y3VycmVudEdyYXBofSBEUk9QIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfWApO1xuICB9XG5cbiAgLyoqIERyb3Agb25lIG9yIG1vcmUgZWRnZSBsYWJlbHMgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wRWRnZUxhYmVsKC4uLm5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjdXJyZW50R3JhcGggPSB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHtjdXJyZW50R3JhcGh9IERST1AgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsYWJlbCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlTGFiZWxJZk5vdEV4aXN0KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbGFiZWxzID0gYXdhaXQgdGhpcy5zaG93TGFiZWxzKCk7XG4gICAgY29uc3QgdGFyZ2V0VHlwZSA9IG5vZGVPckVkZ2UgPT09IERCVHlwZS5FREdFID8gJ0VER0UnIDogJ05PREUnO1xuXG4gICAgaWYgKGxhYmVscy5zb21lKGwgPT4gbC5uYW1lID09PSBuYW1lICYmIGwudHlwZSA9PT0gdGFyZ2V0VHlwZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlTm9kZUxhYmVsKG5hbWUsIHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVFZGdlTGFiZWwobmFtZSwgcHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGFsdGVyTm9kZUxhYmVsKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwob2xkTmFtZSl9IFJFTkFNRSBUTyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmV3TmFtZSl9YCk7XG4gIH1cblxuICAvKiogUmVuYW1lIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgYWx0ZXJFZGdlTGFiZWwob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChvbGROYW1lKX0gUkVOQU1FIFRPICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuZXdOYW1lKX1gKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBhbGdvcml0aG1zICovXG4gIGFzeW5jIHNob3dBbGdvcygpOiBQcm9taXNlPEFsZ29JbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgQUxHT1MnKTtcbiAgICByZXR1cm4gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBQcm9wZXJ0eSBPcGVyYXRpb25zICgxMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Byb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dFZGdlUHJvcGVydHkobGFiZWxOYW1lKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIHNob3dOb2RlUHJvcGVydHkobGFiZWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgY29uc3QgbnQgPSBhd2FpdCB0aGlzLmdldE5vZGVMYWJlbChsYWJlbE5hbWUpO1xuICAgIGlmICghbnQpIHRocm93IG5ldyBFcnJvcihgTm9kZSBsYWJlbCBcIiR7bGFiZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBudC5wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIHNob3dFZGdlUHJvcGVydHkobGFiZWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgY29uc3QgZXQgPSBhd2FpdCB0aGlzLmdldEVkZ2VMYWJlbChsYWJlbE5hbWUpO1xuICAgIGlmICghZXQpIHRocm93IG5ldyBFcnJvcihgRWRnZSBsYWJlbCBcIiR7bGFiZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBldC5wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGEgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldFByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIGNvbnN0IHByb3BzID0gYXdhaXQgdGhpcy5zaG93UHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lKTtcbiAgICByZXR1cm4gcHJvcHMuZmluZChwID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYSBub2RlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXROb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuTk9ERSwgbGFiZWxOYW1lLCBwcm9wTmFtZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYW4gZWRnZSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0RWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoREJUeXBlLkVER0UsIGxhYmVsTmFtZSwgcHJvcE5hbWUpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgKi9cbiAgYXN5bmMgY3JlYXRlUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVOb2RlUHJvcGVydHkobGFiZWxOYW1lLCBwcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUVkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gQUREIFBST1BFUlRZICR7cHJvcFN0cn1gKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW11cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBQUk9QRVJUWSAke3Byb3BTdHJ9YCk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYSBsYWJlbCAobm9kZSBvciBlZGdlKSAqL1xuICBhc3luYyBkcm9wUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcE5vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIC4uLnByb3BOYW1lcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3BFZGdlUHJvcGVydHkobGFiZWxOYW1lLCAuLi5wcm9wTmFtZXMpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBkcm9wTm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BOYW1lcyl9YCk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBkcm9wRWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BOYW1lcyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb3BlcnRpZXMgb24gYSBsYWJlbCBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHByb3BlcnRpZXMgd2VyZSBjcmVhdGVkLCBmYWxzZSBpZiBhbGwgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUHJvcGVydHlJZk5vdEV4aXN0KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNob3dQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUpO1xuICAgIGNvbnN0IGV4aXN0aW5nU2V0ID0gbmV3IFNldChleGlzdGluZy5tYXAocCA9PiBwLm5hbWUpKTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IHByb3BzLmZpbHRlcihwID0+ICFleGlzdGluZ1NldC5oYXMocC5uYW1lKSk7XG5cbiAgICBpZiAobmV3UHJvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmV3UHJvcHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgQ29uc3RyYWludCBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBOT1QgTlVMTCBjb25zdHJhaW50IG9uIGEgcHJvcGVydHkgKi9cbiAgYXN5bmMgY3JlYXRlTm90TnVsbENvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVudGl0eVR5cGUgPSBkYlR5cGVUb0tleXdvcmQobm9kZU9yRWRnZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiAke2VudGl0eVR5cGV9ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgQ09OU1RSQUlOVCBOT1QgTlVMTCBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwocHJvcE5hbWUpfWApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIFVOSVFVRSBjb25zdHJhaW50IG9uIG9uZSBvciBtb3JlIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgY3JlYXRlVW5pcXVlQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBDT05TVFJBSU5UIFVOSVFVRSBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BOYW1lcyl9YCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgTk9UIE5VTEwgY29uc3RyYWludCBmcm9tIGEgcHJvcGVydHkgKi9cbiAgYXN5bmMgZHJvcE5vdE51bGxDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBlbnRpdHlUeXBlID0gZGJUeXBlVG9LZXl3b3JkKG5vZGVPckVkZ2UpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgJHtlbnRpdHlUeXBlfSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBDT05TVFJBSU5UIE5PVCBOVUxMIE9OICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChwcm9wTmFtZSl9YCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgVU5JUVVFIGNvbnN0cmFpbnQgZnJvbSBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGRyb3BVbmlxdWVDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXM6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBlbnRpdHlUeXBlID0gZGJUeXBlVG9LZXl3b3JkKG5vZGVPckVkZ2UpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgJHtlbnRpdHlUeXBlfSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBDT05TVFJBSU5UIFVOSVFVRSBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BOYW1lcyl9YCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBJbmRleCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0luZGV4KCk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgSU5ERVgnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dOb2RlSW5kZXgoKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIElOREVYJyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RWRnZUluZGV4KCk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBJTkRFWCcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlSW5kZXgoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluZGV4UHJvcGVydHlbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgSU5ERVggJHtpbmRleE5hbWV9IE9OIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke3Byb3BTdHJ9KWApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBpbmRleCBvbiBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VJbmRleChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW5kZXhQcm9wZXJ0eVtdXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBJTkRFWCAke2luZGV4TmFtZX0gT04gRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7cHJvcFN0cn0pYCk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wTm9kZUluZGV4KGluZGV4TmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIElOREVYICR7aW5kZXhOYW1lfWApO1xuICB9XG5cbiAgLyoqIERyb3AgYW4gZWRnZSBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BFZGdlSW5kZXgoaW5kZXhOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgSU5ERVggJHtpbmRleE5hbWV9YCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBGdWxsdGV4dCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGZ1bGx0ZXh0IGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0Z1bGx0ZXh0KCk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRlVMTFRFWFQnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBmdWxsdGV4dCBpbmRleGVzICovXG4gIGFzeW5jIHNob3dOb2RlRnVsbHRleHQoKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIEZVTExURVhUJyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgZnVsbHRleHQgaW5kZXhlcyAqL1xuICBhc3luYyBzaG93RWRnZUZ1bGx0ZXh0KCk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBGVUxMVEVYVCcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgZnVsbHRleHQgaW5kZXggb24gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVGdWxsdGV4dChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEZVTExURVhUICR7aW5kZXhOYW1lfSBPTiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5wcm9wcyl9KWApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUZ1bGx0ZXh0KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgRlVMTFRFWFQgJHtpbmRleE5hbWV9IE9OIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BzKX0pYCk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgZnVsbHRleHQgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wTm9kZUZ1bGx0ZXh0KGluZGV4TmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIEZVTExURVhUICR7aW5kZXhOYW1lfWApO1xuICB9XG5cbiAgLyoqIERyb3AgYW4gZWRnZSBmdWxsdGV4dCBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BFZGdlRnVsbHRleHQoaW5kZXhOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgRlVMTFRFWFQgJHtpbmRleE5hbWV9YCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBUYXNrIE9wZXJhdGlvbnMgKDMgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgdGFza3MgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Rhc2tzKCk6IFByb21pc2U8VGFza0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBUQVNLUycpO1xuICAgIHJldHVybiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSB0YXNrIGJ5IElEICovXG4gIGFzeW5jIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBERUxFVEUgVEFTSyAke3Rhc2tJZH1gKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGEgcnVubmluZyB0YXNrIGJ5IElEICovXG4gIGFzeW5jIHN0b3BUYXNrKHRhc2tJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgU1RPUCBUQVNLICR7dGFza0lkfWApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRGF0YSBJbnNlcnQgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSW5zZXJ0IG5vZGVzIHVzaW5nIEdRTCBJTlNFUlQgc3ludGF4ICovXG4gIC8qKlxuICAgKiBJbnNlcnQgbm9kZXMgdXNpbmcgR1FMIElOU0VSVCBzeW50YXggd2l0aCBSRVRVUk4gY2xhdXNlLlxuICAgKiBHUUw6IElOU0VSVCAobjA6TGFiZWwge3AxOiB2MX0pLCAobjE6TGFiZWwge3AyOiB2Mn0pIFJFVFVSTiBuMCwgbjFcbiAgICogSWYgTm9kZURhdGEuaWQgaXMgc2V0IChub24tZW1wdHkpLCBpbmNsdWRlcyBpdCBhcyBfaWQgcHJvcGVydHkgaW4gdGhlIEdRTC5cbiAgICogUmV0dXJucyB0aGUgcmF3IFJlc3BvbnNlIGNvbnRhaW5pbmcgdGhlIGluc2VydGVkIG5vZGVzIGluIGNvbHVtbnMgbjAsIG4xLCBldGMuXG4gICAqL1xuICBhc3luYyBpbnNlcnROb2Rlcyhub2RlczogTm9kZURhdGFbXSwgaW5zZXJ0VHlwZTogSW5zZXJ0VHlwZSA9IEluc2VydFR5cGUuTm9ybWFsKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHJldHVybiBuZXcgUmVzcG9uc2UoW10sIFtdLCAwLCBmYWxzZSwgW10sIDApO1xuXG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgaWYgKCFub2RlLmxhYmVscyB8fCBub2RlLmxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGF0IGluZGV4ICR7aX0gaGFzIG5vIGxhYmVscy4gQXQgbGVhc3Qgb25lIGxhYmVsIGlzIHJlcXVpcmVkLmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdmFyTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFydHMgPSBub2Rlcy5tYXAoKG5vZGUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZhck5hbWUgPSBgbiR7aX1gO1xuICAgICAgdmFyTmFtZXMucHVzaCh2YXJOYW1lKTtcbiAgICAgIC8vIEdRTCBJTlNFUlQgb25seSBzdXBwb3J0cyBzaW5nbGUgbGFiZWwgcGVyIG5vZGVcbiAgICAgIGNvbnN0IGxhYmVsID0gR3FsZGJDbGllbnQucXVvdGVMYWJlbChub2RlLmxhYmVsc1swXSk7XG4gICAgICAvLyBCdWlsZCBwcm9wZXJ0aWVzIGluY2x1ZGluZyBfaWQgaWYgc2V0XG4gICAgICBsZXQgcHJvcHMgPSBub2RlLnByb3BlcnRpZXM7XG4gICAgICBpZiAobm9kZS5pZCkge1xuICAgICAgICBwcm9wcyA9IHsgX2lkOiBub2RlLmlkLCAuLi5wcm9wcyB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nKHByb3BzKTtcbiAgICAgIHJldHVybiBwcm9wU3RyID8gYCgke3Zhck5hbWV9OiR7bGFiZWx9ICR7cHJvcFN0cn0pYCA6IGAoJHt2YXJOYW1lfToke2xhYmVsfSlgO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydFR5cGUgPT09IEluc2VydFR5cGUuT3ZlcndyaXRlID8gJ0lOU0VSVCBPVkVSV1JJVEUnIDogJ0lOU0VSVCc7XG4gICAgY29uc3QgZ3FsU3RyID0gaW5zZXJ0S2V5d29yZCArICcgJyArIHBhcnRzLmpvaW4oJywgJykgKyAnIFJFVFVSTiAnICsgdmFyTmFtZXMuam9pbignLCAnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoZ3FsU3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgZWRnZXMgdXNpbmcgR1FMIElOU0VSVCBzeW50YXggd2l0aCBSRVRVUk4gY2xhdXNlLlxuICAgKiBFYWNoIGVkZ2UgaXMgaW5zZXJ0ZWQgaW5kaXZpZHVhbGx5IHVzaW5nIE1BVENIICsgSU5TRVJUIHRvIHJlc29sdmUgbm9kZSBJRHMuXG4gICAqIEdRTDogTUFUQ0ggKHNyYyBXSEVSRSBpZChzcmMpID0gJ2Zyb20nKSwgKGRzdCBXSEVSRSBpZChkc3QpID0gJ3RvJylcbiAgICogICAgICBJTlNFUlQgKHNyYyktW2UwOkxhYmVsIHtwMTogdjF9XS0+KGRzdCkgUkVUVVJOIGUwXG4gICAqIFJldHVybnMgYSBtZXJnZWQgUmVzcG9uc2UgY29udGFpbmluZyBhbGwgaW5zZXJ0ZWQgZWRnZXMgaW4gY29sdW1ucyBlMCwgZTEsIGV0Yy5cbiAgICovXG4gIGFzeW5jIGluc2VydEVkZ2VzKGVkZ2VzOiBFZGdlRGF0YVtdLCBpbnNlcnRUeXBlOiBJbnNlcnRUeXBlID0gSW5zZXJ0VHlwZS5Ob3JtYWwpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKGVkZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBSZXNwb25zZShbXSwgW10sIDAsIGZhbHNlLCBbXSwgMCk7XG5cbiAgICBjb25zdCBpbnNlcnRLZXl3b3JkID0gaW5zZXJ0VHlwZSA9PT0gSW5zZXJ0VHlwZS5PdmVyd3JpdGUgPyAnSU5TRVJUIE9WRVJXUklURScgOiAnSU5TRVJUJztcbiAgICBjb25zdCBhbGxDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFZhbHVlczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxBZmZlY3RlZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgY29uc3QgdmFyTmFtZSA9IGBlJHtpfWA7XG4gICAgICBjb25zdCBsYWJlbFBhcnQgPSBlZGdlLmxhYmVsID8gJzonICsgR3FsZGJDbGllbnQucXVvdGVMYWJlbChlZGdlLmxhYmVsKSA6ICcnO1xuICAgICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nKGVkZ2UucHJvcGVydGllcyk7XG4gICAgICBjb25zdCBlZGdlUGFydCA9IHByb3BTdHIgPyBgWyR7dmFyTmFtZX0ke2xhYmVsUGFydH0gJHtwcm9wU3RyfV1gIDogYFske3Zhck5hbWV9JHtsYWJlbFBhcnR9XWA7XG4gICAgICBjb25zdCBncWxTdHIgPSBgTUFUQ0ggKHNyYyBXSEVSRSBpZChzcmMpID0gJyR7ZWRnZS5mcm9tTm9kZUlkfScpLCBgXG4gICAgICAgICsgYChkc3QgV0hFUkUgaWQoZHN0KSA9ICcke2VkZ2UudG9Ob2RlSWR9JykgYFxuICAgICAgICArIGAke2luc2VydEtleXdvcmR9IChzcmMpLSR7ZWRnZVBhcnR9LT4oZHN0KSBSRVRVUk4gJHt2YXJOYW1lfWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsU3RyKTtcbiAgICAgIHRvdGFsQWZmZWN0ZWQgKz0gcmVzcC5yb3dzQWZmZWN0ZWQ7XG4gICAgICBhbGxDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICBpZiAocmVzcC5yb3dzLmxlbmd0aCA+IDAgJiYgcmVzcC5yb3dzWzBdLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFsbFZhbHVlcy5wdXNoKHJlc3Aucm93c1swXS52YWx1ZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXJnZWRSb3cgPSBuZXcgUm93KGFsbFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShhbGxDb2x1bW5zLCBbbWVyZ2VkUm93XSwgMSwgZmFsc2UsIFtdLCB0b3RhbEFmZmVjdGVkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFN5c3RlbSAmIFByb2Nlc3MgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3NlcyAocXVlcmllcykgKi9cbiAgYXN5bmMgdG9wKCk6IFByb21pc2U8UHJvY2Vzc0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnVE9QJyk7XG4gICAgcmV0dXJuIHBhcnNlUHJvY2Vzc0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSBhIHJ1bm5pbmcgcXVlcnkgYnkgaXRzIHF1ZXJ5IElEICovXG4gIGFzeW5jIGtpbGwocXVlcnlJZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgS0lMTCAnJHtxdWVyeUlkfSdgKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3RhdGlzdGljcyBmb3IgdGhlIGN1cnJlbnQgZ3JhcGggdXNpbmcgZGIuc3RhdHMoKSAqL1xuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPEdyYXBoU3RhdHM+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1JFVFVSTiBkYi5zdGF0cygpIEFTIHN0YXRzJyk7XG4gICAgcmV0dXJuIHBhcnNlR3JhcGhTdGF0cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgcGluZyB0byB0aGUgc2VydmVyIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgdGVzdCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnBpbmcoKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW50ZXJuYWwgSGVscGVycyDigJQgUGFyc2luZyBSZXNwb25zZSBSb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogRmluZCB0aGUgaW5kZXggb2YgYSBjb2x1bW4gYnkgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSksIG9yIC0xIGlmIG5vdCBmb3VuZCAqL1xuZnVuY3Rpb24gZmluZENvbHVtbkluZGV4KHJlc3A6IFJlc3BvbnNlLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVzcC5jb2x1bW5zW2ldLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyKSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKiBTYWZlbHkgZXh0cmFjdCBhIHN0cmluZyBmcm9tIGEgcm93IGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbmZ1bmN0aW9uIGdldFN0cmluZ1ZhbChyb3c6IFJvdywgaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuICcnO1xuICB0cnkge1xuICAgIGNvbnN0IHZhbCA9IHJvdy5nZXQoaWR4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqIFNhZmVseSBleHRyYWN0IGEgbnVtYmVyIGZyb20gYSByb3cgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuZnVuY3Rpb24gZ2V0TnVtYmVyVmFsKHJvdzogUm93LCBpZHg6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpZHggPCAwKSByZXR1cm4gMDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWwgPSByb3cuZ2V0KGlkeCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbCk7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBMYWJlbEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgbGFiZWxJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2xhYmVsJyk7XG4gIGNvbnN0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBsYWJlbElkeCksXG4gICAgdHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgdHlwZUlkeCksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb2RlVHlwZUluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogTm9kZVR5cGVJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgcHJvcHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcblxuICBpZiAobmFtZUlkeCA8IDApIG5hbWVJZHggPSB0eXBlSWR4O1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIHByb3BlcnRpZXM6IHBhcnNlUHJvcGVydHlTdHJpbmcoZ2V0U3RyaW5nVmFsKHJvdywgcHJvcHNJZHgpKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVkZ2VUeXBlSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBFZGdlVHlwZUluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBwcm9wc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuXG4gIGlmIChuYW1lSWR4IDwgMCkgbmFtZUlkeCA9IHR5cGVJZHg7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgcHJvcGVydGllczogcGFyc2VQcm9wZXJ0eVN0cmluZyhnZXRTdHJpbmdWYWwocm93LCBwcm9wc0lkeCkpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQWxnb0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogQWxnb0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCBkZXNjSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkZXNjcmlwdGlvbicpO1xuICBjb25zdCB2ZXJJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3ZlcnNpb24nKTtcbiAgY29uc3QgcGFyYW1zSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwYXJhbWV0ZXJzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgZGVzY3JpcHRpb246IGdldFN0cmluZ1ZhbChyb3csIGRlc2NJZHgpLFxuICAgIHZlcnNpb246IGdldFN0cmluZ1ZhbChyb3csIHZlcklkeCksXG4gICAgcGFyYW1ldGVyczogZ2V0U3RyaW5nVmFsKHJvdywgcGFyYW1zSWR4KSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBJbmRleEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4TmFtZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhfbmFtZScpO1xuICBjb25zdCBpZHhFbnRpdHkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VudGl0eV90eXBlJyk7XG4gIGNvbnN0IGlkeExhYmVsID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdsYWJlbCcpO1xuICBjb25zdCBpZHhQcm9wID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0eScpO1xuICBjb25zdCBpZHhQcmVmaXggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3ByZWZpeF9sZW5ndGgnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG4gIGNvbnN0IGlkeEluZGV4ZWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4ZWRfY291bnQnKTtcbiAgY29uc3QgaWR4VG90YWwgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3RvdGFsX2NvdW50Jyk7XG4gIGNvbnN0IGlkeEVycm9yID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlcnJvcicpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgaW5mbzogSW5kZXhJbmZvID0ge1xuICAgICAgaW5kZXhOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhOYW1lKSxcbiAgICAgIGVudGl0eVR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVudGl0eSksXG4gICAgICBsYWJlbDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TGFiZWwpLFxuICAgICAgcHJvcGVydHk6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb3ApLFxuICAgICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgICAgIGluZGV4ZWRDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4SW5kZXhlZCksXG4gICAgICB0b3RhbENvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhUb3RhbCksXG4gICAgICBlcnJvcjogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RXJyb3IpLFxuICAgIH07XG4gICAgaWYgKGlkeFByZWZpeCA+PSAwKSB7XG4gICAgICBpbmZvLnByZWZpeExlbmd0aCA9IGdldE51bWJlclZhbChyb3csIGlkeFByZWZpeCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogRnVsbHRleHRJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeE5hbWUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4X25hbWUnKTtcbiAgY29uc3QgaWR4RW50aXR5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbnRpdHlfdHlwZScpO1xuICBjb25zdCBpZHhTY2hlbWEgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3NjaGVtYV9uYW1lJyk7XG4gIGNvbnN0IGlkeFByb3BzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG4gIGNvbnN0IGlkeEFuYWx5emVyID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdhbmFseXplcicpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhEb2NDb3VudCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZG9jX2NvdW50Jyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIGluZGV4TmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TmFtZSksXG4gICAgZW50aXR5VHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RW50aXR5KSxcbiAgICBzY2hlbWFOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTY2hlbWEpLFxuICAgIHByb3BlcnRpZXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb3BzKSxcbiAgICBhbmFseXplcjogZ2V0U3RyaW5nVmFsKHJvdywgaWR4QW5hbHl6ZXIpLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICBkb2NDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4RG9jQ291bnQpLFxuICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUYXNrSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBUYXNrSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhJZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndGFza19pZCcpO1xuICBjb25zdCBpZHhUeXBlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IGlkeFF1ZXJ5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeScpO1xuICBjb25zdCBpZHhBbGdvID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdhbGdvX25hbWUnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4U3RhcnRlZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhcnRlZF9hdCcpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcbiAgY29uc3QgaWR4UGFyYW1zID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwYXJhbWV0ZXJzJyk7XG4gIGNvbnN0IGlkeE5vZGVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdub2Rlc193cml0dGVuJyk7XG4gIGNvbnN0IGlkeENvbXB1dGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2NvbXB1dGVfdGltZV9tcycpO1xuICBjb25zdCBpZHhXcml0ZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnd3JpdGVfdGltZV9tcycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIHRhc2tJZDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4SWQpLFxuICAgIHR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFR5cGUpLFxuICAgIHF1ZXJ5OiBnZXRTdHJpbmdWYWwocm93LCBpZHhRdWVyeSksXG4gICAgYWxnb05hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEFsZ28pLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICBzdGFydGVkQXQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXJ0ZWQpLFxuICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gICAgcGFyYW1ldGVyczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UGFyYW1zKSxcbiAgICBub2Rlc1dyaXR0ZW46IGdldE51bWJlclZhbChyb3csIGlkeE5vZGVzKSxcbiAgICBjb21wdXRlVGltZU1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhDb21wdXRlKSxcbiAgICB3cml0ZVRpbWVNczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4V3JpdGUpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvY2Vzc0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogUHJvY2Vzc0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4SWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5X2lkJyk7XG4gIGNvbnN0IGlkeFRleHQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5X3RleHQnKTtcbiAgY29uc3QgaWR4U3RhcnQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXJ0X3RpbWUnKTtcbiAgY29uc3QgaWR4RHVyYXRpb24gPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2R1cmF0aW9uX21zJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgcXVlcnlJZDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4SWQpLFxuICAgIHF1ZXJ5VGV4dDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4VGV4dCksXG4gICAgc3RhcnRUaW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGFydCksXG4gICAgZHVyYXRpb25NczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4RHVyYXRpb24pLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUdyYXBoU3RhdHMocmVzcDogUmVzcG9uc2UpOiBHcmFwaFN0YXRzIHtcbiAgY29uc3QgZ3M6IEdyYXBoU3RhdHMgPSB7XG4gICAgZ3JhcGhOYW1lOiAnJyxcbiAgICBub2RlQ291bnQ6IDAsXG4gICAgZWRnZUNvdW50OiAwLFxuICAgIGxhYmVsQ291bnRzOiB7fSxcbiAgICBlZGdlTGFiZWxDb3VudHM6IHt9LFxuICAgIG5vZGVQcm9wZXJ0eVN0YXRzOiB7fSxcbiAgICBlZGdlUHJvcGVydHlTdGF0czoge30sXG4gIH07XG5cbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBncztcblxuICBsZXQgc3RhdHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXRzJyk7XG4gIGlmIChzdGF0c0lkeCA8IDApIHN0YXRzSWR4ID0gMDtcblxuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCB8fCBzdGF0c0lkeCA+PSByZXNwLnJvd3NbMF0udmFsdWVzLmxlbmd0aCkgcmV0dXJuIGdzO1xuXG4gIGNvbnN0IHZhbCA9IHJlc3Aucm93c1swXS5nZXQoc3RhdHNJZHgpO1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKHZhbC5ncmFwaF9uYW1lICE9PSB1bmRlZmluZWQpIGdzLmdyYXBoTmFtZSA9IFN0cmluZyh2YWwuZ3JhcGhfbmFtZSk7XG4gICAgaWYgKHZhbC5ub2RlX2NvdW50ICE9PSB1bmRlZmluZWQpIGdzLm5vZGVDb3VudCA9IE51bWJlcih2YWwubm9kZV9jb3VudCkgfHwgMDtcbiAgICBpZiAodmFsLmVkZ2VfY291bnQgIT09IHVuZGVmaW5lZCkgZ3MuZWRnZUNvdW50ID0gTnVtYmVyKHZhbC5lZGdlX2NvdW50KSB8fCAwO1xuICB9XG5cbiAgcmV0dXJuIGdzO1xufVxuIl19
1165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBV29CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBeUNpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBMkMxQiw2Q0FBNkM7QUFDN0MsTUFBYSxXQUFXO0lBQ2QsTUFBTSxDQUFjO0lBQ3BCLE9BQU8sQ0FBaUI7SUFDeEIsUUFBUSxDQUFpQjtJQUN6QixTQUFTLENBQXFCO0lBQzlCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFdkIsd0NBQXdDO0lBQ2hDLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUM1QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBRWpDLG9CQUFvQjtJQUNaLGNBQWMsQ0FBaUI7SUFDL0IsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBZ0I7SUFDN0IsWUFBWSxDQUFlO0lBQzNCLGlCQUFpQixDQUFvQjtJQUU3QyxzREFBc0Q7SUFDOUMsa0JBQWtCO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsWUFBWSxNQUFtQjtRQUM3QixJQUFBLHVCQUFjLEVB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RTtRQUNyQixpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUV0QyxJQUFJLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLElBQUksUUFBUSxHQUFHLENBQUM7UUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRS9CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEUsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYWluIGNsaWVudCBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXG4gKi9cblxuaW1wb3J0ICogYXMgZ3JwYyBmcm9tICdAZ3JwYy9ncnBjLWpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBHcWxkYkNvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBFbXB0eVF1ZXJ5RXJyb3IsIExvZ2luRmFpbGVkRXJyb3IsIFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1xuICBSZXNwb25zZSxcbiAgUm93LFxuICBJbnNlcnROb2Rlc1Jlc3VsdCxcbiAgSW5zZXJ0RWRnZXNSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXG4gIEV4cG9ydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydENodW5rLFxuICBFeHBvcnRTdGF0cyxcbn0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBHcmFwaEluZm8sXG4gIEdyYXBoVHlwZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVN0YXRzLFxuICBDYWNoZVR5cGUsXG4gIFN0YXRpc3RpY3MsXG4gIENvbXBhY3RSZXN1bHQsXG4gIENvbXB1dGVUb3BvbG9neVJlc3VsdCxcbiAgU3lzdGVtTWV0cmljcyxcbiAgTm9kZURhdGEsXG4gIEVkZ2VEYXRhLFxuICBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zLFxuICBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zLFxuICBCdWxrSW1wb3J0T3B0aW9ucyxcbiAgQnVsa0ltcG9ydFNlc3Npb24sXG4gIENoZWNrcG9pbnRSZXN1bHQsXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEFib3J0QnVsa0ltcG9ydFJlc3VsdCxcbiAgQnVsa0ltcG9ydFN0YXR1cyxcbiAgVHJhbnNhY3Rpb25JbmZvLFxuICBEQlR5cGUsXG4gIEluc2VydFR5cGUsXG4gIExhYmVsSW5mbyxcbiAgTm9kZVR5cGVJbmZvLFxuICBFZGdlVHlwZUluZm8sXG4gIExhYmVsRGVmLFxuICBDb252UHJvcGVydHlEZWYsXG4gIEluZGV4UHJvcGVydHksXG4gIEluZGV4SW5mbyxcbiAgRnVsbHRleHRJbmZvLFxuICBUYXNrSW5mbyxcbiAgUHJvY2Vzc0luZm8sXG4gIEdyYXBoU3RhdHMsXG4gIEFsZ29JbmZvLFxuICBwYXJzZVByb3BlcnR5U3RyaW5nLFxuICBidWlsZFByb3BlcnR5RGVmU3RyaW5nLFxuICBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcsXG4gIGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nLFxuICB1c2VHcmFwaFByZWZpeCxcbiAgZGJUeXBlVG9LZXl3b3JkLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNlcnZpY2VDbGllbnRzLCBwcm9taXNpZnlDYWxsLCBwcm9taXNpZnlDYWxsV2l0aERlYWRsaW5lIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBTZXJ2aWNlQ29udGV4dCxcbiAgU2VydmljZUNsaWVudHMsXG4gIFNlc3Npb25TZXJ2aWNlLFxuICBRdWVyeVNlcnZpY2UsXG4gIEdyYXBoU2VydmljZSxcbiAgVHJhbnNhY3Rpb25TZXJ2aWNlLFxuICBEYXRhU2VydmljZSxcbiAgSGVhbHRoU2VydmljZSxcbiAgQWRtaW5TZXJ2aWNlLFxuICBCdWxrSW1wb3J0U2VydmljZSxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9pbmRleCc7XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBhIHF1ZXJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q29uZmlnIHtcbiAgZ3JhcGhOYW1lPzogc3RyaW5nO1xuICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdHJhbnNhY3Rpb25JZD86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogTWF4IHBhdGhzIHRvIHJldHVybiBmcm9tIHBhdGggcXVlcmllcyAoMCA9IHVubGltaXRlZCkgKi9cbiAgbWF4UGF0aFJlc3VsdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0Tm9kZXMgLyBpbnNlcnRFZGdlcyBjb252ZW5pZW5jZSBtZXRob2RzLlxuICogRXh0ZW5kcyBRdWVyeUNvbmZpZyB3aXRoIGluc2VydC1zcGVjaWZpYyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvbmZpZyBleHRlbmRzIFF1ZXJ5Q29uZmlnIHtcbiAgLyoqIEluc2VydCBtb2RlLiBEZWZhdWx0cyB0byBJbnNlcnRUeXBlLk5vcm1hbCB3aGVuIG9taXR0ZWQuICovXG4gIGluc2VydFR5cGU/OiBJbnNlcnRUeXBlO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0IG5vZGVzICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydE5vZGVzQ29uZmlnIHtcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XG4gIGJ1bGtJbXBvcnRTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgZWRnZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0RWRnZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWFsdGggd2F0Y2hlciBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZyBoZWFsdGggdXBkYXRlcy5cbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKiogTWFpbiBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggR1FMREIgKi9cbmV4cG9ydCBjbGFzcyBHcWxkYkNsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBHcWxkYkNvbmZpZztcbiAgcHJpdmF0ZSBjbGllbnRzOiBTZXJ2aWNlQ2xpZW50cztcbiAgcHJpdmF0ZSBzZXNzaW9uczogU2Vzc2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgdHhNYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgLy8gU3RvcmVkIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICBwcml2YXRlIHN0b3JlZFVzZXJuYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBzdG9yZWRQYXNzd29yZDogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkR3JhcGg6IHN0cmluZyA9ICcnO1xuXG4gIC8vIFNlcnZpY2UgaW5zdGFuY2VzXG4gIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFNlc3Npb25TZXJ2aWNlO1xuICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xuICBwcml2YXRlIGdyYXBoU2VydmljZTogR3JhcGhTZXJ2aWNlO1xuICBwcml2YXRlIHRyYW5zYWN0aW9uU2VydmljZTogVHJhbnNhY3Rpb25TZXJ2aWNlO1xuICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcbiAgcHJpdmF0ZSBoZWFsdGhTZXJ2aWNlOiBIZWFsdGhTZXJ2aWNlO1xuICBwcml2YXRlIGFkbWluU2VydmljZTogQWRtaW5TZXJ2aWNlO1xuICBwcml2YXRlIGJ1bGtJbXBvcnRTZXJ2aWNlOiBCdWxrSW1wb3J0U2VydmljZTtcblxuICAvKiogR2V0IHNlc3Npb24gbWV0YWRhdGEgZm9yIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgKi9cbiAgcHJpdmF0ZSBnZXRTZXNzaW9uTWV0YWRhdGEoKTogZ3JwYy5NZXRhZGF0YSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgZ3JwYy5NZXRhZGF0YSgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgICBtZXRhZGF0YS5hZGQoJ3Nlc3Npb24taWQnLCBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogR3FsZGJDb25maWcpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTtcbiAgICB0aGlzLnR4TWFuYWdlciA9IG5ldyBUcmFuc2FjdGlvbk1hbmFnZXIoKTtcblxuICAgIC8vIENyZWF0ZSBnUlBDIGNyZWRlbnRpYWxzXG4gICAgbGV0IGNyZWRlbnRpYWxzOiBncnBjLkNoYW5uZWxDcmVkZW50aWFscztcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2woKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uczogZ3JwYy5DaGFubmVsT3B0aW9ucyA9IHtcbiAgICAgICdncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDQgKiAxMDI0ICogMTAyNCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lX21zJzogMzAwMDAsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZW91dF9tcyc6IDEwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3Blcm1pdF93aXRob3V0X2NhbGxzJzogMSxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgY2xpZW50cyBmb3IgdGhlIGZpcnN0IGhvc3RcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xuICAgIHRoaXMuY2xpZW50cyA9IGNyZWF0ZVNlcnZpY2VDbGllbnRzKGhvc3QsIGNyZWRlbnRpYWxzLCBvcHRpb25zKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gbmV3IFNlcnZpY2VDb250ZXh0KHRoaXMuY29uZmlnLCB0aGlzLnNlc3Npb25zLCB0aGlzLnR4TWFuYWdlciwgdGhpcy5jbGllbnRzKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICAgIC8vIFN0b3JlIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICAgIHRoaXMuc3RvcmVkVXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnN0b3JlZFBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBmbiBhbmQgYXV0by1yZWNvbm5lY3Qgb24gVU5BVVRIRU5USUNBVEVEIGVycm9yLlxuICAgKiBJZiBmbiB0aHJvd3MgYW4gVU5BVVRIRU5USUNBVEVEIGdSUEMgZXJyb3IgYW5kIGNyZWRlbnRpYWxzIGFyZSBzdG9yZWQsXG4gICAqIHJlLWxvZ2luIGFuZCByZXRyeSBmbiBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQXV0b1JlY29ubmVjdDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZ0xvd2VyID0gZT8ubWVzc2FnZSA/IFN0cmluZyhlLm1lc3NhZ2UpLnRvTG93ZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGlzVW5hdXRoZW50aWNhdGVkID1cbiAgICAgICAgKGU/LmNvZGUgPT09IGdycGMuc3RhdHVzLlVOQVVUSEVOVElDQVRFRCkgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3VuYXV0aGVudGljYXRlZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIG5vdCBmb3VuZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIGV4cGlyZWQnKTtcbiAgICAgIGlmIChpc1VuYXV0aGVudGljYXRlZCAmJiB0aGlzLnN0b3JlZFVzZXJuYW1lKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBncmFwaCBjb250ZXh0IGJlZm9yZSByZS1sb2dpblxuICAgICAgICBjb25zdCBzYXZlZEdyYXBoID0gdGhpcy5zdG9yZWRHcmFwaDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKHRoaXMuc3RvcmVkVXNlcm5hbWUsIHRoaXMuc3RvcmVkUGFzc3dvcmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBlOyAvLyBSZXR1cm4gb3JpZ2luYWwgZXJyb3IgaWYgcmUtbG9naW4gZmFpbHNcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0b3JlIGdyYXBoIGNvbnRleHQgYWZ0ZXIgcmUtbG9naW5cbiAgICAgICAgaWYgKHNhdmVkR3JhcGggJiYgc2F2ZWRHcmFwaCAhPT0gJ19fc3lzdGVtX18nKSB7XG4gICAgICAgICAgdHJ5IHsgYXdhaXQgdGhpcy51c2VHcmFwaChzYXZlZEdyYXBoKTsgfSBjYXRjaCB7IC8qIGJlc3QgZWZmb3J0ICovIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oKTsgLy8gUmV0cnkgb25jZVxuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGVybWluYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLmxvZ291dCgpO1xuICB9XG5cbiAgLyoqIENoZWNrIHRoZSBjb25uZWN0aW9uIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBRdWVyeSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqL1xuICBhc3luYyBncWwocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cbiAgYXN5bmMgZ3FsU3RyZWFtKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXG4gICAgY2FsbGJhY2s/OiAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmdxbFN0cmVhbShxdWVyeSwgY29uZmlnLCBjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cbiAgYXN5bmMgZXhwbGFpbihxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZXhwbGFpbihxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIHF1ZXJ5IHdpdGggcHJvZmlsaW5nIGFuZCByZXR1cm4gc3RhdGlzdGljcyAqL1xuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHcmFwaCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgZ3JhcGggKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGgoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSBncmFwaCAqL1xuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmRyb3BHcmFwaChuYW1lLCBpZkV4aXN0cyk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjdXJyZW50IGdyYXBoIGZvciB0aGUgc2Vzc2lvbiAqL1xuICBhc3luYyB1c2VHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdyYXBoU2VydmljZS51c2VHcmFwaChuYW1lKTtcbiAgICB0aGlzLnN0b3JlZEdyYXBoID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBncmFwaHMgKi9cbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmxpc3RHcmFwaHMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBncmFwaCAqL1xuICBhc3luYyBnZXRHcmFwaEluZm8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxHcmFwaEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zYWN0aW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuYmVnaW5UcmFuc2FjdGlvbihncmFwaE5hbWUsIHJlYWRPbmx5LCB0aW1lb3V0KTtcbiAgfVxuXG4gIC8qKiBDb21taXQgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyBjb21taXQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHJvbGxiYWNrKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5yb2xsYmFjayh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyAqL1xuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UubGlzdFRyYW5zYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZm46ICh0eElkOiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uud2l0aFRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgZm4sIHJlYWRPbmx5KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEYXRhIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEluc2VydCBtdWx0aXBsZSBub2RlcyBpbnRvIGEgZ3JhcGggdXNpbmcgZ1JQQyBidWxrIGluc2VydCAqL1xuICBhc3luYyBpbnNlcnROb2Rlc0JhdGNoQXV0byhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgZWRnZXMgaW50byBhIGdyYXBoIHVzaW5nIGdSUEMgYnVsayBpbnNlcnQgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXNCYXRjaEF1dG8oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKGdyYXBoTmFtZSwgZWRnZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRGVsZXRlIG5vZGVzIGZyb20gYSBncmFwaCAqL1xuICBhc3luYyBkZWxldGVOb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlSWRzPzogc3RyaW5nW10sXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgd2hlcmU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5kZWxldGVOb2RlcyhncmFwaE5hbWUsIG5vZGVJZHMsIGxhYmVscywgd2hlcmUpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBlZGdlcyBmcm9tIGEgZ3JhcGggKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlRWRnZXMoZ3JhcGhOYW1lLCBlZGdlSWRzLCBsYWJlbCwgd2hlcmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxuICAgKiBAcGFyYW0gY29uZmlnIEV4cG9ydCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmb3IgZWFjaCBleHBvcnRlZCBjaHVua1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0KFxuICAgIGNvbmZpZzogRXhwb3J0Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKGNodW5rOiBFeHBvcnRDaHVuaykgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnQoY29uZmlnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnROb2Rlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnROb2RlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gZWRnZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydEVkZ2VzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydEVkZ2VzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlYWx0aCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDaGVjayB0aGUgaGVhbHRoIG9mIGEgc2VydmljZSAqL1xuICBhc3luYyBoZWFsdGhDaGVjayhzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8SGVhbHRoU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS5oZWFsdGhDaGVjayhzZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBoZWFsdGggc3RhdHVzIGNoYW5nZXMgdmlhIHNlcnZlci1zaWRlIHN0cmVhbWluZy5cbiAgICogUmV0dXJucyBhIEhlYWx0aFdhdGNoZXIgdGhhdCBlbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgdmFsdWVzLlxuICAgKiBDYWxsIHN0b3AoKSB0byBjYW5jZWwgdGhlIHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgLSBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gd2F0Y2hcbiAgICogQHJldHVybnMgSGVhbHRoV2F0Y2hlciAtIEV2ZW50RW1pdHRlciB3aXRoIHN0b3AoKSBtZXRob2RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3YXRjaGVyID0gY2xpZW50LndhdGNoKCk7XG4gICAqIHdhdGNoZXIub24oJ3N0YXR1cycsIChzdGF0dXM6IEhlYWx0aFN0YXR1cykgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdIZWFsdGggc3RhdHVzOicsIHN0YXR1cyk7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKCdXYXRjaCBlcnJvcjonLCBlcnIpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZW5kJywgKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdXYXRjaCBzdHJlYW0gZW5kZWQnKTtcbiAgICogfSk7XG4gICAqIC8vIExhdGVyLCB0byBzdG9wIHdhdGNoaW5nOlxuICAgKiB3YXRjaGVyLnN0b3AoKTtcbiAgICogYGBgXG4gICAqL1xuICB3YXRjaChzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IEhlYWx0aFdhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2Uud2F0Y2goc2VydmljZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWRtaW4gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUHJlLWFsbG9jYXRlIHBhcnNlciBpbnN0YW5jZXMgKi9cbiAgYXN5bmMgd2FybXVwUGFyc2VyKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FybXVwUGFyc2VyKGNvdW50KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGUgc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRDYWNoZVN0YXRzKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8Q2FjaGVTdGF0cz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRDYWNoZVN0YXRzKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNwZWNpZmllZCBjYWNoZSAqL1xuICBhc3luYyBjbGVhckNhY2hlKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jbGVhckNhY2hlKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGFiYXNlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0U3RhdGlzdGljcyhncmFwaE5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxTdGF0aXN0aWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lKTtcbiAgfVxuXG4gIC8qKiBJbnZhbGlkYXRlIHRoZSBSQkFDIHBlcm1pc3Npb24gY2FjaGUgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN5c3RlbS1sZXZlbCBtZXRyaWNzIChDUFUsIG1lbW9yeSwgZGlzayBJL08sIHN0b3JhZ2UsIG5ldHdvcmspICovXG4gIGFzeW5jIGdldFN5c3RlbU1ldHJpY3MoKTogUHJvbWlzZTxTeXN0ZW1NZXRyaWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN5c3RlbU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIG1hbnVhbCBjb21wYWN0aW9uIG9mIHRoZSBkYXRhYmFzZSBzdG9yYWdlICovXG4gIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTxDb21wYWN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNvbXBhY3QoKTtcbiAgfVxuXG4gIC8qKiBXYWl0IGZvciB0aGUgY29tcHV0aW5nIGVuZ2luZSB0b3BvbG9neSB0byBiZSByZWFkeSAqL1xuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZSwgdGltZW91dE1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCdWxrIEltcG9ydCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGJ1bGsgaW1wb3J0IHNlc3Npb24gZm9yIG9wdGltaXplZCBoaWdoLXRocm91Z2hwdXQgaW5zZXJ0cy5cbiAgICogQHBhcmFtIGdyYXBoTmFtZSBUYXJnZXQgZ3JhcGggbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBidWxrIGltcG9ydCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBzdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBCdWxrSW1wb3J0T3B0aW9ucyk6IFByb21pc2U8QnVsa0ltcG9ydFNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5zdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGVja3BvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQuIFVzZSBlbmRCdWxrSW1wb3J0KCkgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaC5cbiAgICovXG4gIGFzeW5jIGNoZWNrcG9pbnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPENoZWNrcG9pbnRSZXN1bHQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHJlY29yZENvdW50OiAwLFxuICAgICAgbGFzdENoZWNrcG9pbnRDb3VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICdDaGVja3BvaW50IGhhcyBiZWVuIHJlbW92ZWQ7IHVzZSBlbmRCdWxrSW1wb3J0IHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2gnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5kIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGggYSBmaW5hbCBjaGVja3BvaW50LlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEVuZEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5lbmRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGhvdXQgZmluYWwgc3luYy5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBhYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFib3J0QnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgYSBidWxrIGltcG9ydCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtJbXBvcnRTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5nZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgTWV0aG9kcyDigJQgR2V0dGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgZ2V0U2Vzc2lvbigpOiBTZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZXNzaW9uICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuaXNMb2dnZWRJbigpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKi9cbiAgZ2V0Q29uZmlnKCk6IEdxbGRiQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYSBjbHVzdGVyIGRlcGxveW1lbnQgKi9cbiAgZ2V0IGlzQ2x1c3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmlzQ2x1c3RlciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsdXN0ZXIgSUQgKGVtcHR5IHN0cmluZyBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgY2x1c3RlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5jbHVzdGVySWQgfHwgJyc7XG4gIH1cblxuICAvKiogR2V0IHRoZSBwYXJ0aXRpb24gY291bnQgKDAgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IHBhcnRpdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5wYXJ0aXRpb25Db3VudCB8fCAwO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIEhlbHBlcnMg4oCUIE5hbWUgUXVvdGluZ1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogV3JhcCBhIG5hbWUgaW4gYmFja3RpY2tzIGZvciBzYWZlIHVzZSBpbiBHUUwgc3RhdGVtZW50cy5cbiAgICogTGFiZWwgbmFtZXMgYW5kIHByb3BlcnR5IG5hbWVzIHNob3VsZCBiZSBxdW90ZWQ7IGdyYXBoIG5hbWVzLCBpbmRleCBuYW1lcyxcbiAgICogYW5kIGZ1bGx0ZXh0IG5hbWVzIHNob3VsZCBOT1QgYmUgd3JhcHBlZCBpbiBiYWNrdGlja3MuICovXG4gIHByaXZhdGUgc3RhdGljIHF1b3RlTGFiZWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2AnICsgbmFtZSArICdgJztcbiAgfVxuXG4gIC8qKiBXcmFwIGVhY2ggbGFiZWwgbmFtZSBpbiBiYWNrdGlja3MgYW5kIGpvaW4gd2l0aCBcIiwgXCIgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbHMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMubWFwKG4gPT4gJ2AnICsgbiArICdgJykuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKiBKb2luIG5hbWVzIHdpdGggXCIsIFwiIHdpdGhvdXQgYmFja3RpY2sgd3JhcHBpbmcgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgam9pbk5hbWVzKC4uLm5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBHcmFwaCBPcGVyYXRpb25zICg2IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgb3BlbiAoc2NoZW1hLWxlc3MpIGdyYXBoICovXG4gIGFzeW5jIGNyZWF0ZU9wZW5HcmFwaChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEdSQVBIICR7bmFtZX0ge31gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBjbG9zZWQgKHNjaGVtYS1lbmZvcmNlZCkgZ3JhcGggd2l0aCBub2RlIGFuZCBlZGdlIGxhYmVsIGRlZmluaXRpb25zICovXG4gIGFzeW5jIGNyZWF0ZUNsb3NlZEdyYXBoKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfSB7fWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ3JhcGggaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBncmFwaCB3YXMgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGhJZk5vdEV4aXN0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgbXNnID0gKGUubWVzc2FnZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChtc2cuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3QnKSB8fCBtc2cuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgYSBncmFwaCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyAqL1xuICBhc3luYyBoYXNHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBncmFwaHMgPSBhd2FpdCB0aGlzLmxpc3RHcmFwaHMoKTtcbiAgICByZXR1cm4gZ3JhcGhzLnNvbWUoZyA9PiBnLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIGdyYXBoICovXG4gIGFzeW5jIGFsdGVyR3JhcGgoZ3JhcGhOYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke2dyYXBoTmFtZX0gUkVOQU1FIFRPICR7bmV3TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhbGwgZGF0YSBmcm9tIGEgZ3JhcGggd2hpbGUga2VlcGluZyBpdHMgc3RydWN0dXJlICovXG4gIGFzeW5jIHRydW5jYXRlKGdyYXBoTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYFRSVU5DQVRFIEdSQVBIICR7Z3JhcGhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBMYWJlbCBPcGVyYXRpb25zICgxNiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBsYWJlbHMgKG5vZGUgYW5kIGVkZ2UpIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgbGFiZWxzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dOb2RlTGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwLCAnTk9ERScpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBsYWJlbHMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0VkZ2VMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3AsICdFREdFJyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIHR5cGVzIHdpdGggdGhlaXIgcHJvcGVydGllcyAqL1xuICBhc3luYyBzaG93Tm9kZVR5cGVzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxOb2RlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIFRZUEVTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VOb2RlVHlwZUluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSB0eXBlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgc2hvd0VkZ2VUeXBlcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RWRnZVR5cGVJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBUWVBFUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzcGVjaWZpYyBsYWJlbCBieSBuYW1lIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGgsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICAgKiBNYXRjaGVzIGVudHJpZXMgd2hlcmUgYG5hbWVgIGlzIG9uZSBvZiB0aGUgLmxhYmVscyAoc3VwcG9ydHMgbXVsdGktbGFiZWwgZ3JvdXBzKS5cbiAgICovXG4gIGFzeW5jIGdldExhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCBsYWJlbHMgPSBhd2FpdCB0aGlzLnNob3dMYWJlbHMoY29uZmlnKTtcbiAgICByZXR1cm4gbGFiZWxzLmZpbmQobCA9PiBsLmxhYmVscy5pbmNsdWRlcyhuYW1lKSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBub2RlIHR5cGUgYnkgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0Tm9kZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPE5vZGVUeXBlSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuc2hvd05vZGVUeXBlcyhjb25maWcpO1xuICAgIHJldHVybiB0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIGVkZ2UgdHlwZSBieSBuYW1lLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRFZGdlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RWRnZVR5cGVJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5zaG93RWRnZVR5cGVzKGNvbmZpZyk7XG4gICAgcmV0dXJuIHR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbm9kZSBsYWJlbCBpbiB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBjcmVhdGVOb2RlTGFiZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gQUREIE5PREUgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgke3Byb3BTdHJ9KSB9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gZWRnZSBsYWJlbCBpbiB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBjcmVhdGVFZGdlTGFiZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gQUREIEVER0UgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgpLVske3Byb3BTdHJ9XS0+KCkgfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgbGFiZWwgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wTm9kZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gRFJPUCBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3Agb25lIG9yIG1vcmUgZWRnZSBsYWJlbHMgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wRWRnZUxhYmVsKC4uLm5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAvLyBMYXN0IGFyZyBtYXkgYmUgYSBRdWVyeUNvbmZpZyAob3IgdW5kZWZpbmVkKTsgdHJlYXQgbm9uLXN0cmluZyBhcyBjb25maWcuXG4gICAgbGV0IGNvbmZpZzogUXVlcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICBpZiAobmFtZXNPckNvbmZpZy5sZW5ndGggPiAwICYmIHR5cGVvZiBuYW1lc09yQ29uZmlnW25hbWVzT3JDb25maWcubGVuZ3RoIC0gMV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBuYW1lc09yQ29uZmlnW25hbWVzT3JDb25maWcubGVuZ3RoIC0gMV0gYXMgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICBuYW1lcyA9IG5hbWVzT3JDb25maWcuc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lcyA9IG5hbWVzT3JDb25maWcgYXMgc3RyaW5nW107XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IERST1AgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGxhYmVsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVMYWJlbElmTm90RXhpc3QoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsYWJlbHMgPSBhd2FpdCB0aGlzLnNob3dMYWJlbHMoY29uZmlnKTtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gbm9kZU9yRWRnZSA9PT0gREJUeXBlLkVER0UgPyAnRURHRScgOiAnTk9ERSc7XG5cbiAgICBpZiAobGFiZWxzLnNvbWUobCA9PiBsLmxhYmVscy5pbmNsdWRlcyhuYW1lKSAmJiBsLnR5cGUgPT09IHRhcmdldFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZU5vZGVMYWJlbChuYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVFZGdlTGFiZWwobmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgYWx0ZXJOb2RlTGFiZWwob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwob2xkTmFtZSl9IFJFTkFNRSBUTyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmV3TmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBhbHRlckVkZ2VMYWJlbChvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChvbGROYW1lKX0gUkVOQU1FIFRPICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuZXdOYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGFsZ29yaXRobXMgKi9cbiAgYXN5bmMgc2hvd0FsZ29zKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBbGdvSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEFMR09TJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBQcm9wZXJ0eSBPcGVyYXRpb25zICgxMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Byb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0VkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBzaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBjb25zdCBudCA9IGF3YWl0IHRoaXMuZ2V0Tm9kZUxhYmVsKGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoIW50KSB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbGFiZWwgXCIke2xhYmVsTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gbnQucHJvcGVydGllcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBzaG93RWRnZVByb3BlcnR5KGxhYmVsTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBjb25zdCBldCA9IGF3YWl0IHRoaXMuZ2V0RWRnZUxhYmVsKGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoIWV0KSB0aHJvdyBuZXcgRXJyb3IoYEVkZ2UgbGFiZWwgXCIke2xhYmVsTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gZXQucHJvcGVydGllcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICBjb25zdCBwcm9wcyA9IGF3YWl0IHRoaXMuc2hvd1Byb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICByZXR1cm4gcHJvcHMuZmluZChwID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYSBub2RlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXROb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuTk9ERSwgbGFiZWxOYW1lLCBwcm9wTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhbiBlZGdlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuRURHRSwgbGFiZWxOYW1lLCBwcm9wTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhIGxhYmVsIChub2RlIG9yIGVkZ2UpICovXG4gIGFzeW5jIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUVkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIHByb3BzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgUFJPUEVSVFkgJHtwcm9wU3RyfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgUFJPUEVSVFkgJHtwcm9wU3RyfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYSBsYWJlbCAobm9kZSBvciBlZGdlKSAqL1xuICBhc3luYyBkcm9wUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wTm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgLi4ubmFtZXMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3BFZGdlUHJvcGVydHkobGFiZWxOYW1lLCAuLi5uYW1lcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgZHJvcE5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgZHJvcEVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9wZXJ0aWVzIG9uIGEgbGFiZWwgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBwcm9wZXJ0aWVzIHdlcmUgY3JlYXRlZCwgZmFsc2UgaWYgYWxsIGFscmVhZHkgZXhpc3RlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVByb3BlcnR5SWZOb3RFeGlzdChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zaG93UHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGNvbnN0IGV4aXN0aW5nU2V0ID0gbmV3IFNldChleGlzdGluZy5tYXAocCA9PiBwLm5hbWUpKTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IHByb3BzLmZpbHRlcihwID0+ICFleGlzdGluZ1NldC5oYXMocC5uYW1lKSk7XG5cbiAgICBpZiAobmV3UHJvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmV3UHJvcHMsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBDb25zdHJhaW50IE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENyZWF0ZSBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgb24gYSBwcm9wZXJ0eSAqL1xuICBhc3luYyBjcmVhdGVOb3ROdWxsQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBDT05TVFJBSU5UIE5PVCBOVUxMIE9OICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChwcm9wTmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBVTklRVUUgY29uc3RyYWludCBvbiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBDT05TVFJBSU5UIFVOSVFVRSBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgZnJvbSBhIHByb3BlcnR5ICovXG4gIGFzeW5jIGRyb3BOb3ROdWxsQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IERST1AgQ09OU1RSQUlOVCBOT1QgTlVMTCBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwocHJvcE5hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgVU5JUVVFIGNvbnN0cmFpbnQgZnJvbSBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGRyb3BVbmlxdWVDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGNvbnN0IGVudGl0eVR5cGUgPSBkYlR5cGVUb0tleXdvcmQobm9kZU9yRWRnZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiAke2VudGl0eVR5cGV9ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIENPTlNUUkFJTlQgVU5JUVVFIE9OICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBJbmRleCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0luZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93Tm9kZUluZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dFZGdlSW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlSW5kZXgoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluZGV4UHJvcGVydHlbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgSU5ERVggJHtpbmRleE5hbWV9IE9OIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke3Byb3BTdHJ9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUluZGV4KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbmRleFByb3BlcnR5W10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIElOREVYICR7aW5kZXhOYW1lfSBPTiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtwcm9wU3RyfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcE5vZGVJbmRleChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIE5PREUgSU5ERVggJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGFuIGVkZ2UgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wRWRnZUluZGV4KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgRURHRSBJTkRFWCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRnVsbHRleHQgT3BlcmF0aW9ucyAoNyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBmdWxsdGV4dCBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGZ1bGx0ZXh0IGluZGV4ZXMgKi9cbiAgYXN5bmMgc2hvd05vZGVGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgZnVsbHRleHQgaW5kZXhlcyAqL1xuICBhc3luYyBzaG93RWRnZUZ1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlRnVsbHRleHQoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBGVUxMVEVYVCAke2luZGV4TmFtZX0gT04gTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ucHJvcHMpfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUZ1bGx0ZXh0KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgRlVMTFRFWFQgJHtpbmRleE5hbWV9IE9OIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BzKX0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBmdWxsdGV4dCBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BOb2RlRnVsbHRleHQoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIEZVTExURVhUICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhbiBlZGdlIGZ1bGx0ZXh0IGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcEVkZ2VGdWxsdGV4dChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgRlVMTFRFWFQgJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFRhc2sgT3BlcmF0aW9ucyAoMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCB0YXNrcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93VGFza3MoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFRhc2tJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgVEFTS1MnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSB0YXNrIGJ5IElEICovXG4gIGFzeW5jIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgREVMRVRFIFRBU0sgJHt0YXNrSWR9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGEgcnVubmluZyB0YXNrIGJ5IElEICovXG4gIGFzeW5jIHN0b3BUYXNrKHRhc2tJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYFNUT1AgVEFTSyAke3Rhc2tJZH1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRGF0YSBJbnNlcnQgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5zZXJ0IG5vZGVzIHVzaW5nIEdRTCBJTlNFUlQgc3ludGF4IHdpdGggUkVUVVJOIGNsYXVzZS5cbiAgICogR1FMOiBJTlNFUlQgKG4wOkxhYmVsIHtwMTogdjF9KSwgKG4xOkxhYmVsIHtwMjogdjJ9KSBSRVRVUk4gbjAsIG4xXG4gICAqIFdoZW4gY29uZmlnLmluc2VydFR5cGUgaXMgSW5zZXJ0VHlwZS5PdmVyd3JpdGUsIHVzZXMgSU5TRVJUIE9WRVJXUklURSBzeW50YXguXG4gICAqIElmIE5vZGVEYXRhLmlkIGlzIHNldCAobm9uLWVtcHR5KSwgaW5jbHVkZXMgaXQgYXMgX2lkIHByb3BlcnR5IGluIHRoZSBHUUwuXG4gICAqIFJldHVybnMgdGhlIHJhdyBSZXNwb25zZSBjb250YWluaW5nIHRoZSBpbnNlcnRlZCBub2RlcyBpbiBjb2x1bW5zIG4wLCBuMSwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZXMgTm9kZXMgdG8gaW5zZXJ0LlxuICAgKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIEluc2VydENvbmZpZy4gU3VwcG9ydHMgcGVyLWNhbGwgZ3JhcGhOYW1lIGFuZCBpbnNlcnRUeXBlLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXMobm9kZXM6IE5vZGVEYXRhW10sIGNvbmZpZz86IEluc2VydENvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgIGlmICghbm9kZS5sYWJlbHMgfHwgbm9kZS5sYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBhdCBpbmRleCAke2l9IGhhcyBubyBsYWJlbHMuIEF0IGxlYXN0IG9uZSBsYWJlbCBpcyByZXF1aXJlZC5gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZhck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhcnRzID0gbm9kZXMubWFwKChub2RlLCBpKSA9PiB7XG4gICAgICBjb25zdCB2YXJOYW1lID0gYG4ke2l9YDtcbiAgICAgIHZhck5hbWVzLnB1c2godmFyTmFtZSk7XG4gICAgICAvLyBHUUwgSU5TRVJUIG9ubHkgc3VwcG9ydHMgc2luZ2xlIGxhYmVsIHBlciBub2RlXG4gICAgICBjb25zdCBsYWJlbCA9IEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwobm9kZS5sYWJlbHNbMF0pO1xuICAgICAgLy8gQnVpbGQgcHJvcGVydGllcyBpbmNsdWRpbmcgX2lkIGlmIHNldFxuICAgICAgbGV0IHByb3BzID0gbm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgaWYgKG5vZGUuaWQpIHtcbiAgICAgICAgcHJvcHMgPSB7IF9pZDogbm9kZS5pZCwgLi4ucHJvcHMgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcFN0ciA/IGAoJHt2YXJOYW1lfToke2xhYmVsfSAke3Byb3BTdHJ9KWAgOiBgKCR7dmFyTmFtZX06JHtsYWJlbH0pYDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGluc2VydFR5cGUgPSBjb25maWc/Lmluc2VydFR5cGUgPz8gSW5zZXJ0VHlwZS5Ob3JtYWw7XG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydFR5cGUgPT09IEluc2VydFR5cGUuT3ZlcndyaXRlID8gJ0lOU0VSVCBPVkVSV1JJVEUnIDogJ0lOU0VSVCc7XG4gICAgY29uc3QgZ3FsU3RyID0gaW5zZXJ0S2V5d29yZCArICcgJyArIHBhcnRzLmpvaW4oJywgJykgKyAnIFJFVFVSTiAnICsgdmFyTmFtZXMuam9pbignLCAnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoZ3FsU3RyLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBlZGdlcyB1c2luZyBHUUwgSU5TRVJUIHN5bnRheCB3aXRoIFJFVFVSTiBjbGF1c2UuXG4gICAqIEVhY2ggZWRnZSBpcyBpbnNlcnRlZCBpbmRpdmlkdWFsbHkgdXNpbmcgTUFUQ0ggKyBJTlNFUlQgdG8gcmVzb2x2ZSBub2RlIElEcy5cbiAgICogR1FMOiBNQVRDSCAoc3JjIFdIRVJFIGlkKHNyYykgPSAnZnJvbScpLCAoZHN0IFdIRVJFIGlkKGRzdCkgPSAndG8nKVxuICAgKiAgICAgIElOU0VSVCAoc3JjKS1bZTA6TGFiZWwge3AxOiB2MX1dLT4oZHN0KSBSRVRVUk4gZTBcbiAgICogV2hlbiBjb25maWcuaW5zZXJ0VHlwZSBpcyBJbnNlcnRUeXBlLk92ZXJ3cml0ZSwgdXNlcyBJTlNFUlQgT1ZFUldSSVRFIHN5bnRheC5cbiAgICogUmV0dXJucyBhIG1lcmdlZCBSZXNwb25zZSBjb250YWluaW5nIGFsbCBpbnNlcnRlZCBlZGdlcyBpbiBjb2x1bW5zIGUwLCBlMSwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gZWRnZXMgRWRnZXMgdG8gaW5zZXJ0LlxuICAgKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIEluc2VydENvbmZpZy4gU3VwcG9ydHMgcGVyLWNhbGwgZ3JhcGhOYW1lIGFuZCBpbnNlcnRUeXBlLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXMoZWRnZXM6IEVkZ2VEYXRhW10sIGNvbmZpZz86IEluc2VydENvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAoZWRnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIGNvbnN0IGluc2VydFR5cGUgPSBjb25maWc/Lmluc2VydFR5cGUgPz8gSW5zZXJ0VHlwZS5Ob3JtYWw7XG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydFR5cGUgPT09IEluc2VydFR5cGUuT3ZlcndyaXRlID8gJ0lOU0VSVCBPVkVSV1JJVEUnIDogJ0lOU0VSVCc7XG4gICAgY29uc3QgYWxsQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhbGxWYWx1ZXM6IGFueVtdID0gW107XG4gICAgbGV0IHRvdGFsQWZmZWN0ZWQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIGNvbnN0IHZhck5hbWUgPSBgZSR7aX1gO1xuICAgICAgY29uc3QgbGFiZWxQYXJ0ID0gZWRnZS5sYWJlbCA/ICc6JyArIEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwoZWRnZS5sYWJlbCkgOiAnJztcbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhlZGdlLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgZWRnZVBhcnQgPSBwcm9wU3RyID8gYFske3Zhck5hbWV9JHtsYWJlbFBhcnR9ICR7cHJvcFN0cn1dYCA6IGBbJHt2YXJOYW1lfSR7bGFiZWxQYXJ0fV1gO1xuICAgICAgY29uc3QgZ3FsU3RyID0gYE1BVENIIChzcmMgV0hFUkUgaWQoc3JjKSA9ICcke2VkZ2UuZnJvbU5vZGVJZH0nKSwgYFxuICAgICAgICArIGAoZHN0IFdIRVJFIGlkKGRzdCkgPSAnJHtlZGdlLnRvTm9kZUlkfScpIGBcbiAgICAgICAgKyBgJHtpbnNlcnRLZXl3b3JkfSAoc3JjKS0ke2VkZ2VQYXJ0fS0+KGRzdCkgUkVUVVJOICR7dmFyTmFtZX1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbFN0ciwgY29uZmlnKTtcbiAgICAgIHRvdGFsQWZmZWN0ZWQgKz0gcmVzcC5yb3dzQWZmZWN0ZWQ7XG4gICAgICBhbGxDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICBpZiAocmVzcC5yb3dzLmxlbmd0aCA+IDAgJiYgcmVzcC5yb3dzWzBdLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFsbFZhbHVlcy5wdXNoKHJlc3Aucm93c1swXS52YWx1ZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXJnZWRSb3cgPSBuZXcgUm93KGFsbFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShhbGxDb2x1bW5zLCBbbWVyZ2VkUm93XSwgMSwgZmFsc2UsIFtdLCB0b3RhbEFmZmVjdGVkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFN5c3RlbSAmIFByb2Nlc3MgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3NlcyAocXVlcmllcykgKi9cbiAgYXN5bmMgdG9wKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxQcm9jZXNzSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdUT1AnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZVByb2Nlc3NJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgYSBydW5uaW5nIHF1ZXJ5IGJ5IGl0cyBxdWVyeSBJRCAqL1xuICBhc3luYyBraWxsKHF1ZXJ5SWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBLSUxMICcke3F1ZXJ5SWR9J2AsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN0YXRpc3RpY3MgZm9yIHRoZSBjdXJyZW50IGdyYXBoIHVzaW5nIGRiLnN0YXRzKCkgKi9cbiAgYXN5bmMgc3RhdHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEdyYXBoU3RhdHM+IHtcbiAgICBjb25zdCBjdXJyZW50R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnUkVUVVJOIGRiLnN0YXRzKCkgQVMgc3RhdHMnLCBjb25maWcpO1xuICAgIGNvbnN0IGdzID0gcGFyc2VHcmFwaFN0YXRzKHJlc3ApO1xuICAgIGlmICghZ3MuZ3JhcGhOYW1lKSBncy5ncmFwaE5hbWUgPSBjdXJyZW50R3JhcGg7XG4gICAgcmV0dXJuIGdzO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBwaW5nIHRvIHRoZSBzZXJ2ZXIgYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xuICBhc3luYyB0ZXN0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucGluZygpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBUcmFpbGluZyBDb25maWcgU3BsaXR0ZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU3BsaXQgYSB2YXJpYWRpYyBhcmcgbGlzdCB3aGVyZSB0aGUgbGFzdCBlbGVtZW50ICptYXkqIGJlIGEgUXVlcnlDb25maWdcbiAqIGludG8gc2VwYXJhdGUgc3RyaW5nIG5hbWVzIGFuZCBhbiBvcHRpb25hbCBjb25maWcuIFB5dGhvbiB1c2VzIGtleXdvcmQtb25seVxuICogYGNvbmZpZ2AgaW4gdGhlc2UgQVBJczsgdGhlIFR5cGVTY3JpcHQgZXF1aXZhbGVudCBpcyBhbiBvcHRpb25hbCB0cmFpbGluZ1xuICogY29uZmlnIG9iamVjdCBkZXRlY3RlZCBieSBcIm5vdCBhIHN0cmluZ1wiLlxuICovXG5mdW5jdGlvbiBzcGxpdFRyYWlsaW5nQ29uZmlnKFxuICBhcmdzOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbik6IHsgbmFtZXM6IHN0cmluZ1tdOyBjb25maWc/OiBRdWVyeUNvbmZpZyB9IHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4geyBuYW1lczogW10gfTtcbiAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBuYW1lczogYXJncy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW10sIGNvbmZpZzogbGFzdCBhcyBRdWVyeUNvbmZpZyB9O1xuICB9XG4gIC8vIElmIGxhc3QgaXMgdW5kZWZpbmVkLCBzdHJpcCBpdCBhcyBhIHRyYWlsaW5nIG9wdGlvbmFsIGNvbmZpZyBwbGFjZWhvbGRlci5cbiAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IG5hbWVzOiBhcmdzLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXSB9O1xuICB9XG4gIHJldHVybiB7IG5hbWVzOiBhcmdzIGFzIHN0cmluZ1tdIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBQYXJzaW5nIFJlc3BvbnNlIFJvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBGaW5kIHRoZSBpbmRleCBvZiBhIGNvbHVtbiBieSBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSwgb3IgLTEgaWYgbm90IGZvdW5kICovXG5mdW5jdGlvbiBmaW5kQ29sdW1uSW5kZXgocmVzcDogUmVzcG9uc2UsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZXNwLmNvbHVtbnNbaV0udG9Mb3dlckNhc2UoKSA9PT0gbG93ZXIpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqIFNhZmVseSBleHRyYWN0IGEgc3RyaW5nIGZyb20gYSByb3cgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuZnVuY3Rpb24gZ2V0U3RyaW5nVmFsKHJvdzogUm93LCBpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpZHggPCAwKSByZXR1cm4gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsID0gcm93LmdldChpZHgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vKiogU2FmZWx5IGV4dHJhY3QgYSBudW1iZXIgZnJvbSBhIHJvdyBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4ICovXG5mdW5jdGlvbiBnZXROdW1iZXJWYWwocm93OiBSb3csIGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlkeCA8IDApIHJldHVybiAwO1xuICB0cnkge1xuICAgIGNvbnN0IHZhbCA9IHJvdy5nZXQoaWR4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICByZXR1cm4gaXNOYU4obnVtKSA/IDAgOiBudW07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8qKiBOb3JtYWxpemUgYSBsYWJlbCBjb2x1bW4gdmFsdWUgdG8gYSBzdHJpbmcgYXJyYXkuXG4gKlxuICogU2VydmVyIHJldHVybnMgYSBsaXN0IChtdWx0aS1sYWJlbCBzdXBwb3J0KS4gQWNjZXB0IGxpc3Qgb2Ygc3RyaW5ncyxcbiAqIGEgc2luZ2xlIHN0cmluZyAoZGVncmFkZWQgc2VydmVycyksIG9yIG51bGwvdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhYmVsc1ZhbHVlKHZhbDogYW55KTogc3RyaW5nW10ge1xuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB2YWwubWFwKCh4OiBhbnkpID0+IFN0cmluZyh4KSk7XG4gIHJldHVybiBbU3RyaW5nKHZhbCldO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UsIGZvcmNlZFR5cGU/OiBzdHJpbmcpOiBMYWJlbEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IGxhYmVsSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdsYWJlbCcpO1xuICBpZiAobGFiZWxJZHggPCAwKSBsYWJlbElkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBsZXQgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBpZiAodHlwZUlkeCA8IDApIHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VsZW1lbnRfdHlwZScpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgcmF3TGFiZWwgPSBsYWJlbElkeCA+PSAwID8gcm93LmdldChsYWJlbElkeCkgOiBudWxsO1xuICAgIGNvbnN0IHR5cGUgPSBmb3JjZWRUeXBlICE9PSB1bmRlZmluZWQgPyBmb3JjZWRUeXBlIDogZ2V0U3RyaW5nVmFsKHJvdywgdHlwZUlkeCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsczogcGFyc2VMYWJlbHNWYWx1ZShyYXdMYWJlbCksXG4gICAgICB0eXBlLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5vZGVUeXBlSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBOb2RlVHlwZUluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBwcm9wc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuXG4gIGlmIChuYW1lSWR4IDwgMCkgbmFtZUlkeCA9IHR5cGVJZHg7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgcHJvcGVydGllczogcGFyc2VQcm9wZXJ0eVN0cmluZyhnZXRTdHJpbmdWYWwocm93LCBwcm9wc0lkeCkpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEVkZ2VUeXBlSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IHByb3BzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG5cbiAgaWYgKG5hbWVJZHggPCAwKSBuYW1lSWR4ID0gdHlwZUlkeDtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBwcm9wZXJ0aWVzOiBwYXJzZVByb3BlcnR5U3RyaW5nKGdldFN0cmluZ1ZhbChyb3csIHByb3BzSWR4KSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBBbGdvSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IGRlc2NJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2Rlc2NyaXB0aW9uJyk7XG4gIGNvbnN0IHZlcklkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndmVyc2lvbicpO1xuICBjb25zdCBwYXJhbXNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3BhcmFtZXRlcnMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBkZXNjcmlwdGlvbjogZ2V0U3RyaW5nVmFsKHJvdywgZGVzY0lkeCksXG4gICAgdmVyc2lvbjogZ2V0U3RyaW5nVmFsKHJvdywgdmVySWR4KSxcbiAgICBwYXJhbWV0ZXJzOiBnZXRTdHJpbmdWYWwocm93LCBwYXJhbXNJZHgpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEluZGV4SW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhOYW1lID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleF9uYW1lJyk7XG4gIGNvbnN0IGlkeEVudGl0eSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZW50aXR5X3R5cGUnKTtcbiAgY29uc3QgaWR4TGFiZWwgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2xhYmVsJyk7XG4gIGNvbnN0IGlkeFByb3AgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnR5Jyk7XG4gIGNvbnN0IGlkeFByZWZpeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJlZml4X2xlbmd0aCcpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcbiAgY29uc3QgaWR4SW5kZXhlZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhlZF9jb3VudCcpO1xuICBjb25zdCBpZHhUb3RhbCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndG90YWxfY291bnQnKTtcbiAgY29uc3QgaWR4RXJyb3IgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2Vycm9yJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+IHtcbiAgICBjb25zdCBpbmZvOiBJbmRleEluZm8gPSB7XG4gICAgICBpbmRleE5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeE5hbWUpLFxuICAgICAgZW50aXR5VHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RW50aXR5KSxcbiAgICAgIGxhYmVsOiBnZXRTdHJpbmdWYWwocm93LCBpZHhMYWJlbCksXG4gICAgICBwcm9wZXJ0eTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvcCksXG4gICAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICAgICAgaW5kZXhlZENvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhJbmRleGVkKSxcbiAgICAgIHRvdGFsQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeFRvdGFsKSxcbiAgICAgIGVycm9yOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFcnJvciksXG4gICAgfTtcbiAgICBpZiAoaWR4UHJlZml4ID49IDApIHtcbiAgICAgIGluZm8ucHJlZml4TGVuZ3RoID0gZ2V0TnVtYmVyVmFsKHJvdywgaWR4UHJlZml4KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBGdWxsdGV4dEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4TmFtZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhfbmFtZScpO1xuICBjb25zdCBpZHhFbnRpdHkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VudGl0eV90eXBlJyk7XG4gIGNvbnN0IGlkeFNjaGVtYSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc2NoZW1hX25hbWUnKTtcbiAgY29uc3QgaWR4UHJvcHMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcbiAgY29uc3QgaWR4QW5hbHl6ZXIgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2FuYWx5emVyJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeERvY0NvdW50ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkb2NfY291bnQnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgaW5kZXhOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhOYW1lKSxcbiAgICBlbnRpdHlUeXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFbnRpdHkpLFxuICAgIHNjaGVtYU5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFNjaGVtYSksXG4gICAgcHJvcGVydGllczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvcHMpLFxuICAgIGFuYWx5emVyOiBnZXRTdHJpbmdWYWwocm93LCBpZHhBbmFseXplciksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgIGRvY0NvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhEb2NDb3VudCksXG4gICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IFRhc2tJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeElkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0YXNrX2lkJyk7XG4gIGNvbnN0IGlkeFR5cGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgaWR4UXVlcnkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5Jyk7XG4gIGNvbnN0IGlkeEFsZ28gPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2FsZ29fbmFtZScpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhTdGFydGVkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGFydGVkX2F0Jyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuICBjb25zdCBpZHhQYXJhbXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3BhcmFtZXRlcnMnKTtcbiAgY29uc3QgaWR4Tm9kZXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25vZGVzX3dyaXR0ZW4nKTtcbiAgY29uc3QgaWR4Q29tcHV0ZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnY29tcHV0ZV90aW1lX21zJyk7XG4gIGNvbnN0IGlkeFdyaXRlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd3cml0ZV90aW1lX21zJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgdGFza0lkOiBnZXRTdHJpbmdWYWwocm93LCBpZHhJZCksXG4gICAgdHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4VHlwZSksXG4gICAgcXVlcnk6IGdldFN0cmluZ1ZhbChyb3csIGlkeFF1ZXJ5KSxcbiAgICBhbGdvTmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4QWxnbyksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgIHN0YXJ0ZWRBdDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhcnRlZCksXG4gICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgICBwYXJhbWV0ZXJzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQYXJhbXMpLFxuICAgIG5vZGVzV3JpdHRlbjogZ2V0TnVtYmVyVmFsKHJvdywgaWR4Tm9kZXMpLFxuICAgIGNvbXB1dGVUaW1lTXM6IGdldE51bWJlclZhbChyb3csIGlkeENvbXB1dGUpLFxuICAgIHdyaXRlVGltZU1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhXcml0ZSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQcm9jZXNzSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBQcm9jZXNzSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhJZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnlfaWQnKTtcbiAgY29uc3QgaWR4VGV4dCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnlfdGV4dCcpO1xuICBjb25zdCBpZHhTdGFydCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhcnRfdGltZScpO1xuICBjb25zdCBpZHhEdXJhdGlvbiA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZHVyYXRpb25fbXMnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBxdWVyeUlkOiBnZXRTdHJpbmdWYWwocm93LCBpZHhJZCksXG4gICAgcXVlcnlUZXh0OiBnZXRTdHJpbmdWYWwocm93LCBpZHhUZXh0KSxcbiAgICBzdGFydFRpbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXJ0KSxcbiAgICBkdXJhdGlvbk1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhEdXJhdGlvbiksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlR3JhcGhTdGF0cyhyZXNwOiBSZXNwb25zZSk6IEdyYXBoU3RhdHMge1xuICBjb25zdCBnczogR3JhcGhTdGF0cyA9IHtcbiAgICBncmFwaE5hbWU6ICcnLFxuICAgIG5vZGVDb3VudDogMCxcbiAgICBlZGdlQ291bnQ6IDAsXG4gICAgbGFiZWxDb3VudHM6IHt9LFxuICAgIGVkZ2VMYWJlbENvdW50czoge30sXG4gICAgbm9kZVByb3BlcnR5U3RhdHM6IHt9LFxuICAgIGVkZ2VQcm9wZXJ0eVN0YXRzOiB7fSxcbiAgfTtcblxuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGdzO1xuXG4gIGxldCBzdGF0c0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHMnKTtcbiAgaWYgKHN0YXRzSWR4IDwgMCkgc3RhdHNJZHggPSAwO1xuXG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwIHx8IHN0YXRzSWR4ID49IHJlc3Aucm93c1swXS52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZ3M7XG5cbiAgY29uc3QgdmFsID0gcmVzcC5yb3dzWzBdLmdldChzdGF0c0lkeCk7XG4gIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAodmFsLmdyYXBoX25hbWUgIT09IHVuZGVmaW5lZCkgZ3MuZ3JhcGhOYW1lID0gU3RyaW5nKHZhbC5ncmFwaF9uYW1lKTtcbiAgICBpZiAodmFsLm5vZGVfY291bnQgIT09IHVuZGVmaW5lZCkgZ3Mubm9kZUNvdW50ID0gTnVtYmVyKHZhbC5ub2RlX2NvdW50KSB8fCAwO1xuICAgIGlmICh2YWwuZWRnZV9jb3VudCAhPT0gdW5kZWZpbmVkKSBncy5lZGdlQ291bnQgPSBOdW1iZXIodmFsLmVkZ2VfY291bnQpIHx8IDA7XG4gIH1cblxuICByZXR1cm4gZ3M7XG59XG4iXX0=